使用Eclipse Milo OPC UA读写文件遇Bad_NotFound错误及位设置问题
Eclipse Milo OPC UA文件操作问题解决
1. 修复Bad_NotFound错误
出现该错误的核心原因是目标节点或方法未找到,按以下步骤排查修正:
- 验证NodeId准确性:确认
NodeId(2, "Demo.Files.readwrite.txt")中的命名空间索引2与服务器端实际命名空间匹配,同时检查文件节点的浏览名/ID是否和服务器上的节点完全一致。可以用UaExpert这类OPC UA客户端工具连接服务器,直接查看目标文件节点的准确NodeId。 - 修正Method的QualifiedName:
QualifiedName(0, "Open")中的命名空间索引0可能错误。OPC UA文件服务的方法通常归属http://opcfoundation.org/UA/FileSystem/命名空间,需先获取服务器的命名空间映射,找到该命名空间对应的索引替换0。 - 提前校验节点存在性:在调用
getObjectNode前先确认节点是否存在,避免无效调用:
if (client.get.getAddressSpace.exists(nodeId)) { val objectNode = client.get.getAddressSpace.getObjectNode(nodeId) // 后续方法调用逻辑 } else { logger.error("目标文件节点不存在") }
2. 正确设置只读模式参数
OPC UA FileType的Open方法中,mode参数为无符号字节(UInt8),只读模式要求将最低位(bit0)设为1(十进制值1)。由于Java/Scala的Byte是有符号类型,建议使用无符号字节类型避免类型不匹配:
// 使用UByte匹配OPC UA规范的无符号字节类型 val mode: UByte = UByte.valueOf(1) val inputs: Array[Variant] = Array(new Variant(mode)) val outputs: Array[Variant] = method.call(inputs)
若Milo版本不直接支持UByte,也可直接使用Byte(确保值在无符号范围内):
val mode: Byte = 1.toByte // 二进制为00000001,符合只读模式要求 val inputs: Array[Variant] = Array(new Variant(mode))
内容的提问来源于stack exchange,提问作者FlyingStone
相关产品推荐
相关产品推荐

