Aufzählungen / Enumerationen

Eine Enumeration oder Aufzählung ist ein benutzerdefinierter Datentyp, der sich aus einer kommaseparierten Reihe von Komponenten, auch Enumerationswerte genannt, zusammensetzt, um benutzerdefinierte Variablen zu deklarieren. Außerdem können Sie die Enumerationskomponenten wie konstante Variablen verwenden, deren Bezeichner <enumeration name>.<component name> global im Projekt bekannt sind.

Die Deklaration einer Enumeration nehmen Sie in einem DUT-Objekt vor, das Sie über den Befehl Hinzufügen > DUT im Kontextmenü des SPS-Projektbaums im Projekt anlegen.

Aufzählungen / Enumerationen 1:

Jede Enumeration, die Sie einem Projekt neu hinzufügen, erhält automatisch ein Attribut 'strict' und ein Attribut 'qualified only' in der Zeile oberhalb der TYPE-Deklaration. Die Attribute können auch explizit hinzugefügt oder entfernt werden.

Siehe auch:

Deklaration

Syntax

{attribute 'strict'} 
TYPE <enumeration name>:
(
    <component declaration>,
    <component declaration>
) <basic data type> := <default variable initialization>
;
END_TYPE

{attribute 'strict'}

Optional

Das Pragma bewirkt, dass eine strenge Typprüfung, so wie unten beschrieben, durchgeführt wird

Das Pragma ist optional, wird aber empfohlen.

<enumeration name>

Name der Enumeration, der im Code als Datentyp verwendet werden kann

Beispiel: E_ColorBasic

<component declaration>

Beliebig viele, aber mindestens zwei Komponenten

Die Werte der Komponenten werden automatisch initialisiert: Beginnend bei 0 werden die Werte fortlaufend um 1 inkrementiert. Sie können den einzelnen Komponenten aber auch explizit feste Initialwerte zuweisen.

Beispiel: eYellow := 1

<basic data type>

Optional

Sie können explizit einen der folgenden Basisdatentypen deklarieren:

UINT | SINT | USINT | DINT | UDINT | LINT | ULINT | BYTE | WORD | DWORD | LWORD

Falls kein expliziter Basisdatentyp deklariert ist, wird automatisch der Basisdatentyp INT verwendet.

<default variable initialization>

Optional

Eine der Komponenten kann explizit als initiale Komponente deklariert werden. Falls keine explizite Initialisierung angegeben ist, wird automatisch mit der obersten Komponente initialisiert.

Beispiel

{attribute 'qualified_only'}
{attribute 'strict'}
TYPE E_ColorBasic :
(
    eRed,
    eYellow,
    eGreen := 10,
    eBlue,
    eBlack
) // Basic data type is INT, default initialization for all E_ColorBasic  variables is eYellow
;
END_TYPE

In dieser Deklaration erhalten die ersten beiden Komponenten die Standard-Initialisierungswerte: eRed = 0, eYellow = 1, der Initialisierungswert der dritten Komponente ist explizit anders definiert: eGreen = 10. Die nachfolgenden Komponenten erhalten wieder Standard-Initialisierungswerte: eBlue = 11, eBlack = 12.

Enumeration mit explizitem Basisdatentyp

Erweiterungen zur Norm IEC 61131-3

Der Basisdatentyp bei einer Enumerationsdeklaration ist standardmäßig INT. Sie können aber auch Enumerationen deklarieren, die explizit auf einen anderen ganzzahligen Datentypen basieren.

Beispiel: Enumeration mit Basisdatentyp DWORD

TYPE E_Color :
(
    eWhite  := 16#FFFFFF,
    eYellow := 16#FFFF00,
    eGreen  := 16#FF00FF,
    eBlue   := 16#0000FF,
    eBlack  := 16#000000
)DWORD := eBlack
; // Basic data type is DWORD, default initialization for all E_Color variables is eBlack
END_TYPE

Strikte Programmierregeln

Aufzählungen / Enumerationen 2:

Ab TwinCAT 3.1 Build 4026 wird beim Deklarieren einer Enumeration automatisch in der ersten Zeile das Pragma {attribute 'strict'} hinzugefügt.

Die strikten Programmierregeln werden mit Hinzufügen des Pragmas {attribute 'strict'} aktiviert.

Folgender Code wird dann als Compilerfehler eingestuft:

Arithmetischen Operationen können dazu führen, dass Enumerationskomponenten nicht deklarierte Werte zugewiesen werden. Ein besserer Programmierstil ist es, CASE-Anweisungen zu verwenden, um Komponentenwerte zu bearbeiten.

Deklaration und Initialisierung von Enumerationsvariablen

Syntax

<variable name> : <enumeration name> ( := <initialization>)? ;

Bei der Deklaration einer Enumerationsvariable mit benutzerdefiniertem Datentyp <enumeration name> kann diese mit einer Enumerationskomponenten initialisiert werden.

Beispiel

PROGRAM MAIN
VAR
    eColorCar  : E_Color;
    eColorTaxi : E_Color := E_Color.eYellow;
END_VAR

Die Variable eColorCar wird mit E_Color.eBlack initialisiert. Das ist die Standardinitialisierung für alle Enumerationsvariablen des Typs E_Color und so in der Typdeklaration festgelegt. Die Variable eColorTaxi hat eine eigene Initialisierung.

Wenn keine Initialisierungen angegeben sind, wird mit 0 initialisiert.

PROGRAM MAIN
VAR
    eColorFlower : E_ColorBasic;
    eColorTree   : E_ColorBasic := E_ColorBasic.eGreen;
END_VAR

Die Variable eColorFlower wird mit E_ColorBasic.eYellow initialisiert. Das ist die Standardinitialisierung für alle Enumerationsvariablen des Typs E_ColorBasic. Da in der Enumerationsdeklaration keine Komponente für die Initialisierung angegeben ist, wird automatisch mit der Komponente, die den Wert 0 hat, initialisiert. Das ist üblicherweise die erste der Enumerationskomponenten. Das kann aber auch eine andere Komponente sein, die nicht an erster Stelle steht, aber explizit mit 0 initialisiert wird.

Die Variable eColorTree hat eine explizite Initialisierung.

Wenn sowohl beim Typ als auch bei der Variable kein Wert angegeben ist, dann gilt folgende Regel: Wenn eine Enumeration einen Wert für 0 enthält, dann ist dieser Wert die Standardinitialisierung, wenn nicht, dann die erste Komponente in der Liste.

Beispiele

Initialisierung mit der 0-Komponente:

TYPE E_SampleA :
(
    e1 := 2,
    e2 := 0,
    e3
);
END_TYPE
PROGRAM MAIN
VAR
    eSampleA  : E_SampleA;
END_VAR

Die Variable eSampleA wird mit E_SampleA.e2 initialisiert.

Initialisierung mit der ersten Komponente:

TYPE E_SampleB :
(
    e1 := 3,
    e2 := 1,
    e3
);
END_TYPE
PROGRAM MAIN
VAR
    eSampleB  : E_SampleB;
END_VAR

Die Variable eSampleB wird mit E_SampleB.e1 initialisiert.

Eindeutiger Zugriff auf Enumerationskomponenten

Erweiterungen zur Norm IEC 61131-3

Die Enumerationskomponenten können auch als konstante Variablen mit dem Bezeichner <enumeration name>.<component name> verwendet werden. Enumerationskomponenten sind global im Projekt bekannt und der Zugriff auf sie ist eindeutig. Deshalb kann ein Komponentenname in unterschiedlichen Enumerationen verwendet werden.

Beispiel: Komponente blue

PROGRAM MAIN
VAR
    eFlower   : E_ColorBasic;
    eColorCar : E_Color;
END_VAR
// unambiguous identifiers although the component names are identical
eFlower   := E_ColorBasic.eBlue;
eColorCar := E_Color.eBlue;

// invalid code
eFlower   := eBlue;
eColorCar := eBlue;