首页 历史故事复杂数据类型的使用技巧

复杂数据类型的使用技巧

【摘要】:复杂数据类型是由其他数据类型组成的数据组,不能将任何常量用做复杂数据类型的实参,也不能将任何绝对地址作为实参传送给复杂数据类型。下面通过几个例子说明复杂数据类型的定义和使用。数组元素可以在声明中进行初始化赋值,初始化值的数据类型必须与数组元素的数据类型相一致。在存储器中,String数据类型的变量比指定最大长度多占用两个字节,在存储区中前两个字节分别为总字符数和当前字符数。

复杂数据类型是由其他数据类型组成的数据组,不能将任何常量用做复杂数据类型的实参,也不能将任何绝对地址作为实参传送给复杂数据类型。下面通过几个例子说明复杂数据类型的定义和使用。

1.数组(Array)

Array数据类型表示的是由固定数目的同一数据类型的元素组成的一个域。一维数组声明的形式为

域名:ARRAY[最小索引..最大索引]OF数据类型;

如一维数组

MeasurementValue:ARRAY[1..10]OF REAL;

数组声明中的索引数据类型为INT,其范围为-32768~32767,这也就反映了数组的最大数目。

新建一个全局数据块“blk10”,数据块编号为DB6,不选择“仅符号访问”,新建变量MeasurementValue和TestValue,数据类型选择Array,修改类型为Real,数组上下限分别修改为1..10和-5..5,如图6-31a所示。

数组元素可以在声明中进行初始化赋值,初始化值的数据类型必须与数组元素的数据类型相一致。数组元素的初始化赋值要在“扩展模式”中输入,点击数据块工具栏按钮978-7-111-34922-8-Chapter06-34.jpg可以打开扩展模式的数据块,如图6-31b所示。例如,在初始值列为Array型变量Measure-mentValue的第一个元素MeasurementValue[1]赋初始值20.23。

对数组元素的访问,图6-31b扩展模式显示了Array型变量的元素,例如Measure-mentValue的上下限为1..10,则其10个元素为MeasurementValue[1]~MeasurementValue[10]。而TestValue的上下限为-5..5,则其11个元素为TestValue[-5]~TestValue[5]。因此访问数据块中数组类型变量元素的方法为blk10.MeasurementValue[1],blk10.TestValue[0]等,其中blk10为数据块名称,MeasurementValue和TestValue为数组型变量,[1]或[0]表示第1个或第0个元素。

图6-31中,变量MeasurementValue的偏移量为0.0,表示该数组变量的起始位为0.0,则其第1个元素的绝对地址为DB6.DBD0,第2个元素的绝对地址为DB6.DBD4,依次类推,第10个元素的绝对地址为DB6.DBD36。变量TestValue的起始地址位为40.0,则元素TestValue[-5]的绝对地址为DB6.DBD40,其他类推。

978-7-111-34922-8-Chapter06-35.jpg

图6-31 新建Array类型变量

2.结构(Struct)

Struct数据类型表示一组指定数目的数据元素,而且每个元素可以具有不同的数据类型。S7-1200中结构型变量不支持嵌套

新建一个全局数据块“blk20”,数据块编号为DB7,不选择“仅符号访问”,新建变量MotorPara,数据类型选择Struct,在下一行新建变量Speed,类型为Real,继续新建Bool型变量Status和Real型变量Temp,如图6-32所示。

结构元素可以在声明中进行初始化赋值,初始化值的数据类型必须与结构元素的数据类型相一致,在扩展模式的数据块中输入结构变量相应元素的初始值,如图6-32所示。

978-7-111-34922-8-Chapter06-36.jpg

图6-32 新建Struct类型变量

可以使用下列方式来访问结构元素:

StructureName(结构名称).ComponentName(结构元素名称)

例如访问数据块blk20中MotorPara变量的Status元素的方法为

blk20.MotorPara.Status

blk20为数据块名称,MotorPara为结构型变量,Status为结构型变量中的元素。

图6-32中,变量MotorPara的偏移量为0.0,表示该结构变量的起始位为0.0,则其第1个元素Speed的偏移量为0.0,因为Speed为Real型变量,所以其绝对地址为DB7.DBD0,第2个元素的偏移量为4.0,因为Status为Bool型,所以其绝对地址为DB7.DBX4.0,第3个元素的偏移量为4.0,Real型变量,其绝对地址为DB7.DBD6。

3.字符串(String)

String数据类型变量是用以存储字符串如消息文本的。通过字符串数据类型变量,在S7CPU里就可以执行一个简单的“(消息)字处理系统”。String数据类型的变量将多个字符保存在一个字符串中,该字符串最多由254个字符组成。每个变量的字符串最大长度可由方括号中的关键字STRING指定(如STRING[4])。如果省略了最大长度信息,则为相应的变量设置254个字符的标准长度。在存储器中,String数据类型的变量比指定最大长度多占用两个字节,在存储区中前两个字节分别为总字符数和当前字符数。

新建一个全局数据块“blk30”,数据块编号为DB8,不选择“仅符号访问”,新建变量ErrMsg,数据类型选择String,在下一行新建变量tag1,类型选择并输入为String[10],表示该变量包含10个字符,如图6-33所示。

978-7-111-34922-8-Chapter06-37.jpg

图6-33 新建String类型变量

字符串变量可以在声明的时候用初始文本对String数据类型变量进行初始化。字符串变量的声明方法为

字符串名称:STRING[最大数目]

图6-33中,声明了字符串变量Errmsg,没有指明最大数目,则程序编辑器认为该变量的长度为254个字符,输入其初始值为“This is a test”。而tag1变量的最大数目为10,其长度为10个字符,默认初始值为空。

如果用ASCII编码的字符进行初始化,则该ASCII编码的字符必须要用单引号括起来,而如果包含那些用于控制术语的特殊字符,那么必须在这些字符前面加字符($)。

可以使用的特殊字符有:

$$简单的美元字符

$L,$I换行(LF)符

$P,$p换页符

$R,$r回车符

$T,$t空格符等。

对字符串变量的访问,可以访问字符串String变量的各个字符,还可以使用扩展指令中的字符串项下的字符指令来实现对字符串变量的访问和处理。例如,符号寻址图6-33字符串的方法为blk30.ErrMsg或者blk30.tag1,blk30为数据块名称,ErrMsg和tag1为字符串型变量。寻址单个元素的方法为blk30.ErrMsg[23],表示寻址数据块blk30中的字符串型变量ErrMsg的第23个字符。

String数据类型的变量具有最大256个字节的长度,因此可以接收的字符数达254个,称为“净数”。

图6-33中,变量ErrMsg的长度为默认的254个字符,每个字符占用存储区的1个字节,又因为在存储器中,String数据类型的变量比指定最大长度多占用2个字节,故变量ErrMsg在存储区中共占用256个字节。变量的ErrMsg的偏移量为0.0,表示它的存储起始地址位是0.0,共占用256个字节,故变量tag1的偏移量为256.0,变量tag2的偏移量为268.0,因为变量tag1最大数目为10,所以共占用了12个字节的存储区。对变量ErrMsg,由于其前两个字节分别为总字符数和当前字符数,故在存储区的第3个字节开始存储字符,即图6-33所示变量ErrMsg的第1个字符“T”的绝对地址为DB8.DBB3,“a”的绝对地址为DB8.DBB11。

4.长格式日期和时间(DTL)

DTL数据类型表示了一个日期时间值,共12个字节。

新建一个全局数据块“blk40”,数据块编号为DB9,不选择“仅符号访问”,新建变量tag5,数据类型选择DTL,如图6-34a所示,图6-34b为扩展模式的DTL变量。

可以在声明部分为变量预设一个初始值。初始值必须具有如下形式

DTL#年-月-日-周-小时-分钟-秒-毫秒-]

具体结构如图6-34b所示。

978-7-111-34922-8-Chapter06-38.jpg

图6-34 新建DTL类型变量

对于DTL数据类型的变量,可以通过符号寻址来访问其中的元素,例如符号寻址月元素的格式为blk40.tag5.MONTH,其中blk40为数据块名称,tag5为DTL类型变量,MONTH为DTL变量的元素,由图6-34b可以看出该元素的数据类型为USInt型。

还可以通过绝对地址寻址访问DTL类型变量的各个内部元素。图6-34中,变量tag5的偏移量为0.0,表示其存储起始地址位是0.0,共占用12个字节,第1个元素为年,是无符号整型数据,偏移量为0.0,则该元素的绝对地址寻址格式为DB9.DBW0。第2个元素月的偏移量为2.0,为无符号短整型数据,则其绝对地址寻址格式为DB9.DBB2。