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

Python OPC客户端订阅:如何存储变化值并设置布尔变量为True

解决OPC订阅值存储与状态标记问题

方案1:使用全局变量(快速实现需求)

直接在回调函数中操作全局变量,虽不符合Python模块化规范,但能快速达成功能:

# 定义全局变量
global_value_list = []
value_has_changed = False

class SubHandler(object):
    def datachange_notification(self, node, value, data):
        # 声明使用全局变量
        global global_value_list, value_has_changed
        
        # 将新值存入列表
        global_value_list.append(value)
        # 标记值已变化
        value_has_changed = True
        print(f"已更新值: {value},列表当前内容: {global_value_list}")

if __name__ == "__main__":
    # 假设client已完成初始化
    num_node = client.get_node('ns=3;s="OPC_Daten"."Var_Real" ')
    
    handler = SubHandler()
    sub = client.create_subscription(500, handler)
    handle = sub.subscribe_data_change(num_node)
    
    # 后续逻辑中可检查状态并执行SQL存储等操作
    import time
    while True:
        if value_has_changed:
            print("检测到值变化,开始执行SQL存储任务")
            # 这里写入你的数据库操作代码
            # 任务完成后重置标记
            value_has_changed = False
        time.sleep(1)

方案2:使用类实例属性(更规范,推荐长期维护)

避免全局变量,将数据和状态封装在SubHandler实例中,代码更易维护:

class SubHandler(object):
    def __init__(self):
        # 初始化实例属性
        self.value_list = []
        self.value_has_changed = False
        
    def datachange_notification(self, node, value, data):
        # 更新实例内的数据和状态
        self.value_list.append(value)
        self.value_has_changed = True
        print(f"已更新值: {value},列表当前内容: {self.value_list}")

if __name__ == "__main__":
    # 假设client已完成初始化
    num_node = client.get_node('ns=3;s="OPC_Daten"."Var_Real" ')
    
    handler = SubHandler()
    sub = client.create_subscription(500, handler)
    handle = sub.subscribe_data_change(num_node)
    
    # 后续通过handler实例访问数据和状态
    import time
    while True:
        if handler.value_has_changed:
            print("检测到值变化,开始执行SQL存储任务")
            # 可通过handler.value_list获取所有变化值,比如取最新值handler.value_list[-1]
            # 写入你的数据库操作代码
            # 任务完成后重置标记
            handler.value_has_changed = False
        time.sleep(1)

补充提示

OPC订阅的回调函数通常在独立线程中执行,若后续操作数据库,建议使用线程锁等方式保证并发安全,避免数据异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 21:23:27