浏览示例
把语法放回完整程序里看:边沿、定时器、状态机、缓冲站、阀门控制。
打开示例库 →SCL 数组怎么定义、下标从哪开始、多维数组、ARRAY[*]、数组 DB,以及 LOWER_BOUND/UPPER_BOUND/MOVE_BLK 的配合。
一句话:SCL 数组用 Array[lo..hi] of 类型 定义;下标从声明的 lo 开始,不一定是 0。通用代码用 LOWER_BOUND/UPPER_BOUND 取范围,批量复制用 MOVE_BLK/FILL_BLK。
数组是 SCL 里最容易“看起来会、实际越界”的部分。这页把定义、下标、边界、数组 DB 和常用指令串起来;具体指令页见 SCL 指令手册。
一维数组:
1VAR
2 Values : Array[1..8] of Int;
3 Raw : Array[0..15] of Byte;
4END_VAR
多维数组:
1VAR
2 Matrix : Array[0..3, 0..7] of Real;
3END_VAR
Array[1..8] 从 1 开始,Array[0..7] 从 0 开始。Struct、UDT、甚至 FB 实例(数组实例)。Matrix[2, 5];不要把它当一维数组拍平。全局数组通常放在数据块里:
1DATA_BLOCK "DB_Data"
2{ S7_Optimized_Access := 'TRUE' }
3VERSION : 0.1
4 VAR
5 Values : Array[1..8] of Int;
6 END_VAR
7BEGIN
8END_DATA_BLOCK
访问:
1"DB_Data".Values[1] := 10;
2#Sum := #Sum + "DB_Data".Values[#i];
CountOfElements),排查时先看 DB 属性。通用库函数用 Array[*] + 边界指令:
1FUNCTION_BLOCK "FB_ArraySum"
2 VAR_IN_OUT
3 Data : Array[*] of Int;
4 END_VAR
5 VAR_OUTPUT
6 Sum : DInt;
7 END_VAR
8 VAR_TEMP
9 i : DInt;
10 END_VAR
11BEGIN
12 #Sum := 0;
13 FOR #i := LOWER_BOUND(ARR := #Data, DIM := 1)
14 TO UPPER_BOUND(ARR := #Data, DIM := 1) DO
15 #Sum := #Sum + #Data[#i];
16 END_FOR;
17END_FUNCTION_BLOCK
注意:TIA 的 LOWER_BOUND/UPPER_BOUND 只接受 ARRAY[*];把固定 Array[1..8] 直接传进去会报 “Only ARRAYs with variable limits are permitted”。
MOVE_BLK / UMOVE_BLK,IN/OUT 用数组起始元素,COUNT 是元素个数。FILL_BLK / UFILL_BLK。UPPER_BOUND - LOWER_BOUND + 1;VARIANT 指向的数组用 CountOfElements。Serialize / Deserialize 把结构/数组转成字节流,跨通信/文件使用。指令细节:
Array[1..8] 写 [0] 会越界或访问到别的数据。LOWER_BOUND/UPPER_BOUND 或 CountOfElements。Matrix[i] 不是一行;要按声明维度访问。P#/绝对偏移;用符号访问。MOVE_BLK 按元素类型复制;结构体布局/版本不一致时先确认。由声明决定:Array[0..7] 从 0 开始,Array[1..8] 从 1 开始;不要假设一定是 0。
变量边界数组,长度由调用方传入的实际数组决定;LOWER_BOUND/UPPER_BOUND 用它写通用库,TIA 也只允许对 ARRAY[*] 使用这两条指令。
把语法放回完整程序里看:边沿、定时器、状态机、缓冲站、阀门控制。
打开示例库 →把示例导入你的 TIA Portal 工程,生成块、编译并读回核对。
了解 TiaLink →不装博途,用 MCP 逐扫描运行 SCL,做场景验收。
打开云仿真 →