如何在OpenOPC服务器的VARIANT结构中写入数组格式标签
问题根因
你遇到的报错核心原因是:OpenOPC.open_client()会基于Pyro框架和独立的OpenOPC网关服务进程通信,而Windows COM体系下的VARIANT结构体无法跨进程序列化传输,导致远端服务进程解析对象时找不到对应属性。
解决方案
按以下步骤修改即可解决数组写入问题:
- 替换客户端初始化方式,不使用跨进程的网关模式,改用同进程内的COM客户端,避开Pyro跨进程序列化的限制
- 修正write方法传参格式:OpenOPC的write方法要求传入由标签-值元组组成的列表,单个标签也需要套一层列表
- 如果修改后依然报VARIANT相关导入错误,可将Pywin32降级到官方建议的217版本,高版本部分接口封装存在差异
修正后完整代码
from win32com.client import VARIANT import pythoncom import OpenOPC # 改用同进程客户端,不走Pyro跨进程通信 opc_local = OpenOPC.client() opc_local.connect('Matrikon.OPC.Simulation','localhost') # 构造数组类型VARIANT values = VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_R8, [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]) # write参数需套列表 w = opc_local.write([('Bucket Brigade.ArrayOfReal8', values)]) print(w) opc_local.close()
补充说明
如果必须保留OpenOPC网关模式实现多客户端共享连接,就不能直接在客户端侧构造VARIANT对象,需要自行修改OpenOPC服务端代码,在服务端侧完成VARIANT结构体的构造,客户端仅传输数组内容和类型标识即可。
内容的提问来源于stack exchange,提问作者Simon F.-Smith
相关产品推荐
相关产品推荐

