PLC编程经常遇到数据的处理,很多指令都需要数组作为输入条件,比如进行数据移动的MOVE_BLK指令。而我们实际使用的数据很多是用户自定义类型(UDT)或结构类型(Struct)。这种情况下,我们可以使用序列化指令——Serialize将UDT或Struct类型的数据转换为标准数组进行操作。等数据处理完成后,再使用反序列化指令Deserialize将其转换为之前的数据类型。序列化指令也常用在通信中,将UDT或Struct类型的数据转换为标准数组然后发送给通信伙伴。今天这篇文章,我们来详细聊聊序列化指令Serialize 。
在博途Step7开发环境的指令列表中可以找到序列化Serialize,如下图所示:
其基本语法如下:
Serialize(SRC_VARIABLE:=_variant_in_,
DEST_ARRAY=>_variant_out_,
POS:=_dint_inout_)
该指令的参数含义如下:
SRC_VARIABLE:输入参数,待序列化的变量,支持所有数据类型;
DEST_ARRAY:输出参数,序列化后的数组,类型为字节或字符(数组);
POS:输入/输出参数,序列化的起始位置。通常,POS从数组的下标0开始,当执行完一次序列化操作后,POS会变成下一次序列化写入的起始下标;
下面来举例说明
首先我们定义用户自定义数据类型typeTest,如下图所示:
添加全局数据块,在其中添加如下变量:
源数据sourceData,数据类型为上述定义的typeTest;
目标数组targetArray,类型为字节数组,用来存放序列化后的数据;
posSerialize,存放序列化指令的位置数据(POS);
reValue,存放序列化指令的返回值;
添加函数块FB10_SerialTest,添加输入参数start,用于启动序列化操作。序列化不宜反复执行,因此我使用上升沿信号触发,代码如下图所示:
在主程序OB1中调用FB10,执行一次序列化后数据块中的数据如下:
可以看出执行一次序列化之后,POS的值变为10。如果接着再执行一次,将会从数组序号为10的元素,即targeArray[10]开始写入,写入长度为10,显然,目前的数组长度不够第二次写入了。这种情况下,要么将posSerialize的值清零,要么增加数组的长度。
在多个变量序列化到同一个数组的操作中,如果POS的返回值为奇数,应将其+1,然后再执行下一次序列化,从而防止数据被覆盖。
好了,关于序列化指令就先介绍到这里。
我的书《西门子S7-1200/1500 PLC SCL语言编程》对SCL语言编程有详细的介绍。如果你感兴趣的话,可以扫描下面的小程序查看:
相关文章:
发表评论