问题描述
我构建了一个 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());
}
}
我的应用程序在与 SCADA 服务器 (OPC UA) 不同的计算机上运行。观察到的一个特殊行为是,如果我使用 ProSys 客户端检查失败标签的值,并且如果我重新运行我的应用程序,数据将被正确获取。我对 ProSys 客户端和我的应用程序之间的关系完全一无所知。 prosys 客户端是否触发了服务器端的某些内容以将标签加载到某个缓存中... 任何线索/指示都会有所帮助。提前致谢。
解决方法
听起来好像 Rockwell 服务器并没有真正“构建”Node 实例,直到您先浏览了它。
您在客户端没有做错任何事情;这是服务器方面的愚蠢行为。在阅读或创建受监控的项目之前,您可能需要对您的客户端进行编程,以递归浏览您感兴趣的层次结构。