Standarddatentypen

 

Standarddatentypen

Überblick

EcoStruxure Machine Expert unterstützt alle in der Norm IEC61131-3 beschriebenen Datentypen.

In diesem Kapitel werden die folgenden Datentypen beschrieben:

oBOOL

oINTEGER

oREAL / LREAL

oSTRING

oWSTRING

oZeitdatentypen (LTIME)

oANY und ANY_<type>

Beachten Sie, dass es auch einige, die Norm erweiternde Datentypen gibt, und dass Sie auch Ihre eigenen benutzerdefinierten Datentypen definieren können.

BOOL

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).

Integer

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).

REAL / LREAL

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).

STRING

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).

WSTRING

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

oSTRING Konstanten (Operanden)

Zeitdatentypen

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:

oDatentypen

oTIME - Konstanten

oDATE - Konstanten

oDATE_AND_TIME - Konstanten

oTIME_OF_DAY - Konstanten

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).

ANY / ANY_<type>

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.