持久化.task_state.json
parent
cb28159b37
commit
eaca4a54b9
|
|
@ -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
|
||||
|
||||
# 控制寄存器
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue