EcoStruxure Machine Expert unterstützt alle von der Norm IEC61131-3 beschriebenen Datentypen.
In diesem Kapitel werden die folgenden Datentypen beschrieben:
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) haben. Es sind 8 Bits an Speicherplatz reserviert.
Weitere Informationen finden Sie im Kapitel BOOL Konstanten.
In der nachstehenden Tabelle sind die verfügbaren ganzzahligen Datentypen (Integer) 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 |
Weitere Informationen finden Sie in der Beschreibung der Zahlenkonstanten.
Zum Erstellen von IEC-Code, der für die verschiedenen Zielsysteme geeignet ist, verwenden Sie die zielunabhängigen Integer-Datentypen (Ganzzahlen) __UXINT, __XINT und __XWORD. Der Compiler konvertiert diese Datentypen in die entsprechenden Standarddatentypen, die vom Zielsystem unterstützt werden. Systeme mit Adressregistern von 32-Bit- und 64-Bit-Breite werden unterstützt.
Folgende Typkonvertierungsoperatoren stehen zur Verfügung:
Zielunabhängige Datentypen |
Auf 64-Bit-Plattformen |
Auf 32-Bit-Plattformen |
---|---|---|
__UXINT |
ULINT |
UDINT |
__XINT |
LINT |
DINT |
__XWORD |
LWORD |
DWORD |
Die Datentypen REAL und LREAL sind Gleitkommatypen. Sie stellen rationale Zahlen dar.
Kenndaten 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 |
Beispiel:
PROGRAM PLC_PRG
VAR
rMax: REAL := 3.402823E+38; // Largest number
rPosMin : REAL := 1.0E-44; // Smallest positive number
rNegMax: REAL := -1.0E-44; // Largest negative number
rMin: REAL := -3.402823E+38; // Smallest number
lrMax: LREAL := 1.7976931348623158E+308; // Largest number
lrPosMin : LREAL := 4.94065645841247E-324; // Smallest positve number
lNegMax: LREAL := -4.94065645841247E-324; // Largest negative number
lrMin: LREAL := -1.7976931348623158E+308; // Smallest number
END_VAR
Beim Zuweisen 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).
Mit EcoStruxure Machine Expert ab V2.2 kann der Datentyp STRING im Latin 1- oder UTF-8-Format codiert werden. Für eine projektweite Interpretation als UTF-8 aktivieren Sie den Parameter im Dialogfeld . Für weitere Informationen siehe Projektweite UTF-8-Codierung.
{attribute 'monitoring_encoding' := 'UTF-8'}
Pragma zur Deklaration einer Variablen hinzu. Es ermöglicht Ihnen die Überwachung des Inhalts der Variablen in UTF-8-Codierung.
Eine Variable vom Datentyp STRING kann eine beliebige Zeichenfolge enthalten. Die Größenangabe in der Deklaration bestimmt den Speicherplatz, der für die Variable reserviert wird. Sie verweist auf die Anzahl der Bytes in der Zeichenfolge und kann in runden Klammern oder eckigen Klammern stehen. Wenn keine Größe angegeben wird, wird die Standardgröße von 80 Bytes verwendet. Wenn eine Variable mit einer Zeichenfolge (String) initialisiert wird, der zu lang für den Datentyp der Variablen ist, wird die Zeichenfolge von rechts nach links entsprechend abgeschnitten.
Zeichenfolgenlänge:
Für die Latin 1-Codierung: Der für eine Variable vom Typ STRING erforderliche Speicherplatz ist 1 Byte pro Zeichen + 1 zusätzliches Byte. Das bedeutet, dass die "STRING[80]"
-Deklaration 81 Bytes benötigt.
Mit der UTF-8-Codierung kann ein Zeichen eine Länge von bis zu vier Bytes haben. Die Länge der Zeichenfolge gibt die Anzahl der Bytes an, die für die Zeichenfolge (STRING) reserviert sind. Somit besteht keine 1:1-Beziehung mehr zwischen der Zeichenzählung und der Zeichenfolgenlänge in Bytes.
Beispiel einer Zeichenfolgendeklaration mit 35 Bytes:
str:STRING(35):='This is a String';
Die Zeichenfolgenlänge ist im Allgemeinen nicht begrenzt. Wenn Sie Zeichenfolgenmanipulationen mit den Funktionen der Standard-Bibliothek ausführen, sind Zeichenfolgen bis zu einer Länge von 255 zulässig. Wenn Sie Zeichenfolgenmanipulationen mit den Funktionen der StringUtils-Bibliothek ausführen, sind auch längere Zeichenfolgen (> 255 Zeichen) zulässig.
Wenn eine Variable des Datentyps STRING durch Zurücksetzen der Anwendung neu initialisiert wird, werden die Inhalte der alten Zeichenfolge, die nach dem abschließenden Nullzeichen des Initialwerts vorhanden sind, nicht überschrieben. Dies gilt sowohl für die Initialisierung mit dem Initialisierungswert als auch für die Initialisierung mit dem Standardinitialisierungswert 0.
Weitere Informationen finden Sie unter WSTRING und STRING-Konstanten (Operanden).
Der Datentyp WSTRING unterscheidet sich vom Typ STRING (ASCII) durch Interpretation im Unicode-Format und benötigt zwei Bytes für jedes Zeichen und zwei Bytes zusätzlichen Speicherplatz für den Zeichenfolgenabschluss (jeweils nur ein Byte bei einem STRING).
WSTRING-Datentypen werden als Unicode im UTF-16-Format codiert.
Die Bibliothek standard64.lib bietet Funktionen für WSTRING-Zeichenfolgen.
Die Anzahl der Zeichen für WSTRING hängt von den enthaltenen Zeichen ab. Eine Größe von 10 für WSTRING bedeutet, dass die Länge des WSTRING maximal 10 WORDS umfassen kann. Für einige Zeichen in Unicode sind mehrere WORDS für die Codierung eines Zeichens erforderlich, sodass die Anzahl der Zeichen nicht der Länge des WSTRING (10 in diesem Fall) entsprechen muss. Der Datentyp erfordert ein WORD an zusätzlichem Speicher, da er mit 0
abgeschlossen wird.
Wenn keine Größe definiert ist, dann werden 80 WORDS plus eins für das Endzeichen 0
zugeordnet.
Beispiele:
wstr:WSTRING:="This is a WString";
wstr10 : WSTRING(10) := "1234567890";
Weitere Informationen finden Sie in den nachfolgenden Beschreibungen:
STRING-Konstanten (Operanden)
Die Datentypen TIME, TIME_OF_DAY (gekürzt TOD), DATE und DATE_AND_TIME (gekürzt DT) werden intern gehandhabt wie DWORD. Die Datentypen LDATE, LDATE_AND_TIME (LDT) und LTIME_OF_DAY (LTOD) werden intern gehandhabt wie LWORD. Die Zeit wird in TIME und TOD in Millisekunden angegeben. Die Zeit in TOD beginnt um 12:00 Uhr. Die Zeit wird in DATE und DT ab 1. Januar 1970, 12:00 Uhr in Sekunden angegeben.
LTIME wird als Zeitbasis für hochauflösende Timer unterstützt. LTIME weist eine Größe von 64 Bit und eine Auflösung in Nanosekunden auf.
Syntax von LTIME:
LTIME#<Zeitdeklaration>
Die Zeitdeklaration kann Zeiteinheiten enthalten, wie mit der TIME-Konstante verwendet und wie folgende:
us: Mikrosekunden
ns: Nanosekunden
Beispiel für LTIME:
LTIME1 := LTIME#1000d15h23m12s34ms2us44ns
Weitere Informationen finden Sie in den nachfolgenden Beschreibungen:
Wenn Sie eine Funktion implementieren und einen der Funktionseingänge (VAR_INPUT) über einen generischen IEC-Datentyp (ANY oder ANY_<type>)) verfügt, dann ist der Datentyp des Aufrufparameters nicht als eindeutig definiert. Variablen unterschiedlicher Datentypen können an diese Funktion übergeben werden. Der übergebene Wert kann zusammen mit dem Datentyp ü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 |
– |
BYTE, WORD, DWORD, LWORD |
ANY_DATE |
– |
DATE_AND_TIME, DATE, TIME_OF_DAY, LDATE_AND_TIME, LDATE, LTIME_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 vom Datentyp BYTE, WORD, DWORD oder LWORD als Parameter an die Funktion übergeben werden.
Vordefinierte Struktur:
Beim Kompilieren des Codes wird der Datentyp ANY 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
Siehe auch die Beschreibung des __VARINFO-Operators.