Operatoren
TwinCAT 3 PLC unterstützt alle Operatoren der Norm IEC-61131-3. Diese Operatoren sind implizit überall im Projekt bekannt. Neben den IEC-Operatoren unterstützt TwinCAT 3 PLC auch einige Operatoren, die nicht in der Norm IEC 61131-3 beschrieben sind.
Operatoren werden in einem Baustein wie Funktionen benutzt.
Operationen mit Gleitkomma-Datentypen Bei Operationen mit Gleitkomma-Datentypen ist das Rechenergebnis abhängig von der verwendeten Zielsystem-Hardware. |
Operationen mit Über- oder Unterlauf Bei Operationen mit Überlauf oder Unterlauf im Datentyp ist das Rechenergebnis abhängig von der verwendeten Zielsystemhardware. |
Informationen zur Abarbeitungsreihenfolge (Bindungsstärke) der ST-Operatoren finden Sie im Abschnitt „ST-Ausdrücke“. |
Überlauf/Unterlauf im Datentyp
Der TwinCAT 3 Compiler generiert Code für das jeweilige Zielgerät und berechnet dabei Zwischenergebnisse immer mit der nativen Größe, die durch das Zielsystem vorgegeben ist. Beispielsweise wird auf den Systemen x86 und ARM mindestens mit 32 Bit Zwischenwerten gerechnet und auf x64-Systemen immer mit 64 Bit Zwischenwerten. Dies bietet deutliche Vorteile bei der Rechengeschwindigkeit und produziert häufig auch das erwartete Ergebnis. Dies bedeutet aber auch, dass ein Überlauf oder ein Unterlauf im Datentyp unter Umständen nicht abgeschnitten wird.
Beispiel 1
Das Ergebnis dieser Addition wird nicht abgeschnitten und das Ergebnis in dwVar ist 65536.
VAR
nVarWORD : WORD;
nVarDWORD : DWORD;
END_VAR
nVarWORD := 65535;
nVarDWORD := nVarWORD + 1;
Beispiel 2
Der Überlauf und Unterlauf im Datentyp wird nicht abgeschnitten und die Ergebnisse (bVar1, bVar2) beider Vergleiche sind auf einer 32 Bit und auf einer 64 Bit Hardware FALSE.
VAR
nVar1 : WORD;
nVar2 : WORD;
bVar1 : BOOL;
bVar2 : BOOL;
END_VAR
nVar1 := 65535;
nVar2 := 0;
bVar1 := (nVar1 + 1) = nVar2;
bVar2 := (nVar2 - 1) = nVar1;
Beispiel 3
Durch die Zuweisung auf nVar3 wird der Wert auf den Zieldatentyp WORD abgeschnitten und das Ergebnis bVar1 ist TRUE.
VAR
nVar1 : WORD;
nVar2 : WORD;
nVar3 : WORD;
bVar1 : BOOL;
END_VAR
nVar1 := 65535;
nVar2 := 0;
nVar3 := (nVar1 + 1);
bVar1 := (nVar3 = nVar2);
Beispiel 4
Um den Compiler zu einem Abschneiden des Zwischenergebnisses zu zwingen, kann eine Konvertierung eingefügt werden.
Durch die Typkonvertierung wird sichergestellt, dass beide Vergleiche nur 16 Bit vergleichen und die Ergebnisse (bVar1, bVar2) beider Vergleiche jeweils TRUE sind.
VAR
nVar1 : WORD;
nVar2 : WORD;
bVar1 : BOOL;
bVar2 : BOOL;
END_VAR
nVar1 := 65535;
nVar2 := 0;
bVar1 := (TO_WORD(nVar1 + 1) = nVar2);
bVar2 := (TO_WORD(nVar2 - 1) = nVar1);
Namensraumoperatoren
Die Namensraumoperatoren sind eine Erweiterung der IEC 61131-3 Operatoren. Sie bieten Ihnen Möglichkeiten, den Zugriff auf Variablen oder Module eindeutig zu gestalten, auch wenn Sie den gleichen Variablen- oder Modulnamen im Projekt mehrmals verwenden.
Typkonvertierungsoperatoren
Bei Typkonvertierungen wird zwischen impliziten und expliziten Typkonvertierungen unterschieden.
Implizite Typkonvertierungen
Konvertierungen von einem „kleineren“ Typ auf einen „größeren“ Typ, wie beispielsweise von BYTE nach INT oder von WORD nach DINT, können explizit durchgeführt werden – sie sind aber auch implizit ohne den Aufruf eines Konvertierungsoperators möglich.
Explizite Typkonvertierungen
Sie können explizit Typkonvertierungsoperatoren aufrufen. Für getypte Konvertierungen von einem elementaren Typ in einen anderen elementaren Typ und auch für Überladungen stehen die unten beschriebenen Typkonvertierungsoperatoren zur Verfügung.
Getypte Konvertierung:
<elementary data type>_TO_<another elementary data type>
Überladene Konvertierung:
TO_<elementary data type>
Elementare Datentypen:
<elementary data type> =
__UXINT | __XINT | __XWORD | BIT | BOOL | BYTE | DATE | DINT | DT | DWORD | INT | LDATE | LDT | LINT | LREAL | LTIME | LTOD | LWORD | REAL | SINT | TIME | TOD | UDINT | UINT | ULINT | USINT | WORD
Die Schlüsselwörter TIME_OF_DAY und DATE_AND_TIME sind alternative Schreibweisen für die Datentypen TOD und DT.
- TIME_OF_DAY = TOD
- DATE_AND_TIME = DT
TIME_OF_DAY und DATE_AND_TIME werden nicht als Typkonvertierungsbefehl abgebildet. Verwenden Sie stattdessen die Datentypen TOD und DT.
Undefiniertes Ergebnis bei Überschreitung des Wertebereichs Wenn der Eingangswert eines Typkonvertierungsoperators außerhalb des Wertebereichs des Ausgangsdatentyps liegt, ist das Ergebnis der Operation nicht definiert und abhängig von der Plattform. Dies ist beispielsweise der Fall, wenn ein negativer Operandenwert von LREAL in den Zieldatentyp UINT konvertiert wird. Auch ein Ausnahmefehler ist dann möglich! |
Informationsverlust möglich Wenn ein größerer Datentyp in einen kleineren Datentyp konvertiert wird, können Informationen verloren gehen. |
Stringmanipulation bei Konvertierung nach STRING oder WSTRING Bei einer Typkonvertierung nach STRING oder WSTRING wird der getypte Wert als Zeichenfolge linksbündig abgelegt und bei Überlänge abgeschnitten. Deklarieren Sie deshalb die Rückgabevariablen für die Typkonvertierungsoperatoren <type>_TO_STRING und <type>_TO_WSTRING ausreichend lang, sodass die Zeichenfolge ohne Manipulation Platz findet. |
Vergleichsoperatoren
Die Vergleichsoperatoren sind boolesche Operatoren, die jeweils zwei Eingänge (erster und zweiter Operand) miteinander vergleichen.