持久化.task_state.json

main
risingLee 2025-12-24 10:01:55 +08:00
parent cb28159b37
commit eaca4a54b9
1 changed files with 104 additions and 1 deletions

View File

@ -1712,6 +1712,83 @@ class ModbusGateway:
self.config_service.start() self.config_service.start()
self.logger.info(f"Config service started on {config_service_host}:{config_service_port}") 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): def _update_modbus_datas(self):
"""更新本地Modbus服务器的寄存器""" """更新本地Modbus服务器的寄存器"""
if not hasattr(self, 'context'): 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_addr = self.config_manager.config['task']['control_reg_addr']
task_control_reg_value = 0x0000 task_control_reg_value = 0x0000
self.taskInfo['start_time'] = None 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: while True:
self.gps.config = self.config_manager.config['gps'] self.gps.config = self.config_manager.config['gps']
self.lsdaq.config = self.config_manager.config['lsdaq'] self.lsdaq.config = self.config_manager.config['lsdaq']
@ -1908,6 +1998,9 @@ class ModbusGateway:
match self.taskInfo['status']: match self.taskInfo['status']:
case 0x0000: case 0x0000:
self.breaker.openBreaker() self.breaker.openBreaker()
# 实验停止时重置运行时间
if self.taskInfo['running_time'] > 0:
self._reset_task_running_time()
self.taskInfo['start_time'] = None self.taskInfo['start_time'] = None
self.taskInfo['running_time'] = 0 self.taskInfo['running_time'] = 0
case 0x5555: case 0x5555:
@ -1920,6 +2013,8 @@ class ModbusGateway:
self.taskInfo['start_time'] = time.time() self.taskInfo['start_time'] = time.time()
if self.taskInfo['running_time'] > self.taskInfo['period']: if self.taskInfo['running_time'] > self.taskInfo['period']:
# 实验完成时重置运行时间
self._reset_task_running_time()
self.holding_registers.values[task_control_reg_addr+1] = 0xFFFF self.holding_registers.values[task_control_reg_addr+1] = 0xFFFF
continue continue
@ -1945,6 +2040,14 @@ class ModbusGateway:
# self._read_plc_datas() # self._read_plc_datas()
self._update_modbus_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
# 控制寄存器 # 控制寄存器