可以在数据块中或逻辑块的变量声明表中定义结构,下面介绍在数据块中定义的方法。在图4-7的数据块DB4中,定义了一个数组和一个结构。名为STACK的结构由3个不同数据类型的变量组成。
选中图4-7“ARRAY”下面的“INT”,按回车键,在该单元的下面生成一个空白行。在“名称”列输入结构的名称“STACK”,用鼠标右键点击空白行的“类型”列单元,执行弹出的快捷菜单中的“复杂类型”→“STRUCT”(也可以直接输入STRUCT),连续按回车键后,在该行的下面出现新的行,新的行下面一行增加的“END_STRUCT”(结束结构)是自动生成的,表示该结构的结束。在新的行输入结构的第一个元素“AMOUNT”和它的数据类型。如果没有输入该元素的初值,将会自动生成默认的初值0。用同样的方法生成结构的其他元素。选中结构的“END_STRUCT”单元后按回车键,在下面出现的新的行中定义一个名为Fault、长度为20个字符的字符串。
图4-7的STACK所在行的地址列中的 12.0表示结构在数据块中的起始地址为DBB12。结构各元素的地址列中的“2.0”等表示结构元素在结构中的相对起始地址,“=8.0”表示该结构一共占用8B。Zui后一行地址列中的“=42.0”表示DB4中的数组、结构和字符串一共占用42B。可以为结构中各个元素设置初始值和加上注释。在图4-7中输入实数的初始值102.4后,被自动转换为1.024000e002(1.024×10²)。
用鼠标点击结构的第一行或Zui后一行(即有关键字STRUCT或END_STRUCT的行)的地址列中的单元,将选中整个结构,结构各行的背景变为黑色,字变为白色(称为反色)。若要选中结构中的某一参数,用鼠标点击该行的地址单元,仅该行反色。
(2)访问结构中的元素
可以用结构中的元素的juedui地址或符号地址来访问结构中的元素。访问结构中的数据时,需要指出结构所在的数据块的名称、结构的名称,以及结构元素的名称,数据块TANK内结构STACK的元素AMOUNT应表示为“TANK”.STACK.AMOUNT。因为AMOUNT从数据块TANK(DB4)的第12号字节开始存放,它的juedui地址为DB4.DBW12。
(3)用结构传递参数
如果在块的变量声明表中,声明形参的类型为数组或结构,可以将整个数组或结构而不是它们的某个元素作为参数来传递。调用块时也可以将某个数组或结构的元素赋值给同一类型的参数。
将复杂数据类型的变量作为参数传递时,作为形参和实参的两个变量必须具有相同的数据结构,例如两个结构应具有相同数据类型的结构元素和相同的排列顺序。
用户定义数据类型的生成与使用
选中SIMATIC管理器左边窗口中的“块”,执行菜单命令“插人”→“S7块”→“数据类型”,生成新的UDT。在生成UDT的元素时,可以设置它的初始值和加上注释。从表面上看,图4-9的UDT1与图4-7中定义的结构STACK完全相同,它们有本质的区别。
结构(STRUCT)是在数据块的声明视图方式或在逻辑块的变量声明表中与别的变量一起定义的,UDT必须在特殊的数据块内单独定义,并单独存放在一个数据块内。生成UDT后,在定义变量时将它作为一个数据类型来多次使用,例如在变量声明表中定义一个变量,其数据类型为UDT1,名称为ProData(见图4-10)。由该例可以看出,UDT在数据块中的使用方法与其他数据类型(例如INT)是一样的。
UDT可以在逻辑块(FC、FB和OB)的变量声明表中作为基本数据类型或复杂数据类型来使用,或者在数据块(DB)中作为变量的数据类型来使用。
要访问数据块Heater中数据类型为UDT1的结构ProData中的元素AMOUNT,其符号地址为“Heater”.ProData.AMOUNT。
可以将具有用户定义数据类型的变量作为参数来传递。如果在块的变量声明表中,声明形参的数据类型为UDT1,在调用块时应使用具有相同数据类型的变量来传递参数。在调用块时也可以将用户定义数据类型中的元素赋值给同一类型的形参。
用户定义数据类型也可以用来作为生成具有相同数据结构的数据块的摸板。