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

