In Anweisungen wird festgelegt, wie mit den vorliegenden Ausdrücken verfahren wird.
In ST können die folgenden Anweisungen verwendet werden:
Anweisung |
Beispiel |
---|---|
|
|
Aufruf eines Funktionsbausteins und Verwendung des Funktionsbausteinausgangs |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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
MOVE, 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.
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
<variable name> REF= <variablename> ;
Beispiel
refA : REFERENCE TO DUT;
B : DUT;
C : DUT;
A REF= B; // corresponds to A := ADR(B);
A := C; // corresponds to A^ := C;
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);
RETURN
-Anweisung
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.
IF
-Anweisung
Mit der Anweisung IF
können Sie prüfen, ob eine Bedingung erfüllt ist, und auf der 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 <boolean_expression2> 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_instructions> 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.
CASE
-Anweisung
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:
Falls die Variable in <Var1>
den Wert <valueI> aufweist, wird die Anweisung <instruction_I> ausgeführt.
Falls <Var 1>
keinen der angegebenen Werte aufweist, wird die <ELSE instruction> ausgeführt.
Wenn für mehrere 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.
Falls 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;
FOR
-Schleife
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
<instructions>
END_FOR;
Das Segment in geschweiften Klammern {} ist optional.
Die <instructions> werden ausgeführt, solange der Zähler <INT_Var>
nicht größer als der <END_VALUE> ist. Der Zähler wird geprüft, bevor die <instructions> ausgeführt werden, damit eine Ausführung unterbleibt, wenn der <INIT_VALUE> größer als der <END_VALUE> ist.
Wenn <instructions> ausgeführt werden, wird <INT_Var>
um den unter <step size> 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 <END_VALUE> 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.
FOR
-Anweisung festgelegte Grenzwert nie erreicht.
WARNUNG | |
---|---|
Die Anweisung CONTINUE
kann in einer FOR
-Schleife verwendet werden. Hierbei handelt es sich um eine Erweiterung des IEC 61131-3-Standards.
WHILE
-Schleife
Eine Alternative zur FOR
-Schleife ist die WHILE
-Schleife, die ausgeführt wird, wenn und solange eine boolesche Bedingung TRUE ist. Wenn die Bedingung ursprünglich nicht TRUE war, 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
<instructions>
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.
WARNUNG | |
---|---|
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 CONTINUE
kann in einer WHILE
-Schleife verwendet werden.
REPEAT
-Schleife
Die REPEAT
-Schleife ist eine weitere Alternative zur FOR
- wie 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
<instructions>
UNTIL <boolean expression>
END_REPEAT;
Die Ausführung der <instructions> wird so lange wiederholt, bis <boolean expression> TRUE lautet. Falls <boolean expression> bereits bei der ersten UNTIL-Prüfung TRUE lautet, werden die <instructions> nur einmal ausgeführt. <boolean expression> 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.
WARNUNG | |
---|---|
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.
CONTINUE
-Anweisung
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;
EXIT
-Anweisung
Die Anweisung EXIT
sorgt für eine bedingungslose Beendigung der FOR
-, WHILE
- oder REPEAT
-Schleife in der sie sich befindet.
JMP
-Anweisung
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.
WARNUNG | |
---|---|
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.
Für das Einfügen von Kommentaren in ein ST-Objekt stehen zwei Möglichkeiten zur Auswahl:
Fassen 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.*)
Einzeilige 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.