EcoStruxure Machine Expert unterstützt alle in der Norm IEC61131-3 beschriebenen Datentypen.
In diesem Kapitel werden die folgenden Datentypen beschrieben:
oBOOL
Beachten Sie, dass es auch einige, die Norm erweiternde Datentypen gibt, und dass Sie auch Ihre eigenen benutzerdefinierten Datentypen definieren können.
Variablen vom Typ BOOL können die Werte TRUE (1) und FALSE (0) annehmen. Es werden 8 Speicherbits reserviert.
Weitere Information finden Sie im Kapitel BOOL-Konstanten.
HINWEIS: Zum Validieren der Konvertierung von Variablentypen können implizite Prüfungen durchgeführt werden (weitere Informationen hierzu finden Sie im Kapitel POUs für implizite Prüfungen).
In der nachstehenden Tabelle sind die verfügbaren ganzzahligen Datentypen aufgeführt. Jeder der verschiedenen Zahlentypen deckt einen anderen Wertebereich ab. Dabei gelten die folgenden Bereichsgrenzen.
Datentyp |
Unterer Grenzwert |
Oberer Grenzwert |
Speicherplatz |
---|---|---|---|
BYTE |
0 |
255 |
8 Bit |
WORD |
0 |
65.535 |
16 Bit |
DWORD |
0 |
4.294.967.295 |
32 Bit |
LWORD |
0 |
264-1 |
64 Bit |
SINT |
–128 |
127 |
8 Bit |
USINT |
0 |
255 |
8 Bit |
INT |
–32.768 |
32.767 |
16 Bit |
UINT |
0 |
65.535 |
16 Bit |
DINT |
–2.147.483.648 |
2.147.483.647 |
32 Bit |
UDINT |
0 |
4.294.967.295 |
32 Bit |
LINT |
–263 |
263-1 |
64 Bit |
ULINT |
0 |
264-1 |
64 Bit |
HINWEIS: Dadurch kann es passieren, dass bei der Typkonvertierung von größeren auf kleinere Typen Informationen verlorengehen.
Weitere Informationen finden Sie in der Beschreibung der Zahlenkonstanten.
HINWEIS: Zum Validieren der Konvertierung von Variablentypen können implizite Prüfungen verwendet werden (weitere Informationen hierzu finden Sie im Kapitel POUs für implizite Prüfungen).
Die Datentypen REAL und LREAL sind sogenannte Gleitkommatypen. Sie stellen rationale Zahlen dar.
Eigenschaften der Datentypen REAL und LREAL:
Datentyp |
Unterer Grenzwert |
Oberer Grenzwert |
Speicherplatz |
---|---|---|---|
REAL |
-3,402823e+38 |
3,402823e+38 |
32 Bit |
LREAL |
-1,7976931348623158e+308 |
1,7976931348623158e+308 |
64 Bit |
HINWEIS: Welche Datentypen von LREAL unterstützt werden, ist vom Zielgerät abhängig. Der zugehörigen Dokumentation können Sie entnehmen, ob der 64-Bit-Datentyp LREAL bei der Kompilierung in den Datentyp REAL konvertiert wird (evtl. mit Verlust von Informationen) oder erhalten bleibt.
HINWEIS: Wenn ein REAL oder LREAL in SINT, USINT, INT, UINT, DINT, UDINT, LINT oder ULINT konvertiert wird und der Wert der REAL/LREAL-Zahl außerhalb des Wertebereichs des Integers liegt, erhält man ein undefiniertes Ergebnis, das vom Zielsystem abhängt. Auch ein Ausnahmefehler ist dann möglich! Um zielsystemunabhängigen Code zu erhalten, müssen Wertebereichüberschreitungen über die Anwendung abgefangen werden. Wenn die REAL/LREAL-Zahl innerhalb des Bereichs liegt, arbeitet die Konvertierung auf allen Systemen gleich.
Bei der Zuweisung von i1 := r1; wird ein Fehler erkannt. Aus diesem Grund gilt der vorherige Hinweis, wenn sie einen der folgenden Konvertierungsoperatoren verwenden:
i1 := REAL_TO_INT(r1);
Weitere Informationen finden Sie unter REAL/LREAL-Konstanten (Operanden).
HINWEIS: Zum Validieren der Konvertierung von Variablentypen können implizite Prüfungen verwendet werden (weitere Informationen hierzu finden Sie im Kapitel POUs für implizite Prüfungen).
Eine Variable vom Datentyp STRING kann eine beliebige Zeichenkette aufnehmen. Die Größenangabe in der Deklaration bestimmt den Speicherplatz, der für die Variable reserviert wird. Sie verweist auf die Anzahl der Zeichen in der Zeichenkette und kann in runde oder eckige Klammern gesetzt werden. Ist keine Größe angegeben, so werden standardmäßig 80 Zeichen angenommen.
Die String-Länge ist im Allgemeinen nicht begrenzt. Allerdings können die String-Funktionen nur Längen von 1-255 Zeichen verarbeiten. Wenn eine Variable mit einem String initialisiert wird, der zu lang für den Datentyp der Variablen ist, wird der String von rechts nach links entsprechend abgeschnitten.
HINWEIS: Der für eine STRING-Variable benötigte Speicherplatz ist immer 1 Byte pro Zeichen + ein zusätzliches Byte. Das bedeutet, dass für die Deklaration "STRING[80]" 81 Byte erforderlich sind.
Beispiel einer String-Deklaration mit 35 Zeichen:
str:STRING(35):='This is a String';
Weitere Informationen finden Sie unter WSTRING und STRING-Konstanten (Operanden).
HINWEIS: Zum Validieren der Konvertierung von Variablentypen können implizite Prüfungen verwendet werden (weitere Informationen hierzu finden Sie im Kapitel POUs für implizite Prüfungen).
Der Datentyp WSTRING unterscheidet sich vom Typ STRING (ASCII) durch die Auslegung im Unicode-Format und benötigt zwei Bytes für jedes Zeichen und zwei Bytes zusätzlichen Speicherplatz (jeweils nur ein Byte im Falle eines STRING).
Die Bibliothek standard64.lib stellt Funktionen für WSTRING-Zeichenfolgen bereit.
Die Anzahl der Zeichen für den WSTRING ist von den enthaltenen Zeichen abhängig. Eine Größe von 10 für den WSTRING bedeutet, dass der WSTRING eine maximale Länge von 10 Wörtern (WORDS) annehmen kann. Für manche Zeichen im Unicode sind mehrere WORDS zur Codierung eines Zeichens erforderlich, sodass die Anzahl an Zeichen nicht unbedingt mit der Länge des WSTRING (10 in diesem Fall) übereinstimmt. Der Datentyp erfordert ein WORD zusätzlichen Speicher, da er mit einem 0 beendet wird.
Wenn keine Größe definiert wird, dann werden 80 WORDS plus 1 für das Endzeichen 0 zugewiesen.
Beispiele:
wstr:WSTRING:="This is a WString";
wstr10 : WSTRING(10) := "1234567890";
Weitere Informationen finden Sie in den nachfolgenden Beschreibungen:
oSTRING Konstanten (Operanden)
Die Datentypen TIME, TIME_OF_DAY (abgekürzt TOD), DATE und DATE_AND_TIME (abgekürzt DT) werden intern wie DWORD verwaltet. Die Zeit wird in TIME und TOD in Millisekunden angegeben. In TOD beginnt die Zeit bei 00:00 Uhr. Bei DATE und DT wird die Zeit in Sekunden angegeben, wobei ab dem 1. Januar 1970 ab 00:00 Uhr gerechnet wird.
LTIME
LTIME wird als Zeitbasis für hochauflösende Timer unterstützt. LTIME hat die Größe von 64 Bit und eine Auflösung bis zum Nanosekunden-Bereich.
Syntax von LTIME:
LTIME#<Zeitdeklaration>
Die Zeitdeklaration kann die Zeiteinheiten enthalten, die für die TIME-Konstante gelten, und zusätzlich:
ous: microseconds
ons: Nanosekunden
Beispiel von LTIME:
LTIME1 := LTIME#1000d15h23m12s34ms2us44ns
Verglichen mit dem Datentyp TIME mit einer Größe von 32 Bit und einer Auflösung in Millisekunden.
Weitere Informationen finden Sie in den nachfolgenden Beschreibungen:
HINWEIS: Zum Validieren der Konvertierung von Variablentypen können implizite Prüfungen verwendet werden (weitere Informationen hierzu finden Sie im Kapitel POUs für implizite Prüfungen).
Wenn Sie eine Funktion implementieren und einer der Funktionseingänge (VAR_INPUT) verfügt über einen generischen IEC Datentyp (ANY oder ANY_<type>), dann ist der Aufrufparameter nicht als einzigartig definiert. Variablen unterschiedlicher Datentypen können an diese Funktion übergeben werden. Der übergebene Wert kann zusammen mit dem Datentypen über eine vordefinierte Struktur innerhalb der Funktion abgefragt werden.
Generische IEC Datentypen, die die Verwendung elementarer Datentypen für Funktionseingänge ermöglichen:
Hierarchie generischer Datentypen |
Elementare Datentypen |
||
---|---|---|---|
ANY |
ANY_BIT |
– |
BOOL, BYTE, WORD, DWORD, LWORD |
ANY_DATE |
– |
DATE_AND_TIME, DATE, TIME_OF_DAY |
|
ANY_NUM |
ANY_REAL |
REAL, LREAL |
|
ANY_INT |
USINT, UINT, UDINT, ULINT SINT, INT, DINT, LINT |
||
ANY_STRING |
– |
STRING, WSTRING |
Beispiel:
FUNCTION ANYBIT_TO_BCD : DWORD
VAR_INPUT
value : ANY_BIT;
END_VAR
Wenn die Funktion ANYBIT_TO_BCD aufgerufen wird, kann eine Variable des Datentyps BOOL, BYTE, WORD, DWORD oder LWORD als Parameter an die Funktion übergeben werden.
Vordefinierte Struktur:
Beim Kompilieren des Codes wird ein ANY-Datentyp intern durch die folgende Struktur ersetzt:
TYPE AnyType :
STRUCT
// the type of the actual parameter
typeclass : __SYSTEM.TYPE_CLASS ;
// the pointer to the actual parameter
pvalue : POINTER TO BYTE;
// the size of the data, to which the pointer points
diSize : DINT;
END_STRUCT
END_TYPE
Der aktuelle Aufrufparameter weist die Strukturelemente während der Laufzeit zu.
Beispiel:
Dieses Codebeispiel vergleicht, ob die beiden übergebenen Variablen den gleichen Typ und den gleichen Wert aufweisen.
FUNCTION Generic_Compare : BOOL
VAR_INPUT
any1 : ANY;
any2 : ANY;
END_VAR
VAR
icount: DINT;
END_VAR
Generic_Compare := FALSE;
IF any1.typeclass <> any2.typeclass THEN
RETURN;
END_IF
IF any1.diSize <> any2.diSize THEN
RETURN;
END_IF
// Byte comparison
FOR icount := 0 TO any1.diSize-1 DO
IF any1.pvalue[iCount] <> any2.pvalue[iCount] THEN
RETURN;
END_IF
END_FOR
Generic_Compare := TRUE;
RETURN;
// END_FUNCTION
Lesen Sie außerdem die Beschreibung des __VARINFO Operatoren.