Quell Code Probleme

mc@ey

Level-1
Beiträge
8
Reaktionspunkte
0
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#0008) 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#0008) 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;
(*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*)
 

Anhänge

  • StateMachine03.jpg
    StateMachine03.jpg
    61,8 KB · Aufrufe: 28
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
State Maschine

Hallo mc@ey,
dein Quellcode ist tatsächlich sehr unübersichtlich. Hier mal dein Code in etwas besserer Darstellung:
Code:
[SIZE=3][FONT=Times New Roman]IF ((wAx_Status AND 16#000F) <> 16#000 THEN[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]sys_cycle_cnt := sys_cycle_cnt +1;[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]        IF (sys_cycle_cnt > Lim_2s) THEN[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]                    sys_cycle_cnt := 0;[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]                    IF En_Drive = TRUE THEN[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]                                IF ((wAx_Status AND 16#00FF) = 16#0060) THEN[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]                                           wAx_Control := 16#0006; (*Init*)[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]                                ELSIF ((wAx_Status AND 16#00FF) = 16#0040) THEN[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]                                           wAx_Control := 16#0006; (*PreCharge*)[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]                                ELSIF ((wAx_Status AND 16#00FF) = 16#0021) THEN[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]                                           wAx_Control := 16#0907; (*PreRun, change to Opmode 9 => v/f - control*)[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]                                ELSIF ((wAx_Status AND 16#00FF) = 16#0023) THEN[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]                                           wAx_Control := 16#090F; (*RuN*)[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]                                ELSIF ((wAx_Status AND 16#00FF) = 16#0027) THEN[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]                                           U_cmd := U_cmd_percent;[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]                                           speed_cmd := speed_cmd_rpm;[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]                                END_IF[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]                    ELSE[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]                                wAx_Control := 16#0000;[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]                                U_cmd := 0;[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]                                speed_cmd := 0;[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]                    END_IF;[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]        END_IF;[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]ELSE (*Drive_Error*)[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]        sys_cycle_cnt := 0;[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]        En_Drive := FALSE; (* Disable on Error *)[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]        U_cmd := 0;[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]        speed_cmd := 0;[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]END_IF;[/FONT][/SIZE]
 
 
[SIZE=3][FONT=Times New Roman]IF ( Clr_Fault = TRUE ) THEN[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]        IF ((wAx_Status AND 16#000F) = 16#000 THEN[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]                    wAx_Control := 16#0080; (*reset Error*)[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]        END_IF[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]        Clr_Fault := FALSE ;[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]END_IF[/FONT][/SIZE]
 
[SIZE=3][FONT=Times New Roman]SysTime(timeLoDW => NewSysTime);[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]CycTime := (NewSysTime - OldSysTime)/10; (* cycle time in [µs]*)[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]IF (CycTime = 0) THEN[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]CycTime := 1000;[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]END_IF[/FONT][/SIZE]
 
 
[SIZE=3][FONT=Times New Roman]OldSysTime := NewSysTime;[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]Lim_2s := 2000000 / CycTime;[/FONT][/SIZE]
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
 

Anhänge

  • State Maschine.JPG
    State Maschine.JPG
    136,5 KB · Aufrufe: 21
natürlich das sieht viel Ordentlicher aus :D

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.p...000-b110/html/ax2000-b110_canopen.htm&id=8964

Ist die Hex Umwandlung richtig?

Ich bekomme da andere Werte

lg
 
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.
 
Zurück
Oben