使用Python OPC-UA向OPC服务器写入数组变量报错求助
解决Python OPC-UA写入数组类型变量的KeyError问题
问题原因
你直接将整数列表q = [0]*50包装成ExtensionObject类型的Variant是错误的。ExtensionObject对应OPC-UA中的自定义结构体类型,不能直接传入原生Python列表,库无法将int列表映射到对应的结构体类型,因此抛出KeyError: 'int'。
正确实现步骤
要写入目标结构体中的数组字段,需要先获取服务器定义的结构体类型,创建对应结构体实例并赋值,再包装为ExtensionObject类型的Variant写入:
- 获取目标节点的DataType并加载结构体类型
- 创建结构体实例,为数组字段赋值
- 将结构体包装为Variant并写入节点
代码示例
from opcua import Client, ua # 连接OPC服务器 client = Client("opc.tcp://your-server-address:port") client.connect() try: # 获取目标节点 target_node = client.get_node('ns=3;s="OSC_Profile"."THIS"') # 获取节点的DataType节点 data_type_node = target_node.get_data_type() # 加载对应的结构体类型 struct_type = client.get_node(data_type_node).get_data_type_as_class() # 创建结构体实例 struct_instance = struct_type() # 为结构体中的数组字段赋值(替换成实际字段名,比如ProfileData) struct_instance.ProfileData = [0]*50 # 字段名需与服务器定义的结构体字段一致 # 包装为ExtensionObject类型的Variant dv = ua.Variant(struct_instance, ua.VariantType.ExtensionObject) # 写入节点 target_node.set_value(dv) finally: client.disconnect()
关键注意事项
- 替换
opc.tcp://your-server-address:port为实际的OPC服务器地址 struct_instance.ProfileData中的字段名需要替换成目标结构体中实际的数组字段名称(从节点结构图片中确认)- 确保数组的长度、元素类型与服务器定义的结构体字段完全匹配
内容的提问来源于stack exchange,提问作者sportul
相关产品推荐
相关产品推荐

