1FUNCTION_BLOCK"FB_UpperBound_Demo"2{ S7_Optimized_Access :='TRUE' }3VERSION:0.14VAR_IN_OUT5 Data :Array[*]ofInt;// 通用数组:调用方绑定实际数组6END_VAR78VAR_OUTPUT9 High :DInt;// 上界10 Low :DInt;// 下界11 Count :DInt;// 元素个数12END_VAR1314BEGIN15REGION 读取数组边界16#High:= UPPER_BOUND(ARR :=#Data, DIM :=1);17#Low:= LOWER_BOUND(ARR :=#Data, DIM :=1);18#Count:=#High-#Low+1;19END_REGION20END_FUNCTION_BLOCK21
块接口表由源码自动生成;# 前缀表示块内局部变量,实际工程里也可以是全局标签或 DB 变量。
SCL 写法
SCL
1#High:= UPPER_BOUND(ARR :=#Data, DIM :=1);2#Low:= LOWER_BOUND(ARR :=#Data, DIM :=1);3#Count:=#High-#Low+1;
ARR 必须是 ARRAY[*](变量边界数组):示例块用 Data : Array[*] of Int 做通用库,调用方传 Array[1..8] 等实际数组。TIA 会拒绝把固定 Array[1..8] 直接当 ARR,报“Only ARRAYs with variable limits are permitted”。
怎么工作
调用方实际数组(绑定到 Array[*])
UPPER_BOUND(..., DIM=1)
Array[0..7]
7
Array[1..8]
8
Array[-2..2]
2
Array[*]
运行时上界
DIM 是维度号,从 1 开始;一维数组写 1。
返回类型是 DINT;元素个数用 UPPER_BOUND - LOWER_BOUND + 1。
结果是调用时绑定数组的实际上界;ARRAY[*] 让同一个块适配不同长度的数组。
上界不一定是长度;Array[1..8] 的上界是 8,但下界不是 0。
常用场景
1. 通用数组遍历
SCL
1FOR#i:= LOWER_BOUND(ARR :=#Data, DIM :=1)TO UPPER_BOUND(ARR :=#Data, DIM :=1)DO2// ...3END_FOR;