1
PLC编程实用指南
1.5.3.2 1.3.2  变量
1.3.2 变量

变量(Variables),有的也称标签(Tags)是用户自行定义的PLC的内存区。传统PLC只有地址,没有这个变量一说。新型和高档PLC才有此程序数据。如和利时LEC G3机的内存数据区中,有容量很大的全局区(G区)及掉电保持区(R区),只能通过定义变量使用它。再如西门子的S7-300/400系列PLC及新型的S7-1200小型机的数据块所用的区域,也是通过定义使用。还有AB新型PLC就没有所谓的内部软器件,只有用户定义的变量。如果所定义的变量要与I/O实际地址(I/O软器件)关联可使用别名(Alias),即用变量当做硬件地址的别名。其他高档PLC也多是此情况。而且,越是高档或新型PLC,其内部器件越少,但可定义的变量则非常之多。

变量与传统PLC的符号地址不同是,它与实际地址(软器件)可以关联,也可不关联。而符号地址则必须与I/O或内部器件关联。

再就是,地址可以定义为变量名(与变量关联),也可不定义为变量名(不与变量关联)。后者也可在程序中直接使用。

使用变量取代内部器件地址的好处是比较灵活,可定义的数据类型多,而且PLC的资源还可得到充分利用。这也是当今PLC技术发展一大趋势。只是使用它编程,计算机技术的“味道”浓些,可能对习惯于电气技术的PLC编程人员,初用时可能不大习惯。

1.变量类型

变量可定义的类型很多,而且随着PLC功能的增强,其类型也越来越多。具体可根据不同特点分类。

(1)根据数据所占内存大小划分有:

1)位数据(bit)。仅占一个位的内存区。

2)数位数据(digit)。占4个位的内存区。

3)字节数据(Byte,B)。占8个位的内存区。

4)字数据(word,W)。占16个位的内存区。

5)双字数据(Double word,DW)。占32个位的内存区。

6)多字数据。占更多字的内存区。

(2)根据数据类型划分有:

1)布尔型。标识符为BOOL,在0(或FALSE)、1(或TRUE)之间选一。

2)整数型。有多种类型。它的类型名称、类型标识符、上下限及存储空间见表1-7。

整数型常数可使用十进制数,也可用二或十六进制数。用前者,直接写数就可以了,如65535。用后者时,在数值前要加“2#”或“16#”,如16#ABCD。所使用的数也不能超过表1-7的数据上、下限。

3)实数型。也称浮点型。用于表示有理数。其标识符为REAL,占32位。实数型数据可正、可负,最小数可以是·1.175495E-38,最大数可以是·3.402823E+38。

表1-7 PLC整数类型标识符、上下限及存储空间

978-7-111-39745-8-Chapter02-38.jpg

4)字符串型。字符型数据(STRING),即字符串。其常量在两个单引号间给出。如978-7-111-39745-8-Chapter02-39.jpgabcd978-7-111-39745-8-Chapter02-40.jpg,这里的abcd就是字符串常量。字符串还可含转义(特殊)字符。只是在之前应加“$”符号。具体见表1-8。

表1-8 转义字符

978-7-111-39745-8-Chapter02-41.jpg

5)时钟型(TIME)、日期型(DAY)、时间型(T IME_OF_DAY,TOD)、日期时间型(DATE and DATE_AND_TIME,DT)等。可用于存储时钟、日期、时间、日期时间值等数值。不同PLC此类型数据的表达可能不完全一样。

6)其他型。如各种功能块型的变量,可用做功能块例程的命名。有的还可由用户自行定义类型等。

(3)根据数据的作用范围划分有:

1)局部变量。其作用范围仅限于所在程序。超出程序无效。

2)全局变量。其定作用范围为PLC的所有程序。但是,如与所在程序局部变量重名,则所在程序的局部变量有效,而它无效。

3)网络变量。如AB等PLC,有此变量。其作用范围可覆盖PLC网络。可以用以PLC间数据链接、实现通信。

4)共享变量。如西门子博途软件建立的过程有此变量。其作用范围可覆盖整个工程。可在工程的其他部件,如人机界面、计算机监控系统等,实现数据共享。

(4)根据PLC停机后数据是否保持划分有:

1)保持变量。PLC掉电后,其值保持。

2)非保持变量。PLC掉电后,其值不保持。

(5)根据变量的结构划分有:

1)简单变量。所定义的变量只有一个,而且只有一个类型。常见的多是此类变量。

2)复合变量。所定义的变量有多个,而且可能有多个类型。如计算机常用数组、结构等就是此类变量。

(6)根据变量的使用划分有:

1)直接变量。直接使用它作变量。也是最常用的变量。

2)指针变量。也是间接变量,使用它的值作为地址,用此地址指向的变量作变量。

(7)根据变量的在POU中的使用划分有:

1)输入变量。用于程序数据输入。

2)输出变量。用于程序数据输出。

3)输入输出变量。也即变量,既可输入程序数据,又可输出程序数据。多数变量为此变量。

2.变量定义

变量在使用前要先定义。要用标识符命名。根据编程标准,标识符只能由字母、数字和下画线字符组成的一个串,并且它应以字母或下画线字符开头。不能使用中文。用具体命名规则取决于具体的PLC。

变量定义时除了命名,还要指明它的类型。要上述分类指明它的归属。如果必要也可与I/O地址关联。变量名称一般要有意义,以便识别与使用。必要时还可加注解。

变量定义要使用编程软件。一般软件都有它的编辑器。有的还可用微软公司的Excel编辑,然后导入。变量可以预先集中编辑,也可随时使用随时编辑。以和利时PLC的变量定义为例,其声明格式为

<变量名>{AT<关联地址>}:<变量类型>{:=<初始值>};

其中{}部分是可选的。可知,定义变量可以与实际地址无关。当然,这不是变量不用地址,而是由系统去分配地址。它用的地址是它的PLC的G区及R区。后者数据保留(掉电后恢复,原数据保留);前者不保留(掉电后恢复,原数据丢失)。

在编程时,如使用未声明的变量,系统将出现图1-20所示的变量声明窗口。

从图1-20可知,可对变量类别(有VAR局部变量、VAR_GLOBAL全局变量等)、变量类型(有布尔型、整型等)、是否与实际地址关联、注释及初始值等做出选择。如果做了该图所示的选定,再单击“确认”,即完成了该变量的声明。这时,在该程序的局部变量声明中将加上此变量。即

978-7-111-39745-8-Chapter02-42.jpg

图1-20 变量声明窗口

978-7-111-39745-8-Chapter02-43.jpg

在图1-20窗口中,“常量”选项的含义是,选定它,程序不能改变它。“保留”选项的含义是,选定它,此变量就可掉电保持。

变量与实际地址关联,和利时称之为变量AT声明。但不是所有的变量都允许做这样的声明。声明为BYTE、WORD、DWORD变量,既可按BYTE、WORD、DWORD使用,也可按位使用。这时,可在变量之后加小数点,然后再加位号。如AA为WORD类型变量,AA指的是字,而AA.14指的是AA字的14位。

以下为它定义的几个变量:

978-7-111-39745-8-Chapter02-44.jpg

978-7-111-39745-8-Chapter02-45.jpg

这里,VAR到END_VAR、VAR_INPUT到END_INPUT以及VAR_OUTPUT到END_OUTPUT之间就是POU所定义的变量、输入变量及输出变量。

3.指针变量

指针是指向变量地址的变量。指针声明的格式为

<指针名>:POINTER TO<数据类型或功能块>;

指针所指向变量的数据类型,可以是系统定义的类型,也可是用户自定义类型,还可以是功能块。

要读取变量的地址,有读取变量地址指令,如和利时PLC用ADR指令,它用于把变量或者功能块的地址赋给指针,例如:

978-7-111-39745-8-Chapter02-46.jpg

指针是计算机C语言常用的工具。使用得好,可提高程序效率。指针还可用于对将要介绍的数组各成员的访问。这时,要先把数组下标下限成员的地址赋值给数组处理指针。然后相应改变这个指针值,即可访问数组的不同成员。

和利时LEC G3机内存地址以字节来计算。如果指针指向字节,指针加、减1,即可访问不同的字节。如果指针指向字,则加、减2,才可访问不同的字。如果指针指向双字,则加、减4,才可访问不同的双字。其余类推。

4.复合变量

除了简单变量,有的PLC还可数组、结构、枚举等类似计算机C语言那样的复合变量。

(1)数组。数组是相同类型数据的集合。有一维、二维和三维数组(不同PLC规则不完全相同)。如和利时PLC其声明格式为

<数组名>:ARRAY[<ll1>..<ul1>,<ll2>..<ul2>]OF<变量类型>.

Ll1、ll2、ll3标识字段范围的最小值;ul1、ul2和ul3标识最大值。范围必须是整型的。

如声明以下数组:

978-7-111-39745-8-Chapter02-47.jpg

则它的名为“Card_game”,是二维数组,下限都是1,上限分别是13、4。数组中的元素(成员)可用数组名加下标访问。如用矩阵与数组对应,那么一维数组,就相当于一维矩阵;二维数组,就相当于二维矩阵;三维数组,就相当于三维矩阵。

如上述数组Card_game,为二维数组。用如下的矩阵A对应:

978-7-111-39745-8-Chapter02-48.jpg

即A的每个元素都有两个下标。如A13,第1个下标为1,代表处于第1行;第2个下标为3,代表处于第3列。有了这个对应,就很好理解Card_game[2,4]的含义。它就是指其中下标1为2、下标2为6的元素。

在声明数组的同时,可进行初始化。如下示的就是已初始化的数组:

arr1:ARRAY[1..5]OF INT:=1,2,3,4,5;

说明:初始化后的arr1[1]=1、arr1[2]=2、arr1[3]=3、arr1[4]=4、arr1[5]=5。

arr2:ARRAY[1..2,3..4]OF INT:=1,3(7);(∗1,7,7,7的简写∗)

说明:两维数组初始化赋值的顺序总是,第1下标先取下限,第2个从下限依次加1,直到上限。这时,第1下标加1,第2下标又从下限开始,依次加1,其余类推,直到都到两个下标的上限。所以,按上述约定,arr2数组初始化后的各元素的值为arr2[1,3]=1、arr2[1,4]=7、arr2[3]=7、arr2[2,4]=7。

arr3:ARRAY[1..2,2..3,3..4]OF INT:=2(0),4(4),2,3;

(∗0,0,4,4,4,4,2,3的简写∗)

说明:三维数组初始化赋值的顺序总是,第1下标先取下限,第2下标也先取下限,第3个从下限依次加1,直到上限。这时,第2下标加1,第3下标又从下限开始,依次加1,其余类推,直到2、3两个下标都到下标的上限。这时,第1下标加1,第2、3下标又重复上述过程,直到都达到三个下标的上限。所以,按上述约定,初始化后的arr3[1,2,3]=0、arr3[1,2,4]=0、arr3[1,3,3]=4、arr3[1,3,4]=4、arr3[2,2,3]=4、arr3[2,2,4]=4、arr3[2,3,3]=2、arr3[2,2,4]=3。

数组也可部分初始化,如

arr1:ARRAY[1..10]OF INT:=1,2;

没有初始化的数组元素的值,为数组元素类型的默认值。在上面例子中,arr1[1]为1、arr1[2]为2,其他数组元素初始值为0。

数组的下标也可以是变量。这样,改变变量的值,就可访问数组不同的成员。但数组不能动态声明。即定义它的上、下标只能是数字。

数组可与实际地址关联,如

mmW AT%MW100:ARRAY[100..4145]OF WORD;

还可声明如下数组:

mmB AT%MW100:ARRAY[100..4145]OF BYTE;

这里,同一地址与不同的数组关联是允许的。

提示:数组的单元总数是有限制的。如LM3109机为4046。再多编译通不过。

提示:不同品牌PLC数组定义的格式也不完全一样。具体可在编程参阅有关软件帮助。

提示:有的PLC访问数组成员时,其下标只能是常量,有的可以是变量。

(2)结构(Structure)。结构是用户自定义数据类型。以和利时PLC为例,其定义格式为

978-7-111-39745-8-Chapter02-49.jpg

图1-21所示为和利时PLC编程软件PowerPro对象管理器的“数据类型”窗口。点击鼠标右键,将弹出菜单。再在“弹出菜单上”,点击“添加”,将出现如图1-21所示的“New data type”窗口。在“新建数据类型名”空白处右方,填入结构名(该图填的为“struct2”)。再点击“确认”,即可弹出结构名为struct2编辑窗口。在其上即可进行结构编辑。

978-7-111-39745-8-Chapter02-50.jpg

图1-21 数据类型定义窗口

如图所示,该结构名为struct2。内含有起点、点1到4及终点6个数组。注意,这里定义的结构,还不是用户可使用的变量。只是创建一个struct2结构的数据类型。但有了它才可进行struct2这个结构类型的变量声明。如

978-7-111-39745-8-Chapter02-51.jpg

这里,声明了2个struct2结构类型的变量。变量名为Sss1与Sss2。其中变量Sss1已初始化。而Sss2未初始化,其成员按默认值赋值,均为0。对它的成员访问的格式是

978-7-111-39745-8-Chapter02-52.jpg

如上述例子,Sss1.Start、Sss2.Start.分别是Sss1结构类型变量的Start成员及Sss2结构类型变量的Start成员。

(3)枚举(Enumeration)。枚举也是用户自定义数据类型,由许多字符常量组成,并把这些常量称作枚举值。枚举以关键字TYPE开始END_TYPE结束。其定义格式为

978-7-111-39745-8-Chapter02-53.jpg

这里,枚举类型名与变量命名规则相同。<Enum_0>、<Enum_1>、…<Enum_n>等为待枚举字符常量。

枚举类型变量的值是数字,称枚举值。如同INT类型一样使用。如不作初始化,枚举值0,指向第1项,即这里的<Enum_0>。枚举值1,指向第1项。即这里的<Enum_1>。其余类推。

枚举类型定义方法与结构定义的方法相同。如和利时PLC也是在PowerPro对象管理器的“数据类型”窗口上,点击鼠标右键,弹出菜单。再在“弹出菜单”上,点击“添加”,出现如图1-21所示的“New data type”窗口。在“新建数据类型名”右方,填入枚举类型名。再点击“确认”,即可弹出与填入枚举类型名编辑窗口。在其上即可进行枚举类型编辑。

如做如下“TRAFFIC_SIGNAL”(交通信号)的枚举定义:

978-7-111-39745-8-Chapter02-54.jpg

只是这里定义的枚举,还不是用户可使用的变量。只是创建一个TRAFFIC_SIGNAL枚举的数据类型。但有了它才可进行TRAFFIC_SIGNAL这个枚举类型的变量声明。如

TRAFFIC_SIGNAL1:TRAFFIC_SIGNAL;

这里的TRAFFIC_SIGNAL1为TRAFFIC_SIGNAL类型变量。如TRAFFIC_SIGNAL1值为0,因为“Red”没有初始化,又是第一项,则指的是“Red”。如值为1,则指的是第二项,“Yellow”。因为“Green”在定义时初始化为10,如果值为10,则指的是“Green”。如“Green”后还有项目,将从11起增加。

枚举不能多次使用相同的枚举项。如

978-7-111-39745-8-Chapter02-55.jpg

这两个枚举都有“Red”,是不允许的。