OPC UA Python调用ReadProgram方法遇BadMethodInvalid错误求助
解决OPC UA调用ReadProgram方法的BadMethodInvalid错误
错误原因
你的代码调用call_method时参数传递错误,错误地将方法的InputArguments属性作为第一个参数传入,同时可能存在方法节点ID验证不充分的问题。
修正后的代码
from opcua import Client, ua client = Client("opc.tcp://10.254.92.26:4880", timeout=5000) client.connect() try: # 替换为ReadProgram方法的正确节点ID method_node = client.get_node("ns=2; i=399800") # 验证方法节点正确性(可选,用于调试) browse_name = method_node.get_browse_name() print(f"当前方法名称: {browse_name.Name}") # 匹配方法要求的输入参数类型(示例为UInt16单参数) input_arg = ua.Variant(0, ua.VariantType.UInt16) # 直接调用方法,传入输入参数 result = method_node.call_method(input_arg) print(f"方法调用结果: {result}") finally: client.disconnect()
关键修正点
- 移除错误参数:原代码中
method.call_method(input, input_arg)里的input(即方法的InputArguments属性)是多余的,call_method只需传入方法要求的输入参数值。InputArguments是用来查看方法参数定义的元数据,不是调用参数。 - 确认方法节点ID:确保
ns=2; i=399800指向的是ReadProgram方法节点,而非方法所属的对象节点。可通过UA Expert查看节点的类型(Method类型)确认。 - 匹配参数类型:输入参数的Variant类型必须和方法
InputArguments定义的类型完全一致,若方法要求数组类型,再用[0]包裹值。
调试辅助步骤
如果仍有问题,可先打印方法的参数元数据,确认参数要求:
input_args_meta = method_node.get_child(["0:InputArguments"]) print(f"输入参数定义: {input_args_meta}")
内容的提问来源于stack exchange,提问作者Andrea_VS
相关产品推荐
相关产品推荐

