OPC UA:极限是多少个变量?
标题是一个很容易回答的常见问题:“没有固定的限制”。
然而,有多种可能性可以降低 OPC UA 服务器的性能需求,从而减轻控制器的负载。本文忽略硬件的影响。
所有值均指在线模式。不检查通过客户端登录或浏览数据点期间的负载峰值。
使用 Raspberry Pi 3 作为控制器,Unified Automation UaExpert 作为客户端。 测试项目创建了具有 1000 个 UDINT 类型变量的 POU。 可以在变量处打开或关闭值更改:

然后可以根据需要经常复制此 POU,使用 10,000 个“准备好的”变量。
使用 PLC_PRG 的代码调用复制的 POU 。

简单地提供数据点对 CPU 负载没有负面影响,因为数据未被使用。
但是,编译过程需要更长的时间。
在测试项目中,CPU 的负载约为 8%,此时 CODESYS IDE 的监控一直处于活动状态。

客户端一连接,负载就会增加到 ~9%,这是基本负载。

值的变化
当客户端激活前 1000 个数据点时,负载增加到 ~17%。

当我们启动计数器时,我们有一个恒定的变量值变化。 这会将负载增加到 ~23%。

数据点数量递增的测量结果总结如下表:
| 数据点数 | 订阅的数据点没有值的变化 | 订阅的数据点值发生变化 |
|---|---|---|
| 0 | ~10%(基本负载) | ~10%(基本负载) |
| 1000 | ~17% | ~23% |
| 2000 | ~25% | ~25% |
| 3000 | ~30% | ~45% |
| 4000 | ~36% | ~55% |
| 5000 | ~41% | ~67% |
第一个结论可以得出如下:
CPU 负载以及变量的数量取决于值更改的数量。 采样率也可以由此推导出来。
采样率
以上测量结果是 OPCUA 客户端默认设置刷新率 500 毫秒记录的。
客户端较慢的刷新率实际上对许多值和参数没有影响。
这里以室温或预设值/设定值,例如 PID 控制器的参数为例。
从上表中最坏的情况开始,现在不断降低采样率,而其他的保持不变:
| 采样率/数据点数 | 0 | 1000 | 2000 | 3000 | 4000 | 5000 |
|---|---|---|---|---|---|---|
| 1000 | ~67% | ~65% | ~64% | ~62% | ~60% | ~59% |
| 2000 | ~67% | ~64% | ~62% | ~59% | ~58% | ~56% |
| 5000 | ~67% | ~64% | ~61% | ~59% | ~56% | ~54% |
1000 个变量的混合运算,每个变量的采样率为 500、1000、2000、3000 和 4000 毫秒,导致 CPU 负载约为 59%。
第二个结论可以得出如下:
还可以通过将变量分成具有不同刷新率的组来减少 CPU 负载。
将数据点组合成一个数组
项目的变量不仅可以通过 OPCUA 客户端组合成基于时间的组,还可以根据控制器上的数据类型组合。
出于演示目的,将程序进行了一些扩展:

同样,这一次,在值被更改和不被更改的情况下记录这些值。
同样,采样率为 500 毫秒。

| 数据点数 | 值没有变化 | 值发生变化 |
|---|---|---|
| 1000 | ~10% | ~11% |
| 2000 | ~10% | ~12% |
| 3000 | ~11% | ~13% |
| 4000 | ~11% | ~14% |
| 5000 | ~12% | ~14% |
即使将不同组/数组中的数据点组合意味着实际项目中的更多工作量,也应该为更大的工厂进行这种投资。
请注意,所有测试都是在仅连接一个客户端的情况下执行的。 当然,每增加一个客户端也会增加 CPU 负载。 这是两个连接的 OPCUA 客户端的第一次测量(1000 个具有值变化的独立变量):
