使用 Eclipse Milo JAva 客户端从 Rockwell OPC UA 服务器获取数据时出错

问题描述

我构建了一个 Java 应用程序来从 OPC UA 服务器获取数据。我使用 Eclipse Milo UA Client SDK 来构建客户端。我在 OpcuaClient.readValues 方法中遇到了问题。我正在传递从定义的标签创建的 NodeId 列表,如果我遍历 readValues 方法返回的 DataValue 数组,我会收到某些元素的以下错误

DataValue{value=Variant{value=null},status=StatusCode{name=Bad_NodeIdUnkNown,value=0x80340000,quality=bad},

Sudo 代码看起来像

List<NodeId> nodeIds = new ArrayList<NodeId>();
List<Parameter> parameters = device.getParameters();
for (int i = 0; i < parameters.size(); i++) {
    Parameter parameter = parameters.get(i);
                            
    nodeIds.add(new NodeId(device.getNsID(),parameter.getTagName()));
                            
}
List<DataValue> values = client.readValues( 0.0,TimestampsToReturn.Both,nodeIds).get();
for (int i = 0; i < values .size(); i++) {
    DataValue dvalue = values.get(i);
    if( dvalue.getValue().getValue() != null) {
        Integer intValue =  (Integer) values.get(i).getValue().getValue();
                            
        logger.info("captured Value is  {}",value);
                                        
    }
    else
    {
       logger.error("Error fetching value for {},{}",parameter.getName(),dvalue.toString());
    }
}

错误是从 else 子句中标记出来的。

我的应用程序在与 SCADA 服务器 (OPC UA) 不同的计算机上运行。观察到的一个特殊行为是,如果我使用 ProSys 客户端检查失败标签的值,并且如果我重新运行我的应用程序,数据将被正确获取。我对 ProSys 客户端和我的应用程序之间的关系完全一无所知。 prosys 客户端是否触发了服务器端的某些内容以将标签加载到某个缓存中... 任何线索/指示都会有所帮助。提前致谢。

解决方法

听起来好像 Rockwell 服务器并没有真正“构建”Node 实例,直到您先浏览了它。

您在客户端没有做错任何事情;这是服务器方面的愚蠢行为。在阅读或创建受监控的项目之前,您可能需要对您的客户端进行编程,以递归浏览您感兴趣的层次结构。