我编写了一个程序,循环遍历数组来检查布尔警报变量状态。
我想动态生成 for 循环计数整数以结束循环。
我浏览了 Benchoff 的 Twincat 3 文档,但找不到任何通用的
SIZEOF()
函数来生成数组大小,例如
nArraySize := SIZEOF(Array);
另一个是生成数组的上界和下界来确定大小,但我也找不到任何函数来执行此操作。
您无法真正确定大小,SIZEOF 返回变量占用的字节数。您缺少一步,将数组大小(字节数)除以基本类型,以确定您拥有多少数据切片:
nArraySize := SIZEOF(array)/SIZEOF(array[0]) - 1;
然后你可以将 for 循环称为
for i := 0 to nArraySize by 1 do
myArray[i] ...
这当然假设你的数组从0开始。
上限和下限只能用于可变大小的数组。您可以做某事的一种方法是在程序中的某个位置定义数组,然后使用一个函数或方法,根据变量数组的要求,将变量数组作为
IN_OUT
参数:
myArray : ARRAY[5..10] of ST_MyDataType;
F_DoSomething
VAR_IN_OUT
refArray : ARRAY[*] of ST_MyDataType
END_VAR
VAR
nIteration
END_VAR
FOR nIteration := LOWER_BOUND(refArray,1) to UPPER_BOUND(refArray,1) by 1 do
if refArray[nIteration].Something = TRUE then
...
END_FOR
然后按原样调用该函数:
F_DoSomething(myArray);
您可以使用的最后一种方法是使用内存访问和指针,但这会变得更复杂一点,并且如果不额外注意地址的话是不安全的。