IEC 61131-3对数据类型进行了定义,从而防止对数据类型的不同设置而发生出错。数据类型的标准化是编程语言开放性的重要标准。
在IEC 61131-3中定义一般数据类型和非一般数据类型两类。非一般数据类型又可分为基本数据类型和衍生数据类型。数据类型与它在数据存储器中所占用的数据宽度有关。
IEC 61131-3标准定义了编程最常用的数据类型,因而在PLC领域内,这些数据类型的含义和使用是统一的。这对于机器和设备制造商,以及使用来自不同制造商的多台PLC和编程系统的技术人员,会带来明显的益处:统一的数据类型能增加PLC程序的可移植性。
1.基本数据类型
基本数据类型(Elementary Data Type,EDT)是在标准中预先定义的标准化数据类型,它有约定的数据允许范围和初始值,如表示。约定初始值是在对该类数据进行声明时,如果没有赋初始取值就用系统提供的约定初始值。
在这个标准中,对BCD数据类型和计数器数据类型都没有进行定义。现在BCD码没有过去那么重要,所以在PLC系统内必须根据特殊目的单独定义。计数器值由通常的整数实现,不需要特殊的格式,至少对于IEC 61131-3的标准计数器功能块是这样的。
2.一般数据类型
一般数据类型(Generic Data Type,GDT)用前缀“ANY”标识。它采用分级结构,如表6.8所示。一般数据类型使用时应该遵循以下原则。
(1)一般数据类型不能用于由用户说明的程序组织单元。
(2)子范围衍生类型的一般数据类型应为“ANY_INT”。
(3)直接衍生数据类型的一般数据类型与由此基本元素衍生的一般数据类型相同。
(4)所有其他衍生类型的一般数据类型定义为“ANY_DERIVED”。
3.衍生数据类型
衍生数据类型(Derived DatType,DDT)是用户在基本数据类型的基础上建立的由用户定义的数据类型,因此,也称为导出数据类型。这种类型定义的变量是全局变量,可使用与基本数据类型相同的方法来进行变量的声明。
对衍生数据类型的定义必须采用文本表达方式,IEC 61131-3标准并没有提及图形表达方式。类型定义由关键字TYPE和END_TYPE构成。
衍生数据类型有五种,分别是从基本数据类型直接衍生的数据类型、枚举数据类型、子范围数据类型、数组数据类型和结构化数据类型,如表
(1)直接衍生的数据类型。
如用户用缩写的LRL来表示数据类型LREAL。因此,采用这种方式的数据类型衍生,在以后的应用中就可以直接用LRL表示长实数数据类型。
(2)枚举数据类型。
实际上一个枚举数据类型不是一个导出数据类型,因为它不是从任何基本数据类型中导出得到的。如表6.9所示,序号2中衍生数据类型Medal_Type由3种奖牌组成,它们是Gold、Silver和Bronze。因此,变量可以用枚举中的一个名称作为其值。
(3)子范围数据类型。
当数据的范围在该数据类型允许的范围内部时,需要定义子范围数据类型。例如,基本数据类型INT的允许取值范围是-32768~32767,如果某类数据只允许取值为-4096~4095,则需要定义子范围数据类型。
(4)数组数据类型。
一个数组由多个相同数据类型的数据元素组成,因此,数组定义为衍生数据类型。在规定的数组界限内,借助于数组注脚(索引)可存取数组元素,注脚的值指示要寻址哪个数组元素。数组数据类型用ARRAY表示,用方括号内的数据定义其范围。当维数大于一维时,用逗号分割。
(5)结构化数据类型。
采用关键字STRUCT和END_STRUCT可以分层建立数据结构,这如同高级编程语言中的数据结构。这些数据结构包括任何基本的或导出的数据类型作为子元素。在数据结构中,同样不允许使用FB实例名。
除了上述5种衍生数据类型,还可以定义混合数据类型。混合数据类型包括(多个)导出的或基本的数据类型。通过这种方法,PLC程序员可优化地适配其数据结构,以满足应用要求。