Aus Funktion Springen und in anderem FB weitermachen in ST? (ähnlich SPA)

Michi85

Level-1
Beiträge
30
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich versuche gerade einen Treiber von einem meiner altern s7 Projekte welcher in AWL geschrieben ist in ST auf Beckhoff zu übersetzen.
Gerade versuche ich erfolglos eine Funktion zu realisieren welche einem SPA bzw. absoluten Sprung Befehl imitiert.

also bspw. in S7 AWL

UN M10.0
U M10.1
= A 4.0
SPA XYZ
...
...

-----
jetzt hab ich mir gedacht ich kann ja in Twincat vielleicht etwas wie einen CALL machen der eine andere Funktion bzw. Funktionsbaustein welcher in ST geschrieben ist aufruft und die aktuelle Funktion / If Schleife abbricht.

...
if (...)
then
...
else
CALL XYZ
"und raus aus dieser datei - nix mehr weiter ausführen hier".
..
..

Habt ihr eine Idee?
Bitte entschuldigt meinen PSEUDO Code.

Viele Grüße
Michi
 
Also spontan würde mir da was einfallen wie eine VAR die von deinem Hilfsbaustein auf FALSE getriggert wird und der Entsprechende Baustein somit nicht mehr aufgerufen wird.
Oder (ist fast der gleiche ansatzt)
If var1 = true then Hauptprogramm();
Else AnderesProgramm();
End_if
Oder ggf auch über einen Task machbar. Wenn ich dich richtig verstanden habe führen hier viele Wege ans Ziel.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Auch wenns meistens Scheiß ist aber auch die IEC Welt kennt Sprünge,
auch wenn mir die gerade nicht einfallen weil ich die nie brauche ...

Gesendet von meinem GT-I9505 mit Tapatalk
 
Hallo,

in ST kannst Du meines Wissens nach nicht springen, das geht nur in AWL. Ein RETURN(); verlässt den aktuellen Baustein wie von Dir gewollt.

Einen Ablauf würde ich in ST aber mittels einer Case Anweisung realisieren, das ist finde ich viel flexibler und übersichtlicher.
Bei uns sieht das in etwa so aus:

Code:
IF xStart AND NOT xRun THEN
    iSchritt:=1;
END_IF



CASE iSchritt OF

0:  (* Schritt 0, nix machen *)
    xRun:=FALSE;

1:  (* Initschritt *)
    xRun := TRUE;
    iSchritt:=2;

2:  (* Schritt 2 ... *)
    IF xWeiterschaltbedingung1 
    AND xbla
    THEN
         (* tu irgendwas *)
         iSchritt:=3;
    END_IF

3:  (*Schritt 3 ...*)
    IF xWeiterschaltbedingung2 THEN
        iSchritt:=4;
    END_IF

... usw


99: (*Schritt 99 fertig *)
    IF xWeiterschaltbedingung THEN
        iSchritt:=0;
    END_IF

END_CASE;
 
Zuletzt bearbeitet:
Hallo Michi
Ein Call ist nicht unbedingt das gleich wie ein Sprung in AWL.
Rufts du mit Call eine anderen Baustein auf, wird nach dessen Ausführung die Abarbeitung eventuell hinter dem Call weitergeführt was du ja nicht möchtest.
Günstiger ist es die If then Schleife mit einer Variable sauber zu verlassen. Dazu mal "Exit IF" nachschlagen ob Twincat dies unterstützt.
Dann wie mein Vorredner sagte aus einem Sprungverteiler deinen Baustein aufrufen.
Eventuell wäre auch ein ereignissorientierter Aufruf eines FB die bessere Lösung für dein Problem. Ähnlich einem Weckalarm nur eben als Ereigniss nicht als Zeit.
Grüsse Holger
 
Zurück
Oben