|
|
@@ -46,6 +46,52 @@ def build_physics(IS_TIMES, phys_params,state_bounds):
|
|
|
)
|
|
|
return physics
|
|
|
|
|
|
+
|
|
|
+def check_state_bounds(current_state, state_bounds, unit_name):
|
|
|
+ """
|
|
|
+ 检查当前状态是否在边界范围内
|
|
|
+
|
|
|
+ 参数:
|
|
|
+ current_state: UFState对象,包含TMP, q_UF, temp
|
|
|
+ state_bounds: 状态边界对象
|
|
|
+ unit_name: 机组名称(如 "UF1")
|
|
|
+
|
|
|
+ 返回:
|
|
|
+ dict: 错误信息字典,格式 {"error_time": str, "error_feature": str}
|
|
|
+ 如果没有错误,返回 None
|
|
|
+ """
|
|
|
+ from datetime import datetime
|
|
|
+
|
|
|
+ error_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
|
|
+
|
|
|
+ # 检查各项参数是否在边界范围内
|
|
|
+ TMP0_min = state_bounds.TMP0_min
|
|
|
+ TMP0_max = state_bounds.TMP0_max
|
|
|
+ if not (TMP0_min <= current_state.TMP <= TMP0_max):
|
|
|
+ return {
|
|
|
+ "error_time": error_time,
|
|
|
+ "error_feature": f"{unit_name}Per"
|
|
|
+ }
|
|
|
+
|
|
|
+ q_UF_min = state_bounds.q_UF_min
|
|
|
+ q_UF_max = state_bounds.q_UF_max
|
|
|
+ if not (q_UF_min <= current_state.q_UF <= q_UF_max):
|
|
|
+ return {
|
|
|
+ "error_time": error_time,
|
|
|
+ "error_feature": f"{unit_name}Per"
|
|
|
+ }
|
|
|
+
|
|
|
+ temp_min = state_bounds.temp_min
|
|
|
+ temp_max = state_bounds.temp_max
|
|
|
+ if not (temp_min <= current_state.temp <= temp_max):
|
|
|
+ return {
|
|
|
+ "error_time": error_time,
|
|
|
+ "error_feature": f"{unit_name}Per"
|
|
|
+ }
|
|
|
+
|
|
|
+ return None
|
|
|
+
|
|
|
+
|
|
|
def generate_plc_instructions(action_spec,current_L_s, current_t_bw_s, model_prev_L_s, model_prev_t_bw_s, model_L_s, model_t_bw_s):
|
|
|
"""
|
|
|
根据工厂当前值、模型上一轮决策值和模型当前轮决策值,生成PLC指令。
|
|
|
@@ -227,9 +273,10 @@ def run_dqn_decide(
|
|
|
# ==============================
|
|
|
if __name__ == "__main__":
|
|
|
|
|
|
- MODEL_PATH = UF_RL_ROOT / "xishan" / "48h_dqn_model.zip"
|
|
|
- ENV_CONFIG_PATH = UF_RL_ROOT / "xishan" / "env_config.yaml"
|
|
|
- TMP0 = 0.019 # 原始 TMP0
|
|
|
+ MODEL_PATH = UF_RL_ROOT / "anzhen" / "48h_dqn_model.zip"
|
|
|
+ ENV_CONFIG_PATH = UF_RL_ROOT / "anzhen" / "env_config.yaml"
|
|
|
+ units_to_run = ["UF1"] # 新增输入:本次调用的机组对象名
|
|
|
+ TMP0 = 0.07 # 原始 TMP0
|
|
|
q_UF = 300 # 进水流量
|
|
|
temp = 20.0 #进水温度
|
|
|
IS_TIMES = False # 新增指定变量,表示CEB间隔为时间控制/次数控制,T表示48次bw一次CEB,F表示48h一次CEB
|
|
|
@@ -249,6 +296,12 @@ if __name__ == "__main__":
|
|
|
|
|
|
physics = build_physics(IS_TIMES, phys_params,state_bounds)
|
|
|
|
|
|
+ # ========== 异常检查(仅检查,不中断,后续归一化时将异常状态强制归一化至上下限) ==========
|
|
|
+ for unit_name in units_to_run:
|
|
|
+ error_result = check_state_bounds(current_state, state_bounds, unit_name)
|
|
|
+ if error_result:
|
|
|
+ print(f"错误发生时间: {error_result['error_time']};错误特征量:{error_result['error_feature']}")
|
|
|
+
|
|
|
action_id, model_L_s, model_t_bw_s = run_dqn_decide(
|
|
|
model_path=MODEL_PATH,
|
|
|
physics=physics,
|
|
|
@@ -265,8 +318,6 @@ if __name__ == "__main__":
|
|
|
L_s, t_bw_s = generate_plc_instructions(action_spec, current_L_s, current_t_bw_s, model_prev_L_s, model_prev_t_bw_s, model_L_s,
|
|
|
model_t_bw_s) # 获取模型下发指令
|
|
|
|
|
|
- L_s = 4100
|
|
|
- t_bw_s = 96
|
|
|
max_tmp_during_filtration = 0.050176 # 新增工厂数据接口:周期最高/最低跨膜压差,无工厂数据接入时传入None,calc_uf_cycle_metrics()自动获取模拟周期中的跨膜压差最值
|
|
|
min_tmp_during_filtration = 0.012496
|
|
|
execution_result = calc_uf_cycle_metrics(current_state, max_tmp_during_filtration, min_tmp_during_filtration, L_s, t_bw_s)
|