跳到正文
Learn-SCL
SCL 示例库/SCL 指令手册/SCL 数组与 DB 指令

SCL 数组与 DB 指令

西门子 SCL 数组与 DB 指令:数组上下界、元素个数、序列化和反序列化,含完整 FB 示例、边界场景和常见坑。

数组相关的 SCL 指令分成两类:读边界/元素数(LOWER_BOUND、UPPER_BOUND、CountOfElements)和转字节流(Serialize、Deserialize)。

数组下界不一定是 0;通用代码要用 LOWER_BOUND/UPPER_BOUND 动态取范围,不要写死 0..N。

Serialize/Deserialize 适合把结构体/数组写到通信缓冲区或文件;POS 是零基索引,类型/对齐必须两边一致。

SCL 数组与 DB 指令 5

怎么选

需求 指令
读下界/上界 LOWER_BOUND / UPPER_BOUND
读元素总数 CountOfElements
结构/数组转字节流 Serialize
字节流转回结构/数组 Deserialize
数组之间复制 MOVE_BLK

通用数组遍历

SCL
1#Low  := LOWER_BOUND(ARR := #Data, DIM := 1);
2#High := UPPER_BOUND(ARR := #Data, DIM := 1);
3FOR #i := #Low TO #High DO
4   // ...
5END_FOR;

序列化/反序列化

SCL
1#Pos := 0;
2#Ret := Serialize(SRC_VARIABLE := #Source, DEST_ARRAY := #Buffer, POS := #Pos);
3// ...
4#Pos := 0;
5#Ret := Deserialize(SRC_ARRAY := #Buffer, DEST_VARIABLE := #Target, POS := #Pos);

通信/文件两端的结构定义要一致;缓冲区要够大。

常见问题

数组下界一定是 0 吗?

不一定。Array[0..7] 下界是 0,Array[1..8] 下界是 1;通用代码用 LOWER_BOUND 读,不要写死。

CountOfElements 和 UPPER_BOUND 有什么区别?

CountOfElements 直接返回元素总数;UPPER_BOUND 返回上界,还要减去下界再加 1 才是长度。

Serialize 的 POS 从 0 还是 1 开始?

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

Serialize/Deserialize 需要什么条件?

DEST/SRC 必须是 ARRAY of BYTE 或 CHAR;结构定义两边一致;标准访问有 64 KB 上限,优化访问有固件版本要求。

← 返回 SCL 指令手册