跳到正文
Learn-SCL
SCL 示例库/SCL 指令手册/SCL Deserialize — 反序列化

SCL Deserialize — 反序列化

把字节数组反序列化回变量。

数组与DB S7-1200/1500 TIA V19 别名:反序列化 / Deserialize

在 TIA 里试一下

通过 TiaLink 把本页示例(FB_Deserialize_Demo)作为“外部源”导入你当前打开的 TIA Portal 项目:预检、生成块、编译,并清理外部源。导入后不会自动保存;FB 导入后需要在 OB 里调用。

TiaLink 设置

默认 http://localhost:8080。也可以在本页地址后加 ?tialink= 临时指定。

TiaLink 启动时若设置了 --api-token,这里要填相同的值;只保存在本机浏览器 localStorage,不会上传。

一句话

答案:把 POS 设为 0,然后 #Ret := Deserialize(SRC_ARRAY := #Buffer, DEST_VARIABLE := #Target, POS := #Pos); 字节流还原到 Target,POS 返回已消费字节数。

Deserialize 把连续字节流还原成数组/结构体/UDT:#Ret := Deserialize(SRC_ARRAY := #Buffer, DEST_VARIABLE := #Target, POS := #Pos);。POS 是零基索引,调用后是已消费字节数。

参数

参数方向类型存储区说明
SRC_ARRAY输入ARRAY[*] of BYTE / ARRAY of CHAR—包含序列化字节流的缓冲区;低界建议从 0 开始。
DEST_VARIABLE输入/输出UDT / STRUCT / ARRAY—反序列化的目标变量;类型和字节流必须匹配。
POS输入/输出DINT—零基读取位置;调用后为已消费的字节数。
Return返回值INT—错误码;0 表示成功,其他值见 TIA 帮助。

参数表以 TIA Portal V19 帮助为事实核对;S7-1200/1500 有差异时在类型列并列显示。存储区是 TIA 允许的范围,实际可用范围还受块接口和优化属性影响。

最小示例

下面是一个完整块,页面展示的源码就是 TiaLink 导入的同一份源码。页面代码已通过构建期语法/结构校验;云仿真状态见下方。

FB_Deserialize_Demo FB

最小示例 · 27 行 · 源文件 blocks/FB_Deserialize_Demo.scl

查看 FB_Deserialize_Demo 的块接口
区块名称类型说明
输入BufferARRAY[0..15] OF Byte
输出RetInt
输出BytesUsedDInt
输出FirstInt
静态TargetARRAY[0..3] OF Int
静态PosDInt
blocks/FB_Deserialize_Demo.scl
1FUNCTION_BLOCK "FB_Deserialize_Demo"
2{ S7_Optimized_Access := 'TRUE' }
3VERSION : 0.1
4   VAR_INPUT
5      Buffer : Array[0..15] of Byte;  // 序列化字节流
6   END_VAR
7 
8   VAR_OUTPUT
9      Ret : Int;                      // 错误码,0 为成功
10      BytesUsed : DInt;               // 已消费字节数
11      First : Int;                    // 还原后的第一个元素
12   END_VAR
13 
14   VAR
15      Target : Array[0..3] of Int;    // 反序列化目标
16      Pos : DInt;                     // 零基位置
17   END_VAR
18 
19BEGIN
20   REGION 反序列化
21      #Pos := 0;
22      #Ret := Deserialize(SRC_ARRAY := #Buffer, DEST_VARIABLE := #Target, POS := #Pos);
23      #BytesUsed := #Pos;
24      #First := #Target[0];
25   END_REGION
26END_FUNCTION_BLOCK
27 

块接口表由源码自动生成;# 前缀表示块内局部变量,实际工程里也可以是全局标签或 DB 变量。

SCL 写法

SCL
1#Pos := 0;
2#Ret := Deserialize(SRC_ARRAY := #Buffer, DEST_VARIABLE := #Target, POS := #Pos);
3#BytesUsed := #Pos;
  • SRC_ARRAY 是 ARRAY[*] of BYTE 或 ARRAY of CHAR。
  • DEST_VARIABLE 的类型/顺序/对齐必须和 Serialize 时一致。
  • Ret=0 表示成功;非 0 是错误码。

怎么工作

参数 作用
SRC_ARRAY 序列化字节流缓冲区
DEST_VARIABLE 还原目标数组/结构体/UDT
POS 零基读取位置;调用后变成已消费字节数
Ret 错误码,0 成功
  • 反序列化会忽略填充字节,但要求结构定义一致。
  • 字节流来自 Serialize 时,填充字节会自动处理;手工拼字节流要自己补对齐。
  • 缓冲区不够或 POS 越界会返回错误码。
  • Deserialize 只负责解析字节流,不负责接收;接收用 TRCV/TRCV_C 等。

常用场景

1. 通信接收还原

收到字节流后,用 Deserialize 还原配方/参数结构体;再校验版本/校验和。

2. 文件/DB 读取

从文件或 DB 读出 Array of Byte,反序列化回结构体;适合保存整组参数。

3. 结构比较/迁移

把旧版本结构体反序列化后逐字段迁移;注意新旧结构体布局差异。

常见坑

  • POS 没清零:第一次调用前设 0;否则从缓冲区中间开始读。
  • 结构不一致:类型、顺序、对齐不同会得到错误数据;Serialize/Deserialize 用同一份定义。
  • 缓冲区太小/POS 越界:返回错误码;先检查字节数。
  • SRC 类型不对:必须是 ARRAY of BYTE/CHAR;普通 Int 数组不行。
  • 忽略错误码:Ret 非 0 时不要继续使用目标数据。
  • 字节序/对齐:跨 CPU/系统通信时确认端序和对齐规则。
  • 版本兼容:结构体加字段后旧字节流可能解析错;加版本号/长度字段。

和 LAD 的区别

LAD 的 Deserialize 是带 SRC_ARRAY/DEST_VARIABLE/POS 的盒;SCL 里直接写函数调用,适合和通信/文件逻辑连写。语义一样,SCL 更容易把接收和解析放在一个流程里。梯形图版本见 Learn-LAD 的 Deserialize 页。

云仿真验证

本页代码已通过构建期语法/结构校验。该示例涉及 VARIANT/结构绑定,云仿真只做 scl_validate,未跑场景。 云仿真校验日期:2026-11-02。

打开 PLC 云仿真

验证状态

项目结果日期证据
构建期语法/结构校验PASS2026-11-02parse + validate
PLC 云仿真scl_validate 通过2026-11-02scl_run_scenario / scl_validate
TIA 导入编译PASS(0 error / 0 warning)2026-11-02TiaLink + TIA Portal

“待实测”表示还没有在 TIA Portal 里导入编译,不代表代码有问题;上机前请先在测试项目编译。云仿真在 tia.hubwiz.com/sim 执行,不替代 TIA 编译。

来源与说明

参数、行为和数据类型的核对来源:TIA Portal V19 帮助的 Instructions/Instructions/Basic_instructions/SCL/Move_operations/Deserialize__Deserialize.md。中文讲解、SCL 示例、时序图和验证场景由 Learn-SCL 编写。

SRC_ARRAY/DEST_VARIABLE/POS 参数、零基索引和错误码以 TIA Portal V19 帮助为事实核对;中文讲解和 SCL 示例由 Learn-SCL 编写。

Siemens 文档与截图的版权归 Siemens;本站只引用事实参数,不复制官方描述段落和图片。官方参考:Siemens TIA Portal。

常见问题

POS 从 0 还是 1 开始?

零基:第一次调用前 POS=0,调用后 POS 是已消费字节数。

目标和字节流类型不匹配会怎样?

返回错误码或得到错误数据;Serialize 和 Deserialize 的结构定义必须一致(类型、顺序、对齐)。

Deserialize 和 MOVE_BLK 有什么区别?

MOVE_BLK 按元素复制;Deserialize 按序列化格式解析字节流,包含对齐/填充规则。

← 返回 SCL 指令手册