如何使用Eclipse Milo写入两个OPC-UA数组元素?

问题描述

我正在运行与Eclipse Milo客户端连接的OPC-UA服务器。我希望能够写入两个节点,两个节点都使用DataType Double Array [60]。

为了覆盖节点值,我复制了一个客户端示例并将其集成到我的代码中:

    public void writeNodeValue(Node node,Object input) {
        Variant v = new Variant(input);
        DataValue dv = new DataValue(v,null,null);
        NodeId nodeId = node.getNodeId();
        
        CompletableFuture<StatusCode> f =
                client.writeValue(nodeId,dv);
        
        StatusCode statusCode = null;
        try {
            statusCode = f.get();
        } catch (Throwable t) {
            logger.error("Error writing value: {}",t.getMessage(),t);
            future.completeExceptionally(t);
        }
    }

首先,此实现是否存在问题,即输入对象而不是特定的数据类型?

此外,关于写入数组节点,我还有两个主要问题。

  1. 如何写入数组之一的特定元素?
  2. 如何保证客户端先更新一个阵列?

感谢您提供的任何建议。

解决方法

首先,此实现是否存在问题,即输入对象而不是特定的数据类型?

在类型签名中使用Object很好,但是该值实际上必须是服务器期望的类型。

如何写一个数组的特定元素?

使用indexRange的{​​{1}}参数并调用接受WriteValue列表的OpcUaClient::write方法。

或者,如果服务器在AddressSpace中将每个元素公开为自己的Node,则可以尝试将标量值直接写入该Node。

无论哪种情况,都不能保证服务器会支持或允许它。

如何保证客户端先更新一个阵列?

进行两个单独的写调用,然后等待第一个写完成,再执行第二个。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...