Ich schreibe ein Programm für eine Schneider-SPS mit strukturiertem Text, und ich versuche es mit objektorientierter Programmierung zu tun.SPS Objektorientierte Programmierung - Methoden verwenden
Als Neuling in der SPS-Programmierung, schrieb ich ein einfaches Testprogramm ein solches dies:
okFlag:=myObject.aMethod();
IF okFlag THEN
// it's ok, go on
ELSE
// error handling
END_IF
aMethod
müssen einige Operationen durchführen, warten auf das Ergebnis (es gibt eine „Auszeit“ überprüfen, um zu vermeiden, Deadlocks) und zurück WAHR oder FALSCH
Dies ist, was ich während der Programmausführung erwartet
1), wenn die okFlag:=myObject.aMethod();
erreicht ist, wird der Code innerhalb aMethod
ausgeführt, bis ein Ergebnis zurückgegeben wird. Wenn ich "ausgeführt" sage, meine ich, dass im nächsten Zyklus die Ausführung von aMethod
von dem Punkt aus weitergeht, den es zuvor erreicht hatte.
2) wird das Ergebnis des Aufrufs der Methode überprüft und die Hauptströmung des Programms
ausgeführt, und das ist, was passiert:
aber Fluss wird das Programm ausgeführt1) aMethod
ist. Das heißt, wenn es das Ende aMethod
erreicht, wird ein Wert zurückgegeben, selbst wenn die Ereignisse, die aMethod
warten sollten, noch ausgeführt werden.
VAR_STATIC
imBusy: BOOL
END_VAR
METHOD aMethod: INT;
IF NOT(imBusy) THEN
imBusy:=FALSE;
aMethod:=-1; // result of method while in progress
ELSE
aMethod:=-1;
<rest of code. If everything is ok, the result is 0, otherwise is 1>
END_IF
imBusy:=aMethod<0;
und das Hauptprogramm: Dies ist die erste Lösung, die ich gefunden
2) auf dem nächsten Zyklus wird aMethod
wieder und wieder von Anfang an
genannt
CASE (myObject.aMethod()) OF
0: // it's ok, go on
1: // error handling
ELSE
// still executing...
END_CASE
und das scheint zu funktionieren, aber ich weiß nicht, ob es der richtige Ansatz ist.
Es gibt einige Bibliotheken von Schneider, die Methoden verwenden, die Boolean zurückgeben und scheinbar so funktionieren, wie ich es in meinem Programm erwartet habe. Das heißt: Wenn der Zyklus zum ersten Mal den Aufruf der Methode erreicht, wird der Programmablauf irgendwie "abgelenkt", so dass er im nächsten Zyklus die Methode wieder eingibt, bis sie beendet ist. Gibt es eine Möglichkeit, dieses Verhalten zu haben?
verwenden Sie SOMOCHINE oder Unity? – mrsargent
SoMachine, Version 4.1 – Marconi