S7-1200的Deserialize与Serialize介绍

deserialize(反序列化)、serialize(序列化)
s7-1200将byte数组(即byte流)看做是序列,也就是标准数组。与之相反,其他所有格式都是非序列的,通常程序使用的都是非序列的,例如struct,udt,或其他格式。
序列化和反序列化指令的作用就是在实现标准数组和其他格式的转换。
对于某些标准功能块,最方便处理的是byte数组,但处理对象往往是多样的例如struct、udt或者其他格式,这时最好的方法就是先将各类对象统一序列化成byte数组,然后执行相关功能块,最后在执行反序列化返回初始对象。如图1所示,为这两个指令实现的结果。
从tia v13sp1,s7-1200 v4.0开始支持这两个指令。
图1 指令实现的功能
图2 指令位置
图3 指令详情
对于deserialize(反序列化)、serialize(序列化),目前出了2个版本的指令:
1. tia 博途 v13sp1开始,s7-1200 v4.0、v4.1支持v1版本,以下为v1版本说明:
deserialize:参数参见表1
表1 deserialize参数
参数 声明 数据类型 说明
src_array input variant或array of byte 标准byte数组
pos inout dint 见下面注意4
ret_val return int 错误代码
dest_variable output variant或struct、udt、array等 反序列化后的输出变量
serialize:参数参见表2
表2 serialize参数
参数 声明 数据类型 说明
src_variable input variant或struct、udt、array等 待序列化的输入变量
pos inout dint 见下面注意4
ret_val return int 错误代码
dest_array output variant或array of byte 标准byte数组
注意:
(1) v1版本中标准byte数组不能是优化数据块的数组,可以是诸如p#m100.0 byte 10这种看做是数组的(原因)。所以deserialize的src_array与serialize的dest_array支持的variant类型其实指向的就是p#指针这种,指向其他类型都不可以。
(2)同样是variant类型,deserialize的dest_variable与serialize的src_variable是真正的支持variant类型,并且是可以处理variant类型的变量的指令之二。
(3) src_array/dest_array的数组大小要大于dest_variable/src_variable的空间占用
(4)dest_variable/src_variable空间占用的计算规则:
位变量位于另一位变量后则地址连续排布,如果位于其他变量类型的后面,则需要从整字节地址开始;
字节大小的变量从整字节地址开始;
字、双字、四字的变量从偶数字节地址开始;
例子:如图4所示,虽然总数上是5个字节,但是因为整形变量从偶数字节地址开始所以空出了一个字节,因此这种排布需要占6个字节。
图4 6个字节的排布
(4)pos变量
pos变量声明是inout,用在byte数组的下标变量,有输入有输出。
deserialize:pos的初始输入作为待转化的byte数组的起始元素,指令结束后,pos的输出=初始输入+dest_variable占据的字节数
也可以看做指针,初始指针指向byte数组所在的pos位置,转化后,指针移动了dest_variable占据的字节数。
注意:pos>=0,当pos=0时,为byte数组的第一个元素,所以建议byte数组使用array[0..x] of byte,这样byte数组下标可以和pos对应上。
例子:pos实例,如图5所示。
图5 pos示例
①:初始pos=0,指针指向数组第0个元素
②:执行deserialize,转化了12个字节,pos的输出=0+12=12,指针指向数组第12个元素
serialize:pos的初始输入作为转化后的byte数组的起始元素,指令结束后,pos的输出=初始输入+src_variable占据的字节数
也可以看做指针,初始指针指向byte数组所在的pos位置,转化后,指针移动了src_variable占据的字节数。
注意:pos>=0,当pos=0时,为byte数组的第一个元素,所以建议byte数组使用array[0..x] of byte,这样byte数组下标可以和pos对应上。
例子参考图5:
①:初始pos=0,指针指向数组第0个元素
②:执行serialize,转化了12个字节,pos的输出=0+12=12,指针指向数组第12个元素
2. tia 博途 v14开始,s7-1200 v4.2支持v2版本
功能与v1版本不同的是
(1)标准byte数组可以是优化数据块的数组
(2)deserialize的src_array支持array[*] of byte
使用举例:
编写fc,实现清零各种db块的变量
思路:
1. 将需要清空的db块内所有变量放入struct/udt,或者将需要清空的数据块建立成udt类型生成的db,然后使用deserialize(反序列化)指令清空。
2. 用于清空的byte数组可以使用m区。对于s7-1211c与s7-1212c有4kb的m区,对于s7-1214c、s7-1215c、s7-1217c有8kb的m区,通常不会用到很多,这样可以利用其中靠后不常用的区域,例如2kb来清空最多2kb的db块。
3. 有多个不同的结构的db,都可以先后清空。
编写的fc、db及调用,如图6-8所示。
图6 fc编写
图7 使用的db24
图8 fc调用
图8中db37为udt_1类型生成的db,可以直接填写在variant类型的inout_1的实参处,并且完整清空db37。


基于CD4069的简单RIAA前置放大器电路图
iPhone12法国版标配有线耳机,原因为何?
新一代连续血糖监测系统Dexcom G7获得加拿大卫生部批准
半双工RF收发器CC900主要技术特点
成功的数字化领导者应所具备的七大特征
S7-1200的Deserialize与Serialize介绍
无人驾驶什么时候才会来临
索尼新款Airpeak支持Alpha系列无反光镜相机
UFS – 更快、更安全的闪存存储
OPPOR17Pro怎么样 到底值不值得买
DIY单反快门线:自己动手丰衣足食
ARM中关键字的具体使用
华为下一代AI芯片即将上市 可能是世界第一
DP4344立体声2通道输出数模转换芯片简介
华为计划做电视市场 达成必将导致国内电视市场格局发生大变
中海达与蓝色创源签署合作协议,加速自动驾驶的商业化进程
E63.C系列压电陶瓷控制器的特点以及驱动原理的分析
带有Arduino的无线单点呼叫系统的制作
硬创早报:德国批准安全法案 有条件允许华为参与其5G网络建设
为什么说谈恋爱不如做机器人?