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

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)

其他修复建议

  1. 服务端add_variables_to_object函数的参数input没被使用,你用了全局的input_cluster,这是笔误,建议修正参数名,避免后续维护问题。
  2. 超时错误可以尝试调整客户端超时时间:
    self.client.set_timeout(10000)  # 设置为10秒,根据实际场景调整
    
  3. 检查每次写入前后的客户端连接状态,避免因连接不稳定导致超时。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 14:56:32