背景:milo 包相关的 OpcUaClient 连接的
目的:解决有效的报错问题,累计
问题1:连接异步问题,导致读写异常
报错:UaException: status=Bad_SessionClosed, message=The session was closed by the client.
原因:opcClient.connect().get(); //开启连接 这是一个异步的过程 ,有可能在你下方读写的时候 连接还没有创建好
常规操作 是会把创建连接封装到一个方法里返回 public static OpcUaClient createOpcClient(){};
这种情况会导致 你先调用了 createOpcClient 获得一个 OpcUaClient 对象,然后去进行读写操作,当代码执行到你读写操作的那一行时,
createOpcClient方法内的 opcClient.connect().get(); 还没有完全创建好连接,这个创建连接是个异步的过程。
解决方案:
所以你需要解决的 仅仅是确保在读写之前 创建好这个连接。一般创建过程1-3秒内。
方法一:
你可以通过将创建连接的过程改成同步,这个比较麻烦,我没写,你可以自行解决。解决方案自己找。
方法二:
opcClient.connect().get();后线程休眠一下再返回对象 给创建过程一个时间。
方法二的缺陷是,受制于业务场景,不适用于高并发业务场景。
//开启连接
opcClient.connect().get();
Thread.sleep(2000); // 让子弹飞一会
return opcClient;
注意:如果你的创建连接返回的对象 不是单例 需要在执行完操作后 关闭连接
// 关闭连接
opcClient.disconnect().get();
log.info("======= end ==== getSourceData ==========,时间: " + new Date().toString());
问题2: 类型的区分
java 的int 是指 int32 对应opc的int32 注意 是无法写入到 int16的 写入要类型匹配才可以
Int16 意思是16位整数(16bit integer),相当于short 占2个字节 -32768 ~ 32767
Int32 意思是32位整数(32bit integer), 相当于 int 占4个字节 -2147483648 ~ 2147483647
Int64 意思是64位整数(64bit interger), 相当于 long long 占8个字节 -9223372036854775808 ~ 9223372036854775807
Byte 相当于byte(unsigned char) 0 ~ 255
WORD 等于 unsigned short 0 ~ 65535