2.3.4 全局数据块与其他数据类型
1.生成全局数据块
在项目“电动机控制”中,单击项目树PLC的“程序块”文件夹中的“添加新块”,在打开的对话框中(见图2-13中的大图),单击“数据块(DB)”按钮,生成一个数据块,可以修改其名称或采用默认的名称,其类型为默认的“全局DB”,生成数据块编号的方式为默认的“自动”。如果用单选框选中“手动”,可以修改块的编号。
图2-13 添加数据块与数据块中的变量
单击“确定”按钮后自动生成数据块。选中下面的复选框“新增并打开”,生成新的块之后,将会自动打开它。右击项目树中新生成的“数据块_1”,执行快捷菜单命令“属性”,选中打开的对话框左边窗口中的“属性”(见图2-14),如果勾选右边窗口中的复选框“优化的块访问”,只能用符号地址访问生成的块中的变量,不能使用绝对地址。这种访问方式可以提高存储器的利用率。
图2-14 设置数据块的属性
只有在未勾选复选框“优化的块访问”时,才能用绝对地址访问数据块中的变量,数据块中才会显示“偏移量”列中的偏移量。
右击数据块灰色的表头所在的行,选中“显示/隐藏”,通过勾选复选框,可以设置显示或隐藏某个列。
2.字符串
数据类型String(字符串)是字符组成的一维数组,每个字节存放1个字符。第一个字节是字符串的最大字符长度,第二个字节是字符串当前有效字符的个数,字符从第3个字节开始存放,一个字符串最多254个字符。
数据类型WString(宽字符串)存储多个数据类型为WChar的Unicode字符(长度为16位的宽字符,包括汉字)。第一个字是最大字符个数,默认的长度为254个宽字符,最多16382个WChar字符。第二个字是当前的宽字符个数。
可以在代码块的接口区和全局数据块中创建字符串、数组和结构。
在“数据块_1”的第2行的“名称”列(见图2-13中的小窗口)输入字符串的名称“故障信息”,单击“数据类型”列中的按钮,选中下拉式列表中的数据类型“String”。“String[30]”表示该字符串的最大字符个数为30,其起始值(初始字符)为‘OK’。
3.数组
数组(Array)是由固定数目的同一种数据类型元素组成的数据结构。允许使用除了Array之外的所有数据类型作为数组的元素,数组的维数最多为6维。图2-15给出了一个名为“电流”的二维数组Array[1..2,1..3]of Byte的内部结构,它一共有6个字节型元素,第一维的下标1、2是电动机的编号,第二维的下标1~3是三相电流的序号。数组元素“电流[1,2]”是1号电动机第2相的电流。
图2-15 二维数组的元素
在数据块_1的第3行的“名称”列输入数组的名称“功率”(见图2-13中的小图),单击“数据类型”列中的按钮,选中下拉式列表中的数据类型“Array[lo..hi]of type”。其中的“lo”(low)和“hi”(high)分别是数组元素的编号(下标)的下限值和上限值,它们用两个小数点隔开,可以是任意的整数(-32768~32767),下限值应小于等于上限值。方括号中各维的参数用逗号隔开,type是数组元素的数据类型。
将“Array[lo..hi]of type”修改为“Array[0..23]of Int”(见图2-13),其元素的数据类型为Int,元素的下标为0~23。在用户程序中,可以用符号地址"数据块_1".功率[2]或绝对地址DB1.DBW36访问数组“功率”中下标为2的元素。
单击图2-13中“功率”左边的按钮,它变为,将会显示数组的各个元素,可以监控它们的起始值和监控值。单击“功率”左边的按钮,它变为,数组的元素被隐藏起来。
4.结构
结构(Struct)是由固定数目的多种数据类型的元素组成的数据类型。可以用数组和结构做结构的元素,结构可以嵌套8层。用户可以把过程控制中有关的数据统一组织在一个结构中,作为一个数据单元来使用,而不是使用大量的单个的元素,为统一处理不同类型的数据或参数提供了方便。
在数据块_1的第4行生成一个名为“电动机”的结构(见图2-13),数据类型为Struct。在第5~8行生成结构的4个元素。单击“电动机”左边的按钮,它变为,结构的元素被隐藏起来。单击“电动机”左边的按钮,它变为,将会显示结构的各个元素。
数组和结构的“偏移量”列是它们在数据块中的起始绝对字节地址。可以看出数组“功率”占48B。
下面是用符号地址表示结构中元素的例子:"数据块_1".电动机.电流。
单击数据块编辑器的工具栏上的按钮(见图2-13),在选中的变量的下面增加一个空白行,单击工具栏上的按钮,在选中的变量的上面增加一个空白行。单击扩展模式按钮,可以显示或隐藏结构和数组的元素。
选中项目树中的PLC_1,将PLC的组态数据和用户程序下载到CPU,将CPU切换到RUN模式。打开数据块_1以后,单击工具栏上的按钮,启动监控功能,出现“监视值”列,可以看到数据块_1中的字符串和数组、结构的元素的当前值。
5.Variant指针
Variant数据类型可以指向各种数据类型或参数类型的变量。Variant指针可以指向结构和结构中的单个元素,它不会占用任何存储器的空间。
下面是使用符号地址的Variant数据类型的例子:MyDB.Struct1.pressure1,MyDB、Struct1和pressure1分别是用小数点分隔的数据块、结构和结构中元素的符号地址。
下面是使用绝对地址的Variant数据类型的例子:P#DB5.DBX10.0 INT 12和%MW10,前者用来表示一个地址区,其起始地址为DB5.DBW10,一共12个连续的Int(整数)变量。
6.PLC数据类型
PLC数据类型用来定义可以在程序中多次使用的数据结构。打开项目树的“PLC数据类型”文件夹,双击“添加新数据类型”,可以创建PLC数据类型。定义好以后可以在用户程序中作为数据类型使用。
PLC数据类型可以用作代码块接口或数据块中的数据类型,或用于创建具有相同数据结构的全局数据块的模板。例如,为混合颜色的配方创建PLC数据类型后,用户可以将该PLC数据类型分配给多个数据块。通过调节各数据块中的变量,就可以创建特定颜色的配方。
7.使用符号方式访问非结构数据类型变量的“片段”
可以用符号方式按位、按字节、按字访问PLC变量表和数据块中某个符号地址变量的一部分。双字大小的变量可以按位0~31、字节0~3或字0、1访问(见图2-16),字大小的变量可以按位0~15、字节0或1、字0访问。字节大小的变量则可以按位0~7或字节0访问。
例如在PLC变量表中,“状态”是一个声明为DWord数据类型的变量,"状态".x11是“状态”的第11位,"状态".b2是“状态”的第2号字节,"状态".w0是“状态”的第0号字。
图2-16 双字中的字、字节和位
8.访问带有一个AT覆盖的变量
通过关键字“AT”,可以将一个已声明的变量覆盖为其他类型的变量,比如通过Bool型数组访问Word变量的各个位。使用AT覆盖访问变频器的控制字和状态字的各位非常方便。
在FC或FB的块接口参数区组态覆盖变量。生成名为“函数块1”的函数块FB1,右击项目树中的“函数块1”,选中快捷菜单中的“属性”,在“属性”选项卡取消“优化的块访问”属性(去掉复选框中的对勾)。
打开函数块1的接口区,输入想要用新的数据类型覆盖的输入参数“状态字”,其数据类型为Word(见图2-17)。在“状态字”下面的空行中输入变量名称“状态位”,双击“数据类型”列表中的“AT”,在“名称”列的变量名称“状态位”的右边出现“AT‘状态字’”。
再次单击“数据类型”列,并声明变量“状态位”的数据类型为数组Array[0..15]of Bool。单击“状态位”左边的按钮,它变为,显示出数组“状态位”的各个元素,例如“状态位[0]”。至此覆盖变量的声明已经完成,可以在程序中使用数组“状态位”的各个元素,即Word变量“状态字”的各位。
图2-17 在块的接口区声明AT覆盖变量