Welcome to our new forum
All users of the legacy CODESYS Forums, please create a new account at account.codesys.com. But make sure to use the same E-Mail address as in the old Forum. Then your posts will be matched. Close

AS-Programmierung; Superstates problematisch

proton
2009-04-30
2009-04-30
  • proton - 2009-04-30

    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]

     
  • SPSstudent - 2009-04-30

    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:

    IF reset=TRUE THEN
      resetmerker := TRUE;
    ELSE
      resetmerker := FALSE;
      [Platzhalter normale Init-Anweisungen]
    END_IF
    
     
  • proton - 2009-04-30

    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

     

Log in to post a comment.