Python OPC UA set_value写入OPC Server触发TypeError及TimeoutError
问题描述
我用Python开发OPC Server写入数据的应用,分客户端和服务端。服务端后台启动后创建对象并添加变量;客户端通过节点ID获取变量节点,调用set_value写入数据。现在数据能成功写入,但程序触发TypeError: unsupported operand type(s) for &: 'NoneType' and 'int'和TimeoutError,导致后续打印操作无法执行,堆栈指向server.write环节,想问是不是需要把值格式化为ua.DataValue对象?
服务端代码
def create_object(self): objects = self.server.get_objects_node() active_object = objects.add_object(self.idx, "object_name") return active_object def add_variables_to_object(self, active_object, input): # BREAK UP THE CLUSTER for name, value in input_cluster: myvar = active_object.add_variable(self.idx, name, value) myvar.set_writable()
客户端代码
def write_to_variables(self, variables_values): try: for name, value in variables_values: node = self.client.get_node(ua.NodeId(name, self.idx)) node.set_value(value) print('Write succeeded') except Exception as e: print("Failed to write: ", e)
堆栈信息
File "c:\PROJECTS\main.py", line 20, in main active_client.write_to_variables(input_cluster) File "c:\PROJECTS\client.py", line 28, in write_to_variables node.set_value(value) File "C:\AppData\Local\Programs\Python\Python39\lib\site-packages\opcua\common\node.py", line 217, in set_value self.set_attribute(ua.AttributeIds.Value, datavalue) File "C:\AppData\Local\Programs\Python\Python39\lib\site-packages\opcua\common\node.py", line 262, in set_attribute result = self.server.write(params) File "C:\AppData\Local\Programs\Python\Python39\lib\site-packages\opcua\client\ua_client.py", line 367, in write data = self._uasocket.send_request(request) File "C:\AppData\Local\Programs\Python\Python39\lib\site-packages\opcua\client\ua_client.py", line 83, in send_request data = future.result(self.timeout) File "C:\AppData\Local\Programs\Python\Python39\lib\concurrent\futures\_base.py", line 442, in result raise TimeoutError()
解决方案
是的,必须把值包装成ua.DataValue对象,同时要保证值的类型和服务端创建变量时的类型严格匹配,这两个错误大概率是因为未正确封装值或类型不匹配导致的。
修改客户端写入逻辑
把原来的node.set_value(value)替换成以下代码,注意根据服务端变量的实际类型调整VariantType:
# 先确保value的类型和服务端变量一致,比如服务端是int就转成int # 封装成DataValue对象 datavalue = ua.DataValue(ua.Variant(value, ua.VariantType.Int32)) node.set_value(datavalue)
其他修复建议
- 服务端
add_variables_to_object函数的参数input没被使用,你用了全局的input_cluster,这是笔误,建议修正参数名,避免后续维护问题。 - 超时错误可以尝试调整客户端超时时间:
self.client.set_timeout(10000) # 设置为10秒,根据实际场景调整 - 检查每次写入前后的客户端连接状态,避免因连接不稳定导致超时。
内容的提问来源于stack exchange,提问作者MG7702
相关产品推荐
相关产品推荐

