持久化.task_state.json
parent
cb28159b37
commit
eaca4a54b9
|
|
@ -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
|
||||||
|
|
||||||
|
# 从配置文件恢复运行时间(如果有)
|
||||||
|
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
|
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
|
||||||
|
|
||||||
# 控制寄存器
|
# 控制寄存器
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue