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

如何用Python OPC UA库将多个方法调用合并为单条消息?

实现OPC UA多方法调用合并单消息发送

要把多个Method调用合并到同一条OPC UA消息中,你需要使用opcua库的批量方法调用接口,而不是逐个调用call_method()。具体实现如下:

核心逻辑

OPC UA协议支持在单个服务请求中包含多个方法调用,python-opcua库提供了对应的批量调用能力——通过构造多个ua.CallMethodRequest对象并一次性提交,就能将所有调用打包进单条消息发送。

修改后的完整代码

from opcua import Client, ua

server_url = "opc.tcp://localhost:4840"

client = Client(server_url)
client.connect()

try:
    # 构造所有方法调用的请求对象
    method_requests = [
        # getCurrentClock 调用请求
        ua.CallMethodRequest(
            ObjectId=ua.NodeId.from_string("ns=1;s=ClockProvider"),
            MethodId=ua.NodeId.from_string("ns=1;s=getCurrentClock"),
            InputArguments=[]  # 该方法无输入参数,传空列表
        ),
        # getCurrentAbsTime 调用请求
        ua.CallMethodRequest(
            ObjectId=ua.NodeId.from_string("ns=1;s=AbsTimeProvider"),
            MethodId=ua.NodeId.from_string("ns=1;s=getCurrentAbsTime"),
            InputArguments=[]
        ),
        # getError 调用请求
        ua.CallMethodRequest(
            ObjectId=ua.NodeId.from_string("ns=1;s=Status"),
            MethodId=ua.NodeId.from_string("ns=1;s=getError"),
            InputArguments=[]
        ),
        # getTracking 调用请求
        ua.CallMethodRequest(
            ObjectId=ua.NodeId.from_string("ns=1;s=Status"),
            MethodId=ua.NodeId.from_string("ns=1;s=getTracking"),
            InputArguments=[]
        )
    ]

    # 一次性发送所有方法调用请求,结果顺序与请求列表严格对应
    results = client.call_multiple_methods(method_requests)

    # 遍历输出每个方法的返回结果
    for idx, res in enumerate(results):
        if res.StatusCode.is_good():
            print(f"方法{idx}返回结果: {res.OutputArguments}")
        else:
            print(f"方法{idx}调用失败: {res.StatusCode}")

finally:
    client.disconnect()

关键细节说明

  1. ua.CallMethodRequest对象:每个对象封装单个方法调用的核心信息:
    • ObjectId:方法所属父对象的NodeId
    • MethodId:目标方法的NodeId
    • InputArguments:方法的输入参数列表(无参数时传空列表即可)
  2. client.call_multiple_methods()方法:接收请求列表,将所有调用打包为单条OPC UA消息发送,返回的结果列表顺序与请求列表完全一致。
  3. 结果处理:每个结果是ua.CallMethodResult对象,需先通过StatusCode.is_good()确认调用成功,再从OutputArguments中获取返回值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 12:57:08