ST-Ausdrücke

Ein Ausdruck ist ein Konstrukt, das nach seiner Auswertung einen Wert zurück liefert.

Ausdrücke sind zusammengesetzt aus Operatoren und Operanden. Ein Operand kann eine Konstante, eine Variable, ein Funktionsaufruf oder ein weiterer Ausdruck sein.

Bespiele:

2014

(* Konstante *)

nVar

(* Variable *)

F_Fct(a,b)

(* Funktionsaufruf *)

(x*y)/z

(* Ausdruck *)

Siehe auch:

Auswertung von Ausdrücken

Die Auswertung eines Ausdrucks erfolgt durch Abarbeitung der Operatoren nach bestimmten Bindungsregeln. TwinCAT arbeitet den Operator mit der stärksten Bindung zuerst ab. Operatoren mit gleicher Bindungsstärke werden von links nach rechts abgearbeitet.

Operation

Symbol

Bindungsstärke

Einklammern

(Ausdruck)

Stärkste Bindung

Funktionsaufruf

Funktionsname (Parameterliste)

alle Operatoren mit Syntax: <operator> ()

 

Potenzieren

EXPT

 

Negieren

Komplementbildung

-

NOT

 

Multiplizieren

Dividieren

Modulo

*

/

MOD

 

Addieren

Subtrahieren

+

-

 

Vergleichen

<,>,<=,>=

 

Gleichheit

Ungleichheit

=

<>

 

Bool AND

AND
AND_THEN

 

Bool XOR

Bool OR

XOR

OR
OR_ELSE

Schwächste Bindung

 

Beispiel:

Im folgenden Beispiel werden die Operatoren AND_THEN und OR verwendet. Zu beachten ist, dass OR die schwächste Bindung hat und dass TwinCAT die Ausdrücke an weiteren Operanden des AND_THEN-Operators nur ausführt, wenn der erste Operand des AND_THEN-Operators TRUE ist.

Daher ergibt sich bei den vier dargestellten Ausdrücken folgendes:

 

PROGRAM MAIN
VAR
    pSample    : POINTER TO INT;
    bTest      : BOOL := TRUE;
    nCounter1  : INT;
    nCounter2  : INT;
    nCounter3  : INT;
    nCounter4  : INT;
END_VAR
// Expression 1
IF (pSample <> 0) AND_THEN (pSample^ = 250) AND_THEN (pSample^ <> 300) OR bTest THEN
    nCounter1 := nCounter1 + 1;   // increasing if (pSample = 0) and (bTest = TRUE)
END_IF
 
// Expression 2
IF ((pSample <> 0) AND_THEN (pSample^ = 250) AND_THEN (pSample^ <> 300)) OR bTest THEN
    nCounter2 := nCounter2 + 1;   // increasing if (pSample = 0) and (bTest = TRUE)
END_IF
 
// Expression 3
IF (pSample <> 0) AND_THEN ((pSample^ = 250) AND_THEN (pSample^ <> 300) OR bTest) THEN
    nCounter3 := nCounter3 + 1;   // not increasing if (pSample = 0) and (bTest = TRUE)
END_IF
 
// Expression 4
IF (pSample <> 0) AND_THEN ((pSample^ = 250) OR bTest) THEN
    nCounter4 := nCounter4 + 1;   // not increasing if (pSample = 0) and (bTest = TRUE)
END_IF