最近一个项目涉及到OPC通信。项目需要建立的节点有200个,都是String类型。需要客户端监听和写的分别是100个。项目客户端采用milo, 服务采用kepware。系统采用订阅方式来获取opc数据。实际测试过程中,获取数据都是ok的,没有出现数据丢失的情况。但是写数据时,概率出现客户端写操作结果显示“StatusCode{name=Good, value=0x00000000, quality=good}” ,kepware 服务器上显示不出来写入的数据 。
实际采用的客户端代码如下:
try {
mWriteClient.connect().get();
} catch (Exception e) {
e.printStackTrace();
logger.error(“OPCUAClient connect Exception”, e);
return ;
}
logger.info(“Wrote identifier: " + identifier);
List nodeIds = ImmutableList.of(new NodeId(namespaceIndex, identifier));//Int32"t|bbb”
Variant v = new Variant(value);
// don't write status or timestamps
DataValue dv = new DataValue(v, null, null);
logger.info("OPCUAClient begin write");
// write asynchronously....
CompletableFuture<List<StatusCode>> f =
mWriteClient.writeValues(nodeIds, ImmutableList.of(dv));
// ...but block for the results so we write in order
List<StatusCode> statusCodes = null;
statusCodes = f.get();
StatusCode status = statusCodes.get(0);
logger.info("Wrote status: " + status.toString());
if (status.isGood()) {
logger.info("Wrote '{}' to nodeId={}", v, nodeIds.get(0));
}
}
目前采用过的处理方式如下:
1. 采用读写公用一个客户端。
2. 建立单独的客户端来进行操作。系统共用一客户端来进行写操作。
3. 每次写操作都单独建立一个客户端。这次写操作完成以后在断开服务器。
实际测试过程中,这个三种方式出现上述问题的概率依次降低,但还是会出现。