Standarddatentypen

Überblick

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.

BOOL

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.

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 (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

HINWEIS: Dadurch kann es passieren, dass bei der Typkonvertierung von größeren auf kleinere Typen Informationen verloren gehen.

Weitere Informationen finden Sie in der Beschreibung der Zahlenkonstanten.

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

Zielunabhängige Integer-Datentypen __UXINT, __XINT, __XWORD

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

REAL / LREAL

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
HINWEIS: Die Unterstützung von Datentypen LREAL ist vom Zielgerät abhängig. In der entsprechenden Dokumentation finden Sie Informationen dazu, ob der 64-Bit-Typ während der Kompilierung (möglicherweise mit einem Informationsverlust) LREAL in REAL konvertiert wird oder bestehen bleibt.
HINWEIS: Wenn ein REAL oder LREAL in SINT, USINT, INT, UINT, DINT, UDINT, LINT oder ULINT konvertiert wird und der Wert der Realzahl außerhalb des Wertebereichs der Ganzzahl liegt, ist das Ergebnis nicht definiert und vom Zielsystem abhängig. Auch ein Ausnahmefehler ist dann möglich! Um zielsystemunabhängigen Code zu erhalten, müssen Wertebereichüberschreitungen über die Anwendung gehandhabt werden. Wenn die REAL/LREAL-Zahl innerhalb des Integer-Wertebereichs liegt, funktioniert die Konvertierung in allen Systemen auf die gleiche Weise.

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

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

STRING

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 UTF8-Codierung für STRING im Dialogfeld Projekteinstellungen > Compiler-Optionen. Für weitere Informationen siehe Projektweite UTF-8-Codierung.

HINWEIS: Bevor Sie das Codierformat auf UTF-8 einstellen, führen Sie den Befehl Regel für statische Analyse SA0175 in Ihrem Code aus, um Konstrukte zu erkennen, die Probleme mit der UTF-8-Codierung verursachen können.
HINWEIS: Wenn Sie die UTF-8-Codierung verwenden, fügen Sie das {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).

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

WSTRING

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:

Datums- und Uhrzeit-Datentypen

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:

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

ANY / ANY_<type>

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.