枚举是一种用户定义的数据类型,由一系列逗号分隔的组件(枚举值)组成,用于声明用户定义的变量。此外,您还可以使用枚举组件(如常量),其标识符<enumeration name>.<component name>
可在项目中全局识别。
您可以在 DUT 对象中声明一个枚举,该对象已在项目中通过点击“Add Object” 创建。
声明
语法
( {attribute 'strict'} )? // Pragma optional but recommended TYPE <enumeration name> : ( <first component declaration>, ( <component declaration> ,)+ <last component declaration> )( <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>
在枚举声明中,通常至少要声明两个组件。不过,您可以随意申报。每个组件都可以分配自己的初始化。枚举自动具有基本数据类型INT
,但也可以指定其他基本数据类型。此外,您还可以在声明中指定一个组件,然后用该组件对枚举变量进行初始化。
pragma{attribute 'strict'}
会导致执行严格的类型测试,如下所述。
示例
{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
具有明确基本数据类型的枚举
扩展 IEC 61131-3 标准
枚举声明的基本数据类型默认为INT
。不过,您也可以声明明确基于另一种整数数据类型的枚举。
<basic data type> : INT | UINT | SINT | USINT | DINT | UDINT | LINT | ULINT | BYTE
| WORD | DWORD | LWORD
示例
基本数据类型为 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
严格的编程规则




注意

在CODESYS V3.5 SP7 及更高版本中,在声明枚举时,第一行会自动添加 pragma{attribute 'strict'}
。
添加 pragma{attribute 'strict'}
后,严格的编程规则就会被激活。
以下代码被视为编译器错误:
-
带枚举成分的算术运算
例如,枚举变量不能用作
FOR
循环中的计数变量。 -
将与枚举值不对应的常量值赋值给枚举部件
-
将另一种数据类型为枚举的非常量变量赋值给枚举组件
算术运算可能导致未声明的值被分配给枚举组件。更好的编程方式是使用SWITCH
/CASE
语句来处理元件值。
枚举变量的声明和初始化
语法
<variable name> : <enumeration name> ( := <initialization> )? ;
对于使用用户定义数据类型<enumeration name>
的枚举变量声明,可以使用枚举组件对其进行初始化。
示例
PROGRAM PLC_PRG VAR colorCar: COLOR; colorTaxi : COLOR := COLOR.yellow; END_VAR
变量colorCar
的初始化值为COLOR.black
。这是COLOR
类型的所有枚举变量的默认初始化,并在类型声明中这样定义。colorTaxi
变量有自己的初始化。
如果没有指定初始化,则初始化值为 0。
示例
PROGRAM PLC_PRG VAR cbFlower : COLOR_BASIC; cbTree: COLOR_BASIC := COLOR_BASIC.green; END_VAR
变量cbFlower
的初始化值为COLOR_BASIC.yellow
。这是所有COLOR_BASIC
类型枚举变量的默认初始化。由于枚举声明没有指定初始化组件,系统会自动使用值为 0 的组件进行初始化。这通常是枚举组件中的第一个。不过,它也可以是另一个不在第一位置但明确初始化为
0 的组件。
cbTree
变量有明确的初始化。
如果类型和变量都没有指定值,则适用以下规则:如果枚举包含 0 的值,则该值为默认初始化值;如果不包含 0 的值,则该值为列表中的第一个组件。
示例
用 0 分量进行初始化
TYPE ENUM : ( e1 := 2, e2 := 0, e3 ) ; END_TYPE PROGRAM PLC_PRG VAR e : ENUM; END_VAR
变量e
的初始化值为ENUM.e2
。
第一个组件的初始化
TYPE ENUM2 : ( e1 := 3, e2 := 1, e3 ) ; END_TYPE PROGRAM PLC_PRG VAR e2 : ENUM2; END_VAR
变量e2
的初始化值为ENUM.e1
。
访问枚举组件的唯一途径
扩展 IEC 61131-3 标准
枚举成分也可以作为常量变量使用,其标识符为<enumeration name>.<component name>
。枚举组件在项目中是全球公认的,对它们的访问是唯一的。因此,一个组件名称可以在不同的枚举中使用。
示例
组件 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;