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

OPC UA客户端读写节点报文匹配问题:Python代码修改咨询

OPC UA客户端报文匹配问题

我通过Wireshark抓取了Dewesoft中OPC UA服务器与客户端的交互报文,计划用Python编写客户端生成完全一致的报文以实现相同功能,但目前我的Python程序与服务器交互的报文和Dewesoft的存在差异,不知道如何修改代码。

读取节点值场景

我的实现代码:

node_id = "ns=0;i=2259"
node = client.get_node(node_id)
data_value = node.get_value()
  • 我的报文:仅携带基础节点ID,未指定TimestampsToReturn、MaxAge等读取参数,报文结构较为简化
  • Dewesoft的报文:指定了TimestampsToReturn=Both、MaxAge=0等参数,请求结构体包含完整的读取选项字段

浏览节点场景

我的实现代码:

node_id=client.get_node("i=84")
node_id_child0 = node_id.get_children()
  • 我的报文:使用默认浏览参数,仅请求子节点,未指定ReferenceTypeId、NodeClassFilter等过滤条件,返回结果结构简单
  • Dewesoft的报文:指定了ReferenceTypeId=HasComponent、NodeClassFilter=Object|Variable等过滤规则,报文包含完整的浏览请求选项

解决思路与代码修改建议

1. 读取节点值:显式指定完整读取参数

默认的get_value()方法会使用简化的读取请求,要匹配Dewesoft的报文,需要直接调用底层的read_request()方法并设置完整的读取选项:

from opcua import ua

node_id = "ns=0;i=2259"
node = client.get_node(node_id)

# 构造标准OPC UA读取请求
read_req = ua.ReadRequest()
read_req.NodesToRead = [ua.ReadValueId(
    NodeId=node.nodeid,
    AttributeId=ua.AttributeIds.Value  # 指定读取值属性
)]
# 匹配Dewesoft的时间戳设置
read_req.TimestampsToReturn = ua.TimestampsToReturn.Both
# 强制读取实时值,不使用缓存
read_req.MaxAge = 0

# 发送请求并获取结果
response = client.read_request(read_req)
data_value = response.Results[0]

2. 浏览节点:设置精准的浏览规则

默认的get_children()方法使用通用浏览规则,要匹配Dewesoft的报文,需要构造完整的BrowseRequest并指定过滤参数:

from opcua import ua

parent_node = client.get_node("i=84")

# 构造标准OPC UA浏览请求
browse_req = ua.BrowseRequest()
browse_req.NodesToBrowse = [ua.BrowseDescription(
    NodeId=parent_node.nodeid,
    BrowseDirection=ua.BrowseDirection.Forward,
    # 指定引用类型为HasComponent,匹配Dewesoft的规则
    ReferenceTypeId=ua.NodeId(ua.ObjectIds.HasComponent),
    IncludeSubtypes=True,
    # 过滤只返回对象和变量类型节点
    NodeClassMask=ua.NodeClass.Object | ua.NodeClass.Variable,
    # 返回所有节点信息字段
    ResultMask=ua.BrowseResultMask.All
)]

# 发送请求并解析结果
response = client.browse_request(browse_req)
node_id_child0 = [client.get_node(ref.NodeId) for ref in response.Results[0].References]

关键提示

  • 差异核心:Python OPC UA库的高层封装方法(如get_value()、get_children())为了易用性默认使用简化参数,而Dewesoft客户端严格遵循OPC UA标准发送了完整参数的请求。
  • 验证方式:修改代码后重新抓取报文,对比ReadRequest/BrowseRequest中的参数字段是否与Dewesoft的报文完全一致,若仍有差异,需进一步调整请求中的其他选项(如RequestHeader中的参数)。

内容的提问来源于stack exchange,提问作者baixianjie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 15:08:14