在 TIA 里试一下
通过 TiaLink 把本页示例(FB_Serialize_Demo)作为“外部源”导入你当前打开的 TIA Portal 项目:预检、生成块、编译,并清理外部源。导入后不会自动保存;FB 导入后需要在 OB 里调用。
一句话
答案:把 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 的块接口
| 区块 | 名称 | 类型 | 说明 |
|---|
| 输入 | Source | ARRAY[0..3] OF Int | |
| 输出 | Ret | Int | |
| 输出 | BytesUsed | DInt | |
| 静态 | Buffer | ARRAY[0..15] OF Byte | |
| 静态 | Pos | DInt | |
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;
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 云仿真
验证状态
| 项目 | 结果 | 日期 | 证据 |
|---|
| 构建期语法/结构校验 | 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/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 把结构/数组转成连续字节流,包含对齐/填充规则,适合通信或存储。