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

使用Python OPC-UA向OPC服务器写入数组变量报错求助

解决Python OPC-UA写入数组类型变量的KeyError问题

问题原因

你直接将整数列表q = [0]*50包装成ExtensionObject类型的Variant是错误的。ExtensionObject对应OPC-UA中的自定义结构体类型,不能直接传入原生Python列表,库无法将int列表映射到对应的结构体类型,因此抛出KeyError: 'int'。

正确实现步骤

要写入目标结构体中的数组字段,需要先获取服务器定义的结构体类型,创建对应结构体实例并赋值,再包装为ExtensionObject类型的Variant写入:

  1. 获取目标节点的DataType并加载结构体类型
  2. 创建结构体实例,为数组字段赋值
  3. 将结构体包装为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 12:45:34