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
相关产品推荐
相关产品推荐

