Beckhoff Twincat3 结构化文本动态数组大小计算

问题描述 投票:0回答:1

我编写了一个程序,循环遍历数组来检查布尔警报变量状态。

我想动态生成 for 循环计数整数以结束循环。

我浏览了 Benchoff 的 Twincat 3 文档,但找不到任何通用的

SIZEOF()
函数来生成数组大小,例如

nArraySize := SIZEOF(Array);

另一个是生成数组的上界和下界来确定大小,但我也找不到任何函数来执行此操作。

twincat structured-text
1个回答
0
投票

您无法真正确定大小,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);

您可以使用的最后一种方法是使用内存访问和指针,但这会变得更复杂一点,并且如果不额外注意地址的话是不安全的。

© www.soinside.com 2019 - 2024. All rights reserved.