2016-04-08 21 views
1

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ührt

1) 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?

+0

verwenden Sie SOMOCHINE oder Unity? – mrsargent

+0

SoMachine, Version 4.1 – Marconi

Antwort

2

allgemein OOP ist nicht der Ansatz, den Menschen nehmen würden, wenn sie IEC61131-Sprachen verwenden. Ihre beste Wette ist wahrscheinlich, Ihren Code als eine Zustandsmaschine zu implementieren. Ich habe diesen Ansatz in der Vergangenheit als eine Möglichkeit verwendet, eine komplexe Sequenz zu vereinfachen, so dass es für Anlagenbetreuer einfacher ist zu interpretieren.

In der Regel, was ich empfehlen würde, wenn Sie diesen Ansatz verwenden, ist zu versuchen, Ihre Zustandsmaschine selbst von Ihrem Arbeitscode zu trennen; Sie können eine Zustandsmaschine mit X Schritten implementieren und dann Ihren Arbeitscode auf den Zustandsmaschinenschritt verweisen lassen.

Ein einfaches Beispiel könnte wie folgt aussehen:

stepNo := 0; 
IF (start AND stepNo = 0) THEN 
    StepNo = 1; 
END_IF; 

(* there's a shortcut unity operation for resetting this array to zeroes which is faster, but I can't remember it off the top of my head... *) 
ActiveStepArray := BlankStepArray; 

IF stepNo > 0 THEN 
    IF StepComplete[stepNo] THEN 
     stepNo := stepNo +1; 
    END_IF; 

    ActiveStepArray[stepNo] := true; 
END_IF; 

Dann in anderen Codeabschnitten können Sie setzen ...

IF ActiveStep[1] THEN 
    (* Do something *) 

    StepComplete[1] := true; 
END_IF; 

IF ActiveStep[2] THEN 
    (* Do Something *) 
    StepComplete[2] := true; 
END_IF; 

(* etc *) 

Das Schöne an diesem Ansatz ist, dass Sie tatsächlich alle der Zustandsmaschine Code setzen können (einschließlich Sprünge, setzt usw.) in einem DFB, es testen und es dann ad acta legen, und dann benutzen Sie einfach den aktiven Schritt , Schritt abgeschlossen und alle anderen Eingaben, die Sie benötigen.

Ihr Code wird immer noch einen ganzen Abschnitt der Logik ausführen, aber wenn Sie das wirklich vermeiden wollen, dann müssen Sie viele IF-Anweisungen verwenden, die die Lesbarkeit beeinträchtigen.

Hoffe, dass hilft.

0

Warum SFC nicht verwenden, erleichtert Ihnen in vielen Fällen das Leben, da es sich um die Sprache der State Machine handelt. Do Unterprogramm, warten Sie eine andere Bedingung .. rince und wiederholen. :)

Nicht nur für ST hängen, die anderen IEC-Sprachen sind besser in einigen anderen Aufgaben und halten die Sache so klar wie möglich. Es sollte nicht so viel "das ist mein Kuchen" -Mentalität auf den industriellen PLC-Programmierkreisen sein, wie es auf den vielen anderen Programmierfeldern ist, da Bewerbungszeitplan 40 Jahre sein kann und Sie das Unternehmen vor 20 Jahren zu besseren Jobs und Programmen verlassen haben fast immer Standort/Kunde oder zumindest Hardware-spezifisch.

http://www.automation.com/pdf_articles/IEC_Programming_Thayer_L.pdf