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

Verlassen eines "Untersystemes" in der Ablaufsprac

Student
2009-05-04
2009-05-05
  • Student - 2009-05-04

    Halo

    Ich habe ein Programm in Ablaufsprache geschrieben und will in einer Aktion eine weitere "Unterablaufsprache" schreiben. Am Ende dieses Unterprogramm will ich wieder zurück in mein Hauptprogramm. Wie muss ich den Sprung benennen?

    Ein weiteres Problem ist, wenn meine Transaktion im Hauptprogramm auf TRUE fällt bevor das Unterprogramm fertig ist, läuft das Hauptprogramm weiter.

    Im Anhang ist ein Bild für den Sprung. Vom Hauptprogramm (rot) in das Unterprogramm mit Sprung (grün) zurück ins Hauptprogramm.

    Oder ist das ganze nur eine Fehler der Simulationssoftware?

    Gruss Reto

     
  • SPSstudent - 2009-05-04

    Deklariere einfach einen Merker in dem Hauptprogramm (oder global). Im Startschritt setzt du merker:=FALSE. Statt TRUE gibst du bei der Transition nach dem Unterprogrammaufruf merker=TRUE an. Im Unterprogramm fügst du am Ende noch einen Schritt hinzu mit der Aktion merker:=TRUE und als Transition TRUE (Alternative: eine Aktion, die einmalig beim Verlassen des bisher letzten Schrittes ausgeführt wird), gefolgt von einem Sprung zum Startschritt des Unterprogramms.

    Vielleicht hilft das hier auch: l viewtopic.php?t=1919 l

    PS: Anhang ist keiner zu sehen. Vielleicht hast du den Button "Attachment hinzufügen" vor dem Absenden nicht gedrückt.

     
  • Sara - 2009-05-05

    Hallo Reto,

    was du beschreibst, ist kein Fehler deiner Simulationssoftware, sondern soll so.

    Der Hintergrund ist folgender:

    Pro SPS-Zyklus wird genau 1 Schritt abgearbeitet. Am Ende des Schrittes wird die Transitionsbedingung geprüft und wenn sie TRUE ist, wird der nächste Schritt aktiviert (nicht ausgeführt!), wenn nicht, bleibt der derzeitige Schritt aktiviert. Dann wird aus diesem Baustein gesprungen. Beim nächsten Zyklus, wenn wieder in diesen Baustein gesprungen wird, wird der aktive Schritt ausgeführt etc.

    Dabei gibt es keinen Unterschied zwischen Unterprogrammen oder Hauptprogrammen.

    Da Bausteine in AS entweder Programme oder Funktionsblöcke sind, merken sie sich immer, welcher Schritt aktiv ist. D.h., selbst wenn du im Hauptprogramm weiterläufst und später wieder an die Stelle mit dem Unterprogramm kommst, "weiß" das Unterprogramm, welcher Schritt als letztes aktiv war und macht dort weiter.

    Eine Lösung ist folgende:

    Das Unterprogramm ist ein geschlossenes Netz, d.h. dem letzten Schritt folgt ein Sprung auf z.B. Init. Im letzten Schritt setzt du eine VAR_OUTPUT z.B. fertig := TRUE; - diese muss im Init-Schritt (oder welcher dem letzten Schritt folgt) zurückgesetzt werden: fertig := FALSE; Diese Variable wird nach außen übergeben: z.B. weiter := fertig;

    Im Hauptprogramm rufst du das Unterprogramm auf. Die Transitionsbedingung ist dieselbe, die du hast mit einer UND-Verknüpfung mit "weiter". (z.B. "Ausdruck AND weiter")

    So wird das Hauptprogramm nur weiterlaufen, wenn das Unterprogramm abgelaufen ist (und gleichzeitig Ausdruck = TRUE ist).

    Achtung: Wenn der zweite Teil der UND-Verknüpfung "Ausdruck" in dem Moment, wo weiter = TRUE wird, nicht auch TRUE ist, wird das Unterprogramm wieder aufgerufen, was du wahrscheinlich nicht willst.

    Deswegen die Empfehlung:

    Die Übergangsbedingung nach der Aktion des Hauptprogramms, die das Unterprogramm aufruft, ist lediglich "weiter" und im nächsten Schritt hast du eine Anweisung, was passieren soll, solange "Ausdruck" noch nicht TRUE ist.

    Hoffe, das hilft dir.

    Grüße

    Sara

    PS: Bei IEC-Schritten ist das noch etwas anders. Ich denke, du benutzt einfache Schritte oder?

     

Log in to post a comment.