Deserialize(反序列化)、Serialize(序列化)
S7-1200將Byte數(shù)組(即Byte流)看做是序列,也就是標(biāo)準(zhǔn)數(shù)組。與之相反,其他所有格式都是非序列的,通常程序使用的都是非序列的,例如Struct,UDT,或其他格式。序列化和反序列化指令的作用就是在實(shí)現(xiàn)標(biāo)準(zhǔn)數(shù)組和其他格式的轉(zhuǎn)換。對(duì)于某些標(biāo)準(zhǔn)功能塊,最方便處理的是Byte數(shù)組,但處理對(duì)象往往是多樣的例如Struct、UDT或者其他格式,這時(shí)最好的方法就是先將各類對(duì)象統(tǒng)一序列化成Byte數(shù)組,然后執(zhí)行相關(guān)功能塊,最后在執(zhí)行反序列化返回初始對(duì)象。如圖1所示,為這兩個(gè)指令實(shí)現(xiàn)的結(jié)果。
從TIA V13SP1,S7-1200 V4.0開始支持這兩個(gè)指令。

圖1 指令實(shí)現(xiàn)的功能

圖2 指令位置

圖3 指令詳情
對(duì)于Deserialize(反序列化)、Serialize(序列化),目前出了2個(gè)版本的指令:
1. TIA 博途 V13SP1開始,S7-1200 V4.0、V4.1支持V1版本,以下為V1版本說明:
Deserialize:參數(shù)參見表1
表1 Deserialize參數(shù)
| 參數(shù) | 聲明 | 數(shù)據(jù)類型 | 說明 |
|---|---|---|---|
| SRC_ARRAY | Input | Variant或Array of Byte | 標(biāo)準(zhǔn)Byte數(shù)組 |
| POS | InOut | DInt | 見下面注意4 |
| Ret_Val | Return | Int | 錯(cuò)誤代碼 |
| DEST_VARIABLE | Output | Variant或Struct、UDT、Array等 | 反序列化后的輸出變量 |
Serialize:參數(shù)參見表2
表2 Serialize參數(shù)
| 參數(shù) | 聲明 | 數(shù)據(jù)類型 | 說明 |
|---|---|---|---|
| SRC_VARIABLE | Input | Variant或Struct、UDT、Array等 | 待序列化的輸入變量 |
| POS | InOut | DInt | 見下面注意4 |
| Ret_Val | Return | Int | 錯(cuò)誤代碼 |
| DEST_ARRAY | Output | Variant或Array of Byte | 標(biāo)準(zhǔn)Byte數(shù)組 |
注意:
(1) V1版本中標(biāo)準(zhǔn)Byte數(shù)組不能是優(yōu)化數(shù)據(jù)塊的數(shù)組,可以是諸如P#M100.0 Byte 10這種看做是數(shù)組的(原因)。所以Deserialize的SRC_ARRAY與Serialize的DEST_ARRAY支持的Variant類型其實(shí)指向的就是P#指針這種,指向其他類型都不可以。
(2)同樣是Variant類型,Deserialize的DEST_VARIABLE與Serialize的SRC_VARIABLE是真正的支持Variant類型,并且是可以處理Variant類型的變量的指令之二。
(3) SRC_ARRAY/DEST_ARRAY的數(shù)組大小要大于DEST_VARIABLE/SRC_VARIABLE的空間占用
(4)DEST_VARIABLE/SRC_VARIABLE空間占用的計(jì)算規(guī)則:
-
位變量位于另一位變量后則地址連續(xù)排布,如果位于其他變量類型的后面,則需要從整字節(jié)地址開始;
-
字節(jié)大小的變量從整字節(jié)地址開始;
-
字、雙字、四字的變量從偶數(shù)字節(jié)地址開始;
例子:如圖4所示,雖然總數(shù)上是5個(gè)字節(jié),但是因?yàn)檎巫兞繌呐紨?shù)字節(jié)地址開始所以空出了一個(gè)字節(jié),因此這種排布需要占6個(gè)字節(jié)。

圖4 6個(gè)字節(jié)的排布
(4)POS變量
POS變量聲明是InOut,用在Byte數(shù)組的下標(biāo)變量,有輸入有輸出。
Deserialize:POS的初始輸入作為待轉(zhuǎn)化的Byte數(shù)組的起始元素,指令結(jié)束后,POS的輸出=初始輸入+DEST_VARIABLE占據(jù)的字節(jié)數(shù)
也可以看做指針,初始指針指向Byte數(shù)組所在的POS位置,轉(zhuǎn)化后,指針移動(dòng)了DEST_VARIABLE占據(jù)的字節(jié)數(shù)。
注意:POS>=0,當(dāng)POS=0時(shí),為Byte數(shù)組的第一個(gè)元素,所以建議Byte數(shù)組使用Array[0..x] of Byte,這樣Byte數(shù)組下標(biāo)可以和POS對(duì)應(yīng)上。
例子:POS實(shí)例,如圖5所示。

圖5 POS示例
①:初始POS=0,指針指向數(shù)組第0個(gè)元素
②:執(zhí)行Deserialize,轉(zhuǎn)化了12個(gè)字節(jié),POS的輸出=0+12=12,指針指向數(shù)組第12個(gè)元素
Serialize:POS的初始輸入作為轉(zhuǎn)化后的Byte數(shù)組的起始元素,指令結(jié)束后,POS的輸出=初始輸入+SRC_VARIABLE占據(jù)的字節(jié)數(shù)
也可以看做指針,初始指針指向Byte數(shù)組所在的POS位置,轉(zhuǎn)化后,指針移動(dòng)了SRC_VARIABLE占據(jù)的字節(jié)數(shù)。
注意:POS>=0,當(dāng)POS=0時(shí),為Byte數(shù)組的第一個(gè)元素,所以建議Byte數(shù)組使用Array[0..x] of Byte,這樣Byte數(shù)組下標(biāo)可以和POS對(duì)應(yīng)上。
例子參考圖5:
①:初始POS=0,指針指向數(shù)組第0個(gè)元素
②:執(zhí)行Serialize,轉(zhuǎn)化了12個(gè)字節(jié),POS的輸出=0+12=12,指針指向數(shù)組第12個(gè)元素
2. TIA 博途 V14開始,S7-1200 V4.2支持V2版本
功能與V1版本不同的是
(1)標(biāo)準(zhǔn)Byte數(shù)組可以是優(yōu)化數(shù)據(jù)塊的數(shù)組
(2)Deserialize的SRC_ARRAY支持Array[*] of Byte
使用舉例:
編寫FC,實(shí)現(xiàn)清零各種DB塊的變量
思路:
1. 將需要清空的DB塊內(nèi)所有變量放入Struct/UDT,或者將需要清空的數(shù)據(jù)塊建立成UDT類型生成的DB,然后使用Deserialize(反序列化)指令清空。
2. 用于清空的Byte數(shù)組可以使用M區(qū)。對(duì)于S7-1211C與S7-1212C有4kB的M區(qū),對(duì)于S7-1214C、S7-1215C、S7-1217C有8kB的M區(qū),通常不會(huì)用到很多,這樣可以利用其中靠后不常用的區(qū)域,例如2kB來清空最多2kB的DB塊。
3. 有多個(gè)不同的結(jié)構(gòu)的DB,都可以先后清空。
編寫的FC、DB及調(diào)用,如圖6-8所示。

圖6 FC編寫

圖7 使用的DB24

圖8 FC調(diào)用
圖8中DB37為UDT_1類型生成的DB,可以直接填寫在Variant類型的InOut_1的實(shí)參處,并且完整清空DB37。
--------------------END------------------
審核編輯 :李倩
-
變量
+關(guān)注
關(guān)注
0文章
616瀏覽量
29506 -
數(shù)組
+關(guān)注
關(guān)注
1文章
420瀏覽量
27368 -
S7-1200
+關(guān)注
關(guān)注
11文章
335瀏覽量
19559
原文標(biāo)題:S7-1200:Deserialize(反序列化)、Serialize(序列化)
文章出處:【微信號(hào):gh_a8b121171b08,微信公眾號(hào):機(jī)器人及PLC自動(dòng)化應(yīng)用】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
JSON:簡(jiǎn)潔代碼高效搞定序列化與反序列化
IO序列化操作:提升系統(tǒng)互操作性的關(guān)鍵技術(shù)
【ioqueue】 IO序列化操作全解析
極簡(jiǎn)代碼,搞定JSON序列化與反序列化
深入剖析LMH0030:SMPTE標(biāo)準(zhǔn)數(shù)字視頻序列化器的卓越之選
深入解析LM2512A:高性能RGB顯示接口序列化器
SN65HVS885:工業(yè)自動(dòng)化的理想數(shù)字輸入序列化器
深度解析DS90UH929-Q1:720p HDMI 到 FPD-Link III 橋接序列化器
DS90UH947-Q1:1080p OpenLDI至FPD - Link III序列化器的深度解析
輕量級(jí)參數(shù)的管理框架(C語言)
天拓四方分享:什么事S7-1200 G2++?
西門子S7-1200 G2的7大亮點(diǎn)及最新功能
快手上線鴻蒙應(yīng)用高性能解決方案:數(shù)據(jù)反序列化性能提升90%
spartan 6 14位LVDS 反序列化
什么是SerDes?SerDes有哪些應(yīng)用?
S7-1200:Deserialize(反序列化)、Serialize(序列化)
評(píng)論