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 „Objekt hinzufügen“ im Projekt angelegt haben.
Deklaration
Syntax
( {attribute 'strict'} )? // Pragma optional but recommended TYPE <enumeration name> : ( <first component deklaration>, ( <component declaration> ,)+ <last component deklaration> )( <basic data type> )? ( := <default variable initialization> )? ; END_TYPE ( ... )? : Optional <component declaration> : <component name> ( := <component initialization> )? <basic data type> : INT | UINT | SINT | USINT | DINT | UDINT | LINT | ULINT | BYTE | WORD | DWORD | LWORD <variable initialization> : <one of the component names>
In einer Enumerationsdeklaration sind üblicherweise wenigstens 2 Komponenten deklariert,
Sie können jedoch beliebig viele deklarieren. Jeder einzelnen Komponente kann eine
eigene Initialisierung zugewiesen werden. Enumerationen haben automatisch den
Basisdatentypen INT
, Sie können aber einen anderen Basisdatentypen angeben. Außerdem können Sie in der
Deklaration eine Komponente angeben, mit der eine Enumerationsvariable dann initialisiert
wird.
Das Pragma {attribute 'strict'}
bewirkt, dass eine strenge Typprüfung, so wie unten beschrieben, durchgeführt wird.
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.
<basic data type> : INT | UINT | SINT | USINT | DINT | UDINT | LINT | ULINT | BYTE
| WORD | DWORD | LWORD
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




HINWEIS

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 benutzerdefiniertem Datentyp <enumeration name>
kann diese mit einer Enumerationskomponenten initialisiert werden.
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
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.
Beisiel
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
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;
Siehe auch