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

SCL Serialize — 序列化

把变量序列化成字节数组。

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

在 TIA 里试一下

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

TiaLink 设置

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

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

一句话

答案:把 POS 设为 0,然后 #Ret := Serialize(SRC_VARIABLE := #Source, DEST_ARRAY := #Buffer, POS := #Pos); 字节流写入 Buffer,POS 返回已用字节数。

Serialize 把数组/结构体/UDT 转成连续字节流:#Ret := Serialize(SRC_VARIABLE := #Source, DEST_ARRAY := #Buffer, POS := #Pos);。POS 是零基索引,调用后是已用字节数。

参数

参数方向类型存储区说明
SRC_VARIABLE输入UDT / STRUCT / ARRAY—要序列化的变量;可以是数组、结构体或 UDT。不能是 I/O 数据。
DEST_ARRAY输入/输出ARRAY of BYTE / CHAR—接收字节流的缓冲区;低界建议从 0 开始,容量要够。
POS输入/输出DINT—零基索引;调用前设为 0 或上一个结构的结束位置,调用后为已用字节数。
Return返回值INT—错误码;0 表示成功,其他值见 TIA 帮助(如 8253 空间不足)。

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

最小示例

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

FB_Serialize_Demo FB

最小示例 · 25 行 · 源文件 blocks/FB_Serialize_Demo.scl

查看 FB_Serialize_Demo 的块接口
区块名称类型说明
输入SourceARRAY[0..3] OF Int
输出RetInt
输出BytesUsedDInt
静态BufferARRAY[0..15] OF Byte
静态PosDInt
blocks/FB_Serialize_Demo.scl
1FUNCTION_BLOCK "FB_Serialize_Demo"
2{ S7_Optimized_Access := 'TRUE' }
3VERSION : 0.1
4   VAR_INPUT
5      Source : Array[0..3] of Int;   // 要序列化的数组
6   END_VAR
7 
8   VAR_OUTPUT
9      Ret : Int;                     // 错误码,0 为成功
10      BytesUsed : DInt;              // 已用字节数
11   END_VAR
12 
13   VAR
14      Buffer : Array[0..15] of Byte; // 字节缓冲区
15      Pos : DInt;                    // 零基位置
16   END_VAR
17 
18BEGIN
19   REGION 序列化
20      #Pos := 0;
21      #Ret := Serialize(SRC_VARIABLE := #Source, DEST_ARRAY := #Buffer, POS := #Pos);
22      #BytesUsed := #Pos;
23   END_REGION
24END_FUNCTION_BLOCK
25 

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

SCL 写法

SCL
1#Pos := 0;
2#Ret := Serialize(SRC_VARIABLE := #Source, DEST_ARRAY := #Buffer, POS := #Pos);
3#BytesUsed := #Pos;
  • DEST_ARRAY 必须是 ARRAY of BYTE 或 ARRAY of CHAR。
  • 缓冲区低界建议从 0 开始;否则 POS 和数组下标的对应关系会变。
  • Ret=0 表示成功;非 0 是错误码(如 8253 空间不足)。

怎么工作

参数 作用
SRC_VARIABLE 要序列化的数组/结构体/UDT
DEST_ARRAY 接收字节流的缓冲区
POS 零基写入位置;调用后变成已用字节数
Ret 错误码,0 成功
  • 序列化包含对齐/填充规则,字节数不一定等于“元素个数 × 元素宽度”。
  • 缓冲区容量不够会返回错误码,不会自动扩容。
  • 标准访问区上限 64 KB;优化访问在 V2.0 以上也支持。
  • Serialize 只负责转字节流,不负责发送;发送用 TSEND/TSEND_C 等。

常用场景

1. 结构体/数组写入通信缓冲区

把配方、参数结构体转成字节流,再通过 TCP/S7 通信发送;接收端用 Deserialize 还原。

2. 保存到文件/DB

先把结构体序列化到 Array of Byte,再用文件/DB 写入指令保存;比逐字段写更紧凑。

3. 结构比较/校验

把两个结构体序列化后比较字节流,或计算校验和;但要注意填充字节。

常见坑

  • POS 没清零:第一次调用前要设 0;否则会从缓冲区中间开始写。
  • 缓冲区太小:返回 8253 等错误;先算好最大字节数,留余量。
  • 字节数不等于元素数:有对齐/填充;用 POS 返回的实际字节数。
  • DEST 类型不对:必须是 ARRAY of BYTE/CHAR;普通 Int 数组不行。
  • 优化/标准访问:标准访问 64 KB 上限;优化访问有版本要求。
  • 忽略错误码:Ret 非 0 时不要继续发送/保存,先处理错误。
  • 端序/对齐:跨 CPU/系统通信时确认字节序和对齐规则。

和 LAD 的区别

LAD 的 Serialize 是带 SRC_VARIABLE/DEST_ARRAY/POS 的盒;SCL 里直接写函数调用,适合和通信/文件逻辑连写。语义一样,SCL 更容易把序列化和发送放在一个流程里。梯形图版本见 Learn-LAD 的 Serialize 页。

云仿真验证

本页代码已通过构建期语法/结构校验。该示例涉及 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/Serialize__Serialize.md。中文讲解、SCL 示例、时序图和验证场景由 Learn-SCL 编写。

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

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

常见问题

POS 从 0 还是 1 开始?

零基:缓冲区低界建议从 0 开始;第一次调用前 POS=0,调用后 POS 是已用字节数。

DEST_ARRAY 能用普通数组吗?

必须是 `ARRAY of BYTE` 或 `ARRAY of CHAR`;容量不够时返回错误码(如 8253)。

Serialize 和 MOVE_BLK 有什么区别?

MOVE_BLK 按元素复制;Serialize 把结构/数组转成连续字节流,包含对齐/填充规则,适合通信或存储。

← 返回 SCL 指令手册