如何让OPC UA服务器无数据变化时也按订阅sampling interval推送通知
OPC UA 订阅无数据变化时按采样间隔推送通知的实现方案
默认配置下,OPC UA 监控项(MonitoredItem)仅在数据值、状态码符合触发规则发生变化时,才会将采样结果存入推送队列,这就是你当前仅在值变化时收到通知的原因。可以通过以下两种方案实现无数据变化也按采样间隔推送的需求:
方案1:调整数据变化过滤器触发规则(兼容所有主流OPC UA版本)
- 创建监控项时,将
DataChangeFilter的DataChangeTrigger枚举值设置为STATUS_VALUE_TIMESTAMP,即状态、值、源时间戳任意一项变化就触发通知 - 要求服务端配置对应监控节点的源时间戳(SourceTimestamp)每次采样时自动更新,即使节点值没有发生变化
按你的场景参数配置后,每次500ms采样时源时间戳更新都会触发通知,每两次采样结果会按1000ms的PublishInterval合并推送,刚好匹配你的需求。
方案2:使用监控项心跳配置(适用于OPC UA 1.04及以上版本)
直接在创建监控项时,将HeartbeatInterval参数设为和采样间隔一致的500ms即可:
HeartbeatInterval是OPC UA 1.04版本新增的配置,定义了即使没有数据变化,服务端必须向队列推送采样记录的最长间隔- 该参数设为500ms时,每次采样都会生成通知存入队列,完全匹配无变化也推送的需求,不需要额外修改服务端节点的时间戳配置。
配置注意事项
- 部分老旧OPC UA服务端不支持
HeartbeatInterval参数,优先选择方案1进行适配 - 不要将调整Deadband死区参数作为解决方案:即使死区设为0,值无变化时也不会触发数据变化通知,该参数仅用来控制值变化的最小判定阈值
- 你当前的
PublishInterval=1000、sampling interval=500、queue=2配置不需要调整,两次采样结果会合并成一次发布消息推送,不会额外增加通信负载。
内容的提问来源于stack exchange,提问作者A MJ
相关产品推荐
相关产品推荐

