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 |
|
Bool XOR Bool OR | XOR OR | 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:
- Bei keinem der vier Ausdrücke wird der Zeiger „pSample“ dereferenziert. Hintergrund ist, dass der AND_THEN-Operator verwendet wird und die Dereferenzierung an den weiteren Operanden des AND_THEN-Operators stattfinden würde. Da aber bereits der erste Operand des AND_THEN-Operators FALSE liefert (da „pSample“ den Wert 0 hat), werden die weiteren AND_THEN-Operanden und damit die Zeiger-Dereferenzierungen nicht ausgeführt.
Aufgrund der Verwendung des AND_THEN-Operators wird somit eine Nullpointer-Exception zur Laufzeit vermieden. Wenn anstelle des AND_THEN-Operators der AND-Operator verwendet werden würde, würde innerhalb der Operanden der Zeiger „pSample“ als Nullpointer dereferenziert, was eine Nullpointer-Exception zur Folge hätte. - Bei den Ausdrücken 1 und 2 folgt OR als weiterer Operator hinter den AND_THENs. Daher inkrementieren die Zähler „nCounter1“ und „nCounter2“, wenn „pSample“ 0 und „bTest“ TRUE ist. Die Kurzform der Ausdrücke lautet „IF <FALSE> OR TRUE THEN“, welche TRUE liefert.
- Bei den Ausdrücken 3 und 4 hingegen inkrementieren „nCounter3“ und „nCounter4“ nicht, wenn „pSample“ 0 und „bTest“ TRUE ist, da bereits der erste Operand „pSample <> 0“ FALSE liefert. Aufgrund des AND_THEN und der Klammerung werden keine weiteren Operanden oder Operatoren überprüft. Die Kurzform der Ausdrücke lautet „IF <FALSE> AND_THEN <…>“, welche FALSE liefert.
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