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
| Optional Das Pragma bewirkt, dass eine strenge Typprüfung, so wie unten beschrieben, durchgeführt wird. Das Pragma ist optional, wird aber empfohlen. |
| Name der Enumeration, der im Code als Datentyp verwendet werden kann Beispiel: |
| 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: |
| Optional Sie können explizit einen der folgenden Basisdatentypen zuweisen:
Default: |
| 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. |
{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.
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.
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.
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.
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.
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.
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.