Habe soeben einen Zustandsautomaten zu programmieren versucht mit Programmiersprache AS. Bei diesem Programm wollte ich eigentlich einen Superstate "Normalbetrieb" und einen "Fehler" machen. Im State "Normalbetrieb" wollte ich wiederum mit AS programmieren; sprich verschachtelte Zustandsautomaten.
Im Anhang findet ihr ein kleines Projekt, in dem ich das testen wollte. Step2 beinhaltet hier den verschachtelten Zustandsautomaten. Wenn ich per Variable "reset" diese Superstate "Step2" verlasse, sollte er meiner Meinung nach auch die Marke im Unterprogramm von "Step2" löschen. Das macht er aber nicht, sondern bleibt auf dem letzten Schritt stehen. Wenn ich dann wieder von "Init" her auf "Step2" komme, hält er im Unterprogramm die Marke am alten Ort.
Es sieht so aus, als ob man so was wohl nicht machen kann in Codesys, aber vielleicht kennt ja jemand einen Trick.
Wenn reset gesetzt ist, darfst du in der Haupt-Schrittkette nicht gleich Step2 wieder verlassen, sondern musst erst innerhalb von der Neben-Schrittkette den aktuellen Schritt verlassen; also von jedem Schritt aus (in deinem Fall nur von einem Schritt aus) eine Alternativbedingung mit "reset=TRUE" anbieten. Was nach der Transition "reset=TRUE" kommt, kannst du dir selbst überlegen.
Zum Beispiel könntest du dann eine Sprungmarke nach Init setzen. In Init musst du dann z.B. abfragen, ob reset gesetzt ist (Voraussetzung: reset ist mindestens 2 SPS-Zyklen lang TRUE). Dann setzt du einen globalen Merker, der in der Haupt-Schrittkette dafür sorgt, dass du Step2 verlässt.
Code für Init2:
IFreset=TRUETHEN
 resetmerker :=TRUE;ELSE
 resetmerker :=FALSE;
 [PlatzhalternormaleInit-Anweisungen]
END_IF
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
SPSstudent hat geschrieben:
Wenn reset gesetzt ist, darfst du in der Haupt-Schrittkette nicht gleich Step2 wieder verlassen, sondern musst erst innerhalb von der Neben-Schrittkette den aktuellen Schritt verlassen; also von jedem Schritt aus (in deinem Fall nur von einem Schritt aus) eine Alternativbedingung mit "reset=TRUE" anbieten.
Danke so weit für die Antwort. Bestätigt aber, dass die Idee eines Superstates mit Codesys nicht sinnvoll realisierbar ist. Wenn ich bei jedem Schritt eine Alternativbedingung anbringen muss, kann ich das Konstrukt gerade so gut ins Hauptfenster nehmen. Die Idee wäre eigentlich, dass man eine übergeordnete Abbruchbedingung (nur einmal definiert) für den Superstate hat und beim erneuten Erreichen des Superstates wieder bei Init2 angefangen wird und nicht beim letzten Schritt.
Habs mittlerweile aber genau so gelöst wie vorgeschlagen; geht offenbar leider nicht anders.
Nochmal Danke und Gruss
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Hallo
Habe soeben einen Zustandsautomaten zu programmieren versucht mit Programmiersprache AS. Bei diesem Programm wollte ich eigentlich einen Superstate "Normalbetrieb" und einen "Fehler" machen. Im State "Normalbetrieb" wollte ich wiederum mit AS programmieren; sprich verschachtelte Zustandsautomaten.
Im Anhang findet ihr ein kleines Projekt, in dem ich das testen wollte. Step2 beinhaltet hier den verschachtelten Zustandsautomaten. Wenn ich per Variable "reset" diese Superstate "Step2" verlasse, sollte er meiner Meinung nach auch die Marke im Unterprogramm von "Step2" löschen. Das macht er aber nicht, sondern bleibt auf dem letzten Schritt stehen. Wenn ich dann wieder von "Init" her auf "Step2" komme, hält er im Unterprogramm die Marke am alten Ort.
Es sieht so aus, als ob man so was wohl nicht machen kann in Codesys, aber vielleicht kennt ja jemand einen Trick.
Danke und Gruss
AS_Test.pro [24.86 KiB]
Wenn reset gesetzt ist, darfst du in der Haupt-Schrittkette nicht gleich Step2 wieder verlassen, sondern musst erst innerhalb von der Neben-Schrittkette den aktuellen Schritt verlassen; also von jedem Schritt aus (in deinem Fall nur von einem Schritt aus) eine Alternativbedingung mit "reset=TRUE" anbieten. Was nach der Transition "reset=TRUE" kommt, kannst du dir selbst überlegen.
Zum Beispiel könntest du dann eine Sprungmarke nach Init setzen. In Init musst du dann z.B. abfragen, ob reset gesetzt ist (Voraussetzung: reset ist mindestens 2 SPS-Zyklen lang TRUE). Dann setzt du einen globalen Merker, der in der Haupt-Schrittkette dafür sorgt, dass du Step2 verlässt.
Code für Init2:
Danke so weit für die Antwort. Bestätigt aber, dass die Idee eines Superstates mit Codesys nicht sinnvoll realisierbar ist. Wenn ich bei jedem Schritt eine Alternativbedingung anbringen muss, kann ich das Konstrukt gerade so gut ins Hauptfenster nehmen. Die Idee wäre eigentlich, dass man eine übergeordnete Abbruchbedingung (nur einmal definiert) für den Superstate hat und beim erneuten Erreichen des Superstates wieder bei Init2 angefangen wird und nicht beim letzten Schritt.
Habs mittlerweile aber genau so gelöst wie vorgeschlagen; geht offenbar leider nicht anders.
Nochmal Danke und Gruss