java - OpcUa 客户端如何获取有关服务器配置的信息?像 max-pending-publish-requests 等
问题描述
我的 MILO OpcUa 客户端运行良好,直到我达到一定数量的订阅 - 10。然后它开始接收Bad_TooManyPublishRequests
. 我按照这个答案的建议设置解决了这个问题OpcUaClientConfigBuilder#setMaxPendingPublishRequests = 10;
,它又可以正常工作了。
但是我应该如何事先知道,服务器只能处理 10 个待处理的发布请求?
连接到服务器后,我可以读取一些服务器信息。如中所示的ServerState、CurrentTime或ServerProductNameReadExample#readServerStateAndTime
。但是我怎样才能获得服务器MaxPendingPublishRequests、MinSamplingInterval设置等?
Subscription 和 MonitoredItem 之间的关系是什么?我为每个订阅使用了一个 MonitoredItem,现在这似乎是一种不好的方法。如果要监控数百个节点,它们应该在一个订阅中,还是分成多个订阅?它们应该按 分组publishingInterval
,或者分组它们的正确逻辑是什么?
欢迎编辑,谢谢。
解决方案
我将分解您的问题并为您提供答案。
但是我怎样才能获得服务器 MaxPendingPublishRequests、MinSamplingInterval 设置等?
要读取 的值MinSupportedSamplingRate
,您可以使用 OPC UA 的属性读取服务。MinSupportedSamplingRate
节点的 nodeId是ns=0;i=2272
。使用属性读取服务,您可以读取值属性以获取服务器支持的最小采样间隔。如果您使用的是 GUI 客户端,则可以浏览服务器地址空间以查找其值。它存在于Root->Object->Server->ServerCapabilities->MinSupportedSamplingRate
“那么 Subscription 和 MonitoredItem 之间是什么关系?”</p>
订阅用于向客户端报告通知。订阅有一组由客户端分配给它们的 MonitoredItem。MonitoredItems 生成要由订阅报告给客户端的通知
“如果你想监控数百个节点,它们应该在一个订阅中,还是分成多个订阅?”</p>
一个订阅足以监控数百个节点(甚至更多)。这取决于您的用例。
是否应该按发布间隔对它们进行分组,或者对它们进行分组的正确逻辑是什么?
订阅的发布间隔定义了订阅执行的循环速率。每次执行时,它都会尝试向客户端发送 NotificationMessage。NotificationMessages 包含尚未报告给客户端的通知。
如果以 1ms 的发布间隔创建订阅,则服务器每隔 1ms 发送一条通知消息,可以是
- 如果发生任何值更改,则数据更改通知或
- 如果没有值更改,则为空通知响应(仅当保持活动间隔已过时)
节点不必按发布间隔参数分组。
以下是您可能有兴趣尝试的其他一些开源实现:
- open62541 – https://open62541.org/certified-sdk.html – C 堆栈 | Mozilla 许可证 | 嵌入式就绪 | TSN 就绪
- NodeOPCUA – https://node-opcua.github.io/ – NodeJS | 麻省理工学院许可证 | 云就绪
- FreeOpcUa – https://github.com/FreeOpcUa/freeopcua – C++ | LGPL-3.0 许可证 | Python 绑定
- UA .NET 堆栈– https://github.com/OPCFoundation/UA-.NETStandard – 适用于 OPC 基金会企业成员的 RCL 许可证和其他人的 GPL 2.0 | 标准型材 | 面向Web的实现
- Eclipse Milo - https://github.com/eclipse/milo - Java | 英超 2.0
如果您正在寻找更多实践信息,还可以查看以下资源:
- 免费文档:可以查看开源文档页面:https ://open62541.org/doc/current/
- 付费在线课程: OPC UA 实用介绍 - 本课程中的代码演练和示例使用 open62541 堆栈:https ://opcfoundation.org/products/view/practical-introduction-to-opc-ua-part-i