首页 > 解决方案 > Eclipse Milo:如何获取方法参数的 DataType?

问题描述

使用eclipse milo连接OPCUA服务器,可以使用browse获取方法节点,那么如何获取方法参数的DataType呢?

就像:final BrowseDescription browseDesc = new BrowseDescription(nodeIdRoot, BrowseDirection.Forward, Identifiers.References, true, uint(NodeClass.Method.getValue()), uint(BrowseResultMask.All.getValue()));

BrowseResult browseResult = client.browse(browseDesc).get();
for (final ReferenceDescription rf : browseResult.getReferences()) {
    final NodeId childId = rf.getNodeId().local().orElse(null);
    List<Node> nodes = client.getAddressSpace().browse(childId).get();
    for (Node node : nodes) {
        // Now, I get the Node of method.
        // How to get the method arguments data types?
        system.out.println("need Input types {}" /*, InputArgument */);
        system.out.println("will get Output types {}" /*, OutputArgument */);
    }
}

标签: javaeclipsemethodsopc-uamilo

解决方案


只要该方法接收输入或输出参数,方法节点就有对名为 InputArguments 和/或 OutputArguments 的属性节点的 HasProperty 引用。

如果您阅读这些节点的值属性,您将获得Argument[]描述参数(名称、数据类型、值排名、数组维度、描述)。


UaMethodNode 拥有getInputArgumentsgetOutputArguments调用它也可以提供帮助:

UaMethodNode methodNode = (UaMethodNode) client.getAddressSpace().getNodeInstance(methodId).get();

CompletableFuture<Argument[]> iaf = methodNode
    .getInputArguments()
    .exceptionally(ex -> new Argument[0]);
CompletableFuture<Argument[]> oaf = methodNode
    .getOutputArguments()
    .exceptionally(ex -> new Argument[0]);

iaf.thenAcceptBoth(oaf, (ia, oa) -> {
    System.out.println("inputArgs: " + Arrays.toString(ia));
    System.out.println("outputArgs: " + Arrays.toString(oa));
});

推荐阅读