如何用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()
关键细节说明
ua.CallMethodRequest对象:每个对象封装单个方法调用的核心信息:ObjectId:方法所属父对象的NodeIdMethodId:目标方法的NodeIdInputArguments:方法的输入参数列表(无参数时传空列表即可)
client.call_multiple_methods()方法:接收请求列表,将所有调用打包为单条OPC UA消息发送,返回的结果列表顺序与请求列表完全一致。- 结果处理:每个结果是
ua.CallMethodResult对象,需先通过StatusCode.is_good()确认调用成功,再从OutputArguments中获取返回值。
内容的提问来源于stack exchange,提问作者baixianjie
相关产品推荐
相关产品推荐

