Anweisungen

Überblick

In den 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 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.

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

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

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 der Zähler (Counter) vom Typ SINT und der Endwert <END_VALUE> beispielsweise 127 ist (der maximal positive Wert für eine Variable vom Typ SINT), dann kann die Schleife nie beendet werden, da die Addition von 1 zu diesem Höchstwert dazu führen würde, dass die Variable negativ wird und damit die durch die FOR-Anweisung vorgegebenen Grenzen nie überschritten würden.
 WARNUNG
ENDLOSSCHLEIFE
Stellen Sie sicher, dass der in FOR-Anweisungen verwendete Variablentyp eine ausreichende Kapazität aufweist, um <END_VALUE> + 1 zu berücksichtigen.
Die Nichtbeachtung dieser Anweisungen kann Tod, schwere Verletzungen oder Sachschäden zur Folge haben.

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
ENDLOSSCHLEIFE
Stellen Sie sicher, dass die WHILE-Schleife innerhalb der Schleifenanweisungen beendet wird, indem eine FALSE-Bedingung des booleschen Ausdrucks erstellt wird, der die WHILE-Schleife steuert.
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

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
ENDLOSSCHLEIFE
Stellen Sie sicher, dass die REPEAT-Schleife innerhalb der Schleifenanweisungen beendet wird, indem eine TRUE-Bedingung des booleschen Ausdrucks erstellt wird.
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;

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
ENDLOSSCHLEIFE
Stellen Sie sicher, dass die Verwendung der JMP-Anweisung bedingt ist.
Die Nichtbeachtung dieser Anweisungen kann Tod, schwere Verletzungen oder Sachschäden zur Folge haben.

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.

Kommentare in ST

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.