In den 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 einer Zuweisung befindet sich ein Operand (Variable, Adresse), dem der Wert des Ausdrucks auf der rechten Seite vom Zuweisungsoperator :=
zugewiesen wird.
Siehe auch die Beschreibung des MOVE
Operators mit derselben Funktion.
Ein Beispiel mit einer Zuweisung 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.
Set-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
während der Bearbeitung der Zuweisung TRUE ist.
Wenn b
während der Bearbeitung der Zuweisung FALSE ist, wird der Wert von a
nicht geändert.
Reset-Operator (Zurücksetzen) R=
Der Wert wird zurückgesetzt: Einmal auf FALSE gesetzt, bleibt er FALSE.
Beispiel
a R= b;
a
wird auf FALSE gesetzt, sobald b
= TRUE.
Beispiel
a S= b R= fun1(par1,par2)
In diesem Fall ist b
der Reset-Ausgangswert von fun1
. Aber a
erhält nicht den gesetzen Wert von b
, sondern den gesetzten Ausgangswert von fun1
.
Beachten Sie, dass eine Zuweisung als Ausdruck verwendet werden kann. Dies ist 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. Dann wird die Ergebnisvariable Q
der Variablen A
zugewiesen. Der Timer-Funktionsbaustein wird von TMR:TON;
instanziiert. Die resultierende Variable wird wie in IL (AWL) gemäß der Syntax <FB-Instanzname>.<FB-Variable> adressiert:
TMR(IN := %IX5, PT := 300);
A:=TMR.Q;
Für Ausgänge ist eine weitere Syntax verfügbar:
fb(in1:=myvar, out1=>myvar2);
RETURN
-Anweisung
Sie können die RETURN
-Anweisung zum Verlassen einer POU verwenden.
Syntax
RETURN;
Beispiel
IF b=TRUE THEN
RETURN;
END_IF;
a:=a+1;
Wenn b
TRUE ist, wird die Anweisung a:=a+1;
nicht ausgeführt. Daher wird die POU sofort verlassen.
IF
-Anweisung
Mit der IF
-Anweisung können Sie auf eine Bedingung prüfen und, abhängig von dieser Bedingung, 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 <boolean_expression1> den Wert TRUE ausgibt, werden nur die <IF_instructions> 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
Mit der CASE
-Anweisungen können Sie mehrere bedingte Anweisungen mit derselben 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 gemäß dem folgenden Modell verarbeitet:
Wenn die Variable in <Var1>
den Wert <Value I> hat, wird die Anweisung <instruction I> ausgeführt.
Wenn <Var 1>
keinen der angegebenen Werte aufweist, wird die <ELSE instruction> ausgeführt.
Wenn 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.
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 wiederholte Prozesse programmieren.
Syntax
INT_Var:INT;
FÜR <INT_Var> := <INIT_VALUE> TO <END_VALUE> {BY <step size>} DO
<instructions>
END_FOR;
Das Segment in geschweiften Klammern {} ist optional.
Die Anweisungen <instructions> werden ausgeführt, solange der Zähler <INT_Var>
nicht größer ist als der Endwert <END_VALUE>. Der Zähler wird geprüft, bevor die <instructions> ausgeführt werden, damit eine Ausführung unterbleibt, wenn der Anfangswert <INIT_VALUE> größer ist als der Endwert <END_VALUE>.
Wenn <instrucctions> ausgeführt werden, wird <INT_Var>
um die Schrittgröße <Step size> 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, wenn <INT_Var>
größer ist als der <END_VALUE>.
Beispiel
FOR Counter:=1 TO 5 BY 1 DO
Var1:=Var1*2;
END_FOR;
Erg:=Var1;
Angenommen, die Standardeinstellung für Var1
ist 1. Dann erhält die Variable den Wert 32 nach der FOR
-Schleife.
FOR
-Anweisung vorgegebenen Grenzen nie überschritten würden.
WARNUNG | |
---|---|
Sie können die CONTINUE
-Anweisung innerhalb einer FOR
-Schleife verwenden. Dies ist eine Erweiterung des IEC 61131-3-Standards.
WHILE
-Schleife
Eine Alternative zur FOR
-Schleife ist die WHILE
-Schleife, die die Schleife ausführt, wenn und solange eine boolesche Bedingung TRUE ist und bleibt. Wenn 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
<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
Sie können die CONTINUE
-Anweisung innerhalb einer WHILE
-Schleife verwenden.
REPEAT
-Schleife
Die REPEAT
-Schleife ist eine weitere Alternative zur FOR
-Schleife, wie zur WHILE
-Schleife. Die REPEAT
-Schleife unterscheidet sich von der WHILE
-Schleife dadurch, dass die Ausgangsbedingung erst am Ende der Schleife ausgewertet wird, nachdem die Schleife mindestens einmal ausgeführt wurde.
Syntax
REPEAT
<instructions>
UNTIL <boolean expression>
END_REPEAT;
Die Ausführung der Anweisungen <instructions> wird so lange wiederholt, bis der boolesche Ausdruck <boolean expression> TRUE lautet. Falls <boolean expression> bereits bei der ersten UNTIL-Auswertung TRUE lautet, werden die <instructions> nur einmal ausgeführt. Der boolesche Ausdruck <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;
Sie können die CONTINUE
-Anweisung innerhalb einer REPEAT
-Schleife verwenden. Dies ist eine Erweiterung des IEC 61131-3-Standards.
CONTINUE
-Anweisung
Als Erweiterung des IEC 61131-3-Standards wird die CONTINUE
-Anweisung innerhalb von FOR
-, WHILE
- und REPEAT
-Schleifen unterstützt. CONTINUE
löst die Fortsetzung der Ausführung mit dem nächsten Schleifenzyklus aus.
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 EXIT
-Anweisung beendet die FOR
-, WHILE
- oder REPEAT
-Schleife, in der sie sich befindet, ohne Berücksichtigung von Bedingungen.
JMP
-Anweisung
Sie können die JMP
-Anweisung für einen unbedingten Sprung in eine mit einer Sprungmarke gekennzeichnete Codezeile verwenden.
Syntax
JMP <label>;
Bei der Marke <label> handelt es sich um eine frei wählbare, aber eindeutige Kennzeichnung am Anfang einer Programmzeile. Die Anweisung JMP
muss von der Angabe des Sprungziels gefolgt sein, die einer vordefinierten Marke entsprechen muss.
WARNUNG | |
---|---|
Im Folgenden ist ein Beispiel für 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 mit 0 initialisierte Variable i
einen Wert kleiner als 10 hat, bewirkt die Sprunganweisung im obigen Beispiel einen wiederholten Rücksprung in die durch die Marke _label1
definierte Programmzeile. Daher löst sie eine wiederholte Verarbeitung der Anweisungen zwischen der Marke und der JMP
-Anweisung aus. Da diese Anweisungen auch das Inkrement der Variablen i
berücksichtigen, wird die Sprungbedingung (bei der neunten Prüfung) verletzt und der Programmfluss fortgesetzt.
Diese Funktion kann auch durch Verwendung einer WHILE
- oder REPEAT
-Schleife in diesem Beispiel erzielt werden. Im Allgemeinen verschlechtert sich durch die Verwendung von Sprunganweisungen die Lesbarkeit des Codes.
Sie können Kommentare an jeder beliebigen Stelle im Deklarations- oder Implementierungsteil des ST-Editors einfügen.
Es gibt zwei Möglichkeiten, Kommentare in ein strukturiertes Textobjekt zu schreiben:
Beginnen Sie den Kommentar mit (*
und beenden Sie ihn mit *)
. Auf diese Weise können Sie Kommentare einfügen, die sich über mehrere Zeilen erstrecken.
Beispiel: (*This is a comment.*)
Verwenden Sie einzeilige Kommentare als Erweiterung des IEC 61131-3-Standards. Die Kommentare werden auf zwei verschiedene Arten gekennzeichnet:
//
kennzeichnet den Anfang eines Kommentars, der mit dem Ende der Zeile endet.
Beispiel: // This is a comment.
///
kennzeichnet den Anfang eines Kommentars, der mit dem Ende der Zeile endet.
Beispiel: /// This is a comment.
Beispiel für Kommentare für Tooltips und POU-Dokumentationen:
A tooltip in the header of a POU is defined by the following comment:
// tooltip text – line 1
// tooltip text – line 2
// tooltip text – line 3
Afterwards the documentation is defined as follows:
/// reStructuredText
Für weitere Informationen zur Handhabung der beiden Kommentartypen bei der Erstellung der Bibliotheksdokumentation mit dem Tool CODESYS LibDoc Scripting Collection mit der LibDocContent-Eigenschaft siehe Bibliothekseigenschaften.
Verschachtelte Kommentare: Sie können Kommentare in anderen Kommentaren platzieren.
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 auf checked
folgende Klammer geschlossen, sondern nur durch die letzte Klammer.