在 TIA 里试一下
通过 TiaLink 把本页示例(FB_Deserialize_Demo)作为“外部源”导入你当前打开的 TIA Portal 项目:预检、生成块、编译,并清理外部源。导入后不会自动保存;FB 导入后需要在 OB 里调用。
一句话
答案:把 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 的块接口
| 区块 | 名称 | 类型 | 说明 |
|---|
| 输入 | Buffer | ARRAY[0..15] OF Byte | |
| 输出 | Ret | Int | |
| 输出 | BytesUsed | DInt | |
| 输出 | First | Int | |
| 静态 | Target | ARRAY[0..3] OF Int | |
| 静态 | Pos | DInt | |
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;
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 云仿真
验证状态
| 项目 | 结果 | 日期 | 证据 |
|---|
| 构建期语法/结构校验 | PASS | 2026-11-02 | parse + validate |
| PLC 云仿真 | scl_validate 通过 | 2026-11-02 | scl_run_scenario / scl_validate |
| TIA 导入编译 | PASS(0 error / 0 warning) | 2026-11-02 | TiaLink + 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 按序列化格式解析字节流,包含对齐/填充规则。