Realisierung von State Machine in ST

msauerpb

Level-2
Beiträge
207
Reaktionspunkte
7
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

in C habe ich bisher Stache Maschinen mit Hilfe der Case Anweisung realisiert. Innerhalb eines States habe ich die State Variable neu beschrieben und den Case dann mit break; verlassen.
Wie wird denn sowas in ST realisiert, dort gibt es ja kein break;? Wenn ich die State Variable neu beschreibe wird dann im selben Zyklus der nächste Eintrag abgearbeitet oder wird der Gesamte Case beendet?

Danke für Eure Hilfe.

gruss
martin
 
Ich meine, dass bei Codesys statt break; exit; zum Einsatz kommen kann (Bitte testen!!!).
Die Frage ist, ist es gewünscht das pro Zyklus max. 1 State ausgeführt werden kann?
Falls nicht kannst Du break; XOR exit; einfach weglassen.

Grüße

Marcel
 
Noch ein Nachtrag, zur besseren Übersicht solltest Du bei einer Schrittkette mit CASE-Anweisung statt Schrittnummern ENUMS verwenden, also z.B. statt 30 halt "MotorEin". Das erleichtert auch das Ändern und Einfügen von Schritten, weil man nicht an so vielen Stellen die Zahlen ändern muss.
 
Innerhalb eines States habe ich die State Variable neu beschrieben und den Case dann mit break; verlassen.
Ich verstehe leider den Sinn und Zweck nicht, eine CASE-Selektion vorzeitig zu verlassen. Will man nur die restlichen Anweisungen des einen CASE, in dem man abbricht, überspringen oder hofft man, dass die Selektion mit dem neuen Wert der StateVariable auch "implizit" neu gestartet wird, ohne vorher die Selektion zu verlassen?
Klingt irgendwie recht widersprüchlich ...
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich verstehe leider den Sinn und Zweck nicht, eine CASE-Selektion vorzeitig zu verlassen. Will man nur die restlichen Anweisungen des einen CASE, in dem man abbricht, überspringen oder hofft man, dass die Selektion mit der neuen Wert der StateVariable auch "implizit" neu gestartet wird, ohne vorher die Selektion zu verlassen?
Klingt irgendwie recht widersprüchlich ...
Der TE hatte die Befürchtung, dass, wenn er die CASE-Variable erhöht, die nächste CASE-Anweisung, soweit sie unter der aktuell aktiven liegt, schon im selben Zyklus ausgeführt wird.
 
Der TE hatte die Befürchtung, dass, wenn er die CASE-Variable erhöht, die nächste CASE-Anweisung, soweit sie unter der aktuell aktiven liegt, schon im selben Zyklus ausgeführt wird.
Ich hatte verstanden, dass er sich den Abbruch in C angewöhnt hatte - ist es denn in C so, dass ein weiteres "Päckchen" abgearbeitet würde, wenn sich die StateVariable passend ändert?
Habe ich gar nicht so in Erinnerung - ist wahrscheinlich schon zu lange her, dass ich in C codiert habe. ;)
Da lobe ich mir doch wieder mal die IF-THEN-ELSEIF-Konstrukte - die funktionieren nicht so unterschiedlich in verschiedenen Sprachen bzw. SprachDialekten ...
 
In "C" musst Du jeden einzelnen Fall mit "break" beenden, sonst läuft das Programm einfach weiter nach unten in den nächsten Fall, auch wenn da ein neues "case-label" steht.
Stimmt auffallend, habe gerade einen C-Schnipsel gefunden, den ich vor 25 Jahren selbst genau so programmiert habe.
Sorry, bin offensichtlich nicht mehr so ganz im Thema ... ;)
 
Wenn man in verschiedenen Programmiersprachen unterwegs ist, kann der ungewollte "Case-Fallthrough" in "C" (oder Java-Script) eine üble Falle sein.
Aktuelle Compiler werfen beim "Case-Fallthrough" wohl eine Warnung (abschaltbar), früher konnte man sich von LINT vor dem möglichen Fehler warnen lassen.
Gruß
Erich
 
Zurück
Oben