.

枚举

.
.

枚举是由用户自定义的数据类型,由用于声明用户定义变量的一系列逗号分隔的组件(枚举值)组成。此外,你可以使用枚举组件,例如常量,其标识符<enumeration name>.<component name>在工程中被全局识别。

你可以在DUT对象中声明一个枚举,该对象已通过单击添加对象在工程中创建。

.
声明

.语法


( {attribute 'strict'} )? // 语法可选,但推荐
TYPE <枚举的名称> : 
(
    <第一个组件声明>,
    ( <组件声明> ,)+
    <最后一个组件声明>
)( <基本数据类型> )? ( := <默认的变量初始值> )? ; 
END_TYPE

( ...)? : 可选的
<组件声明> : <组件的名称> ( := <组件初始化> )?
<基本数据类型> : INT | UINT | SINT | USINT | DINT | UDINT | LINT | ULINT | BYTE | WORD | DWORD | LWORD
<变量初始化> : <组件名称之一> 
 

在枚举声明中,通常至少声明两个组件。但是,你可以声明任意多个。每个组件都可以分配自己的初始化。枚举自动具有INT的数据类型,但是你可以指定其他基本数据类型。此外,你可以在声明中指定一个组件,然后使用该组件初始化枚举变量。

用法{attribute 'strict'}导致执行严格类型测试,如下所述。

.

.例如


{attribute 'qualified_only'}
{attribute 'strict'}
TYPE COLOR_BASIC : 
(
    yellow,
    green,
    blue,
    black
) 
; // 基本数据类型为INT,所有COLOR_BASIC变量的默认初始化为黄色
END_TYPE
 
.
具有显式基本数据类型的枚举

IEC 61131-3标准的扩展

枚举声明的基本数据类型默认为INT。但是,你也可以声明基于另一种整数数据类型的枚举。

<基本数据类型> : 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; // 基本数据类型为DWORD,所有COLOR变量的默认初始化为黑色
END_TYPE
 
.
严格的编程规则

提示!

在CODESYSV3.5 SP7和更高版本中,在声明枚举时,在第一行中自动添加了杂注{attribute 'strict'}

添加编译提示{attribute 'strict'}时,将激活严格的编程规则。

.以下代码被视为编译器错误:

  • 枚举组件的算术运算
    例如,枚举变量不能用作FOR循环中的计数器变量。
  • 将不对应于枚举值的常数值分配给枚举组件
  • 将具有另一种数据类型作为枚举的非常数变量分配给枚举组件

算术运算可能导致未声明的值分配给枚举组件。更好的编程风格是使用SWITCH/CASE语句来使用组件值。

.
枚举变量的声明和初始化

.语法


<变量的名称> : <枚举的名称> ( := <初始化值> )? ;
 

对于使用用户自定义的数据类型<enumeration name>的枚举变量的声明,可以使用枚举组件对其进行初始化。

.

.例如


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

变量colorCarCOLOR.black初始化。这是所有COLOR类型的枚举变量的默认初始化,并在类型声明中以此方式定义。变量colorTaxi有其自己的初始化值。

如果未指定初始化,则初始化值为0。

.

.例如


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

变量cbFlowerCOLOR_BASIC.yellow初始化。这是所有COLOR_BASIC类型的枚举变量的默认初始化。由于枚举声明未指定要初始化的组件,因此系统会自动使用值为0的组件进行初始化。这通常是枚举组件的第一个。但是,它也可以是不在第一位置但显式初始化为0的另一个组件。

变量cbTree具有显式的初始化。

如果没有为类型和变量都指定值,则以下规则适用:如果枚举包含一个值为0的值,则此值为默认的初始化,否则为列表中的第一个组件。

.

.例如

.用0初始化


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

PROGRAM PLC_PRG
VAR
    e : ENUM;
END_VAR
 

变量eENUM.e2初始化。

.用第一个组件初始化


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

PROGRAM PLC_PRG
VAR
    e2 : ENUM2;
END_VAR

 

变量e2ENUM.e1初始化。

.
唯一访问枚举组件

IEC 61131-3标准的扩展

枚举组件还可以与标识符<enumeration name>.<component name>一起用作常量。枚举组件在工程中被全局识别,对其的访问是唯一的。因此,可以在不同的枚举中使用组件名称。

.

.例如

.blue组件


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

(* 明确的标识符,尽管组件名称相同 *)
cbFlower := COLOR_BASIC.blue; 
colorCar := COLOR.blue;

(* 无效的代码 *)
cbFlower := blue;
colorCar := blue;