diff --git a/pcm-influxdb-debug.py b/pcm-influxdb-debug.py index 434f04a..83514ee 100644 --- a/pcm-influxdb-debug.py +++ b/pcm-influxdb-debug.py @@ -1712,6 +1712,83 @@ class ModbusGateway: self.config_service.start() self.logger.info(f"Config service started on {config_service_host}:{config_service_port}") + # 任务状态持久化文件路径(独立文件,不会被外部覆盖) + self.task_state_file = '.task_state.json' + + def _load_task_running_time(self) -> float: + """ + 从独立的持久化文件加载任务累计运行时间 + + Returns: + float: 累计运行时间(秒),文件不存在时返回0 + """ + try: + if not os.path.exists(self.task_state_file): + self.logger.info(f"Task state file not found: {self.task_state_file}, starting from 0") + return 0 + + with open(self.task_state_file, 'r', encoding='utf-8') as f: + data = json.load(f) + + running_time = data.get('running_time', 0) + if running_time > 0: + self.logger.info(f"Loaded task running_time from {self.task_state_file}: {running_time:.2f}s") + return float(running_time) + + except json.JSONDecodeError as e: + self.logger.error(f"Task state file corrupted: {e}, starting from 0") + return 0 + except Exception as e: + self.logger.error(f"Error loading task running_time: {e}, starting from 0") + return 0 + + def _save_task_running_time(self, running_time: float) -> bool: + """ + 保存任务累计运行时间到独立的持久化文件(原子写入) + + Args: + running_time: 累计运行时间(秒) + + Returns: + bool: 保存成功返回 True,失败返回 False + """ + try: + data = { + 'running_time': running_time, + 'last_update': datetime.now().isoformat(), + 'version': '1.0' + } + + # 原子写入:先写临时文件,再重命名 + temp_file = self.task_state_file + '.tmp' + with open(temp_file, 'w', encoding='utf-8') as f: + json.dump(data, f, indent=2, ensure_ascii=False) + + # 重命名(原子操作) + os.replace(temp_file, self.task_state_file) + return True + + except Exception as e: + self.logger.error(f"Error saving task running_time: {e}") + # 清理临时文件 + try: + temp_file = self.task_state_file + '.tmp' + if os.path.exists(temp_file): + os.remove(temp_file) + except: + pass + return False + + def _reset_task_running_time(self) -> bool: + """ + 重置任务累计运行时间为0 + + Returns: + bool: 重置成功返回 True,失败返回 False + """ + self.logger.info("Resetting task running_time to 0") + return self._save_task_running_time(0) + def _update_modbus_datas(self): """更新本地Modbus服务器的寄存器""" if not hasattr(self, 'context'): @@ -1897,7 +1974,20 @@ class ModbusGateway: task_control_reg_addr = self.config_manager.config['task']['control_reg_addr'] task_control_reg_value = 0x0000 self.taskInfo['start_time'] = None - self.taskInfo['running_time'] = 0 + + # 从配置文件恢复运行时间(如果有) + saved_running_time = self._load_task_running_time() + if saved_running_time > 0: + self.taskInfo['running_time'] = saved_running_time + self.logger.info(f"Restored running_time from config: {self.taskInfo['running_time']:.2f}s") + else: + self.taskInfo['running_time'] = 0 + + # 持久化保存相关变量 + last_save_time = time.time() + SAVE_INTERVAL = 5 # 每5秒保存一次 + last_running_time = self.taskInfo['running_time'] # 用于检测变化 + while True: self.gps.config = self.config_manager.config['gps'] self.lsdaq.config = self.config_manager.config['lsdaq'] @@ -1908,6 +1998,9 @@ class ModbusGateway: match self.taskInfo['status']: case 0x0000: self.breaker.openBreaker() + # 实验停止时重置运行时间 + if self.taskInfo['running_time'] > 0: + self._reset_task_running_time() self.taskInfo['start_time'] = None self.taskInfo['running_time'] = 0 case 0x5555: @@ -1920,6 +2013,8 @@ class ModbusGateway: self.taskInfo['start_time'] = time.time() if self.taskInfo['running_time'] > self.taskInfo['period']: + # 实验完成时重置运行时间 + self._reset_task_running_time() self.holding_registers.values[task_control_reg_addr+1] = 0xFFFF continue @@ -1945,6 +2040,14 @@ class ModbusGateway: # self._read_plc_datas() self._update_modbus_datas() + # 周期性保存运行时间(仅在运行状态且时间有变化时保存) + if self.taskInfo['status'] == 0x5555: + if (nowtime - last_save_time) >= SAVE_INTERVAL: + if self.taskInfo['running_time'] != last_running_time: + self._save_task_running_time(self.taskInfo['running_time']) + last_running_time = self.taskInfo['running_time'] + last_save_time = nowtime + # 控制寄存器