Anweisungen

Überblick

In Anweisungen wird festgelegt, wie mit den vorliegenden Ausdrücken verfahren wird.

In ST können die folgenden Anweisungen verwendet werden:

Anweisung

Beispiel

Zuweisung

A:=B; CV := CV + 1; C:=SIN(X);

Aufruf eines Funktionsbausteins und Verwendung des Funktionsbausteinausgangs

CMD_TMR(IN := %IX5, PT := 300);
A:=CMD_TMR.Q

RETURN

RETURN;

IF

D:=B*B;
IF D<0.0 THEN
C:=A;
ELSIF D=0.0 THEN
C:=B;
ELSE
C:=D;
END_IF;

CASE

CASE INT1 OF
1: BOOL1 := TRUE;
2: BOOL2 := TRUE;
ELSE
 BOOL1 := FALSE;
 BOOL2 := FALSE;
END_CASE;

FOR

J:=101;
FOR I:=1 TO 100 BY 2 DO
IF ARR[I] = 70 THEN
J:=I;
'EXIT;
END_IF;
END_FOR;

WHILE

J:=1;
WHILE J<= 100 AND ARR[J] <> 70 DO
J:=J+2;
END_WHILE;

REPEAT

J:=-1;
REPEAT
J:=J+2;
UNTIL J= 101 OR ARR[J] = 70
END_REPEAT;

EXIT

EXIT;

CONTINUE

CONTINUE;

JMP

label1: i:=i+1;
IF i=10 THEN
    JMP label2;
END_IF
JMP label1;
label2:

leere Anweisung

;

Zuweisungsoperatoren

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.

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

<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;

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);

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.

HINWEIS: Wenn <END_VALUE> dem Grenzwert für den Datentyp der Variablen <INT_Var> (dem Zähler im Beispiel oben) entspricht, entsteht eine Endlosschleife. Wenn es sich beim Zähler beispielsweise um eine Variable vom Typ SINT handelt und <END_VALUE> gleich 127 ist (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.
 WARNUNG
ENDLOSSCHLEIFE
Achten Sie darauf, dass der in FOR-Anweisungen verwendete Variablentyp über eine ausreichende Kapazität (hohe Obergrenze) für <END_VALUE> + 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.

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
ENDLOSSCHLEIFE
Achten Sie darauf, dass sich die WHILE-Schleife bei der Ausführung der Schleifenanweisungen beenden lässt, d. h. dass der boolesche Ausdruck, der die WHILE-Schleife steuert, 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 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
ENDLOSSCHLEIFE
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.

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
ENDLOSSCHLEIFE
Stellen Sie sicher, dass die Verwendung der JMP-Anweisung mit einer Bedingung verknüpft ist.
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 in ST

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.