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。
審核編輯:劉清
-
POS
+關注
關注
3文章
119瀏覽量
28327 -
SRC
+關注
關注
0文章
61瀏覽量
18008 -
S7-1200
+關注
關注
11文章
331瀏覽量
18010
原文標題:S7-1200:Deserialize(反序列化)、Serialize(序列化)
文章出處:【微信號:gh_a8b121171b08,微信公眾號:機器人及PLC自動化應用】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論