Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Ergebnis 1 bis 5 von 5

Thema: Quell Code Probleme

  1. #1
    Registriert seit
    05.04.2011
    Beiträge
    8
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo an Alle
    Bei meinem Projekt habe ich als Aufgabe eine State Maschine für ein AX2000 er zu programieren.

    Habe eine VorProgramierte aber leider Funktioniert es nicht. Ich habe mir auch Quelltext angeguckt, ich glaube bei der Hex Umformung gibt es Fehler.

    Ich hoffe dass ihr mir weiter helfen könnt.
    Ich weiss leider nicht, wo genau der Fehler sein kann, bei IF Anweisungen habe ich bei hex zahlen Probleme entdeckt, ich bin mir aber nicht sicher
    Als Anhang füge ich auch die State maschine von AX2000 er

    Danke
    lg

    Mein Quelltext
    (*++++FPGA_Drive_State control+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*)

    IF ((wAx_Status AND 16#000F) <> 16#000 THEN
    sys_cycle_cnt := sys_cycle_cnt +1;
    IF (sys_cycle_cnt > Lim_2s) THEN
    sys_cycle_cnt := 0;
    IF En_Drive = TRUE THEN
    IF ((wAx_Status AND 16#00FF) = 16#0060) THEN
    wAx_Control := 16#0006; (*Init*)
    ELSIF ((wAx_Status AND 16#00FF) = 16#0040) THEN
    wAx_Control := 16#0006; (*PreCharge*)
    ELSIF ((wAx_Status AND 16#00FF) = 16#0021) THEN
    wAx_Control := 16#0907; (*PreRun, change to Opmode 9 => v/f - control*)
    ELSIF ((wAx_Status AND 16#00FF) = 16#0023) THEN
    wAx_Control := 16#090F; (*RuN*)
    ELSIF ((wAx_Status AND 16#00FF) = 16#0027) THEN
    U_cmd := U_cmd_percent;
    speed_cmd := speed_cmd_rpm;
    END_IF
    ELSE
    wAx_Control := 16#0000;
    U_cmd := 0;
    speed_cmd := 0;
    END_IF;
    END_IF;
    ELSE (*Drive_Error*)
    sys_cycle_cnt := 0;
    En_Drive := FALSE; (* Disable on Error *)
    U_cmd := 0;
    speed_cmd := 0;
    END_IF;


    IF ( Clr_Fault = TRUE ) THEN
    IF ((wAx_Status AND 16#000F) = 16#000 THEN
    wAx_Control := 16#0080; (*reset Error*)
    END_IF
    Clr_Fault := FALSE ;
    END_IF

    SysTime(timeLoDW => NewSysTime);
    CycTime := (NewSysTime - OldSysTime)/10; (* cycle time in [µs]*)
    IF (CycTime = 0) THEN
    CycTime := 1000;
    END_IF


    OldSysTime := NewSysTime;
    Lim_2s := 2000000 / CycTime;
    (*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++*)
    Angehängte Grafiken Angehängte Grafiken
    Zitieren Zitieren Quell Code Probleme  

  2. #2
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.716
    Danke
    398
    Erhielt 2.399 Danke für 1.999 Beiträge

    Standard

    Hallo,
    zu deinem Code fällt mir (im Wahrsten Sinne des Wortes) erstmal nichts ein.
    Aber dann ...
    - arbeitet man mit IF-Abfragen dann wird alle sin der Abfrage eingerückt - das macht den Code übersichtlicher.
    - benötigt man ein bestimmtes Teil-Ergebnis immer wieder so bildet man sich ein Zwischen-Ergebnis :
    Code:
     myAxStatus := ((wAx_Status AND 16#000F) ;
    ... und arbeitet dann damit.

    -eine Statemachine ist im Grunde eine Schrittkette (also ein sequentieller Ablauf). Diese würde ich mir zunächst bilden und auch mit Schrittnummern arbeiten, die du ggf. hoch- (oder runter-)setzt. Dann sieht das Ganze vielleicht auch mehr wie das Flußdiagramm aus.

    Gruß
    Larry

  3. #3
    Registriert seit
    29.01.2007
    Ort
    Sandkrug
    Beiträge
    147
    Danke
    7
    Erhielt 36 Danke für 25 Beiträge

    Standard

    Hallo mc@ey,
    dein Quellcode ist tatsächlich sehr unübersichtlich. Hier mal dein Code in etwas besserer Darstellung:
    Code:
    IF ((wAx_Status AND 16#000F) <> 16#000 THEN
    sys_cycle_cnt := sys_cycle_cnt +1;
            IF (sys_cycle_cnt > Lim_2s) THEN
                        sys_cycle_cnt := 0;
                        IF En_Drive = TRUE THEN
                                    IF ((wAx_Status AND 16#00FF) = 16#0060) THEN
                                               wAx_Control := 16#0006; (*Init*)
                                    ELSIF ((wAx_Status AND 16#00FF) = 16#0040) THEN
                                               wAx_Control := 16#0006; (*PreCharge*)
                                    ELSIF ((wAx_Status AND 16#00FF) = 16#0021) THEN
                                               wAx_Control := 16#0907; (*PreRun, change to Opmode 9 => v/f - control*)
                                    ELSIF ((wAx_Status AND 16#00FF) = 16#0023) THEN
                                               wAx_Control := 16#090F; (*RuN*)
                                    ELSIF ((wAx_Status AND 16#00FF) = 16#0027) THEN
                                               U_cmd := U_cmd_percent;
                                               speed_cmd := speed_cmd_rpm;
                                    END_IF
                        ELSE
                                    wAx_Control := 16#0000;
                                    U_cmd := 0;
                                    speed_cmd := 0;
                        END_IF;
            END_IF;
    ELSE (*Drive_Error*)
            sys_cycle_cnt := 0;
            En_Drive := FALSE; (* Disable on Error *)
            U_cmd := 0;
            speed_cmd := 0;
    END_IF;
     
     
    IF ( Clr_Fault = TRUE ) THEN
            IF ((wAx_Status AND 16#000F) = 16#000 THEN
                        wAx_Control := 16#0080; (*reset Error*)
            END_IF
            Clr_Fault := FALSE ;
    END_IF
     
    SysTime(timeLoDW => NewSysTime);
    CycTime := (NewSysTime - OldSysTime)/10; (* cycle time in [µs]*)
    IF (CycTime = 0) THEN
    CycTime := 1000;
    END_IF
     
     
    OldSysTime := NewSysTime;
    Lim_2s := 2000000 / CycTime;
    Damit dürfte die dahinterstehende Logik besser zu erkennen sein.
    Anbei dein Code nochmals dargestellt in einem "ordentlchen" Struktogramm.
    Vielleicht hilft dir das beim Finden deines Fehlers.
    MfG
    eNDe
    Angehängte Grafiken Angehängte Grafiken
    Zitieren Zitieren State Maschine  

  4. #4
    mc@ey ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    05.04.2011
    Beiträge
    8
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Standard

    natürlich das sieht viel Ordentlicher aus

    aber wenn ich unten State Maschine aufmache und dass mit meinem Quelltext vergleiche, erkenne ich immer noch kein Fehler
    Quasi verstehe ich da die Hex Umwandlungen nicht. wenn ich es Umwandle bekomme ich da andere HEx zahlen

    Die State Maschine für AX20000

    http://infosys.beckhoff.com/index.ph...en.htm&id=8964

    Ist die Hex Umwandlung richtig?

    Ich bekomme da andere Werte

    lg

  5. #5
    Registriert seit
    24.10.2010
    Beiträge
    52
    Danke
    0
    Erhielt 10 Danke für 9 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Was meinst du denn mit Hex-Umwandlungen? Wenn ich das richtig interpretiere, bilden die 16#00FF eine Bitmaske, um vom wAx_Status das linke Byte auszublenden (bei 16#000F bleiben nur 4 Bit übrig). Dann wird mit den entsprechenden Werten verglichen und wAx_Control auf einen bestimmten Wert gesetzt.

Ähnliche Themen

  1. C++ Code
    Von rabit im Forum Hochsprachen - OPC
    Antworten: 9
    Letzter Beitrag: 03.01.2010, 10:42
  2. SFC20 BlockMove mit variablem Quell DB
    Von t-poke im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 02.09.2009, 05:12
  3. SCL code
    Von awl-scl im Forum Simatic
    Antworten: 21
    Letzter Beitrag: 14.01.2008, 17:02
  4. AWL-code
    Von Anonymous im Forum Simatic
    Antworten: 29
    Letzter Beitrag: 09.11.2005, 16:48
  5. Code einfügen ???
    Von GobotheHero im Forum Stammtisch
    Antworten: 14
    Letzter Beitrag: 04.03.2005, 15:48

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •