我是OPC-UA宇宙和Milo SDK的新手,所以我会尽力解释我想要做什么。
我运行了一个OPC-UA服务器实例,它将一些节点加载到服务器NameSapce。另一方面,我有一个客户端订阅此服务器并尝试浏览此节点。我可以看到客户端中的节点,我可以访问为此节点定义的一些引用。我现在想要做的事情就是取得很大成功,就是访问服务器中定义的引用,而UA-Expert可以看到它,但我的Milo Client实现却不能。 自定义引用是在服务器端定义的,我的目标是访问“ BrowseName ”或“ DisplayName ”。
我相信这可能是一个简单的问题,但现在我正在努力解决这个问题。
我将留下一些印刷屏幕来举例说明我在上面的文字中的含义:
在下面的图像中,红色箭头指向我正在尝试阅读的参考,因此在第二个图像中,我们可以看到具有 HasComponent 类型的制造和描述是芦苇正确但 HasAMLRoleReference 未在调试窗口中列出。
这段代码不是我的,所以我不能保证正确的实现,但在服务器端我知道这种情况发生了:
server.getNodeMap().addReference(new Reference(
new NodeId(NAMESPACE_IDX, getPrefix(e.getParentElement())),
new NodeId(1, 4001),// new NodeId(1,4001) = HasAmlRoleReference
server.getNodeMap().getNode(new NodeId(NAMESPACE_IDX, name)).get().getNodeId().expanded(),
server.getNodeMap().getNode(new NodeId(NAMESPACE_IDX, name)).get().getNodeClass(),
true)
所以 ReferenceTypeId 是new NodeId(1, 4001)
,这是我尝试在客户端读取的类型。我的代码基于Milo git repo的BrowseNode Exemple。
在最后一张图片中我们可以看到地址空间,所以这里我们有一些参数也作为 HasComponent 出现在 References 中,所以我可以使用错误的方法访问我不能 HasAMLRoleReference ,我真诚地不知道。
提前感谢您的帮助。
public void browseNode(String indent, OpcUaClient client, NodeId browseRoot){
try
{
String equipmentNamespace = "openMOSRoleClassLib/Equipment";
String skillNamespace = "openMOSRoleClassLib/Skill";
String moduleNamespace = "openMOSRoleClassLib/Equipment/Module";
BrowseDescription browse = new BrowseDescription(
browseRoot,
BrowseDirection.Forward,
Identifiers.References,
true,
//uint(NodeClass.Object.getValue() | NodeClass.Variable.getValue()),
uint(NodeClass.Object.getValue() | NodeClass.Variable.getValue() | NodeClass.ReferenceType.getValue()),
uint(BrowseResultMask.All.getValue())
);
BrowseDescription browse2 = new BrowseDescription(
browseRoot,
BrowseDirection.Forward,
new NodeId(1, 4001),
true,
//uint(NodeClass.Object.getValue() | NodeClass.Variable.getValue()),
uint(NodeClass.Object.getValue() | NodeClass.Variable.getValue() | NodeClass.ReferenceType.getValue()),
uint(BrowseResultMask.All.getValue())
);
BrowseResult browseResult = client.browse(browse).get();
List<ReferenceDescription> references = toList(browseResult.getReferences());
System.out.println("\n");
for (ReferenceDescription rd : references)
{
//logger.info("Node={}", rd.getBrowseName().getName());
System.out.println(indent + "Node= " + rd.getBrowseName().getName());
System.out.println(indent + "Type= " + rd.getTypeId().toParseableString());
System.out.println(indent + "NodeId: " + rd.getNodeId().toString());
System.out.println(indent + "Other INFO[]: " + rd.getTypeDefinition().toParseableString());
System.out.println(indent + "Other INFO[NamespaceIndex]: " + rd.getReferenceTypeId().expanded().getNamespaceIndex());
System.out.println(indent + "Other INFO[ReferenceTypeId]: " + rd.getReferenceTypeId().expanded().toString());
// recursively browse to children
rd.getNodeId().local().ifPresent(nodeId -> browseNode("\t" + indent, client, nodeId));
}
} catch (InterruptedException | ExecutionException e)
{
logger.error("Browsing nodeId={} failed: {}", browseRoot, e.getMessage(), e);
}
}
当我右键单击设备参考时,它会加载下面显示的信息。
答案 0 :(得分:1)
好的,问题似乎是你只是在浏览NodeClass的节点:Object,Variable,ReferenceType。
您正在寻找的HasAMLRoleReferences指向具有ObjectType的NodeClass的节点,这就是您没有看到它们返回的原因。