在 TIA 里试一下
通过 TiaLink 把本页示例(FB_CountOfElements_Demo)作为“外部源”导入你当前打开的 TIA Portal 项目:预检、生成块、编译,并清理外部源。导入后不会自动保存;FB 导入后需要在 OB 里调用。
一句话
答案:IF IS_ARRAY(#Data) THEN #Count := CountOfElements(#Data); END_IF; 返回 VARIANT 指向数组的元素总数,非数组返回 0。
CountOfElements 返回 VARIANT 指向的数组元素总数:IF IS_ARRAY(#Data) THEN #Count := CountOfElements(#Data); END_IF;。不是数组时返回 0。
参数
| 参数 | 方向 | 类型 | 存储区 | 说明 |
Operand | 输入 | VARIANT | — | 指向一个 ARRAY 的 VARIANT 变量。可以在 Input、InOut 或 Temp 区声明。 |
Return | 返回值 | UDINT | — | 数组元素总数;多维数组返回所有维度元素数之和。不是数组时返回 0。 |
参数表以 TIA Portal V19 帮助为事实核对;S7-1200/1500 有差异时在类型列并列显示。存储区是 TIA 允许的范围,实际可用范围还受块接口和优化属性影响。
最小示例
下面是一个完整块,页面展示的源码就是 TiaLink 导入的同一份源码。页面代码已通过构建期语法/结构校验;云仿真状态见下方。
FB_CountOfElements_Demo FB
最小示例 · 22 行 · 源文件 blocks/FB_CountOfElements_Demo.scl
查看 FB_CountOfElements_Demo 的块接口
| 区块 | 名称 | 类型 | 说明 |
|---|
| 输入 | Data | "Variant" | |
| 输出 | IsArray | Bool | |
| 输出 | Count | UDInt | |
blocks/FB_CountOfElements_Demo.scl
1FUNCTION_BLOCK "FB_CountOfElements_Demo"
2{ S7_Optimized_Access := 'TRUE' }
3VERSION : 0.1
4 VAR_INPUT
5 Data : Variant;
6 END_VAR
7
8 VAR_OUTPUT
9 IsArray : Bool;
10 Count : UDInt;
11 END_VAR
12
13BEGIN
14 REGION 查询数组元素数
15 #IsArray := IS_ARRAY(#Data);
16 #Count := 0;
17 IF #IsArray THEN
18 #Count := CountOfElements(#Data);
19 END_IF;
20 END_REGION
21END_FUNCTION_BLOCK
22
块接口表由源码自动生成;# 前缀表示块内局部变量,实际工程里也可以是全局标签或 DB 变量。
SCL 写法
SCL
1IF IS_ARRAY(#Data) THEN
2 #Count := CountOfElements(#Data);
3END_IF;
#Data 可以是 Variant 输入、InOut 或 Temp;调用前先用 IS_ARRAY 判断。
怎么工作
#Data 指向 |
返回 |
Array[0..7] of Int |
8 |
Array[1..8] of Int |
8 |
| 二维数组 |
所有维度元素总数 |
| 标量 |
0 |
| 空指针 |
0 |
- 返回
UDINT;元素很多时也不会是负数。
- 单维数组返回“上界 - 下界 + 1”;多维返回各维乘积。
Array of BOOL 的填充位也计入元素数;例如 Array[0..1] of BOOL 返回 8。
- 如果数组在数据块里,DB 不能勾选“设备中写保护”,否则可能返回 0。
常用场景
1. 通用库函数
写 FC/FB 时不知道调用方数组长度,用 Variant + CountOfElements 动态遍历,避免写死长度。
2. 通信/序列化缓冲区
序列化前确认目标数组元素数够用;比固定长度更安全。
3. 多维数组统计
快速获取总元素数,再决定是否逐维处理;逐维长度用 LOWER_BOUND/UPPER_BOUND。
常见坑
- 不判断 IS_ARRAY:标量会返回 0,看起来像“空数组”;先判断类型。
- 把总数当单维长度:多维数组返回总数;某一维长度要用边界指令。
- DB 写保护:数组在写保护的 DB 里可能返回 0;检查 DB 属性。
- VARIANT 为空:空指针返回 0;调用前确认引用有效。
- BOOL 数组填充:元素数按位/字节对齐,可能大于业务上的“有效位数”。
- CPU 固件:ARRAY[*]/VARIANT 相关指令对固件有要求;上机前确认。
云仿真验证
本页代码已通过构建期语法/结构校验。该示例涉及 VARIANT/结构绑定,云仿真只做 scl_validate,未跑场景。 云仿真校验日期:2026-11-02。
打开 PLC 云仿真
验证状态
| 项目 | 结果 | 日期 | 证据 |
|---|
| 构建期语法/结构校验 | PASS | 2026-11-02 | parse + validate |
| PLC 云仿真 | scl_validate 通过 | 2026-11-02 | scl_run_scenario / scl_validate |
| TIA 导入编译 | PASS(0 error / 0 warning) | 2026-11-02 | TiaLink + TIA Portal |
“待实测”表示还没有在 TIA Portal 里导入编译,不代表代码有问题;上机前请先在测试项目编译。云仿真在 tia.hubwiz.com/sim 执行,不替代 TIA 编译。
来源与说明
参数、行为和数据类型的核对来源:TIA Portal V19 帮助的 Instructions/Instructions/Basic_instructions/SCL/Move_operations/VARIANT/CountOfElements__Get_number_of_ARRAY_elements.md。中文讲解、SCL 示例、时序图和验证场景由 Learn-SCL 编写。
VARIANT 输入、UDINT 返回值和多维/BOOL 数组规则以 TIA Portal V19 帮助为事实核对;中文讲解和 SCL 示例由 Learn-SCL 编写。
Siemens 文档与截图的版权归 Siemens;本站只引用事实参数,不复制官方描述段落和图片。官方参考:Siemens TIA Portal。
常见问题
CountOfElements 和 UPPER_BOUND 有什么区别?
CountOfElements 直接返回元素总数;UPPER_BOUND 返回上界,还要减去下界再加 1 才是元素数。
非数组会返回什么?
返回 0。先 `IS_ARRAY` 判断,避免把标量当成空数组。
多维数组怎么算?
返回所有维度元素数的乘积/总数,不是单维长度;需要某一维长度用 LOWER_BOUND/UPPER_BOUND。