You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 05:47:17