You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Beckhoff TwinCAT3结构化文本中动态数组大小计算方法咨询

在TwinCAT 3中获取数组大小以实现动态For循环

TwinCAT 3完全支持IEC 61131-3标准的数组上下界函数,你之前没找到可能是查文档时的遗漏。下面是两种可行的解决方案:

方法1:通过上下界函数计算数组大小

使用UPPER_BOUND和LOWER_BOUND函数可以直接获取数组的索引范围,进而计算元素个数,这也是遍历数组最直观的方式:

示例代码

// 定义布尔报警数组(示例为1-based索引)
arrAlarms: ARRAY[1..10] OF BOOL;
nArraySize: INT;
i: INT;

// 计算数组元素个数
nArraySize := UPPER_BOUND(arrAlarms, 1) - LOWER_BOUND(arrAlarms, 1) + 1;

// 动态遍历数组检查报警
FOR i := LOWER_BOUND(arrAlarms, 1) TO UPPER_BOUND(arrAlarms, 1) DO
    IF arrAlarms[i] THEN
        // 执行报警处理逻辑,比如触发提示、记录日志等
    END_IF;
END_FOR;

注意:UPPER_BOUND和LOWER_BOUND的第二个参数是数组维度,一维数组传1即可,多维数组对应传入维度序号(比如二维数组传2获取第二维的边界)。

方法2:通过SIZEOF函数计算元素个数

TwinCAT 3确实提供SIZEOF函数,但它返回的是数组占用的字节总数,而非元素个数。不过可以通过数组总字节数除以单个元素的字节数,得到元素总数:

示例代码

// 定义布尔报警数组
arrAlarms: ARRAY[0..9] OF BOOL;
nArraySize: INT;

// 计算元素个数:总字节数 / 单个元素字节数
nArraySize := SIZEOF(arrAlarms) / SIZEOF(arrAlarms[0]);

这种方法适用于所有数据类型的数组,但要注意如果是自定义结构体数组,SIZEOF会自动计算结构体的字节大小,除法依然有效。不过相比上下界方法,它无法直接获取索引范围,更适合只需要元素个数的场景。

推荐实践

如果你的核心需求是遍历数组检查报警,直接用LOWER_BOUND和UPPER_BOUND作为For循环的起止值即可,不需要单独计算数组大小——这样代码更简洁,也能适配任何索引范围的数组(比如0-based、1-based甚至非连续索引,不过TwinCAT数组默认是连续索引)。

内容的提问来源于stack exchange,提问作者Alex Chala

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 07:57:08