北岛夜话
原创工业智能控制领域(PLC、单片机/嵌入式、机器人、通信、机器视觉)的技术及经验分享。
文章524 浏览7919700

西门子SCL编程入门教程连载(21)——序列化指令

PLC编程经常遇到数据的处理,很多指令都需要数组作为输入条件,比如进行数据移动的MOVE_BLK指令。而我们实际使用的数据很多是用户自定义类型(UDT)或结构类型(Struct)。这种情况下,我们可以使用序列化指令——Serialize将UDT或Struct类型的数据转换为标准数组进行操作。等数据处理完成后,再使用反序列化指令Deserialize将其转换为之前的数据类型。序列化指令也常用在通信中,将UDT或Struct类型的数据转换为标准数组然后发送给通信伙伴。今天这篇文章,我们来详细聊聊序列化指令Serialize  。

cover.png

在博途Step7开发环境的指令列表中可以找到序列化Serialize,如下图所示:

指令列表.png

其基本语法如下:

Serialize(SRC_VARIABLE:=_variant_in_, 
DEST_ARRAY=>_variant_out_,
POS:=_dint_inout_)

该指令的参数含义如下:

  • SRC_VARIABLE:输入参数,待序列化的变量,支持所有数据类型;

  • DEST_ARRAY:输出参数,序列化后的数组,类型为字节或字符(数组);

  • POS:输入/输出参数,序列化的起始位置。通常,POS从数组的下标0开始,当执行完一次序列化操作后,POS会变成下一次序列化写入的起始下标;

下面来举例说明

首先我们定义用户自定义数据类型typeTest,如下图所示:

UDTtest.PNG

添加全局数据块,在其中添加如下变量:

  • 源数据sourceData,数据类型为上述定义的typeTest;

  • 目标数组targetArray,类型为字节数组,用来存放序列化后的数据;

  • posSerialize,存放序列化指令的位置数据(POS);

  • reValue,存放序列化指令的返回值;

全局数据块.PNG

添加函数块FB10_SerialTest,添加输入参数start,用于启动序列化操作。序列化不宜反复执行,因此我使用上升沿信号触发,代码如下图所示:

代码1.png

在主程序OB1中调用FB10,执行一次序列化后数据块中的数据如下:

DB.png

可以看出执行一次序列化之后,POS的值变为10。如果接着再执行一次,将会从数组序号为10的元素,即targeArray[10]开始写入,写入长度为10,显然,目前的数组长度不够第二次写入了。这种情况下,要么将posSerialize的值清零,要么增加数组的长度。

在多个变量序列化到同一个数组的操作中,如果POS的返回值为奇数,应将其+1,然后再执行下一次序列化,从而防止数据被覆盖。

好了,关于序列化指令就先介绍到这里。

我的书《西门子S7-1200/1500 PLC SCL语言编程》对SCL语言编程有详细的介绍。如果你感兴趣的话,可以扫描下面的小程序查看:

相关文章:

新书《西门子S7-1200/1500 SCL语言编程——从入门到精通》出版啦!

提醒:《西门子S7-1200/1500 PLC SCL语言编程》出现盗版,购买时请甄别

取消

感谢您的支持,欢迎常来看看!

扫码支持
一点动力,多少随意

打开支付宝扫一扫,即可进行扫码打赏哦

发表评论