跳到正文
Learn-SCL
SCL 示例库/SCL 指令手册/SCL CountOfElements — 数组元素个数

SCL CountOfElements — 数组元素个数

读 VARIANT 数组的元素个数。

数组与DB S7-1200/1500 TIA V19 别名:数组元素个数 / CountOfElements

在 TIA 里试一下

通过 TiaLink 把本页示例(FB_CountOfElements_Demo)作为“外部源”导入你当前打开的 TIA Portal 项目:预检、生成块、编译,并清理外部源。导入后不会自动保存;FB 导入后需要在 OB 里调用。

TiaLink 设置

默认 http://localhost:8080。也可以在本页地址后加 ?tialink= 临时指定。

TiaLink 启动时若设置了 --api-token,这里要填相同的值;只保存在本机浏览器 localStorage,不会上传。

一句话

答案: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"
输出IsArrayBool
输出CountUDInt
blocks/FB_CountOfElements_Demo.scl
1FUNCTION_BLOCK "FB_CountOfElements_Demo"
2{ S7_Optimized_Access := 'TRUE' }
3VERSION : 0.1
4   VAR_INPUT
5      Data : Variant;             // 指向数组的 VARIANT
6   END_VAR
7 
8   VAR_OUTPUT
9      IsArray : Bool;             // Data 是否指向数组
10      Count : UDInt;              // 元素总数;非数组为 0
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 相关指令对固件有要求;上机前确认。

和 LAD 的区别

LAD 的 CountOfElements 盒只有一个 VARIANT 输入和返回值;SCL 里直接写函数调用,适合放在 IF 或循环边界里。语义一样,SCL 更容易写通用数组库。梯形图版本见 Learn-LAD 的 CountOfElements 页。

云仿真验证

本页代码已通过构建期语法/结构校验。该示例涉及 VARIANT/结构绑定,云仿真只做 scl_validate,未跑场景。 云仿真校验日期:2026-11-02。

打开 PLC 云仿真

验证状态

项目结果日期证据
构建期语法/结构校验PASS2026-11-02parse + validate
PLC 云仿真scl_validate 通过2026-11-02scl_run_scenario / scl_validate
TIA 导入编译PASS(0 error / 0 warning)2026-11-02TiaLink + 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。

← 返回 SCL 指令手册