问题描述
我正在运行与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);
}
}
首先,此实现是否存在问题,即输入对象而不是特定的数据类型?
此外,关于写入数组节点,我还有两个主要问题。
- 如何写入数组之一的特定元素?
- 如何保证客户端先更新一个阵列?
感谢您提供的任何建议。
解决方法
首先,此实现是否存在问题,即输入对象而不是特定的数据类型?
在类型签名中使用Object很好,但是该值实际上必须是服务器期望的类型。
如何写一个数组的特定元素?
使用indexRange
的{{1}}参数并调用接受WriteValue
列表的OpcUaClient::write
方法。
或者,如果服务器在AddressSpace中将每个元素公开为自己的Node,则可以尝试将标量值直接写入该Node。
无论哪种情况,都不能保证服务器会支持或允许它。
如何保证客户端先更新一个阵列?
进行两个单独的写调用,然后等待第一个写完成,再执行第二个。