In Anweisungen wird festgelegt, wie mit den vorliegenden Ausdrücken verfahren wird.
In ST können die folgenden Anweisungen verwendet werden:
Anweisung |
Beispiel |
---|---|
A:=B; CV := CV + 1; C:=SIN(X); |
|
Aufruf eines Funktionsbausteins und Verwendung des Funktionsbausteinausgangs |
CMD_TMR(IN := %IX5, PT := 300); |
RETURN; |
|
D:=B*B; |
|
CASE INT1 OF |
|
J:=101; |
|
J:=1; |
|
J:=-1; |
|
EXIT; |
|
CONTINUE; |
|
label1: i:=i+1; |
|
leere Anweisung |
; |
Standardzuweisung
Auf der linken Seite der Zuweisung befindet sich ein Operand (Variable, Adresse), dem der Wert des Ausdrucks auf der rechten Seite vom Zuweisungsoperator := zugewiesen wird.
Weitere Informationen finden Sie auch unter der Beschreibung des OperatorsMOVE , der die gleiche Funktion hat.
Ein Beispiel mit einem Aufruf finden Sie im Abschnitt Beispiel für einen Aufruf mit Zuweisungen des Kapitels Aufrufen eines Funktionsbausteins .
Beispiel
a:= b;
a ruft den Wert von b ab.
Operator setzen S=
Der Wert wird gesetzt: Einmal auf TRUE gesetzt, bleibt er TRUE.
Beispiel
a S= b;
a wird auf TRUE gesetzt, wenn b bei der Verarbeitung der Zuweisung den Wert TRUE aufweist.
Wenn b bei der Zuweisungsverarbeitung auf FALSE steht, wird der Wert von a nicht geändert.
Operator zurücksetzen R=
Der Wert wird zurückgesetzt: Einmal auf FALSE gesetzt, bleibt er FALSE.
Beispiel
a R= b;
a nimmt den Wert FALSE an, sobald Folgendes gilt: b = TRUE.
HINWEIS: Falls mehrere Zuweisungen vorhanden sind, beziehen sich die Set- und Reset-Zuweisungen auf das letzte Element der Zuweisung.
Beispiel
a S= b R= fun1(par1,par2)
In diesem Fall ist b der Reset-Ausgabewert von fun1. Allerdings übernimmt a nicht den Set-Wert von b, sondern den Set-Ausgabewert von fun1.
Beachten Sie, dass eine Zuweisung als Ausdruck verwendet werden kann. Hierbei handelt es sich um eine Erweiterung des IEC 61131-3-Standards.
Zuweisungsoperator REF
Dieser Operator generiert einen Verweis auf einen Wert.
Syntax
REF= <variable>
Beispiel
A : REFERENCE TO DUT;
B : DUT;
C : DUT;
A REF= B; // corresponds to A := ADR(B);
A := C; // corresponds to A^ := C;
Aufrufen von Funktionsbausteinen in ST
Ein Funktionsbaustein (FB) wird in ST (Strukturierter Text, Structured Text) gemäß der folgenden Syntax aufgerufen:
<Name der FB-Instanz>(FB-Eingangsvariable:=<Wert oder Adresse>|, <weitere FB-Eingangsvariable:=<Wert oder Adresse>|...weitere FB-Eingangsvariablen);
Beispiel
Im folgenden Beispiel wird ein Timer-Funktionsbaustein (TON) mit Zuweisungen für die Parameter IN und PT aufgerufen. Die resultierende Variable Q wird der Variablen A zugewiesen. Der Timer-Funktionsbaustein wird von TMR:TON; ; instanziiert. Die resultierende Variable wird wie in AWL gemäß der Syntax <FB-Instanzname> adressiert.<FB-Variable>:
TMR(IN := %IX5, PT := 300);
A:=TMR.Q;
Für Ausgaben ist eine weitere Syntax verfügbar:
fb(in1:=myvar, out1=>myvar2);
Mit der Anweisung RETURN können Sie eine POU verlassen.
Syntax
RETURN;
Beispiel
IF b=TRUE THEN
RETURN;
END_IF;
a:=a+1;
Falls b TRUE ist, wird Anweisung a:=a+1; nicht ausgeführt. Daher wird die POU sofort verlassen.
Mit der Anweisung IF können Sie prüfen, ob eine Bedingung erfüllt ist, und auf Grundlage dieser Bedingung bestimmte Anweisungen ausführen.
Syntax
IF <boolean_expression1> THEN
<IF_instructions>
{ELSIF <boolean_expression2> THEN
<ELSIF_instructions1>
..
..
ELSIF <boolean_expression n> THEN
<ELSIF_instructions-1>
ELSE
<ELSE_instructions>}
END_IF;
Das Segment in geschweiften Klammern {} ist optional.
Falls <boolescher_Ausdruck1> den Wert TRUE ausgibt, werden nur die <IF-Anweisungen> und keine anderen Anweisungen ausgeführt. Ansonsten werden die booleschen Ausdrücke ab <boolescher_Ausdruck2> nacheinander geprüft, bis ein Ausdruck den Wert TRUE ausgibt. Anschließend werden nur die Anweisungen nach diesem booleschen Ausdruck und vor dem nächsten ELSE- bzw. ELSIF-Element ausgeführt. Wenn keiner der booleschen Ausdrücke den Wert TRUE ausgibt, werden nur die <ELSE-Anweisungen> ausgeführt.
Beispiel
IF temp<17
THEN heating_on := TRUE;
ELSE heating_on := FALSE;
END_IF;
In diesem Fall wird die Heizung angestellt, sobald die Temperatur unter 17 Grad sinkt. Ansonsten bleibt die Heizung aus.
Bei der Anweisung CASE können Sie mehrere bedingte Anweisungen mit der gleichen Bedingungsvariablen in einem Konstrukt kombinieren.
Syntax
CASE <Var1> OF
<value1>: <instruction 1>
<value2>: <instruction 2>
<value3, value4, value5>: <instruction 3>
<value6..value10>: <instruction4>
..
..
<value n>: <instruction n>
ELSE <ELSE instruction>
END_CASE;
Eine CASE-Anweisung wird nach dem folgenden Modell verarbeitet:
oFalls die Variable in <Var1> den Wert <Wert_I> aufweist, wird die Anweisung <Anweisung_I> ausgeführt.
oFalls <Var 1> keinen der angegebenen Werte aufweist, wird die <ELSE-Anweisung> ausgeführt.
oWenn bei mehreren Variablenwerten die gleiche Anweisung ausgeführt werden soll, können Sie diese Werte nacheinander durch Kommas getrennt festlegen und damit die Bedingung für die gemeinsame Ausführung festlegen.
oFalls die gleiche Anweisung für einen Wertebereich einer Variablen ausgeführt werden sollen, können Sie den Anfangs- und den Endwert durch zwei Punkte voneinander getrennt erfassen. Damit legen Sie die gemeinsame Bedingung fest.
Beispiel
CASE INT1 OF
1, 5: BOOL1 := TRUE;
BOOL3 := FALSE;
2: BOOL2 := FALSE;
BOOL3 := TRUE;
10..20: BOOL1 := TRUE;
BOOL3:= TRUE;
ELSE
BOOL1 := NOT BOOL1;
BOOL2 := BOOL1 OR BOOL2;
END_CASE;
Mit der FOR-Schleife können Sie wiederholt durchzuführende Prozesse programmieren.
Syntax
INT_Var:INT;
FOR <INT_Var> := <INIT_VALUE> TO <END_VALUE> {BY <step size>} DO
<Anweisungen>
END_FOR;
Das Segment in geschweiften Klammern {} ist optional.
Die <Anweisungen> werden ausgeführt, solange der Zähler <INT_Var> nicht größer als der <ENDWERT> ist. Der Zähler wird geprüft, bevor die <Anweisungen> ausgeführt werden, damit eine Ausführung unterbleibt, wenn der <ANFANGSWERT> größer als der <ENDWERT> ist.
Wenn <Anweisungen> ausgeführt werden, wird <INT_Var> um den unter <Schrittgröße> festgelegten Wert erhöht. Als Schrittgröße kann ein beliebiger ganzzahliger Wert festgelegt werden. Wird kein Wert angegeben, wird automatisch der Wert 1 festgelegt. Die Schleife wird beendet, sobald <INT_Var> größer als der <ENDWERT> ist.
Beispiel
FOR Counter:=1 TO 5 BY 1 DO
Var1:=Var1*2;
END_FOR;
Erg:=Var1;
Angenommen, die Standardeinstellung von Var1 lautet 1. In diesem Fall hat der Zähler nach dem Durchlaufen der FOR-Schleife den Wert 32.
HINWEIS: Falls <ENDWERT> dem Grenzwert für den Datentyp der Variablen <INT_Var> (dem Zähler im Beispiel oben) entspricht, entsteht eine Endlosschleife. Falls es sich beim Zähler beispielsweise um eine Variable vom Typ SINT handelt und der <ENDWERT> 127 lautet (der höchste positive Wert einer Variablen vom Typ SINT), kann die Schleife nicht beendet werden, da die Variable durch Addition einer 1 in einen negativen Wert umgewandelt würde. In diesem Fall würde der für die FOR-Anweisung festgelegte Grenzwert nie erreicht.
|
ENDLOSSCHLEIFE FÜHRT ZU UNBEABSICHTIGTEM BETRIEBSZUSTAND |
Achten Sie darauf, dass der in FOR-Anweisungen verwendete Variablentyp über eine ausreichende Kapazität (hohe Obergrenze) für <ENDWERT> + 1 verfügt. |
Die Nichtbeachtung dieser Anweisungen kann Tod, schwere Verletzungen oder Sachschäden zur Folge haben. |
Die Anweisung CONTINUE kann in einer FOR-Schleife verwendet werden. Hierbei handelt es sich um eine Erweiterung des IEC 61131-3-Standards.
Eine Alternative zur FOR-Schleife ist die WHILE-Schleife, die ausgeführt wird, falls und solange eine boolesche Bedingung TRUE ist. Falls die Bedingung ursprünglich nicht TRUE ist, wird die Schleife nicht ausgeführt. Wenn die Bedingung ursprünglich TRUE war und zwischenzeitlich den Wert FALSE annimmt, wird die Schleifenausführung beendet.
Syntax
WHILE <boolean expression> DO
<Anweisungen>
END_WHILE;
Der Wert des booleschen Ausdrucks muss sich zu irgendeinem Zeitpunkt während der Ausführung der Schleifenanweisungen in FALSE ändern. Ansonsten wird die Schleife niemals beendet, d. h., in diesem Fall wäre die Bedingung für eine Endlosschleife gegeben.
|
ENDLOSSCHLEIFE FÜHRT ZU UNBEABSICHTIGTEM BETRIEBSZUSTAND |
Achten Sie darauf, dass sich die WHILE-Schleife bei der Ausführung der Schleifenanweisungen beenden lässt (d. h., dass der boolesche Ausdruck den Wert FALSE annehmen kann). |
Die Nichtbeachtung dieser Anweisungen kann Tod, schwere Verletzungen oder Sachschäden zur Folge haben. |
Im folgenden Beispiel führt die Anweisung in der Schleife dazu, dass die Schleife beendet wird:
WHILE Counter>0 DO
Var1 := Var1*2;
Counter := Counter-1;
END_WHILE
Die Anweisung REPEAT wurde noch nicht vorgestellt. Diese wird im folgenden Absatz (mit Änderungen) erläutert.
Die Anweisung CONTINUE kann in einer WHILE-Schleife verwendet werden.
Die REPEAT-Schleife ist eine weitere Alternative zur FOR-Schleife und zur WHILE-Schleife. Die REPEAT-Schleife unterscheidet sich insofern von der WHILE-Schleife, als die Bedingung zur Beendigung der Schleife erst am Ende überprüft wird, d. h., nachdem die Schleifenanweisung mindestens einmal ausgeführt wurde.
Syntax
REPEAT
<Anweisungen>
UNTIL <boolean expression>
END_REPEAT;
Die Ausführung der <Anweisungen> wird so lange wiederholt, bis der <boolesche Ausdruck> TRUE lautet. Falls der <boolesche Ausdruck> bereits bei der ersten UNTIL-Prüfung TRUE lautet, werden die <Anweisungen> nur einmal ausgeführt. Der <boolesche Ausdruck> muss zu irgendeinem Zeitpunkt bei Ausführung der Schleifenanweisungen den Wert TRUE annehmen. Ansonsten wird die Schleife niemals beendet, d. h., in diesem Fall wäre die Bedingung für eine Endlosschleife gegeben.
|
ENDLOSSCHLEIFE FÜHRT ZU UNBEABSICHTIGTEM BETRIEBSZUSTAND |
Achten Sie darauf, dass sich die REPEAT-Schleife bei der Ausführung der Schleifenanweisungen beenden lässt (d. h., dass der boolesche Ausdruck den Wert TRUE annehmen kann). |
Die Nichtbeachtung dieser Anweisungen kann Tod, schwere Verletzungen oder Sachschäden zur Folge haben. |
Im folgenden Beispiel führt die Anweisung in der Schleife dazu, dass die Schleife beendet wird:
REPEAT
Var1 := Var1*2;
Counter := Counter-1;
UNTIL
Counter=0
END_REPEAT;
Die Anweisung CONTINUE kann in einer REPEAT-Schleife verwendet werden. Hierbei handelt es sich um eine Erweiterung des IEC 61131-3-Standards.
Die WHILE- und die REPEAT-Schleife sind in gewissem Sinne mächtiger als die FOR-Schleife, da man nicht bereits vor der Ausführung der Schleife, die Anzahl der Schleifendurchläufe wissen muss. In manchen Fällen wird man also nur mit diesen beiden Schleifenarten arbeiten können. Wenn jedoch die Anzahl der Schleifendurchläufe klar ist, dann ist eine FOR-Schleife zu bevorzugen, da sie in den meisten Fällen keine endlosen Schleifen ermöglicht (siehe Warnmeldung zur FOR-Schleife in diesem Abschnitt).
Als Erweiterung des IEC 61131-3-Standards wird die Anweisung CONTINUE innerhalb der FOR-, WHILE- und REPEAT-Schleifen unterstützt. Mit der Anweisung CONTINUE wird die Ausführung mit dem nächsten Schleifenzyklus fortgesetzt.
Beispiel
FOR Counter:=1 TO 5 BY 1 DO
INT1:=INT1/2;
IF INT1=0 THEN
CONTINUE; (* to avoid division by zero *)
END_IF
Var1:=Var1/INT1; (* only executed, if INT1 is not "0" *)
END_FOR;
Erg:=Var1;
Die Anweisung EXIT sorgt für eine bedingungslose Beendigung der FOR-, WHILE- oder REPEAT-Schleife in der sie sich befindet.
Mit der Anweisung JMP können Sie ohne Bedingung in eine mit einer Sprungmarke gekennzeichnete Codezeile springen.
Syntax
JMP <Marke>;
Bei <Marke> handelt es sich um eine frei wählbare, aber eindeutige Kennzeichnung am Anfang einer Programmzeile. Auf die Anweisung JMP muss der Verweis auf das Sprungziel, das einer vorab definierten Marke entsprechen muss, folgen.
|
ENDLOSSCHLEIFE FÜHRT ZU UNBEABSICHTIGTEM BETRIEBSZUSTAND |
Achten Sie darauf, dass die Verwendung der Anweisung JMP an eine Bedingung geknüpft ist, damit keine Endlosschleife entsteht. |
Die Nichtbeachtung dieser Anweisungen kann Tod, schwere Verletzungen oder Sachschäden zur Folge haben. |
Im Folgenden ist ein Beispiel von Anweisungen dargestellt, bei denen mit logischen Bedingungen Endlosschleifen zwischen dem Sprung und dem Ziel vermieden werden:
aaa:=0;
_label1: aaa:=aaa+1;
(*instructions*)
IF (aaa < 10) THEN
JMP _label1;
END_IF;
Solange die Variable i (mit dem anfänglichen Wert 0) einen Wert unter 10 aufweist, hat die Sprunganweisung aus dem Beispiel oben Auswirkungen auf die wiederholte Rückkehr zur in der Marke _label1 definierten Programmzeile. Aus diesem Grund wirkt sie sich auf die wiederholte Verarbeitung der Anweisungen zwischen der Marke und der JMP-Anweisung aus. Da diese Anweisungen auch den inkrementellen Wert der Variable i umfassen, wird die Sprungbedingung (bei der neunten Prüfung) nicht erfüllt, und der Programmfluss wird fortgesetzt.
Sie erreichen diese Funktionalität durch den Einsatz einer WHILE- bzw. REPEAT-Schleife im Beispiel. Im Allgemeinen verschlechtert sich durch die Verwendung von Sprunganweisungen die Lesbarkeit des Codes.
Kommentare können in einem ST-Objekt auf 2 Weisen eingefügt werden:
oFassen Sie den Kommentartext mit den Zeichen (* und *) ein. Auf diese Weise können Sie Kommentare einfügen, die sich über mehrere Zeilen erstrecken. Beispiel: (*Dies ist ein Kommentar.*)
oEinzeilige Kommentare als Erweiterung des IEC 61131-3-Standards: Der Kommentar beginnt mit den Zeichen // und endet mit dem Ende der Zeile. Beispiel: // Dies ist ein Kommentar.
Sie können Kommentare an beliebiger Stelle im Deklarations- bzw. Implementierungsteil des ST Editors einfügen.
Verschachtelte Kommentare: Es können Kommentare innerhalb von Kommentaren eingefügt werden.
Beispiel
(*
a:=inst.out; (* to be checked *)
b:=b+1;
*)
In diesem Beispiel wird der Kommentar, der mit der ersten Klammer beginnt, nicht durch die Klammer nach checked, sondern erst nach der letzten Klammer geschlossen.