Skip to main content

Enumeration

Eine Enumeration oder Aufzählung ist ein benutzerdefinierter Datentyp, der sich aus einer kommaseparierten Liste von Komponenten (Enumerationswerte) zusammensetzt, um benutzerdefinierte Variablen zu deklarieren.

Die Deklaration einer Enumeration nehmen Sie in einem DUT-Objekt vor, das Sie über den Befehl Objekt hinzufügen im Projekt angelegt haben.

Im Applikationscode können Sie die Enumerationskomponenten wie konstante Variablen verwenden, deren Bezeichner <enumeration name>.<component name> global im Projekt bekannt sind.

Für weitere Informationen siehe: DUT

Deklaration

Syntax

{attribute 'strict'}

TYPE <ennumeration name> :

(

    <member name> := <value>

) <base data type> := <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: COLOR_BASIC

    <member name> := <initial value>

Beliebig viele, aber mindestens zwei Komponenten

Eine Enumeration ist eine durch Komma separierte Liste von Komponentennamen in runden Klammern. Die letzte Komponente vor der schließenden runden Klammer benötigt kein Komma. Alle Komponenten haben den gleichen Datentyp.

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

Beispiel: yellow := 1

<base data type>

Optional

Sie können explizit einen der folgenden Basisdatentypen zuweisen:

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

Default: INT

:= <initialization>

Optional

Eine der Komponenten kann explizit als initiale Komponente deklariert werden.

Default: Falls keine explizite Initialisierung angegeben ist, wird automatisch mit der obersten Komponente initialisiert.

Beispiel 227. Beispiel
{attribute 'qualified_only'}
{attribute 'strict'}
TYPE COLOR_BASIC :
(
    yellow,
    green,
    blue,
    black
) // Basic data type is INT, default initialization for all COLOR_BASIC variables is yellow
;
END_TYPE


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 228. Beispiel

Enumeration mit Basisdatentyp DWORD

TYPE COLOR :
(
        white := 16#FFFFFF00,
        yellow := 16#FFFFFF00,
        green := 16#FF00FF00,
        blue := 16#FF0000FF,
        black := 16#88000000
) DWORD := black
; // Basic data type is DWORD, default initialization for all COLOR variables is black
END_TYPE


Strikte Programmierregeln

Wichtig

Ab CODESYS V3.5 SP7 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:
  • Arithmetische Operationen mit Enumerationskomponenten

    Beispielsweise kann eine Enumerationsvariable nicht als Zählvariable in einer FOR-Schleife verwendet werden.

  • Zuweisung eines konstanten Werts, der nicht einem Enumerationswert entspricht, an eine Enumerationskomponente

  • Zuweisung einer nicht-konstanten Variablen, die einen anderen Datentyp als die Enumeration hat, an eine Enumerationskomponente

Arithmetischen Operationen können dazu führen, dass Enumerationskomponenten nicht deklarierte Werte zugewiesen werden. Ein besserer Programmierstil ist es, SWITCH- /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 der benutzerdefinierten Enumeration kann die Variable mit einer Enumerationskomponenten initialisiert werden.

Beispiel 229. Beispiel
PROGRAM PLC_PRG
VAR
    colorCar: COLOR;
    colorTaxi : COLOR := COLOR.yellow;
END_VAR

Die Variable colorCar wird mit COLOR.black initialisiert. Das ist die Standardinitialisierung für alle Enumerationsvariablen des Typs COLOR und so in der Typdeklaration festgelegt. Die Variable colorTaxi hat eine eigene Initialisierung.



Wenn keine Initialisierungen angegeben sind, wird mit 0 initialisiert.

Beispiel 230. Beispiel
PROGRAM PLC_PRG
VAR
    cbFlower : COLOR_BASIC;
    cbTree: COLOR_BASIC := COLOR_BASIC.green;
END_VAR

Die Variable cbFlower wird mit COLOR_BASIC.yellow initialisiert. Das ist die Standardinitialisierung für alle Enumerationsvariablen des Typs COLOR_BASIC. 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 cbTree 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.

Beispiel 231. Beispiel

Initialisierung mit der 0-Komponente

TYPE ENUM :
(
    e1 := 2,
    e2 := 0,
    e3
)
;
END_TYPE

PROGRAM PLC_PRG
VAR
    e : ENUM;
END_VAR

Die Variable e wird mit ENUM.e2 initialisiert.

Initialisierung mit der ersten Komponente

TYPE ENUM2 :
(
    e1 := 3,
    e2 := 1,
    e3
)
;
END_TYPE

PROGRAM PLC_PRG
VAR
    e2 : ENUM2;
END_VAR

Die Variable e2 wird mit ENUM.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 232. Beispiel

Komponente blue

PROGRAM PLC_PRG
VAR
    cbFlower : COLOR_BASIC;
    colorCar : COLOR;
END_VAR

(* unambiguous identifiers although the component names are identical *)
cbFlower := COLOR_BASIC.blue;
colorCar := COLOR.blue;

(* invalid code *)
cbFlower := blue;
colorCar := blue;


Für weitere Informationen siehe Enumerations-Namensraum.