1

我是 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是 a new NodeId(1, 4001),这是我试图在客户端读取的类型。我的代码基于 Milo git repo 中的 BrowseNode 示例。

在最后一张图片中,我们可以看到地址空间,所以这里我们有一些参数也作为HasComponent出现在引用中,所以我可能使用错误的方法来访问我无法访问的那个HasAMLRoleReference,我真诚地不要不知道。 在此处输入图像描述

在此先感谢您的帮助。


[编辑 1]

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);
}
}

[编辑 2]

在此处输入图像描述

当我右键单击设备参考时,它会加载如下所示的信息。

在此处输入图像描述

4

1 回答 1

1

好的,问题似乎是您只浏览具有 NodeClass 的节点:Object、Variable、ReferenceType。

您正在寻找的 HasAMLRoleReferences 指向 NodeClass 为 ObjectType 的节点,这就是您没有看到它们返回的原因。

于 2017-08-28T14:13:41.840 回答