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

OPC UA调用含KeyValuePair参数的方法报错,求解决思路

正确处理OPC UA KeyValuePair类型参数的方法

从你的报错和代码来看,问题出在KeyValuePair的构造方式以及参数的类型包装上,以下是修正后的代码和关键说明:

关键修正点

  • KeyValuePair的Key和Value都需要是ua.Variant类型,不能直接传原始字符串/数值
  • 第一个参数应该是KeyValuePair数组(对应UaExpert里的ToolDataItem[]输入),而非单个KeyValuePair或零散的两个Variant
  • 构造好的KeyValuePair需要包装成ua.Variant,类型指定为ua.VariantType.ExtensionObject

修正后的完整代码

id_types = await client.get_namespace_index(config.NS_TYPES)
id_core = await client.get_namespace_index(config.NS_CORE)
machine = await client.nodes.objects.get_child(
    [f"{id_core}:HEIDENHAIN NC", f"{id_core}:Machine"])
tool_data_methods = await machine.get_child(
    [
        f"{id_types}:ToolDataManagement",
        f"{id_types}:ToolDataAccess",
    ]
)

# 1. 正确构造KeyValuePair:Key和Value都用Variant包装
key_variant = ua.Variant("1:Length", ua.VariantType.String)
value_variant = ua.Variant(258.0, ua.VariantType.Double)
kv_pair = ua.KeyValuePair()
kv_pair.Key = key_variant
kv_pair.Value = value_variant

# 2. 将KeyValuePair放入数组,再包装成ExtensionObject类型的Variant
kv_array = [kv_pair]
arg1 = ua.Variant(kv_array, ua.VariantType.ExtensionObject)

# 3. 其他参数保持原来的Variant包装
arg2 = ua.Variant(12, ua.VariantType.UInt32)
arg3 = ua.Variant(0, ua.VariantType.Byte)

update_tool_data_method = await tool_data_methods.get_child([f"{id_types}:UpdateToolDataItems"])
update_data = await tool_data_methods.call_method(
    update_tool_data_method,
    arg1,
    arg2,
    arg3
)

额外说明

  • 你之前直接用ua.KeyValuePair(arg1, arg2)构造是错误的,该类型需要通过属性赋值(Key和Value)来初始化,而非位置参数
  • 第一个参数必须是数组类型,因为UaExpert中显示的输入是ToolDataItem[](数组),即使只传一个元素也要放到数组里
  • 调用call_method时,参数要按方法定义的顺序传入,每个参数都是单独的Variant,不要打包成元组

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 06:35:17