跳到正文
Learn-SCL
SCL 示例库/SCL 指南/SCL 数组:定义、下标、ARRAY[*] 与数组 DB

SCL 数组:定义、下标、ARRAY[*] 与数组 DB

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 指令手册。

定义

一维数组:

SCL
1VAR
2   Values : Array[1..8] of Int;
3   Raw    : Array[0..15] of Byte;
4END_VAR

多维数组:

SCL
1VAR
2   Matrix : Array[0..3, 0..7] of Real;
3END_VAR

数组 DB

全局数组通常放在数据块里:

SCL
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

访问:

SCL
1"DB_Data".Values[1] := 10;
2#Sum := #Sum + "DB_Data".Values[#i];

边界:不要写死 0..N

通用库函数用 Array[*] + 边界指令:

SCL
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”。

批量操作

指令细节:

常见坑

下一步

常见问题

SCL 数组下标从 0 还是 1 开始?

由声明决定:Array[0..7] 从 0 开始,Array[1..8] 从 1 开始;不要假设一定是 0。

ARRAY[*] 是什么?

变量边界数组,长度由调用方传入的实际数组决定;LOWER_BOUND/UPPER_BOUND 用它写通用库,TIA 也只允许对 ARRAY[*] 使用这两条指令。

下一步

浏览示例

把语法放回完整程序里看:边沿、定时器、状态机、缓冲站、阀门控制。

打开示例库 →

TiaLink

把示例导入你的 TIA Portal 工程,生成块、编译并读回核对。

了解 TiaLink →

PLC 云仿真

不装博途,用 MCP 逐扫描运行 SCL,做场景验收。

打开云仿真 →