You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Milo的Java客户端如何识别OPC UA服务器与S7 PLC的连接断开?

解决Milo客户端无法捕获PLC断开导致的OPC UA节点状态变化问题

核心误解纠正

你提到的PLC断电后节点出现BadNoCommunication状态,属于单个MonitoredItem的Value属性状态变化,应该通过onDataChangeNotification捕获,而非onStatusChangedNotification——后者仅监听订阅自身的状态变更(比如订阅被服务器终止、客户端与OPC UA服务器连接断开等),不会响应PLC与网关(IBH Link UA)之间的链路故障。

具体实现步骤

1. 确保MonitoredItem配置正确

创建MonitoredItem时,默认已包含对Value属性及对应StatusCode的监测,也可显式确认配置:

MonitoredItemCreateRequest request = new MonitoredItemCreateRequest(
    new ReadValueId(nodeId, AttributeId.Value.uid(), null, null),
    MonitoringMode.Reporting,
    new MonitoringParameters(
        uint(0),
        uint(1000), // 采样间隔(根据实际需求调整)
        null,
        uint(10),  // 队列大小
        true       // 丢弃旧数据
    )
);

2. 在DataChange监听中捕获状态码变化

实现NotificationListener的onDataChangeNotification方法,遍历通知并检查StatusCode:

@Override
public void onDataChangeNotification(
    UaSubscription subscription,
    List<MonitoredItemNotification> notifications,
    DateTime publishTime
) {
    for (MonitoredItemNotification notification : notifications) {
        StatusCode statusCode = notification.getValue().getStatusCode();
        if (statusCode.isBad() && statusCode.getValue() == StatusCodes.Bad_NoCommunication) {
            MonitoredItem item = subscription.getMonitoredItem(notification.getClientHandle());
            // 此处添加PLC断开后的处理逻辑,比如告警、日志记录
            System.out.printf("节点 %s 与PLC通信中断: %s%n", item.getNodeId(), statusCode);
        }
    }
}

3. 排查网关配置(IBH Link UA)

部分网关设备需要手动开启状态上报功能:登录IBH Link UA的配置界面,确认是否启用了「PLC断开时更新节点状态」的选项,确保网关能将PLC离线状态同步为OPC UA节点的BadNoCommunication状态码。

额外说明

如果需要监听客户端与OPC UA服务器(IBH Link UA)本身的连接断开,onStatusChangedNotification才会触发,此时可通过判断订阅状态(如subscription.getState())来处理客户端侧的连接故障。

内容的提问来源于stack exchange,提问作者Hannes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 23:42:26