Przeglądaj źródła

Initial commit with all files

wmy 4 miesięcy temu
commit
5b60780855

+ 8 - 0
.idea/.gitignore

@@ -0,0 +1,8 @@
+# 默认忽略的文件
+/shelf/
+/workspace.xml
+# 基于编辑器的 HTTP 客户端请求
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml

+ 265 - 0
DQN_decide.py

@@ -0,0 +1,265 @@
+import numpy as np
+from stable_baselines3 import DQN
+from DQN_env import UFSuperCycleEnv
+from DQN_env import UFParams
+
+# 模型路径
+MODEL_PATH = "/Users/wmy/data/Pycharm_Project/jkhj/jkhj_test1/shuangmo/wmy/ultrafiltration_超滤/v2/dqn_model.zip"
+
+# 加载模型(只加载一次,提高效率)
+model = DQN.load(MODEL_PATH)
+
+def run_uf_DQN_decide(uf_params, TMP0_value: float):
+    """
+    单步决策函数:输入原始 TMP0,预测并执行动作
+
+    参数:
+        TMP0_value (float): 当前 TMP0 值(单位与环境一致)
+
+    返回:
+        dict: 包含模型选择的动作、动作参数、新状态、奖励等
+    """
+    # 1. 实例化环境
+    base_params = uf_params
+    env = UFSuperCycleEnv(base_params)
+
+    # 2. 将输入的 TMP0 写入环境
+    env.current_params.TMP0 = TMP0_value
+
+    # 3. 获取归一化状态
+    obs = env._get_obs().reshape(1, -1)
+
+    # 4. 模型预测动作 
+    action, _ = model.predict(obs, deterministic=True)
+
+    # 5. 解析动作对应的 L_s 和 t_bw_s 对应过滤时长和物洗时长
+    L_s, t_bw_s = env._get_action_values(action[0]) 
+
+    # 6. 在环境中执行该动作 执行一个超级周期 
+    next_obs, reward, terminated, truncated, info = env.step(action[0]) 
+
+    # 7. 整理结果
+    result = {
+        "action": int(action[0]),  # 动作       
+        "L_s": float(L_s), # 过滤时长
+        "t_bw_s": float(t_bw_s), # 物洗时长
+        "next_obs": next_obs, # 新状态
+        "reward": reward, # 奖励
+        "terminated": terminated, # 是否终止
+        "truncated": truncated, # 是否截断
+        "info": info # 信息 可行性、步数、奖励等
+    }
+
+    # 8. 关闭环境
+    env.close()
+
+    return result
+
+def generate_plc_instructions(current_L_s, current_t_bw_s, model_prev_L_s, model_prev_t_bw_s, model_L_s, model_t_bw_s):
+    """
+    根据工厂当前值、模型上一轮决策值和模型当前轮决策值,生成PLC指令。
+
+    新增功能:
+    1. 处理None值情况:如果模型上一轮值为None,则使用工厂当前值;
+       如果工厂当前值也为None,则返回None并提示错误。
+    """
+    # 参数配置保持不变
+    params = UFParams(
+        L_min_s=3600.0, L_max_s=4200.0, L_step_s=60.0,
+        t_bw_min_s=90.0, t_bw_max_s=100.0, t_bw_step_s=2.0,
+    )
+
+    # 参数解包
+    L_step_s = params.L_step_s # 过滤时长步长
+    t_bw_step_s = params.t_bw_step_s # 物洗时长步长
+    L_min_s = params.L_min_s # 过滤时长下限
+    L_max_s = params.L_max_s # 过滤时长上限
+    t_bw_min_s = params.t_bw_min_s # 物洗时长下限
+    t_bw_max_s = params.t_bw_max_s # 物洗时长上限
+    adjustment_threshold = 1.0 # 调整阈值
+
+    # 处理None值情况
+    if model_prev_L_s is None:
+        if current_L_s is None:
+            print("错误: 过滤时长的工厂当前值和模型上一轮值均为None")
+            return None, None
+        else:
+            # 使用工厂当前值作为基准
+            effective_current_L = current_L_s 
+            source_L = "工厂当前值(模型上一轮值为None)"
+    else:
+        # 模型上一轮值不为None,继续检查工厂当前值
+        if current_L_s is None:
+            effective_current_L = model_prev_L_s
+            source_L = "模型上一轮值(工厂当前值为None)"
+        else:
+            # 两个值都不为None,比较哪个更接近模型当前建议值
+            current_to_model_diff = abs(current_L_s - model_L_s)
+            prev_to_model_diff = abs(model_prev_L_s - model_L_s)
+
+            if current_to_model_diff <= prev_to_model_diff:
+                effective_current_L = current_L_s
+                source_L = "工厂当前值"
+            else:
+                effective_current_L = model_prev_L_s
+                source_L = "模型上一轮值"
+
+    # 对反洗时长进行同样的处理
+    if model_prev_t_bw_s is None:
+        if current_t_bw_s is None:
+            print("错误: 反洗时长的工厂当前值和模型上一轮值均为None")
+            return None, None
+        else:
+            effective_current_t_bw = current_t_bw_s
+            source_t_bw = "工厂当前值(模型上一轮值为None)"
+    else:
+        if current_t_bw_s is None:
+            effective_current_t_bw = model_prev_t_bw_s
+            source_t_bw = "模型上一轮值(工厂当前值为None)"
+        else:
+            current_to_model_t_bw_diff = abs(current_t_bw_s - model_t_bw_s)
+            prev_to_model_t_bw_diff = abs(model_prev_t_bw_s - model_t_bw_s)
+
+            if current_to_model_t_bw_diff <= prev_to_model_t_bw_diff:
+                effective_current_t_bw = current_t_bw_s
+                source_t_bw = "工厂当前值"
+            else:
+                effective_current_t_bw = model_prev_t_bw_s
+                source_t_bw = "模型上一轮值"
+
+    # 检测所有输入值是否在规定范围内(只对非None值进行检查)
+    # 工厂当前值检查(警告)
+    if current_L_s is not None and not (L_min_s <= current_L_s <= L_max_s):
+        print(f"警告: 当前过滤时长 {current_L_s} 秒不在允许范围内 [{L_min_s}, {L_max_s}]")
+    if current_t_bw_s is not None and not (t_bw_min_s <= current_t_bw_s <= t_bw_max_s):
+        print(f"警告: 当前反洗时长 {current_t_bw_s} 秒不在允许范围内 [{t_bw_min_s}, {t_bw_max_s}]")
+
+    # 模型上一轮决策值检查(警告)
+    if model_prev_L_s is not None and not (L_min_s <= model_prev_L_s <= L_max_s):
+        print(f"警告: 模型上一轮过滤时长 {model_prev_L_s} 秒不在允许范围内 [{L_min_s}, {L_max_s}]")
+    if model_prev_t_bw_s is not None and not (t_bw_min_s <= model_prev_t_bw_s <= t_bw_max_s):
+        print(f"警告: 模型上一轮反洗时长 {model_prev_t_bw_s} 秒不在允许范围内 [{t_bw_min_s}, {t_bw_max_s}]")
+
+    # 模型当前轮决策值检查(错误)
+    if model_L_s is None:
+        raise ValueError("错误: 决策模型建议的过滤时长不能为None")
+    elif not (L_min_s <= model_L_s <= L_max_s):
+        raise ValueError(f"错误: 决策模型建议的过滤时长 {model_L_s} 秒不在允许范围内 [{L_min_s}, {L_max_s}]")
+
+    if model_t_bw_s is None:
+        raise ValueError("错误: 决策模型建议的反洗时长不能为None")
+    elif not (t_bw_min_s <= model_t_bw_s <= t_bw_max_s):
+        raise ValueError(f"错误: 决策模型建议的反洗时长 {model_t_bw_s} 秒不在允许范围内 [{t_bw_min_s}, {t_bw_max_s}]")
+
+    print(f"过滤时长基准: {source_L}, 值: {effective_current_L}")
+    print(f"反洗时长基准: {source_t_bw}, 值: {effective_current_t_bw}")
+
+    # 使用选定的基准值进行计算调整
+    L_diff = model_L_s - effective_current_L # 过滤时长差值
+    L_adjustment = 0
+    if abs(L_diff) > adjustment_threshold * L_step_s: # 如果过滤时长差值超过调整阈值
+        if L_diff > 0: 
+            L_adjustment = L_step_s # 增加过滤时长步长
+        else:
+            L_adjustment = -L_step_s # 减少过滤时长步长
+    next_L_s = effective_current_L + L_adjustment # 调整后的过滤时长
+
+    t_bw_diff = model_t_bw_s - effective_current_t_bw # 反洗时长差值
+    t_bw_adjustment = 0
+    if abs(t_bw_diff) > adjustment_threshold * t_bw_step_s: # 如果反洗时长差值超过调整阈值 调整阈值 * 反洗时长步长
+        if t_bw_diff > 0:
+            t_bw_adjustment = t_bw_step_s # 增加反洗时长步长
+        else:
+            t_bw_adjustment = -t_bw_step_s # 减少反洗时长步长
+    next_t_bw_s = effective_current_t_bw + t_bw_adjustment # 调整后的反洗时长
+
+    return next_L_s, next_t_bw_s 
+
+
+from DQN_env import simulate_one_supercycle
+def calc_uf_cycle_metrics(p, TMP0, max_tmp_during_filtration, min_tmp_during_filtration, L_s: float, t_bw_s: float):
+    """
+    计算 UF 超滤系统的核心性能指标
+
+    参数:
+        p (UFParams): UF 系统参数
+        L_s (float): 单次过滤时间(秒)
+        t_bw_s (float): 单次反洗时间(秒)
+
+    返回:
+        dict: {
+            "k_bw_per_ceb": 小周期次数,
+            "ton_water_energy_kWh_per_m3": 吨水电耗,
+            "recovery": 回收率,
+            "net_delivery_rate_m3ph": 净供水率 (m³/h),
+            "daily_prod_time_h": 日均产水时间 (小时/天)
+            "max_permeability": 全周期最高渗透率(lmh/bar)
+        }
+    """
+    # 将跨膜压差写入参数 
+    p.TMP0 = TMP0
+
+    # 模拟该参数下的超级周期 
+    feasible, info = simulate_one_supercycle(p, L_s, t_bw_s)
+
+    # 获得模型模拟周期信息  
+    k_bw_per_ceb = info["k_bw_per_ceb"] # 超级周期内CEB次数 
+    ton_water_energy_kWh_per_m3 = info["ton_water_energy_kWh_per_m3"] # 吨水电耗
+    recovery = info["recovery"] # 回收率
+    net_delivery_rate_m3ph = info["net_delivery_rate_m3ph"] # 净供水率
+    daily_prod_time_h = info["daily_prod_time_h"] # 日均产水时间
+
+    # # 获得模型模拟周期内最高跨膜压差/最低跨膜压差
+    # if max_tmp_during_filtration is None:
+    #     max_tmp_during_filtration = info["max_TMP_during_filtration"]
+    # if min_tmp_during_filtration is None:
+    #     min_tmp_during_filtration = info["min_TMP_during_filtration"]
+
+    # 获取模拟周期内最大/最小跨膜压差(如果未传入,则从 info 中获取)
+    max_tmp_during_filtration = max_tmp_during_filtration if max_tmp_during_filtration is not None else info.get(
+        "max_TMP_during_filtration", None) # 过滤时段TMP峰值
+    min_tmp_during_filtration = min_tmp_during_filtration if min_tmp_during_filtration is not None else info.get(
+        "min_TMP_during_filtration", None) # 过滤时段TMP最低值
+
+    # 计算最高渗透率 最高渗透率 = 100 * 过滤流量 / (128*40) / 过滤时段TMP最低值
+    max_permeability = 100 * p.q_UF / (128*40) / min_tmp_during_filtration 
+
+
+    return {
+        "k_bw_per_ceb": k_bw_per_ceb, # 超级周期内CEB次数       
+        "ton_water_energy_kWh_per_m3": ton_water_energy_kWh_per_m3, # 吨水电耗
+        "recovery": recovery, # 回收率
+        "net_delivery_rate_m3ph": net_delivery_rate_m3ph, # 净供水率
+        "daily_prod_time_h": daily_prod_time_h, # 日均产水时间
+        "max_permeability": max_permeability # 最高渗透率
+    }
+
+
+# ==============================
+# 示例调用
+# ==============================
+if __name__ == "__main__":
+    uf_params = UFParams()
+    TMP0 = 0.03  # 原始 TMP0
+    model_decide_result = run_uf_DQN_decide(uf_params, TMP0) # 调用模型获得动作
+    model_L_s = model_decide_result['L_s'] # 获得模型决策产水时长
+    model_t_bw_s = model_decide_result['t_bw_s'] # 获得模型决策反洗时长
+
+    current_L_s = 3800
+    current_t_bw_s = 100
+    model_prev_L_s = None
+    model_prev_t_bw_s = None
+    L_s, t_bw_s = generate_plc_instructions(current_L_s, current_t_bw_s, model_prev_L_s, model_prev_t_bw_s, model_L_s, model_t_bw_s) # 获取模型下发指令
+
+    max_tmp_during_filtration = None # 新增工厂数据接口:周期最高/最低跨膜压差,无工厂数据接入时传入None,calc_uf_cycle_metrics()自动获取模拟周期中的跨膜压差最值
+    min_tmp_during_filtration = None
+    execution_result = calc_uf_cycle_metrics(uf_params, TMP0, max_tmp_during_filtration, min_tmp_during_filtration, model_L_s, model_t_bw_s)
+    print("\n===== 单步决策结果 =====")
+    print(f"模型选择的动作: {model_decide_result['action']}")
+    print(f"模型选择的L_s: {model_decide_result['L_s']} 秒, 模型选择的t_bw_s: {model_decide_result['t_bw_s']} 秒")
+    print(f"指令下发的L_s: {L_s} 秒, 指令下发的t_bw_s: {t_bw_s} 秒")
+    print(f"指令对应的反洗次数: {execution_result['k_bw_per_ceb']}")
+    print(f"指令对应的吨水电耗: {execution_result['ton_water_energy_kWh_per_m3']}")
+    print(f"指令对应的回收率: {execution_result['recovery']}")
+    print(f"指令对应的日均产水时间: {execution_result['daily_prod_time_h']}")
+    print(f"指令对应的最高渗透率: {execution_result['max_permeability']}")

+ 577 - 0
DQN_env.py

@@ -0,0 +1,577 @@
+import os
+import time
+import random
+import numpy as np
+import gymnasium as gym
+from gymnasium import spaces
+from stable_baselines3 import DQN
+from stable_baselines3.common.monitor import Monitor
+from stable_baselines3.common.vec_env import DummyVecEnv
+from stable_baselines3.common.callbacks import BaseCallback
+from typing import Dict, Tuple, Optional
+import torch
+import torch.nn as nn
+from dataclasses import dataclass, asdict
+from save_uf_models import TMPIncreaseModel, TMPDecreaseModel  # 导入模型类
+import copy
+
+
+# ==== 定义膜的基础运行参数 ====
+@dataclass
+class UFParams:
+    # —— 膜与运行参数 ——
+    q_UF: float = 360.0  # 过滤进水流量(m^3/h)
+    TMP0: float = 0.03  # 初始TMP(MPa)
+    TMP_max: float = 0.06  # TMP硬上限(MPa)
+
+    # —— 膜污染动力学 ——
+    alpha: float = 1e-6  # TMP增长系数
+    belta: float = 1.1  # 幂指数
+
+    # —— 反洗参数(固定) ——
+    q_bw_m3ph: float = 1000.0  # 物理反洗流量(m^3/h)
+
+    # —— CEB参数(固定) ——
+    T_ceb_interval_h: float = 48.0  # 固定每 k 小时做一次CEB
+    v_ceb_m3: float = 30.0  # CEB用水体积(m^3)
+    t_ceb_s: float = 40 * 60.0  # CEB时长(s)
+    phi_ceb: float = 1.0  # CEB去除比例(简化:完全恢复到TMP0)
+
+    # —— 约束与收敛 ——
+    dTMP: float = 0.001  # 单次产水结束时,相对TMP0最大升幅(MPa)
+
+    # —— 搜索范围(秒) ——
+    L_min_s: float = 3800.0  # 过滤时长下限(s)
+    L_max_s: float = 4200.0  # 过滤时长上限(s)
+    t_bw_min_s: float = 90.0  # 物洗时长下限(s)
+    t_bw_max_s: float = 100.0  # 物洗时长上限(s)
+
+    # —— 物理反洗恢复函数参数 ——
+    phi_bw_min: float = 0.7  # 物洗去除比例最小值
+    phi_bw_max: float = 1.0  # 物洗去除比例最大值
+    L_ref_s: float = 4000.0  # 过滤时长影响时间尺度
+    tau_bw_s: float = 30.0  # 物洗时长影响时间尺度
+    gamma_t: float = 1.0  # 物洗时长作用指数
+
+    # —— 网格 ——
+    L_step_s: float = 60.0  # 过滤时长步长(s)
+    t_bw_step_s: float = 2.0  # 物洗时长步长(s)
+
+    # 多目标加权及高TMP惩罚
+    w_rec: float = 0.8  # 回收率权重
+    w_rate: float = 0.2  # 净供水率权重
+    w_headroom: float = 0.3  # 贴边惩罚权重
+    r_headroom: float = 2.0  # 贴边惩罚幂次
+    headroom_hardcap: float = 0.98  # 超过此比例直接视为不可取
+
+# ==== 定义强化学习超参数 ====
+@dataclass
+class DQNParams:
+    """
+    DQN 超参数定义类
+    用于统一管理模型训练参数
+    """
+    # 学习率,控制神经网络更新步长
+    learning_rate: float = 1e-4
+
+    # 经验回放缓冲区大小(步数)
+    buffer_size: int = 2000
+
+    # 学习开始前需要收集的步数
+    learning_starts: int = 200
+
+    # 每次从经验池中采样的样本数量
+    batch_size: int = 16
+
+    # 折扣因子,越接近1越重视长期奖励
+    gamma: float = 0.95
+
+    # 每隔多少步训练一次
+    train_freq: int = 1
+
+    # 目标网络更新间隔
+    target_update_interval: int = 1000
+
+    # 初始探索率 ε
+    exploration_initial_eps: float = 1.0
+
+    # 从初始ε衰减到最终ε所占的训练比例
+    exploration_fraction: float = 0.6
+
+    # 最终探索率 ε
+    exploration_final_eps: float = 0.02
+
+    # 日志备注(用于区分不同实验)
+    remark: str = "default"
+
+# ==== 加载模拟环境模型 ====
+# 初始化模型
+model_fp = TMPIncreaseModel()
+model_bw = TMPDecreaseModel()
+
+# 加载参数
+model_fp.load_state_dict(torch.load("uf_fp.pth"))
+model_bw.load_state_dict(torch.load("uf_bw.pth"))
+
+# 切换到推理模式
+model_fp.eval()
+model_bw.eval()
+
+
+def _delta_tmp(p, L_h: float) -> float:
+    """
+    过滤时段TMP上升量:调用 uf_fp.pth 模型
+    """
+    return model_fp(p, L_h)
+
+def phi_bw_of(p, L_s: float, t_bw_s: float) -> float:
+    """
+    物洗去除比例:调用 uf_bw.pth 模型
+    """
+    return model_bw(p, L_s, t_bw_s)
+
+def _tmp_after_ceb(p, L_s: float, t_bw_s: float) -> float:
+    """
+    计算化学清洗(CEB)后的TMP,当前为恢复初始跨膜压差
+    """
+    return p.TMP0
+
+def _v_bw_m3(p, t_bw_s: float) -> float:
+    """
+    物理反洗水耗
+    """
+    return float(p.q_bw_m3ph * (float(t_bw_s) / 3600.0))
+
+def simulate_one_supercycle(p: UFParams, L_s: float, t_bw_s: float):
+    """
+    返回 (是否可行, 指标字典)
+    - 支持动态CEB次数:48h固定间隔
+    - 增加日均产水时间和吨水电耗
+    """
+    L_h = float(L_s) / 3600.0  # 小周期过滤时间(h)
+
+    tmp = p.TMP0
+    max_tmp_during_filtration = tmp
+    max_residual_increase = 0.0
+
+    # 小周期总时长(h) 小周期总时长 = 过滤时长 + 物洗时长
+    t_small_cycle_h = (L_s + t_bw_s) / 3600.0
+
+    # 计算超级周期内CEB次数 超级周期内CEB次数 = 48h / 小周期总时长
+    k_bw_per_ceb = int(np.floor(p.T_ceb_interval_h / t_small_cycle_h))
+    if k_bw_per_ceb < 1:
+        k_bw_per_ceb = 1  # 至少一个小周期
+
+    # ton水电耗查表
+    energy_lookup = {
+        3600: 0.1034, 3660: 0.1031, 3720: 0.1029, 3780: 0.1026,
+        3840: 0.1023, 3900: 0.1021, 3960: 0.1019, 4020: 0.1017,
+        4080: 0.1015, 4140: 0.1012, 4200: 0.1011
+    }
+
+    for _ in range(k_bw_per_ceb):
+        tmp_run_start = tmp
+
+        # 过滤阶段TMP增长 
+        dtmp = _delta_tmp(p, L_h)
+        tmp_peak = tmp_run_start + dtmp # 过滤阶段TMP峰值 = 过滤阶段TMP开始值 + 过滤阶段TMP上升量
+
+        # 约束1:峰值不得超过硬上限
+        if tmp_peak > p.TMP_max + 1e-12: 
+            return False, {"reason": "TMP_max violated during filtration", "TMP_peak": tmp_peak}
+
+        if tmp_peak > max_tmp_during_filtration: # 如果过滤阶段TMP峰值超过当前最大值
+            max_tmp_during_filtration = tmp_peak # 更新最大值
+
+        # 物理反洗
+        phi = phi_bw_of(p, L_s, t_bw_s) # 物洗去除比例
+        tmp_after_bw = tmp_peak - phi * (tmp_peak - tmp_run_start) # 物理反洗后TMP = 过滤阶段TMP峰值 - 物洗去除比例 * (过滤阶段TMP峰值 - 过滤阶段TMP开始值)
+
+        # 约束2:单次残余增量控制
+        residual_inc = tmp_after_bw - tmp_run_start # 单次残余增量 = 物理反洗后TMP - 过滤阶段TMP开始值
+        if residual_inc > p.dTMP + 1e-12: # 如果单次残余增量超过单次残余增量上限
+            return False, {
+                "reason": "residual TMP increase after BW exceeded dTMP", # 返回不可行
+                "residual_increase": residual_inc, # 单次残余增量
+                "limit_dTMP": p.dTMP
+            }
+        if residual_inc > max_residual_increase: # 如果单次残余增量超过当前最大值   
+            max_residual_increase = residual_inc # 更新最大值
+
+        tmp = tmp_after_bw # 更新TMP
+
+    # CEB
+    tmp_after_ceb = p.TMP0 # 化学反洗后TMP
+
+    # 体积与回收率
+    V_feed_super = k_bw_per_ceb * p.q_UF * L_h # 进水体积 进水体积 = 超级周期内CEB次数 * 过滤流量 * 过滤时长 
+    V_loss_super = k_bw_per_ceb * _v_bw_m3(p, t_bw_s) + p.v_ceb_m3 # 损失体积 损失体积 = 物洗体积 + CEB用水体积
+    V_net = max(0.0, V_feed_super - V_loss_super) # 净产水体积 净产水体积 = 进水体积 - 损失体积
+    recovery = max(0.0, V_net / max(V_feed_super, 1e-12)) # 回收率 净产水体积 / 进水体积
+
+    # 时间与净供水率
+    T_super_h = k_bw_per_ceb * (L_s + t_bw_s) / 3600.0 + p.t_ceb_s / 3600.0 # 超循环时间 超循环时间 = 超级周期内CEB次数 * (过滤时长 + 物洗时长) / 3600 + CEB时长 / 3600
+    net_delivery_rate_m3ph = V_net / max(T_super_h, 1e-12) # 净供水率 净产水体积 / 超循环时间 
+
+    # 贴边比例与硬限
+    headroom_ratio = max_tmp_during_filtration / max(p.TMP_max, 1e-12) # 贴边比例 过滤时段TMP峰值 / 硬上限 
+    if headroom_ratio > p.headroom_hardcap + 1e-12: # 如果贴边比例超过硬上限 
+        return False, {"reason": "headroom hardcap exceeded", "headroom_ratio": headroom_ratio} # 返回不可行
+
+    # —— 新增指标 1:日均产水时间(h/d) ——
+    daily_prod_time_h = k_bw_per_ceb * L_h / T_super_h * 24.0 # 日均产水时间 日均产水时间 = 超级周期内CEB次数 * 过滤时长 / 超循环时间 * 24
+
+    # —— 新增指标 2:吨水电耗(kWh/m³) ——
+    closest_L = min(energy_lookup.keys(), key=lambda x: abs(x - L_s)) # 最接近的过滤时长
+    ton_water_energy = energy_lookup[closest_L] # 吨水电耗 最接近的过滤时长对应的吨水电耗 
+
+    info = {
+        "recovery": recovery, # 回收率 
+        "V_feed_super_m3": V_feed_super, # 进水体积 
+        "V_loss_super_m3": V_loss_super, # 损失体积 
+        "V_net_super_m3": V_net, # 净产水体积 
+        "supercycle_time_h": T_super_h, # 超循环时间 
+        "net_delivery_rate_m3ph": net_delivery_rate_m3ph, # 净供水率 
+        "max_TMP_during_filtration": max_tmp_during_filtration, # 过滤时段TMP峰值 
+        "max_residual_increase_per_run": max_residual_increase, # 单次残余增量最大值 
+        "phi_bw_effective": phi, # 物洗去除比例 
+        "TMP_after_ceb": tmp_after_ceb, # 物理反洗后TMP 
+        "headroom_ratio": headroom_ratio, # 贴边比例 
+        "daily_prod_time_h": daily_prod_time_h, # 日均产水时间 
+        "ton_water_energy_kWh_per_m3": ton_water_energy, # 吨水电耗 
+        "k_bw_per_ceb": k_bw_per_ceb # 超级周期内CEB次数 
+    }
+
+    return True, info
+
+def _score(p: UFParams, rec: dict) -> float:
+    """综合评分:越大越好。不同TMP0会改变max_TMP→改变惩罚→得到不同解。"""
+    # 无量纲化净供水率
+    rate_norm = rec["net_delivery_rate_m3ph"] / max(p.q_UF, 1e-12) # 无量纲化净供水率 净供水率 / 过滤流量 1000m3/h / 360m3/h = 2.7778
+    headroom_penalty = (rec["max_TMP_during_filtration"] / max(p.TMP_max, 1e-12)) ** p.r_headroom # 贴边惩罚
+    reward = (p.w_rec * rec["recovery"] + p.w_rate * rate_norm - p.w_headroom * headroom_penalty) # 奖励
+    return reward
+
+def set_global_seed(seed: int):
+    """固定全局随机种子,保证训练可复现"""
+    random.seed(seed) # 随机种子  
+    np.random.seed(seed) # 随机种子
+    torch.manual_seed(seed) # 随机种子
+    torch.cuda.manual_seed_all(seed)  # 如果使用GPU
+    torch.backends.cudnn.deterministic = True # 确定性
+    torch.backends.cudnn.benchmark = False # 不使用GPU
+
+class UFSuperCycleEnv(gym.Env):
+    """超滤系统环境(超级周期级别决策)"""
+
+    metadata = {"render_modes": ["human"]}
+
+    def __init__(self, base_params, max_episode_steps: int = 10):
+        super(UFSuperCycleEnv, self).__init__() # 初始化环境
+
+        self.base_params = base_params # UFParams 实例
+        self.current_params = copy.deepcopy(base_params) # UFParams 实例
+        self.max_episode_steps = max_episode_steps # 最大步数
+        self.current_step = 0 # 当前步数
+
+        # 计算离散动作空间
+        self.L_values = np.arange(
+            self.base_params.L_min_s, # 过滤时长下限
+            self.base_params.L_max_s + self.base_params.L_step_s, # 过滤时长上限
+            self.base_params.L_step_s # 过滤时长步长
+        )
+        self.t_bw_values = np.arange(
+            self.base_params.t_bw_min_s, # 物洗时长下限
+            self.base_params.t_bw_max_s + self.base_params.t_bw_step_s, # 物洗时长上限
+            self.base_params.t_bw_step_s # 物洗时长步长
+        )
+
+        self.num_L = len(self.L_values) # 过滤时长步数
+        self.num_bw = len(self.t_bw_values) # 物洗时长步数
+
+        # 单一离散动作空间,spaces.Discrete(n) 定义了一个包含 n 个离散动作或观测值的空间。这个空间包含从 0 到 n-1 的整数值
+        self.action_space = spaces.Discrete(self.num_L * self.num_bw) # 动作空间,离散动作空间
+
+        # 状态空间:归一化的[TMP0], 用于定义 连续的空间,通常用于表示那些具有连续值的观测空间或动作空间
+        self.observation_space = spaces.Box(
+            low=np.array([0.0], dtype=np.float32),  # 单一维度,只有TMP0
+            high=np.array([1.0], dtype=np.float32),  # 单一维度,只有TMP0
+            dtype=np.float32,
+            shape=(1,)  # 明确指定形状为1维
+        )
+
+        # 初始化状态
+        self.reset(seed=None) # 重置环境
+
+    def _get_obs(self):
+        # 原始状态
+        TMP0 = self.current_params.TMP0 
+        # 状态归一化
+        TMP0_norm = (TMP0 - 0.01) / (0.05 - 0.01) 
+
+        return np.array([TMP0_norm], dtype=np.float32) # 状态
+
+    def _get_action_values(self, action):
+        """解析离散动作"""
+        L_idx = action // self.num_bw # 过滤时长索引
+        t_bw_idx = action % self.num_bw # 物洗时长索引
+        return self.L_values[L_idx], self.t_bw_values[t_bw_idx] # 动作
+
+    def reset(self, seed=None, options=None):
+        """重置环境"""
+        super().reset(seed=seed)
+
+        # 随机初始化 TMP0
+        self.current_params.TMP0 = np.random.uniform(0.01, 0.05) 
+        # 初始化步数
+        self.current_step = 0
+
+        return self._get_obs(), {}  # Gymnasium要求返回(obs, info)
+
+    def step(self, action):
+        """执行一个超级周期"""
+        self.current_step += 1
+
+        # 解析动作 对应过滤时长和物洗时长
+        L_s, t_bw_s = self._get_action_values(action) 
+
+        #  确保过滤时长和物洗时长在范围内  np.clip:限制在范围内
+        L_s = np.clip(L_s, self.base_params.L_min_s, self.base_params.L_max_s)  
+        t_bw_s = np.clip(t_bw_s, self.base_params.t_bw_min_s, self.base_params.t_bw_max_s) 
+
+        # 记录当前状态 归一化状态
+        current_obs = self._get_obs()
+
+        # 模拟超级周期
+        feasible, info = simulate_one_supercycle(self.current_params, L_s, t_bw_s)
+
+        # 计算奖励
+        if feasible:
+            reward = _score(self.current_params, info) 
+            self.current_params.TMP0 = info["TMP_after_ceb"]
+            terminated = False
+        else:
+            reward = -20
+            terminated = True
+
+        # 检查是否达到最大步数
+        truncated = self.current_step >= self.max_episode_steps
+
+        # 获取新状态
+        next_obs = self._get_obs()
+
+        info["feasible"] = feasible
+        info["step"] = self.current_step
+
+        return next_obs, reward, terminated, truncated, info
+
+
+class UFEpisodeRecorder:
+    """记录episode中的决策和结果"""
+
+    def __init__(self):
+        self.episode_data = [] # 记录episode中的决策和结果
+        self.current_episode = []
+
+    def record_step(self, obs, action, reward, done, info):
+        """记录一步"""
+        step_data = {
+            "obs": obs.copy(), # 新状态         
+            "action": action.copy(), # 动作
+            "reward": reward, # 奖励
+            "done": done, # 是否终止
+            "info": info.copy() if info else {} # 信息
+        }
+        self.current_episode.append(step_data) # 记录episode中的决策和结果
+
+        if done:
+            self.episode_data.append(self.current_episode) # 记录episode中的决策和结果
+            self.current_episode = [] 
+
+    def get_episode_stats(self, episode_idx=-1):
+        """获取episode统计信息"""
+        if not self.episode_data:
+            return {}
+
+        episode = self.episode_data[episode_idx] # 记录episode中的决策和结果
+        total_reward = sum(step["reward"] for step in episode) # 总奖励         
+        avg_recovery = np.mean([step["info"].get("recovery", 0) for step in episode if "recovery" in step["info"]]) # 平均回收率
+        feasible_steps = sum(1 for step in episode if step["info"].get("feasible", False)) # 可行的步数
+
+        return {
+            "total_reward": total_reward, # 总奖励
+            "avg_recovery": avg_recovery, # 平均回收率
+            "feasible_steps": feasible_steps, # 可行的步数
+            "total_steps": len(episode) # 总步数
+        }
+
+
+class UFTrainingCallback(BaseCallback):
+    """
+    PPO 训练回调,用于记录每一步的数据到 recorder。
+    相比原来的 RecordingCallback,更加合理和健壮:
+    1. 不依赖环境内部 last_* 属性
+    2. 使用 PPO 提供的 obs、actions、rewards、dones、infos
+    3. 自动处理 episode 结束时的统计
+    """
+
+    def __init__(self, recorder, verbose=0):
+        super(UFTrainingCallback, self).__init__(verbose) 
+        self.recorder = recorder 
+
+    def _on_step(self) -> bool:
+        try:
+            new_obs = self.locals.get("new_obs") # 新状态
+            actions = self.locals.get("actions") # 动作
+            rewards = self.locals.get("rewards") # 奖励
+            dones = self.locals.get("dones") # 是否终止
+            infos = self.locals.get("infos") # 信息
+
+            if len(new_obs) > 0:
+                step_obs = new_obs[0] # 新状态
+                step_action = actions[0] if actions is not None else None # 动作
+                step_reward = rewards[0] if rewards is not None else 0.0 # 奖励
+                step_done = dones[0] if dones is not None else False # 是否终止
+                step_info = infos[0] if infos is not None else {} # 信息
+
+                # 打印当前 step 的信息
+                if self.verbose:
+                    print(f"[Step {self.num_timesteps}] 动作={step_action}, 奖励={step_reward:.3f}, Done={step_done}")
+
+                # 记录数据
+                self.recorder.record_step(
+                    obs=step_obs, # 新状态
+                    action=step_action, # 动作
+                    reward=step_reward, # 奖励
+                    done=step_done, # 是否终止
+                    info=step_info, # 信息
+                )
+
+        except Exception as e:
+            if self.verbose:
+                print(f"[Callback Error] {e}")
+
+        return True
+
+
+class DQNTrainer:
+    def __init__(self, env, params, callback=None):
+        """
+        初始化 DQN 训练器
+        :param env: 强化学习环境
+        :param params: DQNParams 实例
+        :param callback: 可选,训练回调器
+        """
+        self.env = env # 环境   
+        self.params = params # DQNParams 实例
+        self.callback = callback # 训练回调器
+        self.log_dir = self._create_log_dir() # 日志文件夹
+        self.model = self._create_model() # 模型
+
+    def _create_log_dir(self):
+        """
+        自动生成日志文件夹名:包含核心超参数 + 时间戳
+        """
+        timestamp = time.strftime("%Y%m%d-%H%M%S") # 时间戳
+        log_name = (
+            f"DQN_lr{self.params.learning_rate}_buf{self.params.buffer_size}_bs{self.params.batch_size}" # 日志文件夹名
+            f"_gamma{self.params.gamma}_exp{self.params.exploration_fraction}" # 日志文件夹名
+            f"_{self.params.remark}_{timestamp}" # 日志文件夹名
+        )
+        log_dir = os.path.join("./uf_dqn_tensorboard", log_name) # 日志文件夹
+        os.makedirs(log_dir, exist_ok=True) # 创建日志文件夹
+        return log_dir
+
+    def _create_model(self):
+        """
+        根据参数创建 DQN 模型
+        """
+        return DQN(
+            policy="MlpPolicy", # 策略网络
+            env=self.env, # 环境
+            learning_rate=self.params.learning_rate, # 学习率
+            buffer_size=self.params.buffer_size, # 经验回放缓冲区大小
+            learning_starts=self.params.learning_starts, # 学习开始前需要收集的步数
+            batch_size=self.params.batch_size, # 每次从经验池中采样的样本数量
+            gamma=self.params.gamma, # 折扣因子,越接近1越重视长期奖励
+            train_freq=self.params.train_freq, # 每隔多少步训练一次
+            target_update_interval=self.params.target_update_interval, # 目标网络更新间隔
+            exploration_initial_eps=self.params.exploration_initial_eps, # 初始探索率 ε
+            exploration_fraction=self.params.exploration_fraction, # 从初始ε衰减到最终ε所占的训练比例
+            exploration_final_eps=self.params.exploration_final_eps, # 最终探索率 ε
+            verbose=1,
+            tensorboard_log=self.log_dir
+        )
+
+    def train(self, total_timesteps: int):
+        """
+        训练 DQN 模型,支持自定义回调器
+        """
+        if self.callback:
+            self.model.learn(total_timesteps=total_timesteps, callback=self.callback) # 支持自定义回调器
+        else:
+            self.model.learn(total_timesteps=total_timesteps) # 不支持自定义回调器
+        print(f"模型训练完成,日志保存在:{self.log_dir}")
+
+    def save(self, path=None):
+        """
+        保存模型到指定路径
+        """
+        if path is None:
+            path = os.path.join(self.log_dir, "dqn_model.zip") # 模型文件名
+        self.model.save(path)
+        print(f"模型已保存到:{path}")
+
+    def load(self, path):
+        """
+        从指定路径加载模型
+        """
+        self.model = DQN.load(path, env=self.env) # 加载模型
+        print(f"模型已从 {path} 加载")
+
+def train_uf_rl_agent(params: UFParams, total_timesteps: int = 10000, seed: int = 2025):
+    """训练超滤系统RL代理(固定随机种子)"""
+
+    # === 1. 固定全局随机种子 ===
+    set_global_seed(seed)
+
+    # === 2. 创建回调器 ===
+    recorder = UFEpisodeRecorder() # 记录每一步的数据
+    callback = UFTrainingCallback(recorder, verbose=1) # 训练回调器
+
+    # === 3. 创建环境并固定种子 ===
+    def make_env():
+        env = UFSuperCycleEnv(params) # 创建环境
+        env = Monitor(env) # 监控环境
+        return env
+
+    env = DummyVecEnv([make_env]) # 创建环境 多进程 
+
+    # === 4. 定义DQN参数 ===
+    dqn_params = DQNParams()
+
+    # === 5. 创建训练器 ===
+    trainer = DQNTrainer(env, dqn_params, callback=callback) 
+
+    # === 6. 训练模型 ===
+    trainer.train(total_timesteps)
+
+    # === 7. 保存模型 ===
+    trainer.save()
+
+    # === 8. 输出训练统计信息 ===
+    stats = callback.recorder.get_episode_stats()
+    print(f"训练完成 - 总奖励: {stats.get('total_reward', 0):.2f}, 平均回收率: {stats.get('avg_recovery', 0):.3f}")
+
+    return trainer.model
+
+
+# 训练和测试示例
+if __name__ == "__main__":
+    # 初始化参数
+    params = UFParams()
+
+    # 训练RL代理
+    print("开始训练RL代理...")
+    train_uf_rl_agent(params, total_timesteps=8000)
+

+ 115 - 0
README_UPDATES.md

@@ -0,0 +1,115 @@
+# 超滤系统 DQN 智能决策模块
+
+## 系统简介
+
+基于 DQN 强化学习模型,自动优化超滤膜的过滤时长和物理清洗时长,提升产水量、延长膜使用寿命。
+
+**核心流程**:
+1. 监控 TMP(跨膜压差)达到阈值(95%)
+2. 采集多次数据计算平均 TMP0
+3. DQN 模型决策最优 L_s(过滤时长)和 t_bw_s(物洗时长)
+4. 生成 PLC 指令并下发执行
+5. 发送决策结果到回调接口
+
+## 快速开始
+
+### 运行服务
+```bash
+python loop_main.py
+```
+
+程序会自动:
+- 加载 `config.json` 配置
+- 连接数据库和 API
+- 持续监控并在 TMP 达到阈值时触发决策
+
+### 配置文件 (config.json)
+
+```json
+{
+  "system": {
+    "use_model": 1,              # 1=启用模型决策,0=仅记录数据
+    "trigger_value": 95,         # TMP触发值(%)
+    "num_values_to_collect": 10, # 采集次数
+    "poll_interval": 2           # 轮询间隔(秒)
+  },
+  "api": {
+    "base_url": "http://example.com",
+    "jwt_token": "your_token"
+  },
+  "database": {
+    "host": "localhost",
+    "user": "root",
+    "password": "password",
+    "database": "scada_db"
+  },
+  "scada": {
+    "secret": "your_secret_key",
+    "project_id": 92
+  }
+}
+```
+
+**动态开关**:修改 `use_model` 后无需重启,下次循环自动生效
+
+## 核心模块
+
+### 1. DQN_decide.py
+- `run_uf_DQN_decide(uf_params, TMP0)`:DQN 模型决策
+- `generate_plc_instructions(...)`:生成 PLC 指令
+- `calc_uf_cycle_metrics(...)`:计算周期指标
+
+### 2. DQN_env.py
+- `UFSuperCycleEnv`:强化学习环境
+- `UFParams`:超滤参数配置
+- 模拟超级周期运行
+
+### 3. loop_main.py
+- 主监控循环
+- 数据采集和决策触发
+- PLC 更新和回调推送
+
+## 工作流程
+
+```
+监控 TMP → 达到阈值 → 采集数据 → 计算平均值 → DQN决策 
+    ↓
+生成指令 → 更新PLC → 回调推送 → 保存历史 → 继续监控
+```
+
+## PLC 数据更新
+
+系统自动通过 API 更新 PLC 参数:
+
+**接口**: `/api/v1/plc/set-var-values`
+
+**签名**: `MD5(record + secret + timestamp).toUpperCase()`
+
+**数据格式**:
+```json
+[{
+  "project_id": 92,
+  "item": "设备名称",
+  "old_value": "旧值",
+  "new_value": "新值",
+  "command_type": 1
+}]
+```
+
+## 日志记录
+
+日志保存在 `monitor_service.log`,自动轮转(单文件5MB,保留3个备份)。
+
+记录内容:
+- 配置加载和变更
+- 数据采集过程
+- 模型决策结果
+- PLC 更新状态
+- API 回调响应
+
+## 注意事项
+
+1. **模型文件**: 确保 `dqn_model.zip` 存在
+2. **数据库连接**: 检查数据库配置和网络连通性
+3. **API 认证**: 确认 JWT Token 和密钥正确
+4. **TMP 阈值**: 根据实际工况调整 `trigger_value`

BIN
__pycache__/DQN_decide.cpython-39.pyc


BIN
__pycache__/DQN_env.cpython-39.pyc


BIN
__pycache__/save_uf_models.cpython-39.pyc


+ 168 - 0
config.json

@@ -0,0 +1,168 @@
+{
+  "_comment_api": "API接口配置",
+  "api": {
+    "base_url": "http://120.55.44.4:8900",
+    "current_data_endpoint": "/api/v1/jinke-cloud/device/current-data",
+    "callback_endpoint": "/api/dtgateway/v1/decision/data",
+    "plc_endpoint": "/api/v1/plc/set-var-values",
+    "jwt_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJJRCI6NywiVXNlcm5hbWUiOiJhZG1pbiIsIkRlcCI6IjEzNSIsImV4cCI6MTc3NjExOTExNCwiaXNzIjoiZ2luLWJsb2cifQ.0HTtzHZjyd2mHo8VCy8icYROxmntRMuQhyoZsAYRL_M"
+  },
+  "_comment_database": "MySQL数据库连接配置",
+  "database": {
+    "host": "222.130.26.206",
+    "port": 4000,
+    "user": "whu",
+    "password": "09093f4e6b33ddd",
+    "database": "ws_data",
+    "table_name": "dc_item_history_data_minute"
+  },
+  "_comment_scada": "SCADA系统配置 - PLC通信签名验证",
+  "scada": {
+    "secret": "237c92d2-8795-1094-11ef-00e2e48fce4a",
+    "project_id": 92
+  },
+  "_comment_system": "系统运行参数配置",
+  "system": {
+    "use_model": 0,
+    "_use_model_desc": "模型开关: 1=启用模型决策, 0=禁用模型仅记录数据 (支持运行时修改)",
+    "trigger_value": 95,
+    "_trigger_value_desc": "触发监控的控制值",
+    "num_values_to_collect": 10,
+    "_num_values_to_collect_desc": "每次收集的数据点数量",
+    "poll_interval": 2,
+    "_poll_interval_desc": "轮询间隔时间(秒)",
+    "backwash_time": 100,
+    "_backwash_time_desc": "默认反洗时间(秒)",
+    "ceb_count": 45
+  },
+  "_comment_devices": "设备配置列表 - 每个设备的API调用参数",
+  "devices": [
+    {
+      "_comment": "UF1超滤设备配置",
+      "name": "UF1",
+      "press_pv_item": "C.M.UF1_DB@press_PV",
+      "_press_pv_item_desc": "用于历史数据查询的压差",
+      "control_payload": {
+        "_desc": "控制字读取配置 - 用于触发条件检测",
+        "deviceId": "1",
+        "deviceItems": "C.M.UF1_DB@word_control",
+        "deviceName": "UF1_control_word",
+        "project_id": 92
+      },
+      "target_payload": {
+        "_desc": "跨膜压差读取配置 - 用于数据收集",
+        "deviceId": "1",
+        "deviceItems": "UF1_BW_After_TMP",
+        "deviceName": "UF1_backwash_pressure_diff",
+        "project_id": 92
+      },
+      "production_time_payload": {
+        "_desc": "产水时长读取配置 - 用于模型输入",
+        "deviceId": "1",
+        "deviceItems": "C.M.UF1_DB@time_production",
+        "deviceName": "UF1_production_time",
+        "project_id": 92
+      },
+      "backwashing_payload": {
+        "_desc": "反洗时长读取配置 - 用于模型输入",
+        "deviceId": "1",
+        "deviceItems": "C.M.UF1_DB@time_BW_SP",
+        "deviceName": "UF1_time_BW_SP",
+        "project_id": 92
+      }
+    },
+    {
+      "_comment": "UF2超滤设备配置",
+      "name": "UF2",
+      "press_pv_item": "C.M.UF2_DB@press_PV",
+      "control_payload": {
+        "deviceId": "1",
+        "deviceItems": "C.M.UF2_DB@word_control",
+        "deviceName": "UF2_control_word",
+        "project_id": 92
+      },
+      "target_payload": {
+        "deviceId": "1",
+        "deviceItems": "UF2_BW_After_TMP",
+        "deviceName": "UF2_backwash_pressure_diff",
+        "project_id": 92
+      },
+      "production_time_payload": {
+        "deviceId": "1",
+        "deviceItems": "C.M.UF2_DB@time_production",
+        "deviceName": "UF2_production_time",
+        "project_id": 92
+      },
+      "backwashing_payload": {
+        "deviceId": "1",
+        "deviceItems": "C.M.UF2_DB@time_BW_SP",
+        "deviceName": "UF2_time_BW_SP",
+        "project_id": 92
+      }
+    },
+    {
+      "_comment": "UF3超滤设备配置",
+      "name": "UF3",
+      "press_pv_item": "C.M.UF3_DB@press_PV",
+      "control_payload": {
+        "deviceId": "1",
+        "deviceItems": "C.M.UF3_DB@word_control",
+        "deviceName": "UF3_control_word",
+        "project_id": 92
+      },
+      "target_payload": {
+        "deviceId": "1",
+        "deviceItems": "UF3_BW_After_TMP",
+        "deviceName": "UF3_backwash_pressure_diff",
+        "project_id": 92
+      },
+      "production_time_payload": {
+        "deviceId": "1",
+        "deviceItems": "C.M.UF3_DB@time_production",
+        "deviceName": "UF3_production_time",
+        "project_id": 92
+      },
+      "backwashing_payload": {
+        "deviceId": "1",
+        "deviceItems": "C.M.UF3_DB@time_BW_SP",
+        "deviceName": "UF3_time_BW_SP",
+        "project_id": 92
+      }
+    },
+    {
+      "_comment": "UF4超滤设备配置",
+      "name": "UF4",
+      "press_pv_item": "C.M.UF4_DB@press_PV",
+      "control_payload": {
+        "deviceId": "1",
+        "deviceItems": "C.M.UF4_DB@word_control",
+        "deviceName": "UF4_control_word",
+        "project_id": 92
+      },
+      "target_payload": {
+        "deviceId": "1",
+        "deviceItems": "UF4_BW_After_TMP",
+        "deviceName": "UF4_backwash_pressure_diff",
+        "project_id": 92
+      },
+      "production_time_payload": {
+        "deviceId": "1",
+        "deviceItems": "C.M.UF4_DB@time_production",
+        "deviceName": "UF4_production_time",
+        "project_id": 92
+      },
+      "backwashing_payload": {
+        "deviceId": "1",
+        "deviceItems": "C.M.UF4_DB@time_BW_SP",
+        "deviceName": "UF4_time_BW_SP",
+        "project_id": 92
+      }
+    }
+  ],
+  "_comment_usage": "配置文件使用说明",
+  "_usage_notes": {
+    "1_动态配置": "use_model支持运行时修改,无需重启程序",
+    "2_签名验证": "PLC通信使用MD5签名验证,确保scada.secret与服务器端一致",
+    "3_设备扩展": "新增设备时,复制现有设备配置并修改相应的deviceItems参数"
+  }
+}

+ 23 - 0
device_states.json

@@ -0,0 +1,23 @@
+{
+    "_comment": "此文件用于存储每个设备的运行时状态。时间格式为 YYYY-MM-DD HH:MM:SS",
+    "UF1": {
+        "model_prev_L_s": 4100,
+        "model_prev_t_bw_s": 94.0,
+        "last_cycle_end_time": "2025-10-11 02:35:57"
+    },
+    "UF2": {
+        "model_prev_L_s": 4100,
+        "model_prev_t_bw_s": 94.0,
+        "last_cycle_end_time": "2025-10-11 16:18:23"
+    },
+    "UF3": {
+        "model_prev_L_s": 4100.0,
+        "model_prev_t_bw_s": 94.0,
+        "last_cycle_end_time": "2025-10-11 16:01:39"
+    },
+    "UF4": {
+        "model_prev_L_s": 4100,
+        "model_prev_t_bw_s": 94.0,
+        "last_cycle_end_time": "2025-10-11 15:47:43"
+    }
+}

BIN
dqn_model.zip


+ 1 - 0
dqn_model/_stable_baselines3_version

@@ -0,0 +1 @@
+2.6.0

Plik diff jest za duży
+ 46 - 0
dqn_model/data


BIN
dqn_model/policy.optimizer.pth


BIN
dqn_model/policy.pth


BIN
dqn_model/pytorch_variables.pth


+ 9 - 0
dqn_model/system_info.txt

@@ -0,0 +1,9 @@
+- OS: Windows-10-10.0.26100-SP0 10.0.26100
+- Python: 3.10.9
+- Stable-Baselines3: 2.6.0
+- PyTorch: 2.8.0+cpu
+- GPU Enabled: False
+- Numpy: 1.26.4
+- Cloudpickle: 3.1.1
+- Gymnasium: 1.0.0
+- OpenAI Gym: 0.26.2

+ 583 - 0
loop_main.py

@@ -0,0 +1,583 @@
+# 标准库导入
+import time
+import json
+import os
+import statistics
+import threading
+import hashlib
+from datetime import datetime, timedelta
+import logging
+from logging.handlers import RotatingFileHandler
+
+# 第三方库导入
+import pymysql
+import requests
+
+# 自定义模块导入
+from DQN_env import UFParams
+from DQN_decide import run_uf_DQN_decide, generate_plc_instructions, calc_uf_cycle_metrics 
+
+# 日志系统配置
+logger = logging.getLogger(__name__)
+logger.setLevel(logging.INFO)
+
+# 日志输出格式
+formatter = logging.Formatter(
+    '%(asctime)s - %(threadName)s - %(levelname)s - %(message)s',
+    datefmt='%Y-%m-%d %H:%M:%S'
+)
+
+# 文件日志处理器,单个文件最大5MB,保留3个备份
+file_handler = RotatingFileHandler('monitor_service.log', maxBytes=5 * 1024 * 1024, backupCount=3, encoding='utf-8')
+file_handler.setFormatter(formatter)
+
+# 控制台日志处理器
+console_handler = logging.StreamHandler()
+console_handler.setFormatter(formatter)
+
+# 添加处理器
+logger.addHandler(file_handler)
+logger.addHandler(console_handler)
+
+
+# 配置加载函数
+def load_config(config_file='config.json'):
+    """
+    从JSON配置文件加载系统配置
+    
+    参数:
+        config_file: 配置文件路径
+        
+    返回:
+        配置字典
+        
+    异常:
+        配置文件不存在或格式错误时抛出异常
+    """
+    try:
+        with open(config_file, 'r', encoding='utf-8') as f:
+            return json.load(f)
+    except FileNotFoundError:
+        logger.critical(f"配置文件未找到 {config_file}")
+        raise
+    except json.JSONDecodeError as e:
+        logger.critical(f"配置文件格式错误 {config_file}: {e}")
+        raise
+
+
+def get_current_config():
+    """
+    获取当前配置,支持运行时配置动态变更
+    """
+    return load_config()
+
+
+# 初始化配置
+config = load_config()
+
+# 全局配置参数
+
+# API接口配置
+API_BASE_URL = config['api']['base_url']
+API_URL = API_BASE_URL + config['api']['current_data_endpoint']
+CALLBACK_URL = API_BASE_URL + config['api']['callback_endpoint']
+PLC_URL = API_BASE_URL + config['api']['plc_endpoint']
+
+# HTTP请求头
+HEADERS = {
+    "Content-Type": "application/json",
+    "JWT-TOKEN": config['api']['jwt_token']
+}
+
+# MySQL数据库配置,优先读取环境变量
+DB_USER = os.getenv('DB_USERNAME', config['database']['user'])
+DB_PASSWORD = os.getenv('DB_PASSWORD', config['database']['password'])
+DB_HOST = os.getenv('DB_HOST', config['database']['host'])
+DB_NAME = os.getenv('DB_DATABASE', config['database']['database'])
+DB_PORT = int(os.getenv('DB_PORT', str(config['database']['port'])))
+HISTORY_TABLE_NAME = config['database']['table_name']
+
+# 超滤系统参数
+uf_params = UFParams()
+PROJECT_ID_FOR_CALLBACK = config['scada']['project_id']
+SCADA_SECRET = config['scada']['secret']
+
+# 监控流程参数
+TRIGGER_VALUE = config['system']['trigger_value']
+NUM_VALUES_TO_COLLECT = config['system']['num_values_to_collect']
+POLL_INTERVAL = config['system']['poll_interval']
+
+# 设备列表
+DEVICE_SEQUENCE = config['devices']
+
+# 状态持久化配置
+STATE_FILE = 'device_states.json'
+_state_lock = threading.Lock()
+device_states = {}
+DATETIME_FORMAT = "%Y-%m-%d %H:%M:%S"
+
+
+# 状态持久化函数
+def load_device_states():
+    """
+    从状态文件加载所有设备的运行状态
+    """
+    global device_states
+    with _state_lock:
+        try:
+            if os.path.exists(STATE_FILE):
+                with open(STATE_FILE, 'r', encoding='utf-8') as f:
+                    content = f.read()
+                    if content:
+                        device_states = json.loads(content)
+                        logger.info(f"状态文件加载成功 {STATE_FILE}")
+                    else:
+                        logger.warning(f"状态文件为空 {STATE_FILE}")
+                        device_states = {}
+            else:
+                logger.info(f"状态文件不存在,首次运行 {STATE_FILE}")
+                device_states = {}
+        except (json.JSONDecodeError, IOError) as e:
+            logger.error(f"状态文件加载失败 {STATE_FILE}: {e}")
+            device_states = {}
+
+
+def save_device_state(device_name, state_data):
+    """
+    保存单个设备的运行状态到文件
+    
+    参数:
+        device_name: 设备名称
+        state_data: 设备状态数据字典
+    """
+    with _state_lock:
+        try:
+            # 读取现有状态
+            full_states = {}
+            if os.path.exists(STATE_FILE):
+                with open(STATE_FILE, 'r', encoding='utf-8') as f:
+                    content = f.read()
+                    if content:
+                        full_states = json.loads(content)
+
+            # 更新指定设备状态
+            full_states[device_name] = state_data
+
+            # 写回文件
+            with open(STATE_FILE, 'w', encoding='utf-8') as f:
+                json.dump(full_states, f, indent=4, ensure_ascii=False)
+
+            # 更新内存缓存
+            global device_states
+            device_states[device_name] = state_data
+            logger.info(f"[{device_name}] 状态保存成功")
+        except (json.JSONDecodeError, IOError) as e:
+            logger.error(f"[{device_name}] 状态保存失败: {e}")
+
+
+# 核心业务函数
+
+def create_db_connection():
+    """
+    创建MySQL数据库连接
+    
+    返回:
+        连接对象或None
+    """
+    try:
+        connection = pymysql.connect(
+            host=DB_HOST, user=DB_USER, password=DB_PASSWORD, database=DB_NAME,
+            port=DB_PORT, charset='utf8mb4',
+            cursorclass=pymysql.cursors.DictCursor
+        )
+        logger.debug("数据库连接成功")
+        return connection
+    except pymysql.MySQLError as e:
+        logger.error(f"数据库连接失败: {e}")
+        return None
+
+
+def get_tmp_extremes(item_name, start_time, end_time, word_control):
+    """
+    查询历史数据中指定时间范围内的跨膜压差极值
+    
+    参数:
+        item_name: 数据项名称
+        start_time: 开始时间
+        end_time: 结束时间
+        word_control: 控制字段名
+        
+    返回:
+        (最大值, 最小值) 或 (None, None)
+    """
+    start_time_str = start_time.strftime(DATETIME_FORMAT)
+    end_time_str = end_time.strftime(DATETIME_FORMAT)
+
+    query = f"""
+            SELECT
+                MAX(val) AS max_val,
+                MIN(val) AS min_val
+            FROM {HISTORY_TABLE_NAME}
+            WHERE project_id = %s
+              AND item_name = %s
+              AND h_time IN (
+                  SELECT h_time
+                  FROM {HISTORY_TABLE_NAME}
+                  WHERE project_id = %s
+                    AND item_name = %s
+                    AND val = 26
+                    AND h_time BETWEEN %s AND %s
+              )
+        """
+    logger.info(f"查询历史极值 {item_name} 从 {start_time_str} 到 {end_time_str}")
+    logger.debug(query)
+    
+    db_connection = create_db_connection()
+    if not db_connection:
+        return None, None
+
+    try:
+        with db_connection.cursor() as cursor:
+            cursor.execute(query, (PROJECT_ID_FOR_CALLBACK, item_name, PROJECT_ID_FOR_CALLBACK, word_control, start_time_str, end_time_str))
+            result = cursor.fetchone()
+            logger.debug(f"查询结果: {result}")
+            if result and result['max_val'] is not None and result['min_val'] is not None:
+                max_val = float(result['max_val'])
+                min_val = float(result['min_val'])
+                logger.info(f"查询成功 最大值={max_val} 最小值={min_val}")
+                return max_val, min_val
+            else:
+                logger.warning("查询未返回有效数据")
+                return None, None
+    except pymysql.MySQLError as e:
+        logger.error(f"数据库查询错误: {e}")
+        return None, None
+    finally:
+        if db_connection and db_connection.open:
+            db_connection.close()
+
+
+def generate_md5_signature(record_data, secret, timestamp):
+    """
+    生成PLC请求的MD5签名
+    """
+    cal_str = f"{record_data}{secret}{timestamp}"
+    return hashlib.md5(cal_str.encode('utf-8')).hexdigest().upper()
+
+
+def send_plc_update(device_name, item, old_value, new_value, command_type):
+    """
+    向PLC发送参数更新指令
+    
+    参数:
+        device_name: 设备名称
+        item: 参数项名称
+        old_value: 旧值
+        new_value: 新值
+        command_type: 指令类型
+        
+    返回:
+        是否发送成功
+    """
+    # 构造签名和请求数据
+    timestamp = int(time.time())  # 生成时间戳
+    record_obj = {
+        "project_id": PROJECT_ID_FOR_CALLBACK,  # 项目ID
+        "item": item,  # 参数项名称
+        "old_value": old_value,  # 旧值 
+        "new_value": new_value,  # 新值
+        "command_type": command_type  # 指令类型
+    }
+    record_data = json.dumps([record_obj])  # 生成签名数据
+    signature = generate_md5_signature(record_data, SCADA_SECRET, timestamp)  # 生成签名
+    url = f"{PLC_URL}?sign={signature}&timestamp={timestamp}"  # 生成请求URL
+    payload = [record_obj]
+
+    logger.info(f"[{device_name}] PLC指令 {item} 从 {old_value} 到 {new_value}")  
+    logger.debug(f"[{device_name}] 签名数据 {record_data}")
+    logger.debug(f"[{device_name}] 签名值 {signature}")
+
+    # 重试机制
+    max_retries, retry_interval = 3, 60  # 重试次数 重试间隔
+    for attempt in range(1, max_retries + 1):
+        try:
+            logger.info(f"[{device_name}] 发送PLC指令 尝试 {attempt}/{max_retries}")
+            response = requests.post(url, json=payload, timeout=15)  # 发送PLC指令 请求头 请求体 超时时间
+            response_json = response.json()
+            if response_json.get('code') == 200:
+                logger.info(f"[{device_name}] PLC指令发送成功 响应 {response_json}")
+                return True
+            else:
+                logger.error(f"[{device_name}] PLC指令发送失败 {response_json.get('msg', '未知错误')}")
+        except requests.exceptions.RequestException as e:
+            logger.error(f"[{device_name}] PLC指令网络错误 {e}")
+        except Exception as e:
+            logger.error(f"[{device_name}] PLC指令未知错误 {e}")
+
+        if attempt < max_retries:  # 重试次数 小于 最大重试次数
+            logger.info(f"[{device_name}] 等待{retry_interval}秒后重试")
+            time.sleep(retry_interval)
+
+    logger.error(f"[{device_name}] PLC指令发送失败,已达最大重试次数")
+    return False
+
+
+def send_decision_to_callback(type_name, **kwargs):
+    """
+    发送决策结果到回调接口
+    
+    参数:
+        type_name: 设备类型名称
+        **kwargs: 决策结果数据
+        
+    返回:
+        是否发送成功
+    """
+    payload = {"list": [{"type": type_name, "project_id": PROJECT_ID_FOR_CALLBACK, **kwargs}]}  # 请求负载 设备类型 项目ID 决策结果数据
+
+    logger.info(f"[{type_name}] 发送决策数据\n{json.dumps(payload, indent=2, ensure_ascii=False)}")
+
+    max_retries, retry_interval = 3, 60  # 重试次数 重试间隔
+    for attempt in range(1, max_retries + 1):
+        try:
+            logger.info(f"[{type_name}] 发送回调 尝试 {attempt}/{max_retries}")
+            response = requests.post(CALLBACK_URL, headers=HEADERS, json=payload, timeout=15)  # 发送回调 请求头 请求体 超时时间
+            response.raise_for_status()
+            logger.info(f"[{type_name}] 回调发送成功 响应 {response.text}")
+            return True
+        except requests.exceptions.RequestException as e:
+            logger.error(f"[{type_name}] 回调发送失败 {e}")
+
+        if attempt < max_retries:  # 重试次数 小于 最大重试次数
+            logger.info(f"[{type_name}] 等待{retry_interval}秒后重试")
+            time.sleep(retry_interval)
+
+    logger.error(f"[{type_name}] 回调发送失败,已达最大重试次数")
+    return False
+
+
+def get_device_value(payload, device_name):
+    """
+    从API获取设备数据项的当前值
+    
+    参数:
+        payload: 请求负载
+        device_name: 设备名称
+        
+    返回:
+        数据值或None
+    """
+    try:
+        response = requests.post(API_URL, headers=HEADERS, json=[payload], timeout=10)  # 发送请求 请求头 请求体 超时时间
+        response.raise_for_status()
+        api_response = response.json()  # 解析响应
+        if api_response.get("code") == 200 and api_response.get("data"):
+            val_str = api_response["data"][0].get("val")  # 获取数据值
+            if val_str is not None:
+                return float(val_str)
+        else:
+            logger.error(f"[{device_name}] 获取数据失败 {payload['deviceItems']} {api_response.get('msg', '未知错误')}")  # 日志 设备名称 请求负载 响应
+    except requests.exceptions.RequestException as e:
+        logger.error(f"[{device_name}] API网络错误 {payload['deviceItems']} {e}")  # 日志 设备名称 请求负载 错误
+    except (json.JSONDecodeError, ValueError, IndexError) as e:
+        logger.error(f"[{device_name}] API数据解析错误 {payload['deviceItems']} {e}")  # 日志 设备名称 请求负载 错误
+    return None
+
+
+# 设备监控主循环
+
+def monitor_device(device):
+    """
+    单个设备的监控循环
+    
+    完整流程:
+    1. 等待触发条件
+    2. 收集稳定数据
+    3. 执行决策计算
+    4. 发送控制指令
+    5. 等待重置信号
+    
+    参数:
+        device: 设备配置字典
+    """
+    name = device["name"]
+    threading.current_thread().name = name
+    logger.info("监控线程启动")
+
+    # 加载设备历史状态
+    device_state = device_states.get(name, {})  # 设备状态 
+    model_prev_L_s = device_state.get('model_prev_L_s')  # 过滤时间 上一轮
+    model_prev_t_bw_s = device_state.get('model_prev_t_bw_s')  # 反洗时间 上一轮
+    last_cycle_end_time_str = device_state.get('last_cycle_end_time')  # 上次运行结束时间
+
+    # 解析上次运行结束时间
+    last_cycle_end_time = None  # 上次运行结束时间
+    if last_cycle_end_time_str:
+        try:
+            last_cycle_end_time = datetime.strptime(last_cycle_end_time_str, DATETIME_FORMAT)  # 上次运行结束时间
+            logger.info(f"历史状态加载成功,上次运行时间 {last_cycle_end_time.strftime(DATETIME_FORMAT)}")
+        except ValueError:
+            logger.warning(f"时间戳解析失败 {last_cycle_end_time_str}")
+    else:
+        logger.info("首次运行,无历史状态")
+
+    # 主循环
+    while True:
+        try:
+            # 阶段1: 等待触发条件
+            logger.info(f"等待触发 控制字需等于 {TRIGGER_VALUE}")
+            while True:
+                control_value = get_device_value(device["control_payload"], name)  # 控制字
+                if control_value is not None and int(control_value) == TRIGGER_VALUE:  # 控制字 等于 触发值
+                    logger.info("触发条件满足")
+                    break
+                time.sleep(POLL_INTERVAL)
+
+            # 阶段2: 收集数据
+            logger.info(f"开始收集TMP数据 需要 {NUM_VALUES_TO_COLLECT} 个有效数据点")
+            collected_values = []
+            last_known_value = get_device_value(device["target_payload"], name)  # 上次已知值
+            
+            if last_known_value is not None:
+                logger.info(f"TMP基准值 {last_known_value}")
+                # 循环收集数据点,直到达到目标数量
+                while len(collected_values) < NUM_VALUES_TO_COLLECT:  # 收集数据点 直到达到目标数量 
+                    current_value = get_device_value(device["target_payload"], name)  # 当前值
+                    if current_value is None:
+                        time.sleep(POLL_INTERVAL)
+                        continue
+
+                    # 只有当数值发生变化时才记录
+                    if current_value != last_known_value:  # 当前值 不等于 上次已知值
+                        collected_values.append(current_value)
+                        logger.info(f"TMP变化 {last_known_value:.4f} 到 {current_value:.4f} 已收集 {len(collected_values)}/{NUM_VALUES_TO_COLLECT}")
+                        last_known_value = current_value
+                    time.sleep(POLL_INTERVAL)
+            else:
+                logger.warning("无法获取TMP基准值,跳过本轮")
+                continue
+
+            # 阶段3: 决策计算
+            logger.info("数据收集完成,开始决策计算")
+            if collected_values:
+                # 计算中位数作为代表值
+                median_value = statistics.median(sorted(collected_values))
+                logger.info(f"TMP中位数 {median_value:.4f}")
+
+                # 确定历史数据查询时间范围
+                current_decision_time = datetime.now()
+                start_query_time = last_cycle_end_time if last_cycle_end_time else current_decision_time - timedelta(hours=48)
+                _word_controldevice = device["control_payload"]["deviceItems"]
+
+                # 查询历史极值
+                max_tmp, min_tmp = get_tmp_extremes(device["press_pv_item"], start_query_time, current_decision_time, _word_controldevice)
+
+                # 调用DQN模型获取决策建议
+                logger.info("调用DQN决策模型")
+                uf_bw_dict = run_uf_DQN_decide(uf_params, median_value)
+                logger.info(f"模型决策结果 {uf_bw_dict}")
+
+                # 获取当前PLC参数
+                prod_time = get_device_value(device["production_time_payload"], name) or 3800  # 产水时间 默认3800
+                bw_time = get_device_value(device["backwashing_payload"], name) or 100  # 反洗时间 默认100
+
+                # 生成PLC指令
+                L_s, t_bw_s = generate_plc_instructions(
+                    prod_time, bw_time,  # 产水时间 反洗时间
+                    model_prev_L_s, model_prev_t_bw_s,  # 过滤时间 反洗时间 上一轮
+                    uf_bw_dict["L_s"], uf_bw_dict["t_bw_s"]  # 过滤时间 反洗时间 决策建议
+                )
+                
+                # 计算运行指标
+                logger.info(f"计算运行指标 TMP={median_value} L_s={L_s} t_bw_s={t_bw_s}")
+                metrics = calc_uf_cycle_metrics(uf_params, median_value, max_tmp, min_tmp, L_s, t_bw_s)  # 计算运行指标
+
+                # 发送决策结果
+                send_decision_to_callback(
+                    type_name=name,  # 设备名称
+                    water_production_time=int(L_s),  # 过滤时间
+                    physical_backwash=int(t_bw_s),  # 反洗时间
+                    ceb_backwash_frequency=int(metrics["k_bw_per_ceb"]),  # 化学反洗频率
+                    duration_system=int(prod_time),  # 系统运行时间
+                    tmp_action=median_value,  # TMP动作
+                    recovery_rate=metrics["recovery"],  # 回收率
+                    ton_water_energy_kWh=metrics['ton_water_energy_kWh_per_m3'],  # 吨水电耗
+                    max_permeability=metrics['max_permeability'],  # 最高渗透率
+                    daily_prod_time_h=metrics['daily_prod_time_h'],  # 日均产水时间
+                    ctime=current_decision_time.strftime(DATETIME_FORMAT)  # 时间
+                )
+
+                # 判断是否下发PLC指令
+                if get_current_config()['system']['use_model'] == 1:
+                    logger.info("模型开关已开启,下发PLC指令")
+                    send_plc_update(name, device["production_time_payload"]["deviceItems"], str(prod_time), str(int(L_s)), 1)  # 过滤时间
+                    send_plc_update(name, device["backwashing_payload"]["deviceItems"], str(bw_time), str(int(t_bw_s)), 2)  # 反洗时间
+                else:
+                    logger.info("模型开关已关闭,跳过PLC指令")
+
+                # 保存运行状态
+                model_prev_L_s = L_s  # 过滤时间 上一轮
+                model_prev_t_bw_s = t_bw_s  # 反洗时间 上一轮
+                last_cycle_end_time = current_decision_time  # 上次运行结束时间 
+
+                state_to_save = {
+                    'model_prev_L_s': model_prev_L_s,  # 过滤时间 上一轮
+                    'model_prev_t_bw_s': model_prev_t_bw_s,  # 反洗时间 上一轮
+                    'last_cycle_end_time': last_cycle_end_time.strftime(DATETIME_FORMAT)  # 上次运行结束时间
+                }
+                save_device_state(name, state_to_save)  # 保存设备状态 
+                logger.info(f"状态保存完成 下次查询起始时间 {last_cycle_end_time.strftime(DATETIME_FORMAT)}") 
+
+            # 阶段4: 等待重置
+            logger.info(f"等待重置 控制字需不等于 {TRIGGER_VALUE}")
+            while True:
+                control_value = get_device_value(device["control_payload"], name)  # 控制字 
+                if control_value is None or int(control_value) != TRIGGER_VALUE:  # 控制字 不等于 触发值
+                    logger.info("重置条件满足,开始新一轮")
+                    break
+                time.sleep(POLL_INTERVAL)
+
+            logger.info(f"{name} 本轮完成\n")
+
+        except Exception as e:
+            logger.critical(f"监控循环异常 {e}", exc_info=True)
+            logger.info("等待60秒后重试")
+            time.sleep(60)
+
+
+# 程序主入口
+
+def main():
+    """
+    主函数
+    
+    功能:
+    1. 加载设备历史状态
+    2. 为每个设备启动独立监控线程
+    3. 保持主线程运行
+    """
+    logger.info("========================================")
+    logger.info("超滤并行监控服务启动")
+    logger.info("========================================")
+
+    # 加载设备历史状态
+    load_device_states()
+
+    # 为每个设备创建监控线程
+    threads = []
+    for device_config in DEVICE_SEQUENCE:
+        thread = threading.Thread(target=monitor_device, args=(device_config,), daemon=True)
+        threads.append(thread)
+        thread.start()
+        logger.info(f"设备 {device_config['name']} 监控线程已启动")
+
+    # 保持主线程运行
+    try:
+        while any(t.is_alive() for t in threads):
+            time.sleep(1)
+    except KeyboardInterrupt:
+        logger.info("检测到中断信号,程序退出")
+
+
+if __name__ == "__main__":
+    main()

+ 3770 - 0
monitor_service.log

@@ -0,0 +1,3770 @@
+2025-09-04 16:45:44 - MainThread - INFO - === 启动并行监控任务 ===
+2025-09-04 16:45:44 - UF1 - INFO - 监控线程已启动。
+2025-09-04 16:45:44 - UF2 - INFO - 监控线程已启动。
+2025-09-04 16:45:44 - UF3 - INFO - 监控线程已启动。
+2025-09-04 16:45:44 - UF4 - INFO - 监控线程已启动。
+2025-09-04 16:45:44 - UF2 - INFO - 数据库连接成功。
+2025-09-04 16:45:44 - UF2 - INFO - [阶段 1] 等待 'C.M.UF2_DB@word_control' 的值变为 95...
+2025-09-04 16:45:44 - UF4 - INFO - 数据库连接成功。
+2025-09-04 16:45:44 - UF4 - INFO - [阶段 1] 等待 'C.M.UF4_DB@word_control' 的值变为 95...
+2025-09-04 16:45:44 - UF3 - INFO - 数据库连接成功。
+2025-09-04 16:45:44 - UF3 - INFO - [阶段 1] 等待 'C.M.UF3_DB@word_control' 的值变为 95...
+2025-09-04 16:45:44 - UF1 - INFO - 数据库连接成功。
+2025-09-04 16:45:44 - UF1 - INFO - [阶段 1] 等待 'C.M.UF1_DB@word_control' 的值变为 95...
+2025-09-06 16:44:32 - MainThread - INFO - === 启动并行监控任务 ===
+2025-09-06 16:44:32 - UF1 - INFO - 监控线程已启动。
+2025-09-06 16:44:32 - UF2 - INFO - 监控线程已启动。
+2025-09-06 16:44:32 - UF3 - INFO - 监控线程已启动。
+2025-09-06 16:44:32 - UF4 - INFO - 监控线程已启动。
+2025-09-06 16:44:32 - UF1 - INFO - 数据库连接成功。
+2025-09-06 16:44:32 - UF1 - INFO - [阶段 1] 等待 'C.M.UF1_DB@word_control' 的值变为 95...
+2025-09-06 16:44:32 - UF2 - INFO - 数据库连接成功。
+2025-09-06 16:44:32 - UF2 - INFO - [阶段 1] 等待 'C.M.UF2_DB@word_control' 的值变为 95...
+2025-09-06 16:44:32 - UF4 - INFO - 数据库连接成功。
+2025-09-06 16:44:32 - UF4 - INFO - [阶段 1] 等待 'C.M.UF4_DB@word_control' 的值变为 95...
+2025-09-06 16:44:32 - UF3 - INFO - 数据库连接成功。
+2025-09-06 16:44:32 - UF3 - INFO - [阶段 1] 等待 'C.M.UF3_DB@word_control' 的值变为 95...
+2025-09-06 16:55:09 - MainThread - INFO - === 启动并行监控 ===
+2025-09-06 16:55:09 - UF1 - INFO - 监控线程启动
+2025-09-06 16:55:09 - UF2 - INFO - 监控线程启动
+2025-09-06 16:55:09 - UF3 - INFO - 监控线程启动
+2025-09-06 16:55:09 - UF4 - INFO - 监控线程启动
+2025-09-06 16:55:09 - UF4 - INFO - 数据库连接成功。
+2025-09-06 16:55:09 - UF4 - INFO - [阶段1] 等待触发条件: 95
+2025-09-06 16:55:09 - UF1 - INFO - 数据库连接成功。
+2025-09-06 16:55:09 - UF2 - INFO - 数据库连接成功。
+2025-09-06 16:55:09 - UF3 - INFO - 数据库连接成功。
+2025-09-06 16:55:09 - UF1 - INFO - [阶段1] 等待触发条件: 95
+2025-09-06 16:55:09 - UF2 - INFO - [阶段1] 等待触发条件: 95
+2025-09-06 16:55:09 - UF3 - INFO - [阶段1] 等待触发条件: 95
+2025-09-06 16:55:27 - MainThread - INFO - === 启动并行监控 ===
+2025-09-06 16:55:27 - UF1 - INFO - 监控线程启动
+2025-09-06 16:55:27 - UF2 - INFO - 监控线程启动
+2025-09-06 16:55:27 - UF3 - INFO - 监控线程启动
+2025-09-06 16:55:27 - UF4 - INFO - 监控线程启动
+2025-09-06 16:55:27 - UF1 - INFO - 数据库连接成功。
+2025-09-06 16:55:27 - UF1 - INFO - [阶段1] 等待触发条件: 95
+2025-09-06 16:55:27 - UF2 - INFO - 数据库连接成功。
+2025-09-06 16:55:27 - UF2 - INFO - [阶段1] 等待触发条件: 95
+2025-09-06 16:55:27 - UF4 - INFO - 数据库连接成功。
+2025-09-06 16:55:27 - UF3 - INFO - 数据库连接成功。
+2025-09-06 16:55:27 - UF4 - INFO - [阶段1] 等待触发条件: 95
+2025-09-06 16:55:27 - UF3 - INFO - [阶段1] 等待触发条件: 95
+2025-09-06 16:55:31 - MainThread - INFO -
+程序手动终止
+2025-09-06 16:55:58 - MainThread - INFO - === 启动并行监控 ===
+2025-09-06 16:55:58 - UF1 - INFO - 监控线程启动
+2025-09-06 16:55:58 - UF2 - INFO - 监控线程启动
+2025-09-06 16:55:58 - UF3 - INFO - 监控线程启动
+2025-09-06 16:55:58 - UF4 - INFO - 监控线程启动
+2025-09-06 16:55:58 - UF4 - INFO - 数据库连接成功。
+2025-09-06 16:55:58 - UF4 - INFO - [阶段1] 等待触发条件: 95
+2025-09-06 16:55:58 - UF3 - INFO - 数据库连接成功。
+2025-09-06 16:55:58 - UF3 - INFO - [阶段1] 等待触发条件: 95
+2025-09-06 16:55:58 - UF2 - INFO - 数据库连接成功。
+2025-09-06 16:55:58 - UF2 - INFO - [阶段1] 等待触发条件: 95
+2025-09-06 16:55:58 - UF1 - INFO - 数据库连接成功。
+2025-09-06 16:55:58 - UF1 - INFO - [阶段1] 等待触发条件: 95
+2025-09-06 18:26:37 - UF2 - INFO - 触发条件满足: 95
+2025-09-06 18:26:37 - UF2 - INFO - [阶段2] 开始监控数据变化
+2025-09-06 18:26:38 - UF2 - INFO - 基准值: 0.0352
+2025-09-06 19:08:00 - UF3 - INFO - 触发条件满足: 95
+2025-09-06 19:08:00 - UF3 - INFO - [阶段2] 开始监控数据变化
+2025-09-06 19:08:00 - UF3 - INFO - 基准值: 0.0175
+2025-09-06 19:14:00 - UF3 - INFO - 开始收集数据
+2025-09-06 19:14:00 - UF3 - INFO - 数据变化: 0.0175 -> 0.0246 [1/10]
+2025-09-06 19:14:04 - UF3 - INFO - 数据变化: 0.0246 -> 0.0244 [2/10]
+2025-09-06 19:14:06 - UF3 - INFO - 数据变化: 0.0244 -> 0.0248 [3/10]
+2025-09-06 19:14:10 - UF3 - INFO - 数据变化: 0.0248 -> 0.0244 [4/10]
+2025-09-06 19:14:12 - UF3 - INFO - 数据变化: 0.0244 -> 0.0248 [5/10]
+2025-09-06 19:14:17 - UF3 - INFO - 数据变化: 0.0248 -> 0.0246 [6/10]
+2025-09-06 19:14:19 - UF3 - INFO - 数据变化: 0.0246 -> 0.0244 [7/10]
+2025-09-06 19:14:21 - UF3 - INFO - 数据变化: 0.0244 -> 0.0248 [8/10]
+2025-09-06 19:14:23 - UF3 - INFO - 数据变化: 0.0248 -> 0.0244 [9/10]
+2025-09-06 19:14:25 - UF3 - INFO - 数据变化: 0.0244 -> 0.0233 [10/10]
+2025-09-06 19:14:27 - UF3 - INFO - [阶段3] 数据收集完成,开始计算
+2025-09-06 19:14:27 - UF3 - INFO - TMP数据收集完成
+2025-09-06 19:14:27 - UF3 - INFO - 排序值: [0.0233, 0.0244, 0.0244, 0.0244, 0.0244, 0.0246, 0.0246, 0.0248, 0.0248, 0.0248]
+2025-09-06 19:14:27 - UF3 - INFO - TMP中位数: 0.0245
+2025-09-06 19:14:27 - UF3 - INFO - 首次运行,查询48h历史数据
+2025-09-06 19:14:27 - UF3 - INFO - [DB] 正在查询 'C.M.UF3_DB@press_PV' 从 2025-09-04 19:14:27 到 2025-09-06 19:14:27 的值...
+2025-09-06 19:14:28 - UF3 - INFO - [DB] 查询成功: 最大值=0.051714, 最小值=-0.107658
+2025-09-06 19:14:28 - UF3 - INFO - [UF3] 开始模型决策
+2025-09-06 19:14:28 - UF3 - INFO - DQN决策结果: {'action': 33, 'L_s': 4100.0, 't_bw_s': 96.0, 'next_obs': array([0.3625], dtype=float32), 'reward': np.float64(0.841624433520973), 'terminated': False, 'truncated': False, 'info': {'recovery': 0.9331746976006345, 'V_feed_super_m3': 16810.0, 'V_loss_super_m3': 1123.3333333333335, 'V_net_super_m3': 15686.666666666666, 'supercycle_time_h': np.float64(48.45444444444444), 'net_delivery_rate_m3ph': np.float64(323.74051227957534), 'max_TMP_during_filtration': 0.03189441920741388, 'max_residual_increase_per_run': 0.00016639527595347509, 'phi_bw_effective': 0.7747177964240509, 'TMP_after_ceb': 0.0245, 'headroom_ratio': 0.531573653456898, 'daily_prod_time_h': np.float64(23.128253342200004), 'ton_water_energy_kWh_per_m3': 0.1015, 'k_bw_per_ceb': 41, 'feasible': True, 'step': 1}}
+2025-09-06 19:14:28 - UF3 - INFO - [UF3] 系统产水时长: 7000.0
+2025-09-06 19:14:28 - UF3 - INFO - [UF3] 系统反洗时长: 100.0
+2025-09-06 19:14:28 - UF3 - ERROR - [UF3][回调] 发送决策失败,网络或HTTP错误: 500 Server Error: Internal Server Error for url: http://120.55.44.4:8900/api/dtgateway/v1/decision/data
+2025-09-06 19:14:28 - UF3 - INFO - [UF3] use_model=1,执行PLC指令下发
+2025-09-06 19:14:28 - UF3 - INFO - [UF3][PLC] 签名计算详情:
+2025-09-06 19:14:28 - UF3 - INFO - [UF3][PLC] - record数据: [{"project_id": 92, "item": "C.M.UF3_DB@time_production", "old_value": "7000.0", "new_value": "6940", "command_type": 1}]
+2025-09-06 19:14:28 - UF3 - INFO - [UF3][PLC] - 密钥: 237c92d2-8795-1094-11ef-00e2e48fce4a
+2025-09-06 19:14:28 - UF3 - INFO - [UF3][PLC] - 时间戳: 1757157268
+2025-09-06 19:14:28 - UF3 - INFO - [UF3][PLC] - 计算字符串: [{"project_id": 92, "item": "C.M.UF3_DB@time_production", "old_value": "7000.0", "new_value": "6940", "command_type": 1}]237c92d2-8795-1094-11ef-00e2e48fce4a1757157268
+2025-09-06 19:14:28 - UF3 - INFO - [UF3][PLC] - 生成签名: 344AB5A7FEB6BE7BA996F44817E69207
+2025-09-06 19:14:28 - UF3 - INFO - [UF3][PLC] - 请求URL: http://120.55.44.4:8900/api/v1/plc/set-var-values?sign=344AB5A7FEB6BE7BA996F44817E69207&timestamp=1757157268
+2025-09-06 19:14:28 - UF3 - INFO - [UF3][PLC] - 请求体: [{"project_id": 92, "item": "C.M.UF3_DB@time_production", "old_value": "7000.0", "new_value": "6940", "command_type": 1}]
+2025-09-06 19:14:28 - UF3 - INFO - [UF3][PLC] 响应状态码: 200
+2025-09-06 19:14:28 - UF3 - INFO - [UF3][PLC] 响应头: {'Server': 'nginx/1.16.1', 'Date': 'Sat, 06 Sep 2025 11:14:28 GMT', 'Content-Type': 'application/json; charset=utf-8', 'Content-Length': '59', 'Connection': 'keep-alive', 'Keep-Alive': 'timeout=120', 'Content-Encoding': 'gzip', 'Vary': 'Accept-Encoding', 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': 'GET, POST, OPTIONS', 'Access-Control-Allow-Headers': 'jwt-token,DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization'}
+2025-09-06 19:14:28 - UF3 - INFO - [UF3][PLC] 服务器响应: {'code': 200, 'msg': 'ok', 'data': True}
+2025-09-06 19:14:28 - UF3 - INFO - [UF3][PLC] PLC更新成功
+2025-09-06 19:14:28 - UF3 - INFO - [UF3][PLC] 签名计算详情:
+2025-09-06 19:14:28 - UF3 - INFO - [UF3][PLC] - record数据: [{"project_id": 92, "item": "C.M.UF3_DB@time_BW_SP", "old_value": "100.0", "new_value": "98", "command_type": 2}]
+2025-09-06 19:14:28 - UF3 - INFO - [UF3][PLC] - 密钥: 237c92d2-8795-1094-11ef-00e2e48fce4a
+2025-09-06 19:14:28 - UF3 - INFO - [UF3][PLC] - 时间戳: 1757157268
+2025-09-06 19:14:28 - UF3 - INFO - [UF3][PLC] - 计算字符串: [{"project_id": 92, "item": "C.M.UF3_DB@time_BW_SP", "old_value": "100.0", "new_value": "98", "command_type": 2}]237c92d2-8795-1094-11ef-00e2e48fce4a1757157268
+2025-09-06 19:14:28 - UF3 - INFO - [UF3][PLC] - 生成签名: 4623BB06316ADBC258DAC35F1740FEF7
+2025-09-06 19:14:28 - UF3 - INFO - [UF3][PLC] - 请求URL: http://120.55.44.4:8900/api/v1/plc/set-var-values?sign=4623BB06316ADBC258DAC35F1740FEF7&timestamp=1757157268
+2025-09-06 19:14:28 - UF3 - INFO - [UF3][PLC] - 请求体: [{"project_id": 92, "item": "C.M.UF3_DB@time_BW_SP", "old_value": "100.0", "new_value": "98", "command_type": 2}]
+2025-09-06 19:14:28 - UF3 - INFO - [UF3][PLC] 响应状态码: 200
+2025-09-06 19:14:28 - UF3 - INFO - [UF3][PLC] 响应头: {'Server': 'nginx/1.16.1', 'Date': 'Sat, 06 Sep 2025 11:14:28 GMT', 'Content-Type': 'application/json; charset=utf-8', 'Content-Length': '59', 'Connection': 'keep-alive', 'Keep-Alive': 'timeout=120', 'Content-Encoding': 'gzip', 'Vary': 'Accept-Encoding', 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': 'GET, POST, OPTIONS', 'Access-Control-Allow-Headers': 'jwt-token,DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization'}
+2025-09-06 19:14:28 - UF3 - INFO - [UF3][PLC] 服务器响应: {'code': 200, 'msg': 'ok', 'data': True}
+2025-09-06 19:14:28 - UF3 - INFO - [UF3][PLC] PLC更新成功
+2025-09-06 19:14:28 - UF3 - INFO - 状态更新: L_s=6940.0, t_bw_s=98.0
+2025-09-06 19:14:28 - UF3 - INFO - 下轮查询起始时间: 2025-09-06 19:14:27
+2025-09-06 19:14:28 - UF3 - INFO - [阶段4] 等待重置条件
+2025-09-06 19:14:29 - UF3 - INFO - 重置条件满足: 26
+2025-09-06 19:14:29 - UF3 - INFO - --- 本轮完成,重启监控 ---
+
+2025-09-06 19:14:29 - UF3 - INFO - [阶段1] 等待触发条件: 95
+2025-09-06 19:46:36 - MainThread - INFO - === 启动并行监控 ===
+2025-09-06 19:46:36 - UF1 - INFO - 监控线程启动
+2025-09-06 19:46:36 - UF2 - INFO - 监控线程启动
+2025-09-06 19:46:36 - UF1 - INFO - [阶段1] 等待触发条件: 95
+2025-09-06 19:46:36 - UF3 - INFO - 监控线程启动
+2025-09-06 19:46:36 - UF2 - INFO - [阶段1] 等待触发条件: 95
+2025-09-06 19:46:36 - UF4 - INFO - 监控线程启动
+2025-09-06 19:46:36 - UF3 - INFO - [阶段1] 等待触发条件: 95
+2025-09-06 19:46:36 - UF4 - INFO - [阶段1] 等待触发条件: 95
+2025-09-06 19:59:07 - UF1 - INFO - 触发条件满足: 95
+2025-09-06 19:59:07 - UF1 - INFO - [阶段2] 开始监控数据变化
+2025-09-06 19:59:08 - UF1 - INFO - 基准值: 0.0413
+2025-09-06 19:59:35 - UF2 - ERROR - [UF2][API] 返回错误: ok
+2025-09-06 19:59:41 - UF3 - ERROR - [UF3][API] 返回错误: ok
+2025-09-06 19:59:41 - UF1 - ERROR - [UF1][API] 返回错误: ok
+2025-09-06 19:59:47 - UF2 - ERROR - [UF2][API] 网络请求失败: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-06 19:59:51 - UF4 - ERROR - [UF4][API] 网络请求失败: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-06 19:59:53 - UF3 - ERROR - [UF3][API] 网络请求失败: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-06 19:59:53 - UF1 - ERROR - [UF1][API] 网络请求失败: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-06 19:59:56 - UF2 - ERROR - [UF2][API] 返回错误: ok
+2025-09-06 20:00:08 - MainThread - INFO - === 启动并行监控 ===
+2025-09-06 20:00:08 - UF1 - INFO - 监控线程启动
+2025-09-06 20:00:08 - UF2 - INFO - 监控线程启动
+2025-09-06 20:00:08 - UF1 - INFO - [阶段1] 等待触发条件: 95
+2025-09-06 20:00:08 - UF3 - INFO - 监控线程启动
+2025-09-06 20:00:08 - UF2 - INFO - [阶段1] 等待触发条件: 95
+2025-09-06 20:00:08 - UF4 - INFO - 监控线程启动
+2025-09-06 20:00:08 - UF3 - INFO - [阶段1] 等待触发条件: 95
+2025-09-06 20:00:08 - UF4 - INFO - [阶段1] 等待触发条件: 95
+2025-09-06 20:37:27 - UF4 - INFO - 触发条件满足: 95
+2025-09-06 20:37:27 - UF4 - INFO - [阶段2] 开始监控数据变化
+2025-09-06 20:37:28 - UF4 - INFO - 基准值: 0.0311
+2025-09-06 23:24:52 - UF4 - INFO - 开始收集数据
+2025-09-06 23:24:52 - UF4 - INFO - 数据变化: 0.0311 -> 0.0236 [1/10]
+2025-09-06 23:24:54 - UF4 - INFO - 数据变化: 0.0236 -> 0.0235 [2/10]
+2025-09-06 23:24:57 - UF4 - INFO - 数据变化: 0.0235 -> 0.0236 [3/10]
+2025-09-06 23:24:59 - UF4 - INFO - 数据变化: 0.0236 -> 0.0235 [4/10]
+2025-09-06 23:25:06 - UF4 - INFO - 数据变化: 0.0235 -> 0.0236 [5/10]
+2025-09-06 23:25:10 - UF4 - INFO - 数据变化: 0.0236 -> 0.0238 [6/10]
+2025-09-06 23:25:12 - UF4 - INFO - 数据变化: 0.0238 -> 0.0242 [7/10]
+2025-09-06 23:25:17 - UF4 - INFO - 数据变化: 0.0242 -> 0.024 [8/10]
+2025-09-06 23:25:22 - UF4 - INFO - 数据变化: 0.024 -> 0.0242 [9/10]
+2025-09-06 23:25:24 - UF4 - INFO - 数据变化: 0.0242 -> 0.024 [10/10]
+2025-09-06 23:25:26 - UF4 - INFO - [阶段3] 数据收集完成,开始计算
+2025-09-06 23:25:26 - UF4 - INFO - TMP数据收集完成
+2025-09-06 23:25:26 - UF4 - INFO - 排序值: [0.0235, 0.0235, 0.0236, 0.0236, 0.0236, 0.0238, 0.024, 0.024, 0.0242, 0.0242]
+2025-09-06 23:25:26 - UF4 - INFO - TMP中位数: 0.0237
+2025-09-06 23:25:26 - UF4 - INFO - 首次运行,查询48h历史数据
+2025-09-06 23:25:26 - UF4 - INFO - [DB] 正在查询 'C.M.UF4_DB@press_PV' 从 2025-09-04 23:25:26 到 2025-09-06 23:25:26 的值...
+2025-09-06 23:25:27 - UF4 - INFO - 数据库连接成功。
+2025-09-06 23:25:27 - UF4 - INFO - [DB] 查询成功: 最大值=0.049215, 最小值=-0.118424
+2025-09-06 23:25:27 - UF4 - INFO - [UF4] 开始模型决策
+2025-09-06 23:25:27 - UF4 - INFO - DQN决策结果: {'action': 33, 'L_s': 4100.0, 't_bw_s': 96.0, 'next_obs': array([0.3425], dtype=float32), 'reward': np.float64(0.8458236894152948), 'terminated': False, 'truncated': False, 'info': {'recovery': 0.9331746976006345, 'V_feed_super_m3': 16810.0, 'V_loss_super_m3': 1123.3333333333335, 'V_net_super_m3': 15686.666666666666, 'supercycle_time_h': np.float64(48.45444444444444), 'net_delivery_rate_m3ph': np.float64(323.74051227957534), 'max_TMP_during_filtration': 0.031094419207413876, 'max_residual_increase_per_run': 0.00016639527595347162, 'phi_bw_effective': 0.7747177964240509, 'TMP_after_ceb': 0.0237, 'headroom_ratio': 0.5182403201235646, 'daily_prod_time_h': np.float64(23.128253342200004), 'ton_water_energy_kWh_per_m3': 0.1015, 'k_bw_per_ceb': 41, 'feasible': True, 'step': 1}}
+2025-09-06 23:25:27 - UF4 - INFO - [UF4] 系统产水时长: 5000.0
+2025-09-06 23:25:28 - UF4 - INFO - [UF4] 系统反洗时长: 100.0
+2025-09-06 23:25:28 - UF4 - INFO - [UF4][回调] 第1次尝试发送决策数据...
+2025-09-06 23:25:28 - UF4 - ERROR - [UF4][回调] 第1次尝试失败,网络或HTTP错误: 500 Server Error: Internal Server Error for url: http://120.55.44.4:8900/api/dtgateway/v1/decision/data
+2025-09-06 23:25:28 - UF4 - INFO - [UF4][回调] 60秒后进行第2次重试...
+2025-09-06 23:26:28 - UF4 - INFO - [UF4][回调] 第2次尝试发送决策数据...
+2025-09-06 23:26:28 - UF4 - ERROR - [UF4][回调] 第2次尝试失败,网络或HTTP错误: 500 Server Error: Internal Server Error for url: http://120.55.44.4:8900/api/dtgateway/v1/decision/data
+2025-09-06 23:26:28 - UF4 - INFO - [UF4][回调] 60秒后进行第3次重试...
+2025-09-06 23:27:28 - UF4 - INFO - [UF4][回调] 第3次尝试发送决策数据...
+2025-09-06 23:27:28 - UF4 - ERROR - [UF4][回调] 第3次尝试失败,网络或HTTP错误: 500 Server Error: Internal Server Error for url: http://120.55.44.4:8900/api/dtgateway/v1/decision/data
+2025-09-06 23:27:28 - UF4 - ERROR - [UF4][回调] 所有重试均失败,放弃发送决策数据
+2025-09-06 23:27:28 - UF4 - INFO - [UF4] use_model=0,跳过PLC指令下发
+2025-09-06 23:27:28 - UF4 - INFO - 状态更新: L_s=4940.0, t_bw_s=98.0
+2025-09-06 23:27:28 - UF4 - INFO - 下轮查询起始时间: 2025-09-06 23:25:26
+2025-09-06 23:27:28 - UF4 - INFO - [阶段4] 等待重置条件
+2025-09-06 23:27:28 - UF4 - INFO - 重置条件满足: 26
+2025-09-06 23:27:28 - UF4 - INFO - --- 本轮完成,重启监控 ---
+
+2025-09-06 23:27:28 - UF4 - INFO - [阶段1] 等待触发条件: 95
+2025-09-09 11:18:16 - MainThread - INFO - === 启动并行监控 ===
+2025-09-09 11:18:16 - UF1 - INFO - 监控线程启动
+2025-09-09 11:18:16 - UF2 - INFO - 监控线程启动
+2025-09-09 11:18:16 - UF1 - INFO - [阶段1] 等待触发条件: 95
+2025-09-09 11:18:16 - UF3 - INFO - 监控线程启动
+2025-09-09 11:18:16 - UF2 - INFO - [阶段1] 等待触发条件: 95
+2025-09-09 11:18:16 - UF4 - INFO - 监控线程启动
+2025-09-09 11:18:16 - UF3 - INFO - [阶段1] 等待触发条件: 95
+2025-09-09 11:18:16 - UF4 - INFO - [阶段1] 等待触发条件: 95
+2025-09-09 11:18:19 - MainThread - INFO -
+程序手动终止
+2025-09-09 11:19:09 - MainThread - INFO - === 启动并行监控 ===
+2025-09-09 11:19:09 - UF1 - INFO - 监控线程启动
+2025-09-09 11:19:09 - UF2 - INFO - 监控线程启动
+2025-09-09 11:19:09 - UF1 - INFO - [阶段1] 等待触发条件: 95
+2025-09-09 11:19:09 - UF3 - INFO - 监控线程启动
+2025-09-09 11:19:09 - UF2 - INFO - [阶段1] 等待触发条件: 95
+2025-09-09 11:19:09 - UF4 - INFO - 监控线程启动
+2025-09-09 11:19:09 - UF3 - INFO - [阶段1] 等待触发条件: 95
+2025-09-09 11:19:09 - UF4 - INFO - [阶段1] 等待触发条件: 95
+2025-09-09 11:56:55 - UF4 - ERROR - [UF4][API] 网络请求失败: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-09 12:15:31 - UF4 - ERROR - [UF4][API] 网络请求失败: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-09 12:23:07 - UF2 - ERROR - [UF2][API] 网络请求失败: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-09 12:43:48 - UF1 - INFO - 触发条件满足: 95
+2025-09-09 12:43:48 - UF1 - INFO - [阶段2] 开始监控数据变化
+2025-09-09 12:43:48 - UF1 - INFO - 基准值: 0.0329
+2025-09-09 12:51:06 - UF1 - INFO - 开始收集数据
+2025-09-09 12:51:06 - UF1 - INFO - 数据变化: 0.0329 -> 0.0283 [1/10]
+2025-09-09 12:51:11 - UF1 - INFO - 数据变化: 0.0283 -> 0.0281 [2/10]
+2025-09-09 12:51:13 - UF1 - INFO - 数据变化: 0.0281 -> 0.0283 [3/10]
+2025-09-09 12:51:15 - UF1 - INFO - 数据变化: 0.0283 -> 0.0281 [4/10]
+2025-09-09 12:51:24 - UF1 - INFO - 数据变化: 0.0281 -> 0.0286 [5/10]
+2025-09-09 12:51:26 - UF1 - INFO - 数据变化: 0.0286 -> 0.0283 [6/10]
+2025-09-09 12:51:30 - UF1 - INFO - 数据变化: 0.0283 -> 0.0285 [7/10]
+2025-09-09 12:51:32 - UF1 - INFO - 数据变化: 0.0285 -> 0.0281 [8/10]
+2025-09-09 12:51:37 - UF1 - INFO - 数据变化: 0.0281 -> 0.0283 [9/10]
+2025-09-09 12:51:39 - UF1 - INFO - 数据变化: 0.0283 -> 0.0281 [10/10]
+2025-09-09 12:51:41 - UF1 - INFO - [阶段3] 数据收集完成,开始计算
+2025-09-09 12:51:41 - UF1 - INFO - TMP数据收集完成
+2025-09-09 12:51:41 - UF1 - INFO - 排序值: [0.0281, 0.0281, 0.0281, 0.0281, 0.0283, 0.0283, 0.0283, 0.0283, 0.0285, 0.0286]
+2025-09-09 12:51:41 - UF1 - INFO - TMP中位数: 0.0283
+2025-09-09 12:51:41 - UF1 - INFO - 首次运行,查询48h历史数据
+2025-09-09 12:51:41 - UF1 - INFO - [DB] 正在查询 'C.M.UF1_DB@press_PV' 从 2025-09-07 12:51:41 到 2025-09-09 12:51:41 的值...
+2025-09-09 12:51:41 - UF1 - INFO - 数据库连接成功。
+2025-09-09 12:51:42 - UF1 - INFO - [DB] 查询成功: 最大值=0.051906, 最小值=-0.108619
+2025-09-09 12:51:42 - UF1 - INFO - [UF1] 开始模型决策
+2025-09-09 12:51:42 - UF1 - INFO - DQN决策结果: {'action': 33, 'L_s': 4100.0, 't_bw_s': 96.0, 'next_obs': array([0.4575], dtype=float32), 'reward': np.float64(0.8202213013562771), 'terminated': False, 'truncated': False, 'info': {'recovery': 0.9331746976006345, 'V_feed_super_m3': 16810.0, 'V_loss_super_m3': 1123.3333333333335, 'V_net_super_m3': 15686.666666666666, 'supercycle_time_h': np.float64(48.45444444444444), 'net_delivery_rate_m3ph': np.float64(323.74051227957534), 'max_TMP_during_filtration': 0.03569441920741395, 'max_residual_increase_per_run': 0.00016639527595347509, 'phi_bw_effective': 0.7747177964240509, 'TMP_after_ceb': 0.0283, 'headroom_ratio': 0.5949069867902326, 'daily_prod_time_h': np.float64(23.128253342200004), 'ton_water_energy_kWh_per_m3': 0.1015, 'k_bw_per_ceb': 41, 'feasible': True, 'step': 1}}
+2025-09-09 12:51:42 - UF1 - INFO - [UF1] 系统产水时长: 3800.0
+2025-09-09 12:51:42 - UF1 - INFO - [UF1] 系统反洗时长: 1.0
+2025-09-09 12:51:42 - UF1 - INFO - 性能指标记录: {'k_bw_per_ceb': 44, 'ton_water_energy_kWh_per_m3': 0.1023, 'recovery': 0.9960747370073795, 'net_delivery_rate_m3ph': 353.3195646624742, 'daily_prod_time_h': 23.647460144338986, 'max_permeability': -64.73314981725113}
+2025-09-09 12:51:42 - UF1 - INFO - [UF1][回调] 第1次尝试发送决策数据...
+2025-09-09 12:51:42 - UF1 - INFO - [UF1][<UNK>] <UNK>Payload: {'list': [{'type': 'UF1', 'water_production_time': 3860, 'physical_backwash': 3, 'ceb_backwash_frequency': 44, 'duration_system': 3800, 'tmp_action': 0.0283, 'recovery_rate': 0.9960747370073795, 'ton_water_energy_kWh': 0.1023, 'max_permeability': -64.73314981725113, 'daily_prod_time_h': 23.647460144338986, 'project_id': 92, 'ctime': '2025-09-09 12:51:42'}]}
+2025-09-09 12:51:42 - UF1 - ERROR - [UF1][回调] 第1次尝试失败,网络或HTTP错误: 500 Server Error: Internal Server Error for url: http://120.55.44.4:8900/api/dtgateway/v1/decision/data
+2025-09-09 12:51:42 - UF1 - INFO - [UF1][回调] 60秒后进行第2次重试...
+2025-09-09 12:52:43 - UF1 - INFO - [UF1][回调] 第2次尝试发送决策数据...
+2025-09-09 12:52:43 - UF1 - INFO - [UF1][<UNK>] <UNK>Payload: {'list': [{'type': 'UF1', 'water_production_time': 3860, 'physical_backwash': 3, 'ceb_backwash_frequency': 44, 'duration_system': 3800, 'tmp_action': 0.0283, 'recovery_rate': 0.9960747370073795, 'ton_water_energy_kWh': 0.1023, 'max_permeability': -64.73314981725113, 'daily_prod_time_h': 23.647460144338986, 'project_id': 92, 'ctime': '2025-09-09 12:51:42'}]}
+2025-09-09 12:52:43 - UF1 - ERROR - [UF1][回调] 第2次尝试失败,网络或HTTP错误: 500 Server Error: Internal Server Error for url: http://120.55.44.4:8900/api/dtgateway/v1/decision/data
+2025-09-09 12:52:43 - UF1 - INFO - [UF1][回调] 60秒后进行第3次重试...
+2025-09-09 12:53:43 - UF1 - INFO - [UF1][回调] 第3次尝试发送决策数据...
+2025-09-09 12:53:43 - UF1 - INFO - [UF1][<UNK>] <UNK>Payload: {'list': [{'type': 'UF1', 'water_production_time': 3860, 'physical_backwash': 3, 'ceb_backwash_frequency': 44, 'duration_system': 3800, 'tmp_action': 0.0283, 'recovery_rate': 0.9960747370073795, 'ton_water_energy_kWh': 0.1023, 'max_permeability': -64.73314981725113, 'daily_prod_time_h': 23.647460144338986, 'project_id': 92, 'ctime': '2025-09-09 12:51:42'}]}
+2025-09-09 12:53:43 - UF1 - ERROR - [UF1][回调] 第3次尝试失败,网络或HTTP错误: 500 Server Error: Internal Server Error for url: http://120.55.44.4:8900/api/dtgateway/v1/decision/data
+2025-09-09 12:53:43 - UF1 - ERROR - [UF1][回调] 所有重试均失败,放弃发送决策数据
+2025-09-09 12:53:43 - UF1 - INFO - [UF1] use_model=0,跳过PLC指令下发
+2025-09-09 12:53:43 - UF1 - INFO - 状态更新: L_s=3860.0, t_bw_s=3.0
+2025-09-09 12:53:43 - UF1 - INFO - 下轮查询起始时间: 2025-09-09 12:51:41
+2025-09-09 12:53:43 - UF1 - INFO - [阶段4] 等待重置条件
+2025-09-09 12:53:43 - UF1 - INFO - 重置条件满足: 26
+2025-09-09 12:53:43 - UF1 - INFO - --- 本轮完成,重启监控 ---
+
+2025-09-09 12:53:43 - UF1 - INFO - [阶段1] 等待触发条件: 95
+2025-09-09 13:51:11 - UF2 - ERROR - [UF2][API] 网络请求失败: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-09 14:05:09 - UF4 - ERROR - [UF4][API] 网络请求失败: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-09 14:45:07 - UF2 - ERROR - [UF2][API] 网络请求失败: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-09 15:16:43 - UF1 - ERROR - [UF1][API] 网络请求失败: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-09 15:21:07 - UF4 - ERROR - [UF4][API] 网络请求失败: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-09 16:08:40 - MainThread - INFO - ========================================
+2025-09-09 16:08:40 - MainThread - INFO - ===      启动超滤并行监控服务      ===
+2025-09-09 16:08:40 - MainThread - INFO - ========================================
+2025-09-09 16:08:40 - MainThread - INFO - 成功从状态文件 'device_states.json' 加载设备历史状态。
+2025-09-09 16:08:40 - UF1 - INFO - 监控线程启动
+2025-09-09 16:08:40 - MainThread - INFO - 设备 'UF1' 的监控线程已启动。
+2025-09-09 16:08:40 - UF1 - INFO - 成功加载历史状态,上次周期结束时间: 2025-09-09 12:53:43
+2025-09-09 16:08:40 - UF2 - INFO - 监控线程启动
+2025-09-09 16:08:40 - MainThread - INFO - 设备 'UF2' 的监控线程已启动。
+2025-09-09 16:08:40 - UF1 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-09 16:08:40 - UF2 - INFO - 成功加载历史状态,上次周期结束时间: 2025-09-09 09:51:37
+2025-09-09 16:08:40 - UF3 - INFO - 监控线程启动
+2025-09-09 16:08:40 - MainThread - INFO - 设备 'UF3' 的监控线程已启动。
+2025-09-09 16:08:40 - UF2 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-09 16:08:40 - UF3 - INFO - 成功加载历史状态,上次周期结束时间: 2025-09-06 19:14:28
+2025-09-09 16:08:40 - UF4 - INFO - 监控线程启动
+2025-09-09 16:08:40 - MainThread - INFO - 设备 'UF4' 的监控线程已启动。
+2025-09-09 16:08:40 - UF3 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-09 16:08:40 - UF4 - INFO - 成功加载历史状态,上次周期结束时间: 2025-09-06 23:25:28
+2025-09-09 16:08:40 - UF4 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-09 16:08:54 - MainThread - INFO -
+检测到手动中断(Ctrl+C),程序即将退出...
+2025-09-09 16:09:44 - MainThread - INFO - ========================================
+2025-09-09 16:09:44 - MainThread - INFO - ===      启动超滤并行监控服务      ===
+2025-09-09 16:09:44 - MainThread - INFO - ========================================
+2025-09-09 16:09:44 - MainThread - INFO - 成功从状态文件 'device_states.json' 加载设备历史状态。
+2025-09-09 16:09:44 - UF1 - INFO - 监控线程启动
+2025-09-09 16:09:44 - MainThread - INFO - 设备 'UF1' 的监控线程已启动。
+2025-09-09 16:09:44 - UF1 - INFO - 成功加载历史状态,上次周期结束时间: 2025-09-09 12:53:43
+2025-09-09 16:09:44 - UF2 - INFO - 监控线程启动
+2025-09-09 16:09:44 - MainThread - INFO - 设备 'UF2' 的监控线程已启动。
+2025-09-09 16:09:44 - UF1 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-09 16:09:44 - UF2 - INFO - 成功加载历史状态,上次周期结束时间: 2025-09-09 09:51:37
+2025-09-09 16:09:44 - UF3 - INFO - 监控线程启动
+2025-09-09 16:09:44 - MainThread - INFO - 设备 'UF3' 的监控线程已启动。
+2025-09-09 16:09:44 - UF2 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-09 16:09:44 - UF3 - INFO - 成功加载历史状态,上次周期结束时间: 2025-09-06 19:14:28
+2025-09-09 16:09:44 - UF4 - INFO - 监控线程启动
+2025-09-09 16:09:44 - MainThread - INFO - 设备 'UF4' 的监控线程已启动。
+2025-09-09 16:09:44 - UF3 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-09 16:09:44 - UF4 - INFO - 成功加载历史状态,上次周期结束时间: 2025-09-06 23:25:28
+2025-09-09 16:09:44 - UF4 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-09 16:23:49 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-09 16:34:52 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-09 16:40:25 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-09 16:46:55 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-09 17:14:28 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-09 17:14:28 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-09 17:19:28 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-09 17:47:04 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-09 17:49:52 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,业务错误: ok
+2025-09-09 17:49:52 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,业务错误: ok
+2025-09-09 17:49:52 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,业务错误: ok
+2025-09-09 17:49:52 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,业务错误: ok
+2025-09-09 17:51:23 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-09 18:57:34 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-09 19:05:40 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-09 19:20:10 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-09 20:24:40 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-09 21:37:50 - UF3 - INFO - 触发条件满足,进入数据收集阶段。
+2025-09-09 21:37:50 - UF3 - INFO - [阶段2] 开始监控TMP数据变化,需收集 10 个稳定数据点
+2025-09-09 21:37:51 - UF3 - INFO - 获取到TMP初始基准值: 0.02
+2025-09-09 22:01:37 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-09 22:16:48 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-09 22:16:48 - UF3 - ERROR - [UF3][API] 获取'UF3_BW_After_TMP'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-09 22:16:52 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-09 22:16:52 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-09 22:17:00 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-09 22:17:00 - UF3 - ERROR - [UF3][API] 获取'UF3_BW_After_TMP'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-09 22:17:04 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-09 22:17:04 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-09 22:17:12 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-09 22:17:12 - UF3 - ERROR - [UF3][API] 获取'UF3_BW_After_TMP'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-09 22:17:13 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,业务错误: ok
+2025-09-09 22:17:13 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,业务错误: ok
+2025-09-09 22:17:22 - UF3 - INFO - TMP数据变化: 0.0200 -> 0.0369 [已收集 1/10]
+2025-09-09 22:17:24 - UF3 - INFO - TMP数据变化: 0.0369 -> 0.0373 [已收集 2/10]
+2025-09-09 22:17:26 - UF3 - INFO - TMP数据变化: 0.0373 -> 0.0371 [已收集 3/10]
+2025-09-09 22:17:29 - UF3 - INFO - TMP数据变化: 0.0371 -> 0.0375 [已收集 4/10]
+2025-09-09 22:17:35 - UF3 - INFO - TMP数据变化: 0.0375 -> 0.0373 [已收集 5/10]
+2025-09-09 22:17:42 - UF3 - INFO - TMP数据变化: 0.0373 -> 0.0375 [已收集 6/10]
+2025-09-09 22:17:44 - UF3 - INFO - TMP数据变化: 0.0375 -> 0.0371 [已收集 7/10]
+2025-09-09 22:17:46 - UF3 - INFO - TMP数据变化: 0.0371 -> 0.0344 [已收集 8/10]
+2025-09-09 22:17:50 - UF3 - INFO - TMP数据变化: 0.0344 -> 0.0336 [已收集 9/10]
+2025-09-09 22:17:53 - UF3 - INFO - TMP数据变化: 0.0336 -> 0.0340 [已收集 10/10]
+2025-09-09 22:17:55 - UF3 - INFO - [阶段3] 数据收集完成,开始计算决策
+2025-09-09 22:17:55 - UF3 - INFO - TMP中位数计算完成: 0.0371
+2025-09-09 22:17:55 - UF3 - INFO - [DB] 正在查询 'C.M.UF3_DB@press_PV' 从 2025-09-06 19:14:28 到 2025-09-09 22:17:55 的历史极值...
+2025-09-09 22:17:55 - UF3 - INFO - [DB] 查询成功: 最大值=0.043255, 最小值=-0.103621
+2025-09-09 22:17:55 - UF3 - INFO - 开始DQN模型决策...
+2025-09-09 22:17:55 - UF3 - INFO - DQN决策结果: {'action': 11, 'L_s': 3860.0, 't_bw_s': 100.0, 'next_obs': array([0.6775], dtype=float32), 'reward': np.float64(0.757213804445514), 'terminated': False, 'truncated': False, 'info': {'recovery': 0.9262293984549678, 'V_feed_super_m3': 16598.0, 'V_loss_super_m3': 1224.4444444444443, 'V_net_super_m3': 15373.555555555555, 'supercycle_time_h': np.float64(47.96666666666666), 'net_delivery_rate_m3ph': np.float64(320.50498031040075), 'max_TMP_during_filtration': 0.04406740791738866, 'max_residual_increase_per_run': 0.0001493341749587221, 'phi_bw_effective': 0.7852458069388496, 'TMP_after_ceb': 0.0371, 'headroom_ratio': 0.7344567986231444, 'daily_prod_time_h': np.float64(23.068797776233495), 'ton_water_energy_kWh_per_m3': 0.1023, 'k_bw_per_ceb': 43, 'feasible': True, 'step': 1}}
+2025-09-09 22:17:55 - UF3 - INFO - [UF3][回调] 准备发送决策数据:
+{
+  "list": [
+    {
+      "type": "UF3",
+      "project_id": 92,
+      "water_production_time": 4040,
+      "physical_backwash": 100,
+      "ceb_backwash_frequency": 41,
+      "duration_system": 4200,
+      "tmp_action": 0.0371,
+      "recovery_rate": 0.9294319675870026,
+      "ton_water_energy_kWh": 0.1017,
+      "max_permeability": -67.85545401028749,
+      "daily_prod_time_h": 23.09376089229697,
+      "ctime": "2025-09-09 22:17:55"
+    }
+  ]
+}
+2025-09-09 22:17:55 - UF3 - INFO - [UF3][回调] 第 1/3 次尝试发送...
+2025-09-09 22:17:55 - UF3 - INFO - [UF3][回调] 决策数据发送成功!服务器响应: {"code":200,"msg":"success"}
+2025-09-09 22:17:55 - UF3 - INFO - 配置项 use_model=0,跳过PLC指令下发。
+2025-09-09 22:17:55 - UF3 - INFO - [UF3] 状态已成功保存到 'device_states.json'。
+2025-09-09 22:17:55 - UF3 - INFO - 本轮决策完成,状态已更新并保存。下轮历史查询起始时间将是: 2025-09-09 22:17:55
+2025-09-09 22:17:55 - UF3 - INFO - [阶段4] 等待重置条件 (控制字 != 95)
+2025-09-09 22:17:55 - UF3 - INFO - 重置条件满足,即将开始新一轮监控。
+2025-09-09 22:17:55 - UF3 - INFO - --- UF3 本轮监控完成,重启循环 ---
+
+2025-09-09 22:17:55 - UF3 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-11 10:21:21 - UF1 - INFO - 触发条件满足,进入数据收集阶段。
+2025-09-11 10:21:21 - UF1 - INFO - [阶段2] 开始监控TMP数据变化,需收集 10 个稳定数据点
+2025-09-11 10:21:21 - UF1 - INFO - 获取到TMP初始基准值: 0.0288
+2025-09-11 10:50:52 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-11 11:05:53 - UF1 - ERROR - [UF1][API] 获取'UF1_BW_After_TMP'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-11 11:06:11 - UF1 - INFO - TMP数据变化: 0.0288 -> 0.0273 [已收集 1/10]
+2025-09-11 11:06:15 - UF1 - INFO - TMP数据变化: 0.0273 -> 0.0277 [已收集 2/10]
+2025-09-11 11:06:17 - UF1 - INFO - TMP数据变化: 0.0277 -> 0.0281 [已收集 3/10]
+2025-09-11 11:06:20 - UF1 - INFO - TMP数据变化: 0.0281 -> 0.0283 [已收集 4/10]
+2025-09-11 11:06:22 - UF1 - INFO - TMP数据变化: 0.0283 -> 0.0281 [已收集 5/10]
+2025-09-11 11:06:26 - UF1 - INFO - TMP数据变化: 0.0281 -> 0.0279 [已收集 6/10]
+2025-09-11 11:06:29 - UF1 - INFO - TMP数据变化: 0.0279 -> 0.0275 [已收集 7/10]
+2025-09-11 11:06:31 - UF1 - INFO - TMP数据变化: 0.0275 -> 0.0281 [已收集 8/10]
+2025-09-11 11:06:35 - UF1 - INFO - TMP数据变化: 0.0281 -> 0.0277 [已收集 9/10]
+2025-09-11 11:06:39 - UF1 - INFO - TMP数据变化: 0.0277 -> 0.0279 [已收集 10/10]
+2025-09-11 11:06:41 - UF1 - INFO - [阶段3] 数据收集完成,开始计算决策
+2025-09-11 11:06:41 - UF1 - INFO - TMP中位数计算完成: 0.0279
+2025-09-11 11:06:41 - UF1 - INFO - [DB] 正在查询 'C.M.UF1_DB@press_PV' 从 2025-09-09 12:53:43 到 2025-09-11 11:06:41 的历史极值...
+2025-09-11 11:06:51 - UF1 - ERROR - 数据库连接失败: (2003, "Can't connect to MySQL server on '222.130.26.206' (timed out)")
+2025-09-11 11:06:51 - UF1 - INFO - 开始DQN模型决策...
+2025-09-11 11:06:51 - UF1 - INFO - DQN决策结果: {'action': 33, 'L_s': 4100.0, 't_bw_s': 96.0, 'next_obs': array([0.4475], dtype=float32), 'reward': np.float64(0.8225875959701048), 'terminated': False, 'truncated': False, 'info': {'recovery': 0.9331746976006345, 'V_feed_super_m3': 16810.0, 'V_loss_super_m3': 1123.3333333333335, 'V_net_super_m3': 15686.666666666666, 'supercycle_time_h': np.float64(48.45444444444444), 'net_delivery_rate_m3ph': np.float64(323.74051227957534), 'max_TMP_during_filtration': 0.03529441920741395, 'max_residual_increase_per_run': 0.00016639527595347509, 'phi_bw_effective': 0.7747177964240509, 'TMP_after_ceb': 0.0279, 'headroom_ratio': 0.5882403201235659, 'daily_prod_time_h': np.float64(23.128253342200004), 'ton_water_energy_kWh_per_m3': 0.1015, 'k_bw_per_ceb': 41, 'feasible': True, 'step': 1}}
+2025-09-11 11:06:52 - UF1 - CRITICAL - 监控主循环发生严重异常: 'min_TMP_during_filtration'
+Traceback (most recent call last):
+  File "/home/wangmingyang/projects/wuhan/caijun/uf/v2/loop_main.py", line 440, in monitor_device
+    metrics = calc_uf_cycle_metrics(uf_params, median_value, max_tmp, min_tmp, L_s, t_bw_s)
+  File "/home/wangmingyang/projects/wuhan/caijun/uf/v2/DQN_decide.py", line 216, in calc_uf_cycle_metrics
+    min_tmp_during_filtration = info["min_TMP_during_filtration"]
+KeyError: 'min_TMP_during_filtration'
+2025-09-11 11:06:52 - UF1 - INFO - 等待60秒后,线程将自动重试...
+2025-09-11 11:07:52 - UF1 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-11 11:10:58 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-11 11:21:49 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-11 12:02:32 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-11 12:14:17 - UF2 - INFO - 触发条件满足,进入数据收集阶段。
+2025-09-11 12:14:17 - UF2 - INFO - [阶段2] 开始监控TMP数据变化,需收集 10 个稳定数据点
+2025-09-11 12:14:17 - UF2 - INFO - 获取到TMP初始基准值: 0.035
+2025-09-11 12:52:14 - UF2 - INFO - TMP数据变化: 0.0350 -> 0.0273 [已收集 1/10]
+2025-09-11 12:52:23 - UF2 - INFO - TMP数据变化: 0.0273 -> 0.0271 [已收集 2/10]
+2025-09-11 12:52:25 - UF2 - INFO - TMP数据变化: 0.0271 -> 0.0273 [已收集 3/10]
+2025-09-11 12:52:34 - UF2 - INFO - TMP数据变化: 0.0273 -> 0.0269 [已收集 4/10]
+2025-09-11 12:52:36 - UF2 - INFO - TMP数据变化: 0.0269 -> 0.0271 [已收集 5/10]
+2025-09-11 12:52:38 - UF2 - INFO - TMP数据变化: 0.0271 -> 0.0277 [已收集 6/10]
+2025-09-11 12:52:42 - UF2 - INFO - TMP数据变化: 0.0277 -> 0.0273 [已收集 7/10]
+2025-09-11 12:52:55 - UF2 - INFO - TMP数据变化: 0.0273 -> 0.0277 [已收集 8/10]
+2025-09-11 12:52:57 - UF2 - INFO - TMP数据变化: 0.0277 -> 0.0279 [已收集 9/10]
+2025-09-11 12:52:59 - UF2 - INFO - TMP数据变化: 0.0279 -> 0.0273 [已收集 10/10]
+2025-09-11 12:53:01 - UF2 - INFO - [阶段3] 数据收集完成,开始计算决策
+2025-09-11 12:53:01 - UF2 - INFO - TMP中位数计算完成: 0.0273
+2025-09-11 12:53:01 - UF2 - INFO - [DB] 正在查询 'C.M.UF2_DB@press_PV' 从 2025-09-09 09:51:37 到 2025-09-11 12:53:01 的历史极值...
+2025-09-11 12:53:11 - UF2 - ERROR - 数据库连接失败: (2003, "Can't connect to MySQL server on '222.130.26.206' (timed out)")
+2025-09-11 12:53:11 - UF2 - INFO - 开始DQN模型决策...
+2025-09-11 12:53:11 - UF2 - INFO - DQN决策结果: {'action': 33, 'L_s': 4100.0, 't_bw_s': 96.0, 'next_obs': array([0.4325], dtype=float32), 'reward': np.float64(0.8260870378908463), 'terminated': False, 'truncated': False, 'info': {'recovery': 0.9331746976006345, 'V_feed_super_m3': 16810.0, 'V_loss_super_m3': 1123.3333333333335, 'V_net_super_m3': 15686.666666666666, 'supercycle_time_h': np.float64(48.45444444444444), 'net_delivery_rate_m3ph': np.float64(323.74051227957534), 'max_TMP_during_filtration': 0.03469441920741394, 'max_residual_increase_per_run': 0.00016639527595347509, 'phi_bw_effective': 0.7747177964240509, 'TMP_after_ceb': 0.0273, 'headroom_ratio': 0.5782403201235656, 'daily_prod_time_h': np.float64(23.128253342200004), 'ton_water_energy_kWh_per_m3': 0.1015, 'k_bw_per_ceb': 41, 'feasible': True, 'step': 1}}
+2025-09-11 12:53:12 - UF2 - CRITICAL - 监控主循环发生严重异常: 'min_TMP_during_filtration'
+Traceback (most recent call last):
+  File "/home/wangmingyang/projects/wuhan/caijun/uf/v2/loop_main.py", line 440, in monitor_device
+    metrics = calc_uf_cycle_metrics(uf_params, median_value, max_tmp, min_tmp, L_s, t_bw_s)
+  File "/home/wangmingyang/projects/wuhan/caijun/uf/v2/DQN_decide.py", line 216, in calc_uf_cycle_metrics
+    min_tmp_during_filtration = info["min_TMP_during_filtration"]
+KeyError: 'min_TMP_during_filtration'
+2025-09-11 12:53:12 - UF2 - INFO - 等待60秒后,线程将自动重试...
+2025-09-11 12:54:12 - UF2 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-11 17:28:20 - UF3 - INFO - 触发条件满足,进入数据收集阶段。
+2025-09-11 17:28:20 - UF3 - INFO - [阶段2] 开始监控TMP数据变化,需收集 10 个稳定数据点
+2025-09-11 17:28:20 - UF3 - INFO - 获取到TMP初始基准值: 0.0271
+2025-09-11 17:38:54 - MainThread - INFO - ========================================
+2025-09-11 17:38:54 - MainThread - INFO - ===      启动超滤并行监控服务      ===
+2025-09-11 17:38:54 - MainThread - INFO - ========================================
+2025-09-11 17:38:54 - MainThread - INFO - 成功从状态文件 'device_states.json' 加载设备历史状态。
+2025-09-11 17:38:54 - UF1 - INFO - 监控线程启动
+2025-09-11 17:38:54 - MainThread - INFO - 设备 'UF1' 的监控线程已启动。
+2025-09-11 17:38:54 - UF1 - INFO - 成功加载历史状态,上次周期结束时间: 2025-09-09 12:53:43
+2025-09-11 17:38:54 - UF2 - INFO - 监控线程启动
+2025-09-11 17:38:54 - MainThread - INFO - 设备 'UF2' 的监控线程已启动。
+2025-09-11 17:38:54 - UF1 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-11 17:38:54 - UF2 - INFO - 成功加载历史状态,上次周期结束时间: 2025-09-09 09:51:37
+2025-09-11 17:38:54 - UF2 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-11 17:38:54 - UF3 - INFO - 监控线程启动
+2025-09-11 17:38:54 - MainThread - INFO - 设备 'UF3' 的监控线程已启动。
+2025-09-11 17:38:54 - UF3 - INFO - 成功加载历史状态,上次周期结束时间: 2025-09-09 22:17:55
+2025-09-11 17:38:54 - UF3 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-11 17:38:54 - UF4 - INFO - 监控线程启动
+2025-09-11 17:38:54 - MainThread - INFO - 设备 'UF4' 的监控线程已启动。
+2025-09-11 17:38:54 - UF4 - INFO - 成功加载历史状态,上次周期结束时间: 2025-09-06 23:25:28
+2025-09-11 17:38:54 - UF4 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-11 17:39:01 - MainThread - INFO -
+检测到手动中断(Ctrl+C),程序即将退出...
+2025-09-11 17:39:12 - MainThread - INFO - ========================================
+2025-09-11 17:39:12 - MainThread - INFO - ===      启动超滤并行监控服务      ===
+2025-09-11 17:39:12 - MainThread - INFO - ========================================
+2025-09-11 17:39:12 - MainThread - INFO - 成功从状态文件 'device_states.json' 加载设备历史状态。
+2025-09-11 17:39:12 - UF1 - INFO - 监控线程启动
+2025-09-11 17:39:12 - MainThread - INFO - 设备 'UF1' 的监控线程已启动。
+2025-09-11 17:39:12 - UF1 - INFO - 成功加载历史状态,上次周期结束时间: 2025-09-09 12:53:43
+2025-09-11 17:39:12 - UF2 - INFO - 监控线程启动
+2025-09-11 17:39:12 - MainThread - INFO - 设备 'UF2' 的监控线程已启动。
+2025-09-11 17:39:12 - UF1 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-11 17:39:12 - UF2 - INFO - 成功加载历史状态,上次周期结束时间: 2025-09-09 09:51:37
+2025-09-11 17:39:12 - UF3 - INFO - 监控线程启动
+2025-09-11 17:39:12 - MainThread - INFO - 设备 'UF3' 的监控线程已启动。
+2025-09-11 17:39:12 - UF2 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-11 17:39:12 - UF3 - INFO - 成功加载历史状态,上次周期结束时间: 2025-09-09 22:17:55
+2025-09-11 17:39:12 - UF4 - INFO - 监控线程启动
+2025-09-11 17:39:12 - MainThread - INFO - 设备 'UF4' 的监控线程已启动。
+2025-09-11 17:39:12 - UF3 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-11 17:39:12 - UF4 - INFO - 成功加载历史状态,上次周期结束时间: 2025-09-06 23:25:28
+2025-09-11 17:39:12 - UF4 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-12 01:43:47 - UF4 - INFO - 触发条件满足,进入数据收集阶段。
+2025-09-12 01:43:47 - UF4 - INFO - [阶段2] 开始监控TMP数据变化,需收集 10 个稳定数据点
+2025-09-12 01:43:47 - UF4 - INFO - 获取到TMP初始基准值: 0.0279
+2025-09-12 01:46:05 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-12 02:53:34 - UF4 - INFO - TMP数据变化: 0.0279 -> 0.0246 [已收集 1/10]
+2025-09-12 02:53:38 - UF4 - INFO - TMP数据变化: 0.0246 -> 0.0240 [已收集 2/10]
+2025-09-12 02:53:43 - UF4 - INFO - TMP数据变化: 0.0240 -> 0.0242 [已收集 3/10]
+2025-09-12 02:53:45 - UF4 - INFO - TMP数据变化: 0.0242 -> 0.0250 [已收集 4/10]
+2025-09-12 02:53:47 - UF4 - INFO - TMP数据变化: 0.0250 -> 0.0244 [已收集 5/10]
+2025-09-12 02:53:51 - UF4 - INFO - TMP数据变化: 0.0244 -> 0.0242 [已收集 6/10]
+2025-09-12 02:53:59 - UF4 - INFO - TMP数据变化: 0.0242 -> 0.0246 [已收集 7/10]
+2025-09-12 02:54:06 - UF4 - INFO - TMP数据变化: 0.0246 -> 0.0242 [已收集 8/10]
+2025-09-12 02:54:08 - UF4 - INFO - TMP数据变化: 0.0242 -> 0.0244 [已收集 9/10]
+2025-09-12 02:54:12 - UF4 - INFO - TMP数据变化: 0.0244 -> 0.0242 [已收集 10/10]
+2025-09-12 02:54:14 - UF4 - INFO - [阶段3] 数据收集完成,开始计算决策
+2025-09-12 02:54:14 - UF4 - INFO - TMP中位数计算完成: 0.0243
+2025-09-12 02:54:14 - UF4 - INFO - [DB] 正在查询 'C.M.UF4_DB@press_PV' 从 2025-09-06 23:25:28 到 2025-09-12 02:54:14 的历史极值...
+2025-09-12 02:54:24 - UF4 - ERROR - 数据库连接失败: (2003, "Can't connect to MySQL server on '222.130.26.206' (timed out)")
+2025-09-12 02:54:24 - UF4 - INFO - 开始DQN模型决策...
+2025-09-12 02:54:24 - UF4 - INFO - DQN决策结果: {'action': 33, 'L_s': 4100.0, 't_bw_s': 96.0, 'next_obs': array([0.3575], dtype=float32), 'reward': np.float64(0.8426842474945535), 'terminated': False, 'truncated': False, 'info': {'recovery': 0.9331746976006345, 'V_feed_super_m3': 16810.0, 'V_loss_super_m3': 1123.3333333333335, 'V_net_super_m3': 15686.666666666666, 'supercycle_time_h': np.float64(48.45444444444444), 'net_delivery_rate_m3ph': np.float64(323.74051227957534), 'max_TMP_during_filtration': 0.03169441920741388, 'max_residual_increase_per_run': 0.00016639527595347162, 'phi_bw_effective': 0.7747177964240509, 'TMP_after_ceb': 0.024300000000000002, 'headroom_ratio': 0.5282403201235647, 'daily_prod_time_h': np.float64(23.128253342200004), 'ton_water_energy_kWh_per_m3': 0.1015, 'k_bw_per_ceb': 41, 'feasible': True, 'step': 1}}
+2025-09-12 02:54:25 - UF4 - CRITICAL - 监控主循环发生严重异常: 'min_TMP_during_filtration'
+Traceback (most recent call last):
+  File "/home/wangmingyang/projects/wuhan/caijun/uf/v2/loop_main.py", line 456, in monitor_device
+    metrics = calc_uf_cycle_metrics(uf_params, median_value, max_tmp, min_tmp, L_s, t_bw_s)
+  File "/home/wangmingyang/projects/wuhan/caijun/uf/v2/DQN_decide.py", line 216, in calc_uf_cycle_metrics
+    min_tmp_during_filtration = info["min_TMP_during_filtration"]
+KeyError: 'min_TMP_during_filtration'
+2025-09-12 02:54:25 - UF4 - INFO - 等待60秒后,线程将自动重试...
+2025-09-12 02:55:25 - UF4 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-12 10:09:56 - MainThread - INFO - ========================================
+2025-09-12 10:09:56 - MainThread - INFO - ===      启动超滤并行监控服务      ===
+2025-09-12 10:09:56 - MainThread - INFO - ========================================
+2025-09-12 10:09:56 - MainThread - INFO - 成功从状态文件 'device_states.json' 加载设备历史状态。
+2025-09-12 10:09:56 - UF1 - INFO - 监控线程启动
+2025-09-12 10:09:56 - MainThread - INFO - 设备 'UF1' 的监控线程已启动。
+2025-09-12 10:09:56 - UF1 - INFO - 成功加载历史状态,上次周期结束时间: 2025-09-09 12:53:43
+2025-09-12 10:09:56 - UF2 - INFO - 监控线程启动
+2025-09-12 10:09:56 - UF1 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-12 10:09:56 - MainThread - INFO - 设备 'UF2' 的监控线程已启动。
+2025-09-12 10:09:56 - UF2 - INFO - 成功加载历史状态,上次周期结束时间: 2025-09-09 09:51:37
+2025-09-12 10:09:56 - UF2 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-12 10:09:56 - UF3 - INFO - 监控线程启动
+2025-09-12 10:09:56 - MainThread - INFO - 设备 'UF3' 的监控线程已启动。
+2025-09-12 10:09:56 - UF3 - INFO - 成功加载历史状态,上次周期结束时间: 2025-09-09 22:17:55
+2025-09-12 10:09:56 - UF3 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-12 10:09:56 - UF4 - INFO - 监控线程启动
+2025-09-12 10:09:56 - MainThread - INFO - 设备 'UF4' 的监控线程已启动。
+2025-09-12 10:09:56 - UF4 - INFO - 成功加载历史状态,上次周期结束时间: 2025-09-06 23:25:28
+2025-09-12 10:09:56 - UF4 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-13 18:40:31 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: 502 Server Error: Bad Gateway for url: http://120.55.44.4:8900/api/v1/jinke-cloud/device/current-data
+2025-09-13 19:20:08 - UF1 - INFO - 触发条件满足,进入数据收集阶段。
+2025-09-13 19:20:08 - UF1 - INFO - [阶段2] 开始监控TMP数据变化,需收集 10 个稳定数据点
+2025-09-13 19:20:08 - UF1 - INFO - 获取到TMP初始基准值: 0.0319
+2025-09-13 20:05:00 - UF1 - INFO - TMP数据变化: 0.0319 -> 0.0392 [已收集 1/10]
+2025-09-13 20:05:04 - UF1 - INFO - TMP数据变化: 0.0392 -> 0.0396 [已收集 2/10]
+2025-09-13 20:05:09 - UF1 - INFO - TMP数据变化: 0.0396 -> 0.0392 [已收集 3/10]
+2025-09-13 20:05:15 - UF1 - INFO - TMP数据变化: 0.0392 -> 0.0394 [已收集 4/10]
+2025-09-13 20:05:17 - UF1 - INFO - TMP数据变化: 0.0394 -> 0.0390 [已收集 5/10]
+2025-09-13 20:05:19 - UF1 - INFO - TMP数据变化: 0.0390 -> 0.0388 [已收集 6/10]
+2025-09-13 20:05:22 - UF1 - INFO - TMP数据变化: 0.0388 -> 0.0392 [已收集 7/10]
+2025-09-13 20:05:24 - UF1 - INFO - TMP数据变化: 0.0392 -> 0.0394 [已收集 8/10]
+2025-09-13 20:05:30 - UF1 - INFO - TMP数据变化: 0.0394 -> 0.0392 [已收集 9/10]
+2025-09-13 20:05:32 - UF1 - INFO - TMP数据变化: 0.0392 -> 0.0390 [已收集 10/10]
+2025-09-13 20:05:34 - UF1 - INFO - [阶段3] 数据收集完成,开始计算决策
+2025-09-13 20:05:34 - UF1 - INFO - TMP中位数计算完成: 0.0392
+2025-09-13 20:05:34 - UF1 - INFO - [DB] 正在查询 'C.M.UF1_DB@press_PV' 从 2025-09-09 12:53:43 到 2025-09-13 20:05:34 的历史极值...
+2025-09-13 20:05:34 - UF1 - CRITICAL - 监控主循环发生严重异常: name 'word_control' is not defined
+Traceback (most recent call last):
+  File "/home/wangmingyang/projects/wuhan/caijun/uf/v2/loop_main.py", line 445, in monitor_device
+    max_tmp, min_tmp = get_tmp_extremes(device["press_pv_item"], start_query_time, current_decision_time)
+  File "/home/wangmingyang/projects/wuhan/caijun/uf/v2/loop_main.py", line 252, in get_tmp_extremes
+    cursor.execute(query, (PROJECT_ID_FOR_CALLBACK, item_name, PROJECT_ID_FOR_CALLBACK, start_time_str, end_time_str, word_control))
+NameError: name 'word_control' is not defined
+2025-09-13 20:05:34 - UF1 - INFO - 等待60秒后,线程将自动重试...
+2025-09-13 20:06:34 - UF1 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-13 22:51:44 - UF2 - INFO - 触发条件满足,进入数据收集阶段。
+2025-09-13 22:51:44 - UF2 - INFO - [阶段2] 开始监控TMP数据变化,需收集 10 个稳定数据点
+2025-09-13 22:51:44 - UF2 - INFO - 获取到TMP初始基准值: 0.0367
+2025-09-13 23:03:03 - UF2 - INFO - TMP数据变化: 0.0367 -> 0.0275 [已收集 1/10]
+2025-09-13 23:03:08 - UF2 - INFO - TMP数据变化: 0.0275 -> 0.0277 [已收集 2/10]
+2025-09-13 23:03:10 - UF2 - INFO - TMP数据变化: 0.0277 -> 0.0275 [已收集 3/10]
+2025-09-13 23:03:12 - UF2 - INFO - TMP数据变化: 0.0275 -> 0.0279 [已收集 4/10]
+2025-09-13 23:03:14 - UF2 - INFO - TMP数据变化: 0.0279 -> 0.0277 [已收集 5/10]
+2025-09-13 23:03:18 - UF2 - INFO - TMP数据变化: 0.0277 -> 0.0275 [已收集 6/10]
+2025-09-13 23:03:22 - UF2 - INFO - TMP数据变化: 0.0275 -> 0.0277 [已收集 7/10]
+2025-09-13 23:03:24 - UF2 - INFO - TMP数据变化: 0.0277 -> 0.0271 [已收集 8/10]
+2025-09-13 23:03:29 - UF2 - INFO - TMP数据变化: 0.0271 -> 0.0279 [已收集 9/10]
+2025-09-13 23:03:31 - UF2 - INFO - TMP数据变化: 0.0279 -> 0.0277 [已收集 10/10]
+2025-09-13 23:03:33 - UF2 - INFO - [阶段3] 数据收集完成,开始计算决策
+2025-09-13 23:03:33 - UF2 - INFO - TMP中位数计算完成: 0.0277
+2025-09-13 23:03:33 - UF2 - INFO - [DB] 正在查询 'C.M.UF2_DB@press_PV' 从 2025-09-09 09:51:37 到 2025-09-13 23:03:33 的历史极值...
+2025-09-13 23:03:33 - UF2 - CRITICAL - 监控主循环发生严重异常: name 'word_control' is not defined
+Traceback (most recent call last):
+  File "/home/wangmingyang/projects/wuhan/caijun/uf/v2/loop_main.py", line 445, in monitor_device
+    max_tmp, min_tmp = get_tmp_extremes(device["press_pv_item"], start_query_time, current_decision_time)
+  File "/home/wangmingyang/projects/wuhan/caijun/uf/v2/loop_main.py", line 252, in get_tmp_extremes
+    cursor.execute(query, (PROJECT_ID_FOR_CALLBACK, item_name, PROJECT_ID_FOR_CALLBACK, start_time_str, end_time_str, word_control))
+NameError: name 'word_control' is not defined
+2025-09-13 23:03:33 - UF2 - INFO - 等待60秒后,线程将自动重试...
+2025-09-13 23:04:33 - UF2 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-14 04:51:45 - UF3 - INFO - 触发条件满足,进入数据收集阶段。
+2025-09-14 04:51:45 - UF3 - INFO - [阶段2] 开始监控TMP数据变化,需收集 10 个稳定数据点
+2025-09-14 04:51:46 - UF3 - INFO - 获取到TMP初始基准值: 0.0167
+2025-09-14 05:06:38 - UF3 - INFO - TMP数据变化: 0.0167 -> 0.0154 [已收集 1/10]
+2025-09-14 05:06:42 - UF3 - INFO - TMP数据变化: 0.0154 -> 0.0158 [已收集 2/10]
+2025-09-14 05:06:44 - UF3 - INFO - TMP数据变化: 0.0158 -> 0.0160 [已收集 3/10]
+2025-09-14 05:06:46 - UF3 - INFO - TMP数据变化: 0.0160 -> 0.0158 [已收集 4/10]
+2025-09-14 05:06:53 - UF3 - INFO - TMP数据变化: 0.0158 -> 0.0160 [已收集 5/10]
+2025-09-14 05:06:55 - UF3 - INFO - TMP数据变化: 0.0160 -> 0.0158 [已收集 6/10]
+2025-09-14 05:06:57 - UF3 - INFO - TMP数据变化: 0.0158 -> 0.0156 [已收集 7/10]
+2025-09-14 05:07:01 - UF3 - INFO - TMP数据变化: 0.0156 -> 0.0154 [已收集 8/10]
+2025-09-14 05:07:05 - UF3 - INFO - TMP数据变化: 0.0154 -> 0.0160 [已收集 9/10]
+2025-09-14 05:07:08 - UF3 - INFO - TMP数据变化: 0.0160 -> 0.0156 [已收集 10/10]
+2025-09-14 05:07:10 - UF3 - INFO - [阶段3] 数据收集完成,开始计算决策
+2025-09-14 05:07:10 - UF3 - INFO - TMP中位数计算完成: 0.0158
+2025-09-14 05:07:10 - UF3 - INFO - [DB] 正在查询 'C.M.UF3_DB@press_PV' 从 2025-09-09 22:17:55 到 2025-09-14 05:07:10 的历史极值...
+2025-09-14 05:07:10 - UF3 - CRITICAL - 监控主循环发生严重异常: name 'word_control' is not defined
+Traceback (most recent call last):
+  File "/home/wangmingyang/projects/wuhan/caijun/uf/v2/loop_main.py", line 445, in monitor_device
+    max_tmp, min_tmp = get_tmp_extremes(device["press_pv_item"], start_query_time, current_decision_time)
+  File "/home/wangmingyang/projects/wuhan/caijun/uf/v2/loop_main.py", line 252, in get_tmp_extremes
+    cursor.execute(query, (PROJECT_ID_FOR_CALLBACK, item_name, PROJECT_ID_FOR_CALLBACK, start_time_str, end_time_str, word_control))
+NameError: name 'word_control' is not defined
+2025-09-14 05:07:10 - UF3 - INFO - 等待60秒后,线程将自动重试...
+2025-09-14 05:08:10 - UF3 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-14 13:42:02 - UF4 - INFO - 触发条件满足,进入数据收集阶段。
+2025-09-14 13:42:02 - UF4 - INFO - [阶段2] 开始监控TMP数据变化,需收集 10 个稳定数据点
+2025-09-14 13:42:02 - UF4 - INFO - 获取到TMP初始基准值: 0.0413
+2025-09-14 15:21:12 - UF4 - INFO - TMP数据变化: 0.0413 -> 0.0248 [已收集 1/10]
+2025-09-14 15:21:18 - UF4 - INFO - TMP数据变化: 0.0248 -> 0.0250 [已收集 2/10]
+2025-09-14 15:21:20 - UF4 - INFO - TMP数据变化: 0.0250 -> 0.0248 [已收集 3/10]
+2025-09-14 15:21:22 - UF4 - INFO - TMP数据变化: 0.0248 -> 0.0250 [已收集 4/10]
+2025-09-14 15:21:24 - UF4 - INFO - TMP数据变化: 0.0250 -> 0.0248 [已收集 5/10]
+2025-09-14 15:21:33 - UF4 - INFO - TMP数据变化: 0.0248 -> 0.0244 [已收集 6/10]
+2025-09-14 15:21:37 - UF4 - INFO - TMP数据变化: 0.0244 -> 0.0248 [已收集 7/10]
+2025-09-14 15:21:39 - UF4 - INFO - TMP数据变化: 0.0248 -> 0.0246 [已收集 8/10]
+2025-09-14 15:21:41 - UF4 - INFO - TMP数据变化: 0.0246 -> 0.0250 [已收集 9/10]
+2025-09-14 15:21:48 - UF4 - INFO - TMP数据变化: 0.0250 -> 0.0248 [已收集 10/10]
+2025-09-14 15:21:50 - UF4 - INFO - [阶段3] 数据收集完成,开始计算决策
+2025-09-14 15:21:50 - UF4 - INFO - TMP中位数计算完成: 0.0248
+2025-09-14 15:21:50 - UF4 - INFO - [DB] 正在查询 'C.M.UF4_DB@press_PV' 从 2025-09-06 23:25:28 到 2025-09-14 15:21:50 的历史极值...
+2025-09-14 15:21:50 - UF4 - CRITICAL - 监控主循环发生严重异常: name 'word_control' is not defined
+Traceback (most recent call last):
+  File "/home/wangmingyang/projects/wuhan/caijun/uf/v2/loop_main.py", line 445, in monitor_device
+    max_tmp, min_tmp = get_tmp_extremes(device["press_pv_item"], start_query_time, current_decision_time)
+  File "/home/wangmingyang/projects/wuhan/caijun/uf/v2/loop_main.py", line 252, in get_tmp_extremes
+    cursor.execute(query, (PROJECT_ID_FOR_CALLBACK, item_name, PROJECT_ID_FOR_CALLBACK, start_time_str, end_time_str, word_control))
+NameError: name 'word_control' is not defined
+2025-09-14 15:21:50 - UF4 - INFO - 等待60秒后,线程将自动重试...
+2025-09-14 15:22:50 - UF4 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-14 19:49:24 - MainThread - INFO - ========================================
+2025-09-14 19:49:24 - MainThread - INFO - ===      启动超滤并行监控服务      ===
+2025-09-14 19:49:24 - MainThread - INFO - ========================================
+2025-09-14 19:49:24 - MainThread - INFO - 成功从状态文件 'device_states.json' 加载设备历史状态。
+2025-09-14 19:49:24 - UF1 - INFO - 监控线程启动
+2025-09-14 19:49:24 - MainThread - INFO - 设备 'UF1' 的监控线程已启动。
+2025-09-14 19:49:24 - UF1 - INFO - 成功加载历史状态,上次周期结束时间: 2025-09-11 11:06:51
+2025-09-14 19:49:24 - UF2 - INFO - 监控线程启动
+2025-09-14 19:49:24 - MainThread - INFO - 设备 'UF2' 的监控线程已启动。
+2025-09-14 19:49:24 - UF1 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-14 19:49:24 - UF2 - INFO - 成功加载历史状态,上次周期结束时间: 2025-09-11 12:53:01
+2025-09-14 19:49:24 - UF3 - INFO - 监控线程启动
+2025-09-14 19:49:24 - MainThread - INFO - 设备 'UF3' 的监控线程已启动。
+2025-09-14 19:49:24 - UF2 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-14 19:49:24 - UF3 - INFO - 成功加载历史状态,上次周期结束时间: 2025-09-09 22:17:55
+2025-09-14 19:49:24 - UF4 - INFO - 监控线程启动
+2025-09-14 19:49:24 - UF3 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-14 19:49:24 - MainThread - INFO - 设备 'UF4' 的监控线程已启动。
+2025-09-14 19:49:24 - UF4 - INFO - 成功加载历史状态,上次周期结束时间: 2025-09-12 02:54:24
+2025-09-14 19:49:24 - UF4 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-16 10:55:50 - UF2 - INFO - 触发条件满足,进入数据收集阶段。
+2025-09-16 10:55:50 - UF2 - INFO - [阶段2] 开始监控TMP数据变化,需收集 10 个稳定数据点
+2025-09-16 10:55:50 - UF2 - INFO - 获取到TMP初始基准值: 0.0304
+2025-09-16 11:07:39 - UF2 - INFO - TMP数据变化: 0.0304 -> 0.0269 [已收集 1/10]
+2025-09-16 11:07:41 - UF2 - INFO - TMP数据变化: 0.0269 -> 0.0265 [已收集 2/10]
+2025-09-16 11:07:47 - UF2 - INFO - TMP数据变化: 0.0265 -> 0.0267 [已收集 3/10]
+2025-09-16 11:07:51 - UF2 - INFO - TMP数据变化: 0.0267 -> 0.0265 [已收集 4/10]
+2025-09-16 11:07:53 - UF2 - INFO - TMP数据变化: 0.0265 -> 0.0271 [已收集 5/10]
+2025-09-16 11:07:56 - UF2 - INFO - TMP数据变化: 0.0271 -> 0.0269 [已收集 6/10]
+2025-09-16 11:07:58 - UF2 - INFO - TMP数据变化: 0.0269 -> 0.0265 [已收集 7/10]
+2025-09-16 11:08:00 - UF2 - INFO - TMP数据变化: 0.0265 -> 0.0269 [已收集 8/10]
+2025-09-16 11:08:02 - UF2 - INFO - TMP数据变化: 0.0269 -> 0.0267 [已收集 9/10]
+2025-09-16 11:08:10 - UF2 - INFO - TMP数据变化: 0.0267 -> 0.0271 [已收集 10/10]
+2025-09-16 11:08:12 - UF2 - INFO - [阶段3] 数据收集完成,开始计算决策
+2025-09-16 11:08:12 - UF2 - INFO - TMP中位数计算完成: 0.0268
+2025-09-16 11:08:12 - UF2 - CRITICAL - 监控主循环发生严重异常: name '_word_controldevice' is not defined
+Traceback (most recent call last):
+  File "/home/wangmingyang/projects/wuhan/caijun/uf/v2/loop_main.py", line 444, in monitor_device
+    _word_controldevice["control_payload"]["deviceItems"]
+NameError: name '_word_controldevice' is not defined
+2025-09-16 11:08:12 - UF2 - INFO - 等待60秒后,线程将自动重试...
+2025-09-16 11:09:12 - UF2 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-16 11:33:57 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-16 13:14:55 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-16 14:07:11 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-16 16:47:09 - UF1 - INFO - 触发条件满足,进入数据收集阶段。
+2025-09-16 16:47:09 - UF1 - INFO - [阶段2] 开始监控TMP数据变化,需收集 10 个稳定数据点
+2025-09-16 16:47:10 - UF1 - INFO - 获取到TMP初始基准值: 0.0281
+2025-09-16 16:57:52 - UF1 - INFO - TMP数据变化: 0.0281 -> 0.0273 [已收集 1/10]
+2025-09-16 16:57:54 - UF1 - INFO - TMP数据变化: 0.0273 -> 0.0275 [已收集 2/10]
+2025-09-16 16:58:03 - UF1 - INFO - TMP数据变化: 0.0275 -> 0.0271 [已收集 3/10]
+2025-09-16 16:58:07 - UF1 - INFO - TMP数据变化: 0.0271 -> 0.0269 [已收集 4/10]
+2025-09-16 16:58:13 - UF1 - INFO - TMP数据变化: 0.0269 -> 0.0271 [已收集 5/10]
+2025-09-16 16:58:18 - UF1 - INFO - TMP数据变化: 0.0271 -> 0.0269 [已收集 6/10]
+2025-09-16 16:58:22 - UF1 - INFO - TMP数据变化: 0.0269 -> 0.0271 [已收集 7/10]
+2025-09-16 16:58:24 - UF1 - INFO - TMP数据变化: 0.0271 -> 0.0273 [已收集 8/10]
+2025-09-16 16:58:28 - UF1 - INFO - TMP数据变化: 0.0273 -> 0.0269 [已收集 9/10]
+2025-09-16 16:58:41 - UF1 - INFO - TMP数据变化: 0.0269 -> 0.0252 [已收集 10/10]
+2025-09-16 16:58:43 - UF1 - INFO - [阶段3] 数据收集完成,开始计算决策
+2025-09-16 16:58:43 - UF1 - INFO - TMP中位数计算完成: 0.0271
+2025-09-16 16:58:43 - UF1 - CRITICAL - 监控主循环发生严重异常: name '_word_controldevice' is not defined
+Traceback (most recent call last):
+  File "/home/wangmingyang/projects/wuhan/caijun/uf/v2/loop_main.py", line 444, in monitor_device
+    _word_controldevice["control_payload"]["deviceItems"]
+NameError: name '_word_controldevice' is not defined
+2025-09-16 16:58:43 - UF1 - INFO - 等待60秒后,线程将自动重试...
+2025-09-16 16:59:43 - UF1 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-16 17:07:48 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,业务错误: ok
+2025-09-16 17:07:49 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-16 17:07:53 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-16 17:07:57 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,业务错误: ok
+2025-09-16 17:07:57 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,业务错误: ok
+2025-09-16 17:08:10 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,业务错误: ok
+2025-09-16 17:08:15 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,业务错误: ok
+2025-09-16 18:09:25 - UF3 - INFO - 触发条件满足,进入数据收集阶段。
+2025-09-16 18:09:25 - UF3 - INFO - [阶段2] 开始监控TMP数据变化,需收集 10 个稳定数据点
+2025-09-16 18:09:25 - UF3 - INFO - 获取到TMP初始基准值: 0.0336
+2025-09-16 18:23:54 - UF3 - INFO - TMP数据变化: 0.0336 -> 0.0208 [已收集 1/10]
+2025-09-16 18:23:56 - UF3 - INFO - TMP数据变化: 0.0208 -> 0.0202 [已收集 2/10]
+2025-09-16 18:23:58 - UF3 - INFO - TMP数据变化: 0.0202 -> 0.0206 [已收集 3/10]
+2025-09-16 18:24:02 - UF3 - INFO - TMP数据变化: 0.0206 -> 0.0208 [已收集 4/10]
+2025-09-16 18:24:08 - UF3 - INFO - TMP数据变化: 0.0208 -> 0.0206 [已收集 5/10]
+2025-09-16 18:24:11 - UF3 - INFO - TMP数据变化: 0.0206 -> 0.0210 [已收集 6/10]
+2025-09-16 18:24:17 - UF3 - INFO - TMP数据变化: 0.0210 -> 0.0206 [已收集 7/10]
+2025-09-16 18:24:22 - UF3 - INFO - TMP数据变化: 0.0206 -> 0.0210 [已收集 8/10]
+2025-09-16 18:24:26 - UF3 - INFO - TMP数据变化: 0.0210 -> 0.0208 [已收集 9/10]
+2025-09-16 18:24:28 - UF3 - INFO - TMP数据变化: 0.0208 -> 0.0210 [已收集 10/10]
+2025-09-16 18:24:30 - UF3 - INFO - [阶段3] 数据收集完成,开始计算决策
+2025-09-16 18:24:30 - UF3 - INFO - TMP中位数计算完成: 0.0208
+2025-09-16 18:24:30 - UF3 - CRITICAL - 监控主循环发生严重异常: name '_word_controldevice' is not defined
+Traceback (most recent call last):
+  File "/home/wangmingyang/projects/wuhan/caijun/uf/v2/loop_main.py", line 444, in monitor_device
+    _word_controldevice["control_payload"]["deviceItems"]
+NameError: name '_word_controldevice' is not defined
+2025-09-16 18:24:30 - UF3 - INFO - 等待60秒后,线程将自动重试...
+2025-09-16 18:25:30 - UF3 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-16 18:37:42 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-16 23:37:11 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-17 03:20:18 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-17 03:26:56 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-17 03:26:56 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-17 04:48:01 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-17 05:09:27 - UF4 - INFO - 触发条件满足,进入数据收集阶段。
+2025-09-17 05:09:27 - UF4 - INFO - [阶段2] 开始监控TMP数据变化,需收集 10 个稳定数据点
+2025-09-17 05:09:27 - UF4 - INFO - 获取到TMP初始基准值: 0.0252
+2025-09-17 05:24:37 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,业务错误: ok
+2025-09-17 05:24:37 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,业务错误: ok
+2025-09-17 05:24:38 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,业务错误: ok
+2025-09-17 05:24:38 - UF4 - ERROR - [UF4][API] 获取'UF4_BW_After_TMP'失败,业务错误: ok
+2025-09-17 05:26:06 - UF4 - ERROR - [UF4][API] 获取'UF4_BW_After_TMP'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-17 05:27:16 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-17 05:27:19 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-17 05:35:25 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-17 05:39:46 - UF4 - INFO - TMP数据变化: 0.0252 -> 0.0221 [已收集 1/10]
+2025-09-17 05:39:50 - UF4 - INFO - TMP数据变化: 0.0221 -> 0.0217 [已收集 2/10]
+2025-09-17 05:39:52 - UF4 - INFO - TMP数据变化: 0.0217 -> 0.0219 [已收集 3/10]
+2025-09-17 05:39:54 - UF4 - INFO - TMP数据变化: 0.0219 -> 0.0223 [已收集 4/10]
+2025-09-17 05:39:56 - UF4 - INFO - TMP数据变化: 0.0223 -> 0.0221 [已收集 5/10]
+2025-09-17 05:40:03 - UF4 - INFO - TMP数据变化: 0.0221 -> 0.0219 [已收集 6/10]
+2025-09-17 05:40:09 - UF4 - INFO - TMP数据变化: 0.0219 -> 0.0217 [已收集 7/10]
+2025-09-17 05:40:11 - UF4 - INFO - TMP数据变化: 0.0217 -> 0.0221 [已收集 8/10]
+2025-09-17 05:40:15 - UF4 - INFO - TMP数据变化: 0.0221 -> 0.0217 [已收集 9/10]
+2025-09-17 05:40:26 - UF4 - INFO - TMP数据变化: 0.0217 -> 0.0221 [已收集 10/10]
+2025-09-17 05:40:28 - UF4 - INFO - [阶段3] 数据收集完成,开始计算决策
+2025-09-17 05:40:28 - UF4 - INFO - TMP中位数计算完成: 0.0220
+2025-09-17 05:40:28 - UF4 - CRITICAL - 监控主循环发生严重异常: name '_word_controldevice' is not defined
+Traceback (most recent call last):
+  File "/home/wangmingyang/projects/wuhan/caijun/uf/v2/loop_main.py", line 444, in monitor_device
+    _word_controldevice["control_payload"]["deviceItems"]
+NameError: name '_word_controldevice' is not defined
+2025-09-17 05:40:28 - UF4 - INFO - 等待60秒后,线程将自动重试...
+2025-09-17 05:41:28 - UF4 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-17 05:43:10 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-17 06:31:25 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-17 08:32:51 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-17 08:57:36 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-17 11:08:47 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-17 11:10:16 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-17 11:11:42 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-17 14:31:33 - MainThread - INFO - ========================================
+2025-09-17 14:31:33 - MainThread - INFO - ===      启动超滤并行监控服务      ===
+2025-09-17 14:31:33 - MainThread - INFO - ========================================
+2025-09-17 14:31:33 - MainThread - INFO - 成功从状态文件 'device_states.json' 加载设备历史状态。
+2025-09-17 14:31:33 - UF1 - INFO - 监控线程启动
+2025-09-17 14:31:33 - MainThread - INFO - 设备 'UF1' 的监控线程已启动。
+2025-09-17 14:31:33 - UF1 - INFO - 成功加载历史状态,上次周期结束时间: 2025-09-11 11:06:51
+2025-09-17 14:31:33 - UF2 - INFO - 监控线程启动
+2025-09-17 14:31:33 - MainThread - INFO - 设备 'UF2' 的监控线程已启动。
+2025-09-17 14:31:33 - UF1 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-17 14:31:33 - UF2 - INFO - 成功加载历史状态,上次周期结束时间: 2025-09-11 12:53:01
+2025-09-17 14:31:33 - UF3 - INFO - 监控线程启动
+2025-09-17 14:31:33 - MainThread - INFO - 设备 'UF3' 的监控线程已启动。
+2025-09-17 14:31:33 - UF2 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-17 14:31:33 - UF3 - INFO - 成功加载历史状态,上次周期结束时间: 2025-09-09 22:17:55
+2025-09-17 14:31:33 - UF4 - INFO - 监控线程启动
+2025-09-17 14:31:33 - MainThread - INFO - 设备 'UF4' 的监控线程已启动。
+2025-09-17 14:31:33 - UF3 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-17 14:31:33 - UF4 - INFO - 成功加载历史状态,上次周期结束时间: 2025-09-12 02:54:24
+2025-09-17 14:31:33 - UF4 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-17 15:14:55 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-17 15:55:38 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-17 19:50:09 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-17 20:43:19 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-17 23:51:23 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-18 01:17:07 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-18 08:09:18 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-18 08:09:18 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-18 08:09:31 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,业务错误: ok
+2025-09-18 08:09:31 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,业务错误: ok
+2025-09-18 08:09:31 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,业务错误: ok
+2025-09-18 08:09:32 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-18 08:09:45 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-18 08:09:46 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-18 11:10:43 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-18 12:29:24 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-18 13:41:23 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-18 14:16:25 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-18 14:57:09 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-18 16:27:23 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: 502 Server Error: Bad Gateway for url: http://120.55.44.4:8900/api/v1/jinke-cloud/device/current-data
+2025-09-19 02:44:36 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-19 18:36:18 - UF2 - INFO - 触发条件满足,进入数据收集阶段。
+2025-09-19 18:36:18 - UF2 - INFO - [阶段2] 开始监控TMP数据变化,需收集 10 个稳定数据点
+2025-09-19 18:36:18 - UF2 - INFO - 获取到TMP初始基准值: 0.0233
+2025-09-19 20:14:35 - UF2 - INFO - TMP数据变化: 0.0233 -> 0.0160 [已收集 1/10]
+2025-09-19 20:14:43 - UF2 - INFO - TMP数据变化: 0.0160 -> 0.0161 [已收集 2/10]
+2025-09-19 20:14:47 - UF2 - INFO - TMP数据变化: 0.0161 -> 0.0158 [已收集 3/10]
+2025-09-19 20:14:52 - UF2 - INFO - TMP数据变化: 0.0158 -> 0.0160 [已收集 4/10]
+2025-09-19 20:14:54 - UF2 - INFO - TMP数据变化: 0.0160 -> 0.0161 [已收集 5/10]
+2025-09-19 20:14:56 - UF2 - INFO - TMP数据变化: 0.0161 -> 0.0160 [已收集 6/10]
+2025-09-19 20:14:58 - UF2 - INFO - TMP数据变化: 0.0160 -> 0.0165 [已收集 7/10]
+2025-09-19 20:15:00 - UF2 - INFO - TMP数据变化: 0.0165 -> 0.0158 [已收集 8/10]
+2025-09-19 20:15:05 - UF2 - INFO - TMP数据变化: 0.0158 -> 0.0163 [已收集 9/10]
+2025-09-19 20:15:09 - UF2 - INFO - TMP数据变化: 0.0163 -> 0.0158 [已收集 10/10]
+2025-09-19 20:15:11 - UF2 - INFO - [阶段3] 数据收集完成,开始计算决策
+2025-09-19 20:15:11 - UF2 - INFO - TMP中位数计算完成: 0.0160
+2025-09-19 20:15:11 - UF2 - INFO - [DB] 正在查询 'C.M.UF2_DB@press_PV' 从 2025-09-11 12:53:01 到 2025-09-19 20:15:11 的历史极值...
+2025-09-19 20:15:11 - UF2 - WARNING - [DB] 在指定时间范围内未找到 'C.M.UF2_DB@press_PV' 的有效数据。
+2025-09-19 20:15:11 - UF2 - INFO - 开始DQN模型决策...
+2025-09-19 20:15:11 - UF2 - INFO - DQN决策结果: {'action': 31, 'L_s': 4100.0, 't_bw_s': 92.0, 'next_obs': array([0.15], dtype=float32), 'reward': np.float64(0.8831049351954949), 'terminated': False, 'truncated': False, 'info': {'recovery': 0.9358847247009056, 'V_feed_super_m3': 16810.0, 'V_loss_super_m3': 1077.7777777777778, 'V_net_super_m3': 15732.222222222223, 'supercycle_time_h': np.float64(48.40888888888889), 'net_delivery_rate_m3ph': np.float64(324.98622842453176), 'max_TMP_during_filtration': 0.02353314664353877, 'max_residual_increase_per_run': 0.0001698634618565939, 'phi_bw_effective': 0.7700222270445147, 'TMP_after_ceb': 0.016, 'headroom_ratio': 0.39221911072564614, 'daily_prod_time_h': np.float64(23.150018362100624), 'ton_water_energy_kWh_per_m3': 0.1015, 'k_bw_per_ceb': 41, 'feasible': True, 'step': 1}}
+2025-09-19 20:15:12 - UF2 - CRITICAL - 监控主循环发生严重异常: 'min_TMP_during_filtration'
+Traceback (most recent call last):
+  File "/home/wangmingyang/projects/wuhan/caijun/uf/v2/loop_main.py", line 456, in monitor_device
+    metrics = calc_uf_cycle_metrics(uf_params, median_value, max_tmp, min_tmp, L_s, t_bw_s)
+  File "/home/wangmingyang/projects/wuhan/caijun/uf/v2/DQN_decide.py", line 216, in calc_uf_cycle_metrics
+    min_tmp_during_filtration = info["min_TMP_during_filtration"]
+KeyError: 'min_TMP_during_filtration'
+2025-09-19 20:15:12 - UF2 - INFO - 等待60秒后,线程将自动重试...
+2025-09-19 20:16:12 - UF2 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-19 21:28:37 - UF1 - INFO - 触发条件满足,进入数据收集阶段。
+2025-09-19 21:28:37 - UF1 - INFO - [阶段2] 开始监控TMP数据变化,需收集 10 个稳定数据点
+2025-09-19 21:28:37 - UF1 - INFO - 获取到TMP初始基准值: 0.0252
+2025-09-19 22:50:09 - UF1 - INFO - TMP数据变化: 0.0252 -> 0.0196 [已收集 1/10]
+2025-09-19 22:50:11 - UF1 - INFO - TMP数据变化: 0.0196 -> 0.0198 [已收集 2/10]
+2025-09-19 22:50:13 - UF1 - INFO - TMP数据变化: 0.0198 -> 0.0200 [已收集 3/10]
+2025-09-19 22:50:17 - UF1 - INFO - TMP数据变化: 0.0200 -> 0.0198 [已收集 4/10]
+2025-09-19 22:50:30 - UF1 - INFO - TMP数据变化: 0.0198 -> 0.0200 [已收集 5/10]
+2025-09-19 22:50:32 - UF1 - INFO - TMP数据变化: 0.0200 -> 0.0194 [已收集 6/10]
+2025-09-19 22:50:34 - UF1 - INFO - TMP数据变化: 0.0194 -> 0.0200 [已收集 7/10]
+2025-09-19 22:50:39 - UF1 - INFO - TMP数据变化: 0.0200 -> 0.0198 [已收集 8/10]
+2025-09-19 22:50:41 - UF1 - INFO - TMP数据变化: 0.0198 -> 0.0202 [已收集 9/10]
+2025-09-19 22:50:44 - UF1 - INFO - TMP数据变化: 0.0202 -> 0.0198 [已收集 10/10]
+2025-09-19 22:50:46 - UF1 - INFO - [阶段3] 数据收集完成,开始计算决策
+2025-09-19 22:50:46 - UF1 - INFO - TMP中位数计算完成: 0.0198
+2025-09-19 22:50:46 - UF1 - INFO - [DB] 正在查询 'C.M.UF1_DB@press_PV' 从 2025-09-11 11:06:51 到 2025-09-19 22:50:46 的历史极值...
+2025-09-19 22:50:46 - UF1 - WARNING - [DB] 在指定时间范围内未找到 'C.M.UF1_DB@press_PV' 的有效数据。
+2025-09-19 22:50:46 - UF1 - INFO - 开始DQN模型决策...
+2025-09-19 22:50:46 - UF1 - INFO - DQN决策结果: {'action': 33, 'L_s': 4100.0, 't_bw_s': 96.0, 'next_obs': array([0.245], dtype=float32), 'reward': np.float64(0.8647675619001138), 'terminated': False, 'truncated': False, 'info': {'recovery': 0.9331746976006345, 'V_feed_super_m3': 16810.0, 'V_loss_super_m3': 1123.3333333333335, 'V_net_super_m3': 15686.666666666666, 'supercycle_time_h': np.float64(48.45444444444444), 'net_delivery_rate_m3ph': np.float64(323.74051227957534), 'max_TMP_during_filtration': 0.02719441920741388, 'max_residual_increase_per_run': 0.00016639527595347162, 'phi_bw_effective': 0.7747177964240509, 'TMP_after_ceb': 0.0198, 'headroom_ratio': 0.4532403201235647, 'daily_prod_time_h': np.float64(23.128253342200004), 'ton_water_energy_kWh_per_m3': 0.1015, 'k_bw_per_ceb': 41, 'feasible': True, 'step': 1}}
+2025-09-19 22:50:46 - UF1 - CRITICAL - 监控主循环发生严重异常: 'min_TMP_during_filtration'
+Traceback (most recent call last):
+  File "/home/wangmingyang/projects/wuhan/caijun/uf/v2/loop_main.py", line 456, in monitor_device
+    metrics = calc_uf_cycle_metrics(uf_params, median_value, max_tmp, min_tmp, L_s, t_bw_s)
+  File "/home/wangmingyang/projects/wuhan/caijun/uf/v2/DQN_decide.py", line 216, in calc_uf_cycle_metrics
+    min_tmp_during_filtration = info["min_TMP_during_filtration"]
+KeyError: 'min_TMP_during_filtration'
+2025-09-19 22:50:46 - UF1 - INFO - 等待60秒后,线程将自动重试...
+2025-09-19 22:51:46 - UF1 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-20 00:16:15 - UF3 - INFO - 触发条件满足,进入数据收集阶段。
+2025-09-20 00:16:15 - UF3 - INFO - [阶段2] 开始监控TMP数据变化,需收集 10 个稳定数据点
+2025-09-20 00:16:16 - UF3 - INFO - 获取到TMP初始基准值: 0.0183
+2025-09-20 00:21:44 - UF3 - INFO - TMP数据变化: 0.0183 -> 0.0144 [已收集 1/10]
+2025-09-20 00:21:48 - UF3 - INFO - TMP数据变化: 0.0144 -> 0.0146 [已收集 2/10]
+2025-09-20 00:21:54 - UF3 - INFO - TMP数据变化: 0.0146 -> 0.0144 [已收集 3/10]
+2025-09-20 00:21:58 - UF3 - INFO - TMP数据变化: 0.0144 -> 0.0146 [已收集 4/10]
+2025-09-20 00:22:01 - UF3 - INFO - TMP数据变化: 0.0146 -> 0.0148 [已收集 5/10]
+2025-09-20 00:22:07 - UF3 - INFO - TMP数据变化: 0.0148 -> 0.0146 [已收集 6/10]
+2025-09-20 00:22:12 - UF3 - INFO - TMP数据变化: 0.0146 -> 0.0144 [已收集 7/10]
+2025-09-20 00:22:18 - UF3 - INFO - TMP数据变化: 0.0144 -> 0.0150 [已收集 8/10]
+2025-09-20 00:22:20 - UF3 - INFO - TMP数据变化: 0.0150 -> 0.0148 [已收集 9/10]
+2025-09-20 00:22:24 - UF3 - INFO - TMP数据变化: 0.0148 -> 0.0146 [已收集 10/10]
+2025-09-20 00:22:26 - UF3 - INFO - [阶段3] 数据收集完成,开始计算决策
+2025-09-20 00:22:26 - UF3 - INFO - TMP中位数计算完成: 0.0146
+2025-09-20 00:22:26 - UF3 - INFO - [DB] 正在查询 'C.M.UF3_DB@press_PV' 从 2025-09-09 22:17:55 到 2025-09-20 00:22:26 的历史极值...
+2025-09-20 00:22:27 - UF3 - CRITICAL - 监控主循环发生严重异常: 0
+Traceback (most recent call last):
+  File "/home/wangmingyang/projects/wuhan/caijun/uf/v2/loop_main.py", line 445, in monitor_device
+    max_tmp, min_tmp = get_tmp_extremes(device["press_pv_item"], start_query_time, current_decision_time, _word_controldevice)
+  File "/home/wangmingyang/projects/wuhan/caijun/uf/v2/loop_main.py", line 255, in get_tmp_extremes
+    max_val = float(result[0])
+KeyError: 0
+2025-09-20 00:22:27 - UF3 - INFO - 等待60秒后,线程将自动重试...
+2025-09-20 00:23:27 - UF3 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-20 15:17:07 - UF4 - INFO - 触发条件满足,进入数据收集阶段。
+2025-09-20 15:17:07 - UF4 - INFO - [阶段2] 开始监控TMP数据变化,需收集 10 个稳定数据点
+2025-09-20 15:17:07 - UF4 - INFO - 获取到TMP初始基准值: 0.0171
+2025-09-20 15:31:17 - UF4 - INFO - TMP数据变化: 0.0171 -> 0.0154 [已收集 1/10]
+2025-09-20 15:31:23 - UF4 - INFO - TMP数据变化: 0.0154 -> 0.0158 [已收集 2/10]
+2025-09-20 15:31:25 - UF4 - INFO - TMP数据变化: 0.0158 -> 0.0154 [已收集 3/10]
+2025-09-20 15:31:27 - UF4 - INFO - TMP数据变化: 0.0154 -> 0.0156 [已收集 4/10]
+2025-09-20 15:31:32 - UF4 - INFO - TMP数据变化: 0.0156 -> 0.0154 [已收集 5/10]
+2025-09-20 15:31:34 - UF4 - INFO - TMP数据变化: 0.0154 -> 0.0152 [已收集 6/10]
+2025-09-20 15:31:36 - UF4 - INFO - TMP数据变化: 0.0152 -> 0.0156 [已收集 7/10]
+2025-09-20 15:31:38 - UF4 - INFO - TMP数据变化: 0.0156 -> 0.0158 [已收集 8/10]
+2025-09-20 15:31:42 - UF4 - INFO - TMP数据变化: 0.0158 -> 0.0156 [已收集 9/10]
+2025-09-20 15:31:49 - UF4 - INFO - TMP数据变化: 0.0156 -> 0.0154 [已收集 10/10]
+2025-09-20 15:31:51 - UF4 - INFO - [阶段3] 数据收集完成,开始计算决策
+2025-09-20 15:31:51 - UF4 - INFO - TMP中位数计算完成: 0.0155
+2025-09-20 15:31:51 - UF4 - INFO - [DB] 正在查询 'C.M.UF4_DB@press_PV' 从 2025-09-12 02:54:24 到 2025-09-20 15:31:51 的历史极值...
+2025-09-20 15:31:51 - UF4 - WARNING - [DB] 在指定时间范围内未找到 'C.M.UF4_DB@press_PV' 的有效数据。
+2025-09-20 15:31:51 - UF4 - INFO - 开始DQN模型决策...
+2025-09-20 15:31:51 - UF4 - INFO - DQN决策结果: {'action': 31, 'L_s': 4100.0, 't_bw_s': 92.0, 'next_obs': array([0.1375], dtype=float32), 'reward': np.float64(0.8850451974157898), 'terminated': False, 'truncated': False, 'info': {'recovery': 0.9358847247009056, 'V_feed_super_m3': 16810.0, 'V_loss_super_m3': 1077.7777777777778, 'V_net_super_m3': 15732.222222222223, 'supercycle_time_h': np.float64(48.40888888888889), 'net_delivery_rate_m3ph': np.float64(324.98622842453176), 'max_TMP_during_filtration': 0.02303314664353877, 'max_residual_increase_per_run': 0.0001698634618565939, 'phi_bw_effective': 0.7700222270445147, 'TMP_after_ceb': 0.0155, 'headroom_ratio': 0.38388577739231283, 'daily_prod_time_h': np.float64(23.150018362100624), 'ton_water_energy_kWh_per_m3': 0.1015, 'k_bw_per_ceb': 41, 'feasible': True, 'step': 1}}
+2025-09-20 15:31:52 - UF4 - CRITICAL - 监控主循环发生严重异常: 'min_TMP_during_filtration'
+Traceback (most recent call last):
+  File "/home/wangmingyang/projects/wuhan/caijun/uf/v2/loop_main.py", line 456, in monitor_device
+    metrics = calc_uf_cycle_metrics(uf_params, median_value, max_tmp, min_tmp, L_s, t_bw_s)
+  File "/home/wangmingyang/projects/wuhan/caijun/uf/v2/DQN_decide.py", line 216, in calc_uf_cycle_metrics
+    min_tmp_during_filtration = info["min_TMP_during_filtration"]
+KeyError: 'min_TMP_during_filtration'
+2025-09-20 15:31:52 - UF4 - INFO - 等待60秒后,线程将自动重试...
+2025-09-20 15:32:52 - UF4 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-22 09:42:30 - MainThread - INFO - ========================================
+2025-09-22 09:42:30 - MainThread - INFO - ===      启动超滤并行监控服务      ===
+2025-09-22 09:42:30 - MainThread - INFO - ========================================
+2025-09-22 09:42:30 - MainThread - INFO - 成功从状态文件 'device_states.json' 加载设备历史状态。
+2025-09-22 09:42:30 - UF1 - INFO - 监控线程启动
+2025-09-22 09:42:30 - MainThread - INFO - 设备 'UF1' 的监控线程已启动。
+2025-09-22 09:42:30 - UF1 - INFO - 成功加载历史状态,上次周期结束时间: 2025-09-11 11:06:51
+2025-09-22 09:42:30 - UF2 - INFO - 监控线程启动
+2025-09-22 09:42:30 - UF1 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-22 09:42:30 - MainThread - INFO - 设备 'UF2' 的监控线程已启动。
+2025-09-22 09:42:30 - UF2 - INFO - 成功加载历史状态,上次周期结束时间: 2025-09-11 12:53:01
+2025-09-22 09:42:30 - UF3 - INFO - 监控线程启动
+2025-09-22 09:42:30 - MainThread - INFO - 设备 'UF3' 的监控线程已启动。
+2025-09-22 09:42:30 - UF2 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-22 09:42:30 - UF3 - INFO - 成功加载历史状态,上次周期结束时间: 2025-09-09 22:17:55
+2025-09-22 09:42:30 - UF4 - INFO - 监控线程启动
+2025-09-22 09:42:30 - MainThread - INFO - 设备 'UF4' 的监控线程已启动。
+2025-09-22 09:42:30 - UF3 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-22 09:42:30 - UF4 - INFO - 成功加载历史状态,上次周期结束时间: 2025-09-12 02:54:24
+2025-09-22 09:42:30 - UF4 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-22 10:35:15 - MainThread - INFO - ========================================
+2025-09-22 10:35:15 - MainThread - INFO - ===      启动超滤并行监控服务      ===
+2025-09-22 10:35:15 - MainThread - INFO - ========================================
+2025-09-22 10:35:15 - MainThread - INFO - 成功从状态文件 'device_states.json' 加载设备历史状态。
+2025-09-22 10:35:15 - UF1 - INFO - 监控线程启动
+2025-09-22 10:35:15 - MainThread - INFO - 设备 'UF1' 的监控线程已启动。
+2025-09-22 10:35:15 - UF1 - INFO - 成功加载历史状态,上次周期结束时间: 2025-09-19 22:50:46
+2025-09-22 10:35:15 - UF2 - INFO - 监控线程启动
+2025-09-22 10:35:15 - MainThread - INFO - 设备 'UF2' 的监控线程已启动。
+2025-09-22 10:35:15 - UF1 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-22 10:35:15 - UF2 - INFO - 成功加载历史状态,上次周期结束时间: 2025-09-19 20:15:11
+2025-09-22 10:35:15 - UF3 - INFO - 监控线程启动
+2025-09-22 10:35:15 - MainThread - INFO - 设备 'UF3' 的监控线程已启动。
+2025-09-22 10:35:15 - UF2 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-22 10:35:15 - UF3 - INFO - 成功加载历史状态,上次周期结束时间: 2025-09-20 00:22:26
+2025-09-22 10:35:15 - UF4 - INFO - 监控线程启动
+2025-09-22 10:35:15 - MainThread - INFO - 设备 'UF4' 的监控线程已启动。
+2025-09-22 10:35:15 - UF3 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-22 10:35:15 - UF4 - INFO - 成功加载历史状态,上次周期结束时间: 2025-09-20 15:31:51
+2025-09-22 10:35:15 - UF4 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-22 14:31:06 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-22 15:55:58 - UF1 - INFO - 触发条件满足,进入数据收集阶段。
+2025-09-22 15:55:58 - UF1 - INFO - [阶段2] 开始监控TMP数据变化,需收集 10 个稳定数据点
+2025-09-22 15:55:58 - UF1 - INFO - 获取到TMP初始基准值: 0.0206
+2025-09-22 17:12:02 - UF1 - INFO - TMP数据变化: 0.0206 -> 0.0165 [已收集 1/10]
+2025-09-22 17:12:11 - UF1 - INFO - TMP数据变化: 0.0165 -> 0.0161 [已收集 2/10]
+2025-09-22 17:12:13 - UF1 - INFO - TMP数据变化: 0.0161 -> 0.0167 [已收集 3/10]
+2025-09-22 17:12:22 - UF1 - INFO - TMP数据变化: 0.0167 -> 0.0161 [已收集 4/10]
+2025-09-22 17:12:24 - UF1 - INFO - TMP数据变化: 0.0161 -> 0.0163 [已收集 5/10]
+2025-09-22 17:12:28 - UF1 - INFO - TMP数据变化: 0.0163 -> 0.0161 [已收集 6/10]
+2025-09-22 17:12:33 - UF1 - INFO - TMP数据变化: 0.0161 -> 0.0163 [已收集 7/10]
+2025-09-22 17:12:35 - UF1 - INFO - TMP数据变化: 0.0163 -> 0.0165 [已收集 8/10]
+2025-09-22 17:12:39 - UF1 - INFO - TMP数据变化: 0.0165 -> 0.0160 [已收集 9/10]
+2025-09-22 17:12:41 - UF1 - INFO - TMP数据变化: 0.0160 -> 0.0163 [已收集 10/10]
+2025-09-22 17:12:43 - UF1 - INFO - [阶段3] 数据收集完成,开始计算决策
+2025-09-22 17:12:43 - UF1 - INFO - TMP中位数计算完成: 0.0163
+2025-09-22 17:12:43 - UF1 - INFO - [DB] 正在查询 'C.M.UF1_DB@press_PV' 从 2025-09-19 22:50:46 到 2025-09-22 17:12:43 的历史极值...
+2025-09-22 17:12:43 - UF1 - INFO -
+            SELECT
+                MAX(val) AS max_val,
+                MIN(val) AS min_val
+            FROM dc_item_history_data_minute
+            WHERE project_id = %s
+              AND item_name = %s
+              AND h_time IN (
+                  SELECT h_time
+                  FROM dc_item_history_data_minute
+                  WHERE project_id = %s
+                    AND item_name = %s
+                    AND val = 26
+                    AND h_time BETWEEN %s AND %s
+              )
+
+2025-09-22 17:12:43 - UF1 - CRITICAL - 监控主循环发生严重异常: 0
+Traceback (most recent call last):
+  File "/home/wangmingyang/projects/wuhan/caijun/uf/v2/loop_main.py", line 446, in monitor_device
+    max_tmp, min_tmp = get_tmp_extremes(device["press_pv_item"], start_query_time, current_decision_time, _word_controldevice)
+  File "/home/wangmingyang/projects/wuhan/caijun/uf/v2/loop_main.py", line 254, in get_tmp_extremes
+    if result and result[0] is not None and result[1] is not None:  # 通过索引访问
+KeyError: 0
+2025-09-22 17:12:43 - UF1 - INFO - 等待60秒后,线程将自动重试...
+2025-09-22 17:13:43 - UF1 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-22 19:37:42 - UF2 - INFO - 触发条件满足,进入数据收集阶段。
+2025-09-22 19:37:42 - UF2 - INFO - [阶段2] 开始监控TMP数据变化,需收集 10 个稳定数据点
+2025-09-22 19:37:42 - UF2 - INFO - 获取到TMP初始基准值: 0.0194
+2025-09-22 20:02:35 - UF2 - INFO - TMP数据变化: 0.0194 -> 0.0136 [已收集 1/10]
+2025-09-22 20:02:37 - UF2 - INFO - TMP数据变化: 0.0136 -> 0.0135 [已收集 2/10]
+2025-09-22 20:02:41 - UF2 - INFO - TMP数据变化: 0.0135 -> 0.0136 [已收集 3/10]
+2025-09-22 20:02:45 - UF2 - INFO - TMP数据变化: 0.0136 -> 0.0135 [已收集 4/10]
+2025-09-22 20:02:48 - UF2 - INFO - TMP数据变化: 0.0135 -> 0.0136 [已收集 5/10]
+2025-09-22 20:02:52 - UF2 - INFO - TMP数据变化: 0.0136 -> 0.0133 [已收集 6/10]
+2025-09-22 20:02:56 - UF2 - INFO - TMP数据变化: 0.0133 -> 0.0136 [已收集 7/10]
+2025-09-22 20:02:58 - UF2 - INFO - TMP数据变化: 0.0136 -> 0.0144 [已收集 8/10]
+2025-09-22 20:03:03 - UF2 - INFO - TMP数据变化: 0.0144 -> 0.0146 [已收集 9/10]
+2025-09-22 20:03:05 - UF2 - INFO - TMP数据变化: 0.0146 -> 0.0150 [已收集 10/10]
+2025-09-22 20:03:07 - UF2 - INFO - [阶段3] 数据收集完成,开始计算决策
+2025-09-22 20:03:07 - UF2 - INFO - TMP中位数计算完成: 0.0136
+2025-09-22 20:03:07 - UF2 - INFO - [DB] 正在查询 'C.M.UF2_DB@press_PV' 从 2025-09-19 20:15:11 到 2025-09-22 20:03:07 的历史极值...
+2025-09-22 20:03:07 - UF2 - INFO -
+            SELECT
+                MAX(val) AS max_val,
+                MIN(val) AS min_val
+            FROM dc_item_history_data_minute
+            WHERE project_id = %s
+              AND item_name = %s
+              AND h_time IN (
+                  SELECT h_time
+                  FROM dc_item_history_data_minute
+                  WHERE project_id = %s
+                    AND item_name = %s
+                    AND val = 26
+                    AND h_time BETWEEN %s AND %s
+              )
+
+2025-09-22 20:03:07 - UF2 - CRITICAL - 监控主循环发生严重异常: 0
+Traceback (most recent call last):
+  File "/home/wangmingyang/projects/wuhan/caijun/uf/v2/loop_main.py", line 446, in monitor_device
+    max_tmp, min_tmp = get_tmp_extremes(device["press_pv_item"], start_query_time, current_decision_time, _word_controldevice)
+  File "/home/wangmingyang/projects/wuhan/caijun/uf/v2/loop_main.py", line 254, in get_tmp_extremes
+    if result and result[0] is not None and result[1] is not None:  # 通过索引访问
+KeyError: 0
+2025-09-22 20:03:07 - UF2 - INFO - 等待60秒后,线程将自动重试...
+2025-09-22 20:04:07 - UF2 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-22 20:43:40 - UF3 - INFO - 触发条件满足,进入数据收集阶段。
+2025-09-22 20:43:40 - UF3 - INFO - [阶段2] 开始监控TMP数据变化,需收集 10 个稳定数据点
+2025-09-22 20:43:41 - UF3 - INFO - 获取到TMP初始基准值: 0.0175
+2025-09-22 21:25:27 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-22 22:19:59 - UF3 - INFO - TMP数据变化: 0.0175 -> 0.0142 [已收集 1/10]
+2025-09-22 22:20:01 - UF3 - INFO - TMP数据变化: 0.0142 -> 0.0146 [已收集 2/10]
+2025-09-22 22:20:12 - UF3 - INFO - TMP数据变化: 0.0146 -> 0.0144 [已收集 3/10]
+2025-09-22 22:20:14 - UF3 - INFO - TMP数据变化: 0.0144 -> 0.0146 [已收集 4/10]
+2025-09-22 22:20:16 - UF3 - INFO - TMP数据变化: 0.0146 -> 0.0144 [已收集 5/10]
+2025-09-22 22:20:21 - UF3 - INFO - TMP数据变化: 0.0144 -> 0.0142 [已收集 6/10]
+2025-09-22 22:20:23 - UF3 - INFO - TMP数据变化: 0.0142 -> 0.0146 [已收集 7/10]
+2025-09-22 22:20:32 - UF3 - INFO - TMP数据变化: 0.0146 -> 0.0140 [已收集 8/10]
+2025-09-22 22:20:34 - UF3 - INFO - TMP数据变化: 0.0140 -> 0.0144 [已收集 9/10]
+2025-09-22 22:20:38 - UF3 - INFO - TMP数据变化: 0.0144 -> 0.0142 [已收集 10/10]
+2025-09-22 22:20:40 - UF3 - INFO - [阶段3] 数据收集完成,开始计算决策
+2025-09-22 22:20:40 - UF3 - INFO - TMP中位数计算完成: 0.0144
+2025-09-22 22:20:40 - UF3 - INFO - [DB] 正在查询 'C.M.UF3_DB@press_PV' 从 2025-09-20 00:22:26 到 2025-09-22 22:20:40 的历史极值...
+2025-09-22 22:20:40 - UF3 - INFO -
+            SELECT
+                MAX(val) AS max_val,
+                MIN(val) AS min_val
+            FROM dc_item_history_data_minute
+            WHERE project_id = %s
+              AND item_name = %s
+              AND h_time IN (
+                  SELECT h_time
+                  FROM dc_item_history_data_minute
+                  WHERE project_id = %s
+                    AND item_name = %s
+                    AND val = 26
+                    AND h_time BETWEEN %s AND %s
+              )
+
+2025-09-22 22:20:40 - UF3 - CRITICAL - 监控主循环发生严重异常: 0
+Traceback (most recent call last):
+  File "/home/wangmingyang/projects/wuhan/caijun/uf/v2/loop_main.py", line 446, in monitor_device
+    max_tmp, min_tmp = get_tmp_extremes(device["press_pv_item"], start_query_time, current_decision_time, _word_controldevice)
+  File "/home/wangmingyang/projects/wuhan/caijun/uf/v2/loop_main.py", line 254, in get_tmp_extremes
+    if result and result[0] is not None and result[1] is not None:  # 通过索引访问
+KeyError: 0
+2025-09-22 22:20:40 - UF3 - INFO - 等待60秒后,线程将自动重试...
+2025-09-22 22:21:40 - UF3 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-23 09:43:26 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-23 10:16:23 - UF4 - INFO - 触发条件满足,进入数据收集阶段。
+2025-09-23 10:16:23 - UF4 - INFO - [阶段2] 开始监控TMP数据变化,需收集 10 个稳定数据点
+2025-09-23 10:16:23 - UF4 - INFO - 获取到TMP初始基准值: 0.0152
+2025-09-23 10:33:34 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-23 10:35:44 - UF4 - INFO - TMP数据变化: 0.0152 -> 0.0102 [已收集 1/10]
+2025-09-23 10:35:49 - UF4 - INFO - TMP数据变化: 0.0102 -> 0.0100 [已收集 2/10]
+2025-09-23 10:35:51 - UF4 - INFO - TMP数据变化: 0.0100 -> 0.0098 [已收集 3/10]
+2025-09-23 10:35:53 - UF4 - INFO - TMP数据变化: 0.0098 -> 0.0094 [已收集 4/10]
+2025-09-23 10:35:55 - UF4 - INFO - TMP数据变化: 0.0094 -> 0.0102 [已收集 5/10]
+2025-09-23 10:36:00 - UF4 - INFO - TMP数据变化: 0.0102 -> 0.0100 [已收集 6/10]
+2025-09-23 10:36:03 - UF4 - INFO - TMP数据变化: 0.0100 -> 0.0098 [已收集 7/10]
+2025-09-23 10:36:09 - UF4 - INFO - TMP数据变化: 0.0098 -> 0.0106 [已收集 8/10]
+2025-09-23 10:36:11 - UF4 - INFO - TMP数据变化: 0.0106 -> 0.0112 [已收集 9/10]
+2025-09-23 10:36:13 - UF4 - INFO - TMP数据变化: 0.0112 -> 0.0110 [已收集 10/10]
+2025-09-23 10:36:15 - UF4 - INFO - [阶段3] 数据收集完成,开始计算决策
+2025-09-23 10:36:15 - UF4 - INFO - TMP中位数计算完成: 0.0101
+2025-09-23 10:36:15 - UF4 - INFO - [DB] 正在查询 'C.M.UF4_DB@press_PV' 从 2025-09-20 15:31:51 到 2025-09-23 10:36:15 的历史极值...
+2025-09-23 10:36:15 - UF4 - INFO -
+            SELECT
+                MAX(val) AS max_val,
+                MIN(val) AS min_val
+            FROM dc_item_history_data_minute
+            WHERE project_id = %s
+              AND item_name = %s
+              AND h_time IN (
+                  SELECT h_time
+                  FROM dc_item_history_data_minute
+                  WHERE project_id = %s
+                    AND item_name = %s
+                    AND val = 26
+                    AND h_time BETWEEN %s AND %s
+              )
+
+2025-09-23 10:36:15 - UF4 - CRITICAL - 监控主循环发生严重异常: 0
+Traceback (most recent call last):
+  File "/home/wangmingyang/projects/wuhan/caijun/uf/v2/loop_main.py", line 446, in monitor_device
+    max_tmp, min_tmp = get_tmp_extremes(device["press_pv_item"], start_query_time, current_decision_time, _word_controldevice)
+  File "/home/wangmingyang/projects/wuhan/caijun/uf/v2/loop_main.py", line 254, in get_tmp_extremes
+    if result and result[0] is not None and result[1] is not None:  # 通过索引访问
+KeyError: 0
+2025-09-23 10:36:15 - UF4 - INFO - 等待60秒后,线程将自动重试...
+2025-09-23 10:37:15 - UF4 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-23 11:30:42 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-23 11:55:48 - MainThread - INFO - ========================================
+2025-09-23 11:55:48 - MainThread - INFO - ===      启动超滤并行监控服务      ===
+2025-09-23 11:55:48 - MainThread - INFO - ========================================
+2025-09-23 11:55:48 - MainThread - INFO - 成功从状态文件 'device_states.json' 加载设备历史状态。
+2025-09-23 11:55:48 - UF1 - INFO - 监控线程启动
+2025-09-23 11:55:48 - MainThread - INFO - 设备 'UF1' 的监控线程已启动。
+2025-09-23 11:55:48 - UF1 - INFO - 成功加载历史状态,上次周期结束时间: 2025-09-19 22:50:46
+2025-09-23 11:55:48 - UF2 - INFO - 监控线程启动
+2025-09-23 11:55:48 - UF1 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-23 11:55:48 - MainThread - INFO - 设备 'UF2' 的监控线程已启动。
+2025-09-23 11:55:48 - UF2 - INFO - 成功加载历史状态,上次周期结束时间: 2025-09-19 20:15:11
+2025-09-23 11:55:48 - UF3 - INFO - 监控线程启动
+2025-09-23 11:55:48 - MainThread - INFO - 设备 'UF3' 的监控线程已启动。
+2025-09-23 11:55:48 - UF2 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-23 11:55:48 - UF3 - INFO - 成功加载历史状态,上次周期结束时间: 2025-09-20 00:22:26
+2025-09-23 11:55:48 - UF4 - INFO - 监控线程启动
+2025-09-23 11:55:48 - MainThread - INFO - 设备 'UF4' 的监控线程已启动。
+2025-09-23 11:55:48 - UF3 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-23 11:55:48 - UF4 - INFO - 成功加载历史状态,上次周期结束时间: 2025-09-20 15:31:51
+2025-09-23 11:55:48 - UF4 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-24 16:46:51 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-24 18:28:49 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-24 18:53:03 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-24 18:58:31 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-24 19:02:19 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-24 19:14:10 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-24 20:19:35 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-24 21:19:30 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-24 21:50:38 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-24 21:52:06 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-24 21:58:59 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-25 01:18:11 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-25 02:24:29 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-25 02:56:45 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-25 03:18:21 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-25 03:46:04 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-25 04:13:34 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-25 05:17:47 - UF1 - INFO - 触发条件满足,进入数据收集阶段。
+2025-09-25 05:17:47 - UF1 - INFO - [阶段2] 开始监控TMP数据变化,需收集 10 个稳定数据点
+2025-09-25 05:17:47 - UF1 - INFO - 获取到TMP初始基准值: 0.0261
+2025-09-25 05:26:09 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-25 05:29:06 - UF1 - INFO - TMP数据变化: 0.0261 -> 0.0200 [已收集 1/10]
+2025-09-25 05:29:11 - UF1 - INFO - TMP数据变化: 0.0200 -> 0.0202 [已收集 2/10]
+2025-09-25 05:29:13 - UF1 - INFO - TMP数据变化: 0.0202 -> 0.0200 [已收集 3/10]
+2025-09-25 05:29:19 - UF1 - INFO - TMP数据变化: 0.0200 -> 0.0204 [已收集 4/10]
+2025-09-25 05:29:24 - UF1 - INFO - TMP数据变化: 0.0204 -> 0.0202 [已收集 5/10]
+2025-09-25 05:29:26 - UF1 - INFO - TMP数据变化: 0.0202 -> 0.0198 [已收集 6/10]
+2025-09-25 05:29:28 - UF1 - INFO - TMP数据变化: 0.0198 -> 0.0194 [已收集 7/10]
+2025-09-25 05:29:30 - UF1 - INFO - TMP数据变化: 0.0194 -> 0.0200 [已收集 8/10]
+2025-09-25 05:29:34 - UF1 - INFO - TMP数据变化: 0.0200 -> 0.0204 [已收集 9/10]
+2025-09-25 05:29:36 - UF1 - INFO - TMP数据变化: 0.0204 -> 0.0200 [已收集 10/10]
+2025-09-25 05:29:38 - UF1 - INFO - [阶段3] 数据收集完成,开始计算决策
+2025-09-25 05:29:38 - UF1 - INFO - TMP中位数计算完成: 0.0200
+2025-09-25 05:29:38 - UF1 - INFO - [DB] 正在查询 'C.M.UF1_DB@press_PV' 从 2025-09-19 22:50:46 到 2025-09-25 05:29:38 的历史极值...
+2025-09-25 05:29:38 - UF1 - INFO -
+            SELECT
+                MAX(val) AS max_val,
+                MIN(val) AS min_val
+            FROM dc_item_history_data_minute
+            WHERE project_id = %s
+              AND item_name = %s
+              AND h_time IN (
+                  SELECT h_time
+                  FROM dc_item_history_data_minute
+                  WHERE project_id = %s
+                    AND item_name = %s
+                    AND val = 26
+                    AND h_time BETWEEN %s AND %s
+              )
+
+2025-09-25 05:29:39 - UF1 - INFO - {'max_val': Decimal('0.028260'), 'min_val': Decimal('0.008074')}
+2025-09-25 05:29:39 - UF1 - INFO - [DB] 查询成功: 最大值=0.02826, 最小值=0.008074
+2025-09-25 05:29:39 - UF1 - INFO - 开始DQN模型决策...
+2025-09-25 05:29:39 - UF1 - INFO - DQN决策结果: {'action': 33, 'L_s': 4100.0, 't_bw_s': 96.0, 'next_obs': array([0.25], dtype=float32), 'reward': np.float64(0.8638577479265335), 'terminated': False, 'truncated': False, 'info': {'recovery': 0.9331746976006345, 'V_feed_super_m3': 16810.0, 'V_loss_super_m3': 1123.3333333333335, 'V_net_super_m3': 15686.666666666666, 'supercycle_time_h': np.float64(48.45444444444444), 'net_delivery_rate_m3ph': np.float64(323.74051227957534), 'max_TMP_during_filtration': 0.027394419207413877, 'max_residual_increase_per_run': 0.00016639527595347162, 'phi_bw_effective': 0.7747177964240509, 'TMP_after_ceb': 0.02, 'headroom_ratio': 0.456573653456898, 'daily_prod_time_h': np.float64(23.128253342200004), 'ton_water_energy_kWh_per_m3': 0.1015, 'k_bw_per_ceb': 41, 'feasible': True, 'step': 1}}
+2025-09-25 05:29:39 - UF1 - INFO - [UF1][回调] 准备发送决策数据:
+{
+  "list": [
+    {
+      "type": "UF1",
+      "project_id": 92,
+      "water_production_time": 4100,
+      "physical_backwash": 96,
+      "ceb_backwash_frequency": 41,
+      "duration_system": 3800,
+      "tmp_action": 0.02,
+      "recovery_rate": 0.9331746976006345,
+      "ton_water_energy_kWh": 0.1015,
+      "max_permeability": 870.8508793658658,
+      "daily_prod_time_h": 23.128253342200004,
+      "ctime": "2025-09-25 05:29:38"
+    }
+  ]
+}
+2025-09-25 05:29:39 - UF1 - INFO - [UF1][回调] 第 1/3 次尝试发送...
+2025-09-25 05:29:39 - UF1 - INFO - [UF1][回调] 决策数据发送成功!服务器响应: {"code":200,"msg":"success"}
+2025-09-25 05:29:39 - UF1 - INFO - 配置项 use_model=0,跳过PLC指令下发。
+2025-09-25 05:29:39 - UF1 - INFO - [UF1] 状态已成功保存到 'device_states.json'。
+2025-09-25 05:29:39 - UF1 - INFO - 本轮决策完成,状态已更新并保存。下轮历史查询起始时间将是: 2025-09-25 05:29:38
+2025-09-25 05:29:39 - UF1 - INFO - [阶段4] 等待重置条件 (控制字 != 95)
+2025-09-25 05:29:39 - UF1 - INFO - 重置条件满足,即将开始新一轮监控。
+2025-09-25 05:29:39 - UF1 - INFO - --- UF1 本轮监控完成,重启循环 ---
+
+2025-09-25 05:29:39 - UF1 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-25 10:54:49 - UF2 - INFO - 触发条件满足,进入数据收集阶段。
+2025-09-25 10:54:49 - UF2 - INFO - [阶段2] 开始监控TMP数据变化,需收集 10 个稳定数据点
+2025-09-25 10:54:49 - UF2 - INFO - 获取到TMP初始基准值: 0.029
+2025-09-25 11:28:11 - UF2 - INFO - TMP数据变化: 0.0290 -> 0.0142 [已收集 1/10]
+2025-09-25 11:28:13 - UF2 - INFO - TMP数据变化: 0.0142 -> 0.0144 [已收集 2/10]
+2025-09-25 11:28:15 - UF2 - INFO - TMP数据变化: 0.0144 -> 0.0146 [已收集 3/10]
+2025-09-25 11:28:20 - UF2 - INFO - TMP数据变化: 0.0146 -> 0.0138 [已收集 4/10]
+2025-09-25 11:28:22 - UF2 - INFO - TMP数据变化: 0.0138 -> 0.0146 [已收集 5/10]
+2025-09-25 11:28:24 - UF2 - INFO - TMP数据变化: 0.0146 -> 0.0144 [已收集 6/10]
+2025-09-25 11:28:33 - UF2 - INFO - TMP数据变化: 0.0144 -> 0.0142 [已收集 7/10]
+2025-09-25 11:28:35 - UF2 - INFO - TMP数据变化: 0.0142 -> 0.0144 [已收集 8/10]
+2025-09-25 11:28:39 - UF2 - INFO - TMP数据变化: 0.0144 -> 0.0146 [已收集 9/10]
+2025-09-25 11:28:43 - UF2 - INFO - TMP数据变化: 0.0146 -> 0.0144 [已收集 10/10]
+2025-09-25 11:28:45 - UF2 - INFO - [阶段3] 数据收集完成,开始计算决策
+2025-09-25 11:28:45 - UF2 - INFO - TMP中位数计算完成: 0.0144
+2025-09-25 11:28:45 - UF2 - INFO - [DB] 正在查询 'C.M.UF2_DB@press_PV' 从 2025-09-19 20:15:11 到 2025-09-25 11:28:45 的历史极值...
+2025-09-25 11:28:45 - UF2 - INFO -
+            SELECT
+                MAX(val) AS max_val,
+                MIN(val) AS min_val
+            FROM dc_item_history_data_minute
+            WHERE project_id = %s
+              AND item_name = %s
+              AND h_time IN (
+                  SELECT h_time
+                  FROM dc_item_history_data_minute
+                  WHERE project_id = %s
+                    AND item_name = %s
+                    AND val = 26
+                    AND h_time BETWEEN %s AND %s
+              )
+
+2025-09-25 11:28:46 - UF2 - INFO - {'max_val': Decimal('0.028645'), 'min_val': Decimal('0.008267')}
+2025-09-25 11:28:46 - UF2 - INFO - [DB] 查询成功: 最大值=0.028645, 最小值=0.008267
+2025-09-25 11:28:46 - UF2 - INFO - 开始DQN模型决策...
+2025-09-25 11:28:46 - UF2 - INFO - DQN决策结果: {'action': 31, 'L_s': 4100.0, 't_bw_s': 92.0, 'next_obs': array([0.11], dtype=float32), 'reward': np.float64(0.8891671076337718), 'terminated': False, 'truncated': False, 'info': {'recovery': 0.9358847247009056, 'V_feed_super_m3': 16810.0, 'V_loss_super_m3': 1077.7777777777778, 'V_net_super_m3': 15732.222222222223, 'supercycle_time_h': np.float64(48.40888888888889), 'net_delivery_rate_m3ph': np.float64(324.98622842453176), 'max_TMP_during_filtration': 0.021933146643538782, 'max_residual_increase_per_run': 0.00016986346185659564, 'phi_bw_effective': 0.7700222270445147, 'TMP_after_ceb': 0.0144, 'headroom_ratio': 0.3655524440589797, 'daily_prod_time_h': np.float64(23.150018362100624), 'ton_water_energy_kWh_per_m3': 0.1015, 'k_bw_per_ceb': 41, 'feasible': True, 'step': 1}}
+2025-09-25 11:28:46 - UF2 - INFO - [UF2][回调] 准备发送决策数据:
+{
+  "list": [
+    {
+      "type": "UF2",
+      "project_id": 92,
+      "water_production_time": 4100,
+      "physical_backwash": 94,
+      "ceb_backwash_frequency": 41,
+      "duration_system": 4200,
+      "tmp_action": 0.0144,
+      "recovery_rate": 0.9345297111507701,
+      "ton_water_energy_kWh": 0.1015,
+      "max_permeability": 850.5201403169227,
+      "daily_prod_time_h": 23.13913073402388,
+      "ctime": "2025-09-25 11:28:45"
+    }
+  ]
+}
+2025-09-25 11:28:46 - UF2 - INFO - [UF2][回调] 第 1/3 次尝试发送...
+2025-09-25 11:28:46 - UF2 - INFO - [UF2][回调] 决策数据发送成功!服务器响应: {"code":200,"msg":"success"}
+2025-09-25 11:28:46 - UF2 - INFO - 配置项 use_model=0,跳过PLC指令下发。
+2025-09-25 11:28:46 - UF2 - INFO - [UF2] 状态已成功保存到 'device_states.json'。
+2025-09-25 11:28:46 - UF2 - INFO - 本轮决策完成,状态已更新并保存。下轮历史查询起始时间将是: 2025-09-25 11:28:45
+2025-09-25 11:28:46 - UF2 - INFO - [阶段4] 等待重置条件 (控制字 != 95)
+2025-09-25 11:28:46 - UF2 - INFO - 重置条件满足,即将开始新一轮监控。
+2025-09-25 11:28:46 - UF2 - INFO - --- UF2 本轮监控完成,重启循环 ---
+
+2025-09-25 11:28:46 - UF2 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-25 13:07:27 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-25 13:10:16 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-25 13:45:51 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-25 13:53:37 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-25 13:53:38 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-25 14:32:03 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-25 15:51:45 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-25 16:03:15 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-25 16:04:21 - UF3 - INFO - 触发条件满足,进入数据收集阶段。
+2025-09-25 16:04:21 - UF3 - INFO - [阶段2] 开始监控TMP数据变化,需收集 10 个稳定数据点
+2025-09-25 16:04:21 - UF3 - INFO - 获取到TMP初始基准值: 0.0081
+2025-09-25 16:08:44 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-25 16:38:40 - UF3 - INFO - TMP数据变化: 0.0081 -> 0.0062 [已收集 1/10]
+2025-09-25 16:38:42 - UF3 - INFO - TMP数据变化: 0.0062 -> 0.0060 [已收集 2/10]
+2025-09-25 16:38:53 - UF3 - INFO - TMP数据变化: 0.0060 -> 0.0062 [已收集 3/10]
+2025-09-25 16:38:57 - UF3 - INFO - TMP数据变化: 0.0062 -> 0.0063 [已收集 4/10]
+2025-09-25 16:39:02 - UF3 - INFO - TMP数据变化: 0.0063 -> 0.0065 [已收集 5/10]
+2025-09-25 16:39:04 - UF3 - INFO - TMP数据变化: 0.0065 -> 0.0063 [已收集 6/10]
+2025-09-25 16:39:06 - UF3 - INFO - TMP数据变化: 0.0063 -> 0.0062 [已收集 7/10]
+2025-09-25 16:39:08 - UF3 - INFO - TMP数据变化: 0.0062 -> 0.0060 [已收集 8/10]
+2025-09-25 16:39:13 - UF3 - INFO - TMP数据变化: 0.0060 -> 0.0058 [已收集 9/10]
+2025-09-25 16:39:15 - UF3 - INFO - TMP数据变化: 0.0058 -> 0.0065 [已收集 10/10]
+2025-09-25 16:39:17 - UF3 - INFO - [阶段3] 数据收集完成,开始计算决策
+2025-09-25 16:39:17 - UF3 - INFO - TMP中位数计算完成: 0.0062
+2025-09-25 16:39:17 - UF3 - INFO - [DB] 正在查询 'C.M.UF3_DB@press_PV' 从 2025-09-20 00:22:26 到 2025-09-25 16:39:17 的历史极值...
+2025-09-25 16:39:17 - UF3 - INFO -
+            SELECT
+                MAX(val) AS max_val,
+                MIN(val) AS min_val
+            FROM dc_item_history_data_minute
+            WHERE project_id = %s
+              AND item_name = %s
+              AND h_time IN (
+                  SELECT h_time
+                  FROM dc_item_history_data_minute
+                  WHERE project_id = %s
+                    AND item_name = %s
+                    AND val = 26
+                    AND h_time BETWEEN %s AND %s
+              )
+
+2025-09-25 16:39:17 - UF3 - INFO - {'max_val': Decimal('0.037488'), 'min_val': Decimal('-0.002115')}
+2025-09-25 16:39:17 - UF3 - INFO - [DB] 查询成功: 最大值=0.037488, 最小值=-0.002115
+2025-09-25 16:39:17 - UF3 - INFO - 开始DQN模型决策...
+2025-09-25 16:39:17 - UF3 - INFO - DQN决策结果: {'action': 31, 'L_s': 4100.0, 't_bw_s': 92.0, 'next_obs': array([-0.095], dtype=float32), 'reward': np.float64(0.9135390747132748), 'terminated': False, 'truncated': False, 'info': {'recovery': 0.9358847247009056, 'V_feed_super_m3': 16810.0, 'V_loss_super_m3': 1077.7777777777778, 'V_net_super_m3': 15732.222222222223, 'supercycle_time_h': np.float64(48.40888888888889), 'net_delivery_rate_m3ph': np.float64(324.98622842453176), 'max_TMP_during_filtration': 0.01373314664353884, 'max_residual_increase_per_run': 0.0001698634618565965, 'phi_bw_effective': 0.7700222270445147, 'TMP_after_ceb': 0.0062, 'headroom_ratio': 0.228885777392314, 'daily_prod_time_h': np.float64(23.150018362100624), 'ton_water_energy_kWh_per_m3': 0.1015, 'k_bw_per_ceb': 41, 'feasible': True, 'step': 1}}
+2025-09-25 16:39:18 - UF3 - INFO - [UF3][回调] 准备发送决策数据:
+{
+  "list": [
+    {
+      "type": "UF3",
+      "project_id": 92,
+      "water_production_time": 4100,
+      "physical_backwash": 94,
+      "ceb_backwash_frequency": 41,
+      "duration_system": 4200,
+      "tmp_action": 0.0062,
+      "recovery_rate": 0.9345297111507701,
+      "ton_water_energy_kWh": 0.1015,
+      "max_permeability": -3324.4680851063827,
+      "daily_prod_time_h": 23.13913073402388,
+      "ctime": "2025-09-25 16:39:17"
+    }
+  ]
+}
+2025-09-25 16:39:18 - UF3 - INFO - [UF3][回调] 第 1/3 次尝试发送...
+2025-09-25 16:39:18 - UF3 - INFO - [UF3][回调] 决策数据发送成功!服务器响应: {"code":200,"msg":"success"}
+2025-09-25 16:39:18 - UF3 - INFO - 配置项 use_model=0,跳过PLC指令下发。
+2025-09-25 16:39:18 - UF3 - INFO - [UF3] 状态已成功保存到 'device_states.json'。
+2025-09-25 16:39:18 - UF3 - INFO - 本轮决策完成,状态已更新并保存。下轮历史查询起始时间将是: 2025-09-25 16:39:17
+2025-09-25 16:39:18 - UF3 - INFO - [阶段4] 等待重置条件 (控制字 != 95)
+2025-09-25 16:39:18 - UF3 - INFO - 重置条件满足,即将开始新一轮监控。
+2025-09-25 16:39:18 - UF3 - INFO - --- UF3 本轮监控完成,重启循环 ---
+
+2025-09-25 16:39:18 - UF3 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-25 17:33:42 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-25 17:48:59 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-25 18:05:45 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-25 18:57:48 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-25 19:48:16 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-25 19:48:17 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-25 19:50:00 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-25 20:00:29 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-25 21:47:24 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-25 22:32:35 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-25 22:34:21 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-25 23:27:48 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-25 23:37:18 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-25 23:49:54 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-26 00:25:34 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-26 00:25:34 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-26 02:52:57 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-26 03:08:33 - UF4 - INFO - 触发条件满足,进入数据收集阶段。
+2025-09-26 03:08:33 - UF4 - INFO - [阶段2] 开始监控TMP数据变化,需收集 10 个稳定数据点
+2025-09-26 03:08:33 - UF4 - INFO - 获取到TMP初始基准值: 0.016
+2025-09-26 03:26:00 - UF4 - INFO - TMP数据变化: 0.0160 -> 0.0117 [已收集 1/10]
+2025-09-26 03:26:02 - UF4 - INFO - TMP数据变化: 0.0117 -> 0.0119 [已收集 2/10]
+2025-09-26 03:26:04 - UF4 - INFO - TMP数据变化: 0.0119 -> 0.0121 [已收集 3/10]
+2025-09-26 03:26:09 - UF4 - INFO - TMP数据变化: 0.0121 -> 0.0119 [已收集 4/10]
+2025-09-26 03:26:15 - UF4 - INFO - TMP数据变化: 0.0119 -> 0.0117 [已收集 5/10]
+2025-09-26 03:26:17 - UF4 - INFO - TMP数据变化: 0.0117 -> 0.0123 [已收集 6/10]
+2025-09-26 03:26:19 - UF4 - INFO - TMP数据变化: 0.0123 -> 0.0121 [已收集 7/10]
+2025-09-26 03:26:24 - UF4 - INFO - TMP数据变化: 0.0121 -> 0.0119 [已收集 8/10]
+2025-09-26 03:26:26 - UF4 - INFO - TMP数据变化: 0.0119 -> 0.0123 [已收集 9/10]
+2025-09-26 03:26:30 - UF4 - INFO - TMP数据变化: 0.0123 -> 0.0119 [已收集 10/10]
+2025-09-26 03:26:32 - UF4 - INFO - [阶段3] 数据收集完成,开始计算决策
+2025-09-26 03:26:32 - UF4 - INFO - TMP中位数计算完成: 0.0119
+2025-09-26 03:26:32 - UF4 - INFO - [DB] 正在查询 'C.M.UF4_DB@press_PV' 从 2025-09-20 15:31:51 到 2025-09-26 03:26:32 的历史极值...
+2025-09-26 03:26:32 - UF4 - INFO -
+            SELECT
+                MAX(val) AS max_val,
+                MIN(val) AS min_val
+            FROM dc_item_history_data_minute
+            WHERE project_id = %s
+              AND item_name = %s
+              AND h_time IN (
+                  SELECT h_time
+                  FROM dc_item_history_data_minute
+                  WHERE project_id = %s
+                    AND item_name = %s
+                    AND val = 26
+                    AND h_time BETWEEN %s AND %s
+              )
+
+2025-09-26 03:26:32 - UF4 - INFO - {'max_val': Decimal('0.025376'), 'min_val': Decimal('0.003460')}
+2025-09-26 03:26:32 - UF4 - INFO - [DB] 查询成功: 最大值=0.025376, 最小值=0.00346
+2025-09-26 03:26:32 - UF4 - INFO - 开始DQN模型决策...
+2025-09-26 03:26:32 - UF4 - INFO - DQN决策结果: {'action': 31, 'L_s': 4100.0, 't_bw_s': 92.0, 'next_obs': array([0.0475], dtype=float32), 'reward': np.float64(0.8977850854019129), 'terminated': False, 'truncated': False, 'info': {'recovery': 0.9358847247009056, 'V_feed_super_m3': 16810.0, 'V_loss_super_m3': 1077.7777777777778, 'V_net_super_m3': 15732.222222222223, 'supercycle_time_h': np.float64(48.40888888888889), 'net_delivery_rate_m3ph': np.float64(324.98622842453176), 'max_TMP_during_filtration': 0.019433146643538807, 'max_residual_increase_per_run': 0.00016986346185659564, 'phi_bw_effective': 0.7700222270445147, 'TMP_after_ceb': 0.0119, 'headroom_ratio': 0.32388577739231345, 'daily_prod_time_h': np.float64(23.150018362100624), 'ton_water_energy_kWh_per_m3': 0.1015, 'k_bw_per_ceb': 41, 'feasible': True, 'step': 1}}
+2025-09-26 03:26:33 - UF4 - INFO - [UF4][回调] 准备发送决策数据:
+{
+  "list": [
+    {
+      "type": "UF4",
+      "project_id": 92,
+      "water_production_time": 4100,
+      "physical_backwash": 94,
+      "ceb_backwash_frequency": 41,
+      "duration_system": 4200,
+      "tmp_action": 0.0119,
+      "recovery_rate": 0.9345297111507701,
+      "ton_water_energy_kWh": 0.1015,
+      "max_permeability": 2032.1531791907514,
+      "daily_prod_time_h": 23.13913073402388,
+      "ctime": "2025-09-26 03:26:32"
+    }
+  ]
+}
+2025-09-26 03:26:33 - UF4 - INFO - [UF4][回调] 第 1/3 次尝试发送...
+2025-09-26 03:26:33 - UF4 - INFO - [UF4][回调] 决策数据发送成功!服务器响应: {"code":200,"msg":"success"}
+2025-09-26 03:26:33 - UF4 - INFO - 配置项 use_model=0,跳过PLC指令下发。
+2025-09-26 03:26:33 - UF4 - INFO - [UF4] 状态已成功保存到 'device_states.json'。
+2025-09-26 03:26:33 - UF4 - INFO - 本轮决策完成,状态已更新并保存。下轮历史查询起始时间将是: 2025-09-26 03:26:32
+2025-09-26 03:26:33 - UF4 - INFO - [阶段4] 等待重置条件 (控制字 != 95)
+2025-09-26 03:26:33 - UF4 - INFO - 重置条件满足,即将开始新一轮监控。
+2025-09-26 03:26:33 - UF4 - INFO - --- UF4 本轮监控完成,重启循环 ---
+
+2025-09-26 03:26:33 - UF4 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-26 03:33:41 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-26 04:55:34 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-26 06:18:21 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-26 06:53:18 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-26 07:22:08 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-26 07:22:08 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-26 07:27:36 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-26 07:43:06 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-26 07:49:36 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-26 08:44:29 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-26 08:55:34 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-26 09:19:22 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-26 09:47:12 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-26 09:54:03 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-26 10:10:57 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-26 11:48:06 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-26 11:53:39 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-26 12:42:34 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-26 12:47:31 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-26 15:38:39 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-26 15:40:06 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-26 18:12:09 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-26 18:33:18 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-26 18:42:06 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-26 19:47:52 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-26 20:01:40 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-26 21:24:43 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-26 22:44:06 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-26 22:44:18 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-26 23:11:12 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-27 00:26:48 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-27 01:13:52 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-27 02:23:42 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-27 03:21:42 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-27 03:21:43 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-27 03:51:12 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-27 03:52:12 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-27 03:52:12 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-27 03:56:21 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-27 04:32:52 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-27 04:32:54 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-27 04:37:57 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-27 06:41:06 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-27 06:41:43 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-27 06:41:44 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-27 06:52:40 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-27 06:54:09 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-27 07:24:59 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-27 08:51:42 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-27 08:53:13 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-27 08:54:53 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-27 09:02:06 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-27 09:02:44 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-27 11:50:09 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-27 13:09:18 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-27 13:25:56 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-27 15:28:42 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-27 15:51:00 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-27 16:26:15 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-27 16:45:33 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-27 18:59:58 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-27 19:36:17 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-27 21:06:31 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-27 21:17:45 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-27 21:24:43 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-27 21:37:54 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-27 22:07:09 - UF1 - INFO - 触发条件满足,进入数据收集阶段。
+2025-09-27 22:07:09 - UF1 - INFO - [阶段2] 开始监控TMP数据变化,需收集 10 个稳定数据点
+2025-09-27 22:07:09 - UF1 - INFO - 获取到TMP初始基准值: 0.0165
+2025-09-27 22:38:45 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-27 22:45:39 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-27 22:51:06 - UF1 - ERROR - [UF1][API] 获取'UF1_BW_After_TMP'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-27 23:29:58 - UF1 - INFO - TMP数据变化: 0.0165 -> 0.0106 [已收集 1/10]
+2025-09-27 23:30:00 - UF1 - INFO - TMP数据变化: 0.0106 -> 0.0102 [已收集 2/10]
+2025-09-27 23:30:03 - UF1 - INFO - TMP数据变化: 0.0102 -> 0.0104 [已收集 3/10]
+2025-09-27 23:30:09 - UF1 - INFO - TMP数据变化: 0.0104 -> 0.0106 [已收集 4/10]
+2025-09-27 23:30:11 - UF1 - INFO - TMP数据变化: 0.0106 -> 0.0104 [已收集 5/10]
+2025-09-27 23:30:13 - UF1 - INFO - TMP数据变化: 0.0104 -> 0.0106 [已收集 6/10]
+2025-09-27 23:30:24 - UF1 - INFO - TMP数据变化: 0.0106 -> 0.0110 [已收集 7/10]
+2025-09-27 23:30:26 - UF1 - INFO - TMP数据变化: 0.0110 -> 0.0112 [已收集 8/10]
+2025-09-27 23:30:28 - UF1 - INFO - TMP数据变化: 0.0112 -> 0.0119 [已收集 9/10]
+2025-09-27 23:30:30 - UF1 - INFO - TMP数据变化: 0.0119 -> 0.0117 [已收集 10/10]
+2025-09-27 23:30:32 - UF1 - INFO - [阶段3] 数据收集完成,开始计算决策
+2025-09-27 23:30:32 - UF1 - INFO - TMP中位数计算完成: 0.0106
+2025-09-27 23:30:32 - UF1 - INFO - [DB] 正在查询 'C.M.UF1_DB@press_PV' 从 2025-09-25 05:29:38 到 2025-09-27 23:30:32 的历史极值...
+2025-09-27 23:30:32 - UF1 - INFO -
+            SELECT
+                MAX(val) AS max_val,
+                MIN(val) AS min_val
+            FROM dc_item_history_data_minute
+            WHERE project_id = %s
+              AND item_name = %s
+              AND h_time IN (
+                  SELECT h_time
+                  FROM dc_item_history_data_minute
+                  WHERE project_id = %s
+                    AND item_name = %s
+                    AND val = 26
+                    AND h_time BETWEEN %s AND %s
+              )
+
+2025-09-27 23:30:32 - UF1 - INFO - {'max_val': Decimal('0.024800'), 'min_val': Decimal('0.003845')}
+2025-09-27 23:30:32 - UF1 - INFO - [DB] 查询成功: 最大值=0.0248, 最小值=0.003845
+2025-09-27 23:30:32 - UF1 - INFO - 开始DQN模型决策...
+2025-09-27 23:30:32 - UF1 - INFO - DQN决策结果: {'action': 31, 'L_s': 4100.0, 't_bw_s': 92.0, 'next_obs': array([0.015], dtype=float32), 'reward': np.float64(0.9018547671746796), 'terminated': False, 'truncated': False, 'info': {'recovery': 0.9358847247009056, 'V_feed_super_m3': 16810.0, 'V_loss_super_m3': 1077.7777777777778, 'V_net_super_m3': 15732.222222222223, 'supercycle_time_h': np.float64(48.40888888888889), 'net_delivery_rate_m3ph': np.float64(324.98622842453176), 'max_TMP_during_filtration': 0.01813314664353882, 'max_residual_increase_per_run': 0.00016986346185659564, 'phi_bw_effective': 0.7700222270445147, 'TMP_after_ceb': 0.0106, 'headroom_ratio': 0.302219110725647, 'daily_prod_time_h': np.float64(23.150018362100624), 'ton_water_energy_kWh_per_m3': 0.1015, 'k_bw_per_ceb': 41, 'feasible': True, 'step': 1}}
+2025-09-27 23:30:33 - UF1 - INFO - [UF1][回调] 准备发送决策数据:
+{
+  "list": [
+    {
+      "type": "UF1",
+      "project_id": 92,
+      "water_production_time": 4100,
+      "physical_backwash": 94,
+      "ceb_backwash_frequency": 41,
+      "duration_system": 4200,
+      "tmp_action": 0.0106,
+      "recovery_rate": 0.9345297111507701,
+      "ton_water_energy_kWh": 0.1015,
+      "max_permeability": 1828.6736020806243,
+      "daily_prod_time_h": 23.13913073402388,
+      "ctime": "2025-09-27 23:30:32"
+    }
+  ]
+}
+2025-09-27 23:30:33 - UF1 - INFO - [UF1][回调] 第 1/3 次尝试发送...
+2025-09-27 23:30:33 - UF1 - ERROR - [UF1][回调] 发送失败: 400 Client Error: Bad Request for url: http://120.55.44.4:8900/api/dtgateway/v1/decision/data
+2025-09-27 23:30:33 - UF1 - INFO - [UF1][回调] 60秒后将进行重试...
+2025-09-27 23:31:33 - UF1 - INFO - [UF1][回调] 第 2/3 次尝试发送...
+2025-09-27 23:31:33 - UF1 - ERROR - [UF1][回调] 发送失败: 400 Client Error: Bad Request for url: http://120.55.44.4:8900/api/dtgateway/v1/decision/data
+2025-09-27 23:31:33 - UF1 - INFO - [UF1][回调] 60秒后将进行重试...
+2025-09-27 23:32:33 - UF1 - INFO - [UF1][回调] 第 3/3 次尝试发送...
+2025-09-27 23:32:33 - UF1 - ERROR - [UF1][回调] 发送失败: 400 Client Error: Bad Request for url: http://120.55.44.4:8900/api/dtgateway/v1/decision/data
+2025-09-27 23:32:33 - UF1 - ERROR - [UF1][回调] 所有重试均失败,放弃发送决策数据。
+2025-09-27 23:32:33 - UF1 - INFO - 配置项 use_model=0,跳过PLC指令下发。
+2025-09-27 23:32:33 - UF1 - INFO - [UF1] 状态已成功保存到 'device_states.json'。
+2025-09-27 23:32:33 - UF1 - INFO - 本轮决策完成,状态已更新并保存。下轮历史查询起始时间将是: 2025-09-27 23:30:32
+2025-09-27 23:32:33 - UF1 - INFO - [阶段4] 等待重置条件 (控制字 != 95)
+2025-09-27 23:32:33 - UF1 - INFO - 重置条件满足,即将开始新一轮监控。
+2025-09-27 23:32:33 - UF1 - INFO - --- UF1 本轮监控完成,重启循环 ---
+
+2025-09-27 23:32:33 - UF1 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-28 01:09:13 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-28 03:50:52 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-28 04:12:00 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-28 05:10:33 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-28 06:24:57 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-28 08:05:42 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-28 08:29:54 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-28 08:32:19 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-28 09:20:15 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-28 09:22:41 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-28 10:16:09 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-28 10:53:42 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-28 11:26:42 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-28 11:28:09 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-28 11:47:57 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-28 13:03:44 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-28 13:08:24 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-28 13:41:08 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-28 13:50:42 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-28 13:53:54 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-28 14:36:21 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-28 14:47:06 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-28 15:06:03 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-28 15:14:15 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-28 15:45:50 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-28 15:45:51 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-28 15:45:51 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-28 16:02:45 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-28 16:10:00 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-28 16:52:39 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-28 17:14:30 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-28 17:20:29 - UF3 - INFO - 触发条件满足,进入数据收集阶段。
+2025-09-28 17:20:29 - UF3 - INFO - [阶段2] 开始监控TMP数据变化,需收集 10 个稳定数据点
+2025-09-28 17:20:29 - UF3 - INFO - 获取到TMP初始基准值: 0.0277
+2025-09-28 17:31:07 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-28 17:33:40 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-28 18:05:50 - UF2 - INFO - 触发条件满足,进入数据收集阶段。
+2025-09-28 18:05:50 - UF2 - INFO - [阶段2] 开始监控TMP数据变化,需收集 10 个稳定数据点
+2025-09-28 18:05:50 - UF2 - INFO - 获取到TMP初始基准值: 0.0163
+2025-09-28 18:26:14 - UF2 - INFO - TMP数据变化: 0.0163 -> 0.0112 [已收集 1/10]
+2025-09-28 18:26:18 - UF2 - INFO - TMP数据变化: 0.0112 -> 0.0115 [已收集 2/10]
+2025-09-28 18:26:23 - UF2 - INFO - TMP数据变化: 0.0115 -> 0.0110 [已收集 3/10]
+2025-09-28 18:26:25 - UF2 - INFO - TMP数据变化: 0.0110 -> 0.0117 [已收集 4/10]
+2025-09-28 18:26:30 - UF2 - INFO - TMP数据变化: 0.0117 -> 0.0123 [已收集 5/10]
+2025-09-28 18:26:32 - UF2 - INFO - TMP数据变化: 0.0123 -> 0.0121 [已收集 6/10]
+2025-09-28 18:26:34 - UF2 - INFO - TMP数据变化: 0.0121 -> 0.0113 [已收集 7/10]
+2025-09-28 18:26:36 - UF2 - INFO - TMP数据变化: 0.0113 -> 0.0121 [已收集 8/10]
+2025-09-28 18:26:42 - UF2 - INFO - TMP数据变化: 0.0121 -> 0.0115 [已收集 9/10]
+2025-09-28 18:26:44 - UF2 - INFO - TMP数据变化: 0.0115 -> 0.0121 [已收集 10/10]
+2025-09-28 18:26:46 - UF2 - INFO - [阶段3] 数据收集完成,开始计算决策
+2025-09-28 18:26:46 - UF2 - INFO - TMP中位数计算完成: 0.0116
+2025-09-28 18:26:46 - UF2 - INFO - [DB] 正在查询 'C.M.UF2_DB@press_PV' 从 2025-09-25 11:28:45 到 2025-09-28 18:26:46 的历史极值...
+2025-09-28 18:26:46 - UF2 - INFO -
+            SELECT
+                MAX(val) AS max_val,
+                MIN(val) AS min_val
+            FROM dc_item_history_data_minute
+            WHERE project_id = %s
+              AND item_name = %s
+              AND h_time IN (
+                  SELECT h_time
+                  FROM dc_item_history_data_minute
+                  WHERE project_id = %s
+                    AND item_name = %s
+                    AND val = 26
+                    AND h_time BETWEEN %s AND %s
+              )
+
+2025-09-28 18:26:47 - UF2 - INFO - {'max_val': Decimal('0.033451'), 'min_val': Decimal('0.004037')}
+2025-09-28 18:26:47 - UF2 - INFO - [DB] 查询成功: 最大值=0.033451, 最小值=0.004037
+2025-09-28 18:26:47 - UF2 - INFO - 开始DQN模型决策...
+2025-09-28 18:26:47 - UF2 - INFO - DQN决策结果: {'action': 31, 'L_s': 4100.0, 't_bw_s': 92.0, 'next_obs': array([0.04], dtype=float32), 'reward': np.float64(0.8987492427340898), 'terminated': False, 'truncated': False, 'info': {'recovery': 0.9358847247009056, 'V_feed_super_m3': 16810.0, 'V_loss_super_m3': 1077.7777777777778, 'V_net_super_m3': 15732.222222222223, 'supercycle_time_h': np.float64(48.40888888888889), 'net_delivery_rate_m3ph': np.float64(324.98622842453176), 'max_TMP_during_filtration': 0.01913314664353881, 'max_residual_increase_per_run': 0.00016986346185659564, 'phi_bw_effective': 0.7700222270445147, 'TMP_after_ceb': 0.0116, 'headroom_ratio': 0.3188857773923135, 'daily_prod_time_h': np.float64(23.150018362100624), 'ton_water_energy_kWh_per_m3': 0.1015, 'k_bw_per_ceb': 41, 'feasible': True, 'step': 1}}
+2025-09-28 18:26:48 - UF2 - INFO - [UF2][回调] 准备发送决策数据:
+{
+  "list": [
+    {
+      "type": "UF2",
+      "project_id": 92,
+      "water_production_time": 4100,
+      "physical_backwash": 94,
+      "ceb_backwash_frequency": 41,
+      "duration_system": 4200,
+      "tmp_action": 0.0116,
+      "recovery_rate": 0.9345297111507701,
+      "ton_water_energy_kWh": 0.1015,
+      "max_permeability": 1741.7017587317316,
+      "daily_prod_time_h": 23.13913073402388,
+      "ctime": "2025-09-28 18:26:46"
+    }
+  ]
+}
+2025-09-28 18:26:48 - UF2 - INFO - [UF2][回调] 第 1/3 次尝试发送...
+2025-09-28 18:26:48 - UF2 - INFO - [UF2][回调] 决策数据发送成功!服务器响应: {"code":200,"msg":"success"}
+2025-09-28 18:26:48 - UF2 - INFO - 配置项 use_model=0,跳过PLC指令下发。
+2025-09-28 18:26:48 - UF2 - INFO - [UF2] 状态已成功保存到 'device_states.json'。
+2025-09-28 18:26:48 - UF2 - INFO - 本轮决策完成,状态已更新并保存。下轮历史查询起始时间将是: 2025-09-28 18:26:46
+2025-09-28 18:26:48 - UF2 - INFO - [阶段4] 等待重置条件 (控制字 != 95)
+2025-09-28 18:26:48 - UF2 - INFO - 重置条件满足,即将开始新一轮监控。
+2025-09-28 18:26:48 - UF2 - INFO - --- UF2 本轮监控完成,重启循环 ---
+
+2025-09-28 18:26:48 - UF2 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-28 18:37:21 - UF3 - INFO - TMP数据变化: 0.0277 -> 0.0154 [已收集 1/10]
+2025-09-28 18:37:25 - UF3 - INFO - TMP数据变化: 0.0154 -> 0.0160 [已收集 2/10]
+2025-09-28 18:37:34 - UF3 - INFO - TMP数据变化: 0.0160 -> 0.0163 [已收集 3/10]
+2025-09-28 18:37:36 - UF3 - INFO - TMP数据变化: 0.0163 -> 0.0161 [已收集 4/10]
+2025-09-28 18:37:39 - UF3 - INFO - TMP数据变化: 0.0161 -> 0.0163 [已收集 5/10]
+2025-09-28 18:37:45 - UF3 - INFO - TMP数据变化: 0.0163 -> 0.0161 [已收集 6/10]
+2025-09-28 18:37:47 - UF3 - INFO - TMP数据变化: 0.0161 -> 0.0165 [已收集 7/10]
+2025-09-28 18:37:49 - UF3 - INFO - TMP数据变化: 0.0165 -> 0.0160 [已收集 8/10]
+2025-09-28 18:37:54 - UF3 - INFO - TMP数据变化: 0.0160 -> 0.0161 [已收集 9/10]
+2025-09-28 18:38:00 - UF3 - INFO - TMP数据变化: 0.0161 -> 0.0158 [已收集 10/10]
+2025-09-28 18:38:02 - UF3 - INFO - [阶段3] 数据收集完成,开始计算决策
+2025-09-28 18:38:02 - UF3 - INFO - TMP中位数计算完成: 0.0161
+2025-09-28 18:38:02 - UF3 - INFO - [DB] 正在查询 'C.M.UF3_DB@press_PV' 从 2025-09-25 16:39:17 到 2025-09-28 18:38:02 的历史极值...
+2025-09-28 18:38:02 - UF3 - INFO -
+            SELECT
+                MAX(val) AS max_val,
+                MIN(val) AS min_val
+            FROM dc_item_history_data_minute
+            WHERE project_id = %s
+              AND item_name = %s
+              AND h_time IN (
+                  SELECT h_time
+                  FROM dc_item_history_data_minute
+                  WHERE project_id = %s
+                    AND item_name = %s
+                    AND val = 26
+                    AND h_time BETWEEN %s AND %s
+              )
+
+2025-09-28 18:38:03 - UF3 - INFO - {'max_val': Decimal('0.040564'), 'min_val': Decimal('-0.003845')}
+2025-09-28 18:38:03 - UF3 - INFO - [DB] 查询成功: 最大值=0.040564, 最小值=-0.003845
+2025-09-28 18:38:03 - UF3 - INFO - 开始DQN模型决策...
+2025-09-28 18:38:03 - UF3 - INFO - DQN决策结果: {'action': 31, 'L_s': 4100.0, 't_bw_s': 92.0, 'next_obs': array([0.1525], dtype=float32), 'reward': np.float64(0.882711882751436), 'terminated': False, 'truncated': False, 'info': {'recovery': 0.9358847247009056, 'V_feed_super_m3': 16810.0, 'V_loss_super_m3': 1077.7777777777778, 'V_net_super_m3': 15732.222222222223, 'supercycle_time_h': np.float64(48.40888888888889), 'net_delivery_rate_m3ph': np.float64(324.98622842453176), 'max_TMP_during_filtration': 0.023633146643538768, 'max_residual_increase_per_run': 0.0001698634618565939, 'phi_bw_effective': 0.7700222270445147, 'TMP_after_ceb': 0.0161, 'headroom_ratio': 0.39388577739231284, 'daily_prod_time_h': np.float64(23.150018362100624), 'ton_water_energy_kWh_per_m3': 0.1015, 'k_bw_per_ceb': 41, 'feasible': True, 'step': 1}}
+2025-09-28 18:38:03 - UF3 - INFO - [UF3][回调] 准备发送决策数据:
+{
+  "list": [
+    {
+      "type": "UF3",
+      "project_id": 92,
+      "water_production_time": 4100,
+      "physical_backwash": 94,
+      "ceb_backwash_frequency": 41,
+      "duration_system": 4200,
+      "tmp_action": 0.0161,
+      "recovery_rate": 0.9345297111507701,
+      "ton_water_energy_kWh": 0.1015,
+      "max_permeability": -1828.6736020806243,
+      "daily_prod_time_h": 23.13913073402388,
+      "ctime": "2025-09-28 18:38:02"
+    }
+  ]
+}
+2025-09-28 18:38:03 - UF3 - INFO - [UF3][回调] 第 1/3 次尝试发送...
+2025-09-28 18:38:03 - UF3 - INFO - [UF3][回调] 决策数据发送成功!服务器响应: {"code":200,"msg":"success"}
+2025-09-28 18:38:03 - UF3 - INFO - 配置项 use_model=0,跳过PLC指令下发。
+2025-09-28 18:38:03 - UF3 - INFO - [UF3] 状态已成功保存到 'device_states.json'。
+2025-09-28 18:38:03 - UF3 - INFO - 本轮决策完成,状态已更新并保存。下轮历史查询起始时间将是: 2025-09-28 18:38:02
+2025-09-28 18:38:03 - UF3 - INFO - [阶段4] 等待重置条件 (控制字 != 95)
+2025-09-28 18:38:03 - UF3 - INFO - 重置条件满足,即将开始新一轮监控。
+2025-09-28 18:38:03 - UF3 - INFO - --- UF3 本轮监控完成,重启循环 ---
+
+2025-09-28 18:38:03 - UF3 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-28 18:45:37 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-28 19:08:23 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-28 20:20:10 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-28 20:21:06 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-28 20:31:09 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-28 22:04:08 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-28 22:08:11 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-28 22:24:33 - UF4 - INFO - 触发条件满足,进入数据收集阶段。
+2025-09-28 22:24:33 - UF4 - INFO - [阶段2] 开始监控TMP数据变化,需收集 10 个稳定数据点
+2025-09-28 22:24:33 - UF4 - INFO - 获取到TMP初始基准值: 0.0112
+2025-09-28 23:04:04 - UF4 - INFO - TMP数据变化: 0.0112 -> 0.0119 [已收集 1/10]
+2025-09-28 23:04:08 - UF4 - INFO - TMP数据变化: 0.0119 -> 0.0117 [已收集 2/10]
+2025-09-28 23:04:14 - UF4 - INFO - TMP数据变化: 0.0117 -> 0.0140 [已收集 3/10]
+2025-09-28 23:04:19 - UF4 - INFO - TMP数据变化: 0.0140 -> 0.0154 [已收集 4/10]
+2025-09-28 23:04:21 - UF4 - INFO - TMP数据变化: 0.0154 -> 0.0173 [已收集 5/10]
+2025-09-28 23:04:25 - UF4 - INFO - TMP数据变化: 0.0173 -> 0.0210 [已收集 6/10]
+2025-09-28 23:04:30 - UF4 - INFO - TMP数据变化: 0.0210 -> 0.0198 [已收集 7/10]
+2025-09-28 23:04:32 - UF4 - INFO - TMP数据变化: 0.0198 -> 0.0186 [已收集 8/10]
+2025-09-28 23:04:34 - UF4 - INFO - TMP数据变化: 0.0186 -> 0.0185 [已收集 9/10]
+2025-09-28 23:04:39 - UF4 - INFO - TMP数据变化: 0.0185 -> 0.0181 [已收集 10/10]
+2025-09-28 23:04:41 - UF4 - INFO - [阶段3] 数据收集完成,开始计算决策
+2025-09-28 23:04:41 - UF4 - INFO - TMP中位数计算完成: 0.0177
+2025-09-28 23:04:41 - UF4 - INFO - [DB] 正在查询 'C.M.UF4_DB@press_PV' 从 2025-09-26 03:26:32 到 2025-09-28 23:04:41 的历史极值...
+2025-09-28 23:04:41 - UF4 - INFO -
+            SELECT
+                MAX(val) AS max_val,
+                MIN(val) AS min_val
+            FROM dc_item_history_data_minute
+            WHERE project_id = %s
+              AND item_name = %s
+              AND h_time IN (
+                  SELECT h_time
+                  FROM dc_item_history_data_minute
+                  WHERE project_id = %s
+                    AND item_name = %s
+                    AND val = 26
+                    AND h_time BETWEEN %s AND %s
+              )
+
+2025-09-28 23:04:41 - UF4 - INFO - {'max_val': Decimal('0.030183'), 'min_val': Decimal('0.002499')}
+2025-09-28 23:04:41 - UF4 - INFO - [DB] 查询成功: 最大值=0.030183, 最小值=0.002499
+2025-09-28 23:04:41 - UF4 - INFO - 开始DQN模型决策...
+2025-09-28 23:04:41 - UF4 - INFO - DQN决策结果: {'action': 31, 'L_s': 4100.0, 't_bw_s': 92.0, 'next_obs': array([0.1925], dtype=float32), 'reward': np.float64(0.8761963769798256), 'terminated': False, 'truncated': False, 'info': {'recovery': 0.9358847247009056, 'V_feed_super_m3': 16810.0, 'V_loss_super_m3': 1077.7777777777778, 'V_net_super_m3': 15732.222222222223, 'supercycle_time_h': np.float64(48.40888888888889), 'net_delivery_rate_m3ph': np.float64(324.98622842453176), 'max_TMP_during_filtration': 0.02523314664353877, 'max_residual_increase_per_run': 0.0001698634618565939, 'phi_bw_effective': 0.7700222270445147, 'TMP_after_ceb': 0.0177, 'headroom_ratio': 0.4205524440589795, 'daily_prod_time_h': np.float64(23.150018362100624), 'ton_water_energy_kWh_per_m3': 0.1015, 'k_bw_per_ceb': 41, 'feasible': True, 'step': 1}}
+2025-09-28 23:04:42 - UF4 - INFO - [UF4][回调] 准备发送决策数据:
+{
+  "list": [
+    {
+      "type": "UF4",
+      "project_id": 92,
+      "water_production_time": 4100,
+      "physical_backwash": 94,
+      "ceb_backwash_frequency": 41,
+      "duration_system": 4200,
+      "tmp_action": 0.0177,
+      "recovery_rate": 0.9345297111507701,
+      "ton_water_energy_kWh": 0.1015,
+      "max_permeability": 2813.625450180072,
+      "daily_prod_time_h": 23.13913073402388,
+      "ctime": "2025-09-28 23:04:41"
+    }
+  ]
+}
+2025-09-28 23:04:42 - UF4 - INFO - [UF4][回调] 第 1/3 次尝试发送...
+2025-09-28 23:04:42 - UF4 - INFO - [UF4][回调] 决策数据发送成功!服务器响应: {"code":200,"msg":"success"}
+2025-09-28 23:04:42 - UF4 - INFO - 配置项 use_model=0,跳过PLC指令下发。
+2025-09-28 23:04:42 - UF4 - INFO - [UF4] 状态已成功保存到 'device_states.json'。
+2025-09-28 23:04:42 - UF4 - INFO - 本轮决策完成,状态已更新并保存。下轮历史查询起始时间将是: 2025-09-28 23:04:41
+2025-09-28 23:04:42 - UF4 - INFO - [阶段4] 等待重置条件 (控制字 != 95)
+2025-09-28 23:04:42 - UF4 - INFO - 重置条件满足,即将开始新一轮监控。
+2025-09-28 23:04:42 - UF4 - INFO - --- UF4 本轮监控完成,重启循环 ---
+
+2025-09-28 23:04:42 - UF4 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-28 23:47:57 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-29 00:38:03 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-29 00:57:48 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-29 02:10:44 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-29 02:46:48 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-29 05:28:00 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-29 05:51:21 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-29 07:01:48 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-29 07:58:15 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-29 08:31:00 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-29 08:57:38 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-29 09:39:09 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-29 10:17:12 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-29 10:33:12 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-29 11:02:11 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-29 11:36:21 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-29 12:11:07 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-29 12:24:08 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-29 12:55:33 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-29 13:07:28 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-29 13:24:45 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-29 14:03:40 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-29 14:55:38 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-29 15:02:21 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-29 15:24:54 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-29 16:42:32 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-29 18:38:40 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-29 19:24:30 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-29 19:30:50 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-29 20:16:52 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-29 20:38:36 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-29 21:58:01 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-29 22:20:04 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-29 22:38:24 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-29 23:11:51 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-29 23:11:51 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-29 23:34:10 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-29 23:52:07 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 00:36:11 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 00:37:35 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 00:51:42 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 00:56:08 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 00:58:13 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 01:15:06 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 01:20:03 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 01:33:42 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 04:03:36 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 04:04:42 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 05:09:01 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 06:19:15 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 06:19:39 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 06:19:39 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 06:35:15 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 06:45:20 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 07:32:30 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 07:48:09 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 07:48:09 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 08:27:12 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 08:45:15 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 08:59:42 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 09:20:11 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 10:11:40 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 10:38:45 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 11:00:42 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 12:05:01 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 12:05:03 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 14:45:39 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 14:50:14 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 14:51:45 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 15:09:18 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 15:33:00 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 15:40:28 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 16:08:26 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 16:13:42 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 16:17:49 - UF1 - INFO - 触发条件满足,进入数据收集阶段。
+2025-09-30 16:17:49 - UF1 - INFO - [阶段2] 开始监控TMP数据变化,需收集 10 个稳定数据点
+2025-09-30 16:17:49 - UF1 - INFO - 获取到TMP初始基准值: 0.015
+2025-09-30 16:49:39 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 17:10:27 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 17:11:51 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 17:20:53 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 17:23:00 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 17:23:00 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 17:23:01 - UF1 - ERROR - [UF1][API] 获取'UF1_BW_After_TMP'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 17:23:01 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 17:23:12 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 17:23:12 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 17:23:13 - UF1 - ERROR - [UF1][API] 获取'UF1_BW_After_TMP'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 17:23:13 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 17:23:24 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 17:23:24 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 17:23:25 - UF1 - ERROR - [UF1][API] 获取'UF1_BW_After_TMP'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 17:23:25 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 17:23:35 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,业务错误: ok
+2025-09-30 17:23:36 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 17:23:36 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 17:23:37 - UF1 - ERROR - [UF1][API] 获取'UF1_BW_After_TMP'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 17:23:37 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: 502 Server Error: Bad Gateway for url: http://120.55.44.4:8900/api/v1/jinke-cloud/device/current-data
+2025-09-30 17:23:38 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: 502 Server Error: Bad Gateway for url: http://120.55.44.4:8900/api/v1/jinke-cloud/device/current-data
+2025-09-30 17:23:38 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: 502 Server Error: Bad Gateway for url: http://120.55.44.4:8900/api/v1/jinke-cloud/device/current-data
+2025-09-30 17:23:39 - UF1 - ERROR - [UF1][API] 获取'UF1_BW_After_TMP'失败,网络错误: 502 Server Error: Bad Gateway for url: http://120.55.44.4:8900/api/v1/jinke-cloud/device/current-data
+2025-09-30 17:23:39 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: 502 Server Error: Bad Gateway for url: http://120.55.44.4:8900/api/v1/jinke-cloud/device/current-data
+2025-09-30 17:23:40 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: 502 Server Error: Bad Gateway for url: http://120.55.44.4:8900/api/v1/jinke-cloud/device/current-data
+2025-09-30 17:23:40 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: 502 Server Error: Bad Gateway for url: http://120.55.44.4:8900/api/v1/jinke-cloud/device/current-data
+2025-09-30 17:23:41 - UF1 - ERROR - [UF1][API] 获取'UF1_BW_After_TMP'失败,网络错误: 502 Server Error: Bad Gateway for url: http://120.55.44.4:8900/api/v1/jinke-cloud/device/current-data
+2025-09-30 17:23:41 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: 502 Server Error: Bad Gateway for url: http://120.55.44.4:8900/api/v1/jinke-cloud/device/current-data
+2025-09-30 17:23:42 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: 502 Server Error: Bad Gateway for url: http://120.55.44.4:8900/api/v1/jinke-cloud/device/current-data
+2025-09-30 17:23:43 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: 502 Server Error: Bad Gateway for url: http://120.55.44.4:8900/api/v1/jinke-cloud/device/current-data
+2025-09-30 17:23:43 - UF1 - ERROR - [UF1][API] 获取'UF1_BW_After_TMP'失败,网络错误: 502 Server Error: Bad Gateway for url: http://120.55.44.4:8900/api/v1/jinke-cloud/device/current-data
+2025-09-30 17:23:43 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: 502 Server Error: Bad Gateway for url: http://120.55.44.4:8900/api/v1/jinke-cloud/device/current-data
+2025-09-30 17:23:44 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: 502 Server Error: Bad Gateway for url: http://120.55.44.4:8900/api/v1/jinke-cloud/device/current-data
+2025-09-30 17:23:45 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: 502 Server Error: Bad Gateway for url: http://120.55.44.4:8900/api/v1/jinke-cloud/device/current-data
+2025-09-30 17:23:45 - UF1 - ERROR - [UF1][API] 获取'UF1_BW_After_TMP'失败,网络错误: 502 Server Error: Bad Gateway for url: http://120.55.44.4:8900/api/v1/jinke-cloud/device/current-data
+2025-09-30 17:23:45 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: 502 Server Error: Bad Gateway for url: http://120.55.44.4:8900/api/v1/jinke-cloud/device/current-data
+2025-09-30 17:24:35 - UF1 - ERROR - [UF1][API] 获取'UF1_BW_After_TMP'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 17:24:36 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 17:24:54 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 17:25:07 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 17:25:09 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 17:25:58 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 17:26:11 - UF1 - ERROR - [UF1][API] 获取'UF1_BW_After_TMP'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 17:26:19 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 17:26:21 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 17:27:36 - UF1 - ERROR - [UF1][API] 获取'UF1_BW_After_TMP'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 17:57:42 - UF1 - INFO - TMP数据变化: 0.0150 -> 0.0115 [已收集 1/10]
+2025-09-30 17:57:47 - UF1 - INFO - TMP数据变化: 0.0115 -> 0.0113 [已收集 2/10]
+2025-09-30 17:57:49 - UF1 - INFO - TMP数据变化: 0.0113 -> 0.0115 [已收集 3/10]
+2025-09-30 17:57:51 - UF1 - INFO - TMP数据变化: 0.0115 -> 0.0117 [已收集 4/10]
+2025-09-30 17:58:01 - UF1 - INFO - TMP数据变化: 0.0117 -> 0.0119 [已收集 5/10]
+2025-09-30 17:58:06 - UF1 - INFO - TMP数据变化: 0.0119 -> 0.0121 [已收集 6/10]
+2025-09-30 17:58:13 - UF1 - INFO - TMP数据变化: 0.0121 -> 0.0123 [已收集 7/10]
+2025-09-30 17:58:15 - UF1 - INFO - TMP数据变化: 0.0123 -> 0.0119 [已收集 8/10]
+2025-09-30 17:58:17 - UF1 - INFO - TMP数据变化: 0.0119 -> 0.0121 [已收集 9/10]
+2025-09-30 17:58:21 - UF1 - INFO - TMP数据变化: 0.0121 -> 0.0117 [已收集 10/10]
+2025-09-30 17:58:23 - UF1 - INFO - [阶段3] 数据收集完成,开始计算决策
+2025-09-30 17:58:23 - UF1 - INFO - TMP中位数计算完成: 0.0118
+2025-09-30 17:58:23 - UF1 - INFO - [DB] 正在查询 'C.M.UF1_DB@press_PV' 从 2025-09-27 23:30:32 到 2025-09-30 17:58:23 的历史极值...
+2025-09-30 17:58:23 - UF1 - INFO -
+            SELECT
+                MAX(val) AS max_val,
+                MIN(val) AS min_val
+            FROM dc_item_history_data_minute
+            WHERE project_id = %s
+              AND item_name = %s
+              AND h_time IN (
+                  SELECT h_time
+                  FROM dc_item_history_data_minute
+                  WHERE project_id = %s
+                    AND item_name = %s
+                    AND val = 26
+                    AND h_time BETWEEN %s AND %s
+              )
+
+2025-09-30 17:58:24 - UF1 - INFO - {'max_val': Decimal('0.022301'), 'min_val': Decimal('0.002115')}
+2025-09-30 17:58:24 - UF1 - INFO - [DB] 查询成功: 最大值=0.022301, 最小值=0.002115
+2025-09-30 17:58:24 - UF1 - INFO - 开始DQN模型决策...
+2025-09-30 17:58:24 - UF1 - INFO - DQN决策结果: {'action': 31, 'L_s': 4100.0, 't_bw_s': 92.0, 'next_obs': array([0.045], dtype=float32), 'reward': np.float64(0.8981081378459719), 'terminated': False, 'truncated': False, 'info': {'recovery': 0.9358847247009056, 'V_feed_super_m3': 16810.0, 'V_loss_super_m3': 1077.7777777777778, 'V_net_super_m3': 15732.222222222223, 'supercycle_time_h': np.float64(48.40888888888889), 'net_delivery_rate_m3ph': np.float64(324.98622842453176), 'max_TMP_during_filtration': 0.019333146643538808, 'max_residual_increase_per_run': 0.00016986346185659564, 'phi_bw_effective': 0.7700222270445147, 'TMP_after_ceb': 0.011800000000000001, 'headroom_ratio': 0.3222191107256468, 'daily_prod_time_h': np.float64(23.150018362100624), 'ton_water_energy_kWh_per_m3': 0.1015, 'k_bw_per_ceb': 41, 'feasible': True, 'step': 1}}
+2025-09-30 17:58:24 - UF1 - INFO - [UF1][回调] 准备发送决策数据:
+{
+  "list": [
+    {
+      "type": "UF1",
+      "project_id": 92,
+      "water_production_time": 4100,
+      "physical_backwash": 94,
+      "ceb_backwash_frequency": 41,
+      "duration_system": 4200,
+      "tmp_action": 0.011800000000000001,
+      "recovery_rate": 0.9345297111507701,
+      "ton_water_energy_kWh": 0.1015,
+      "max_permeability": 3324.4680851063827,
+      "daily_prod_time_h": 23.13913073402388,
+      "ctime": "2025-09-30 17:58:23"
+    }
+  ]
+}
+2025-09-30 17:58:24 - UF1 - INFO - [UF1][回调] 第 1/3 次尝试发送...
+2025-09-30 17:58:24 - UF1 - INFO - [UF1][回调] 决策数据发送成功!服务器响应: {"code":200,"msg":"success"}
+2025-09-30 17:58:24 - UF1 - INFO - 配置项 use_model=0,跳过PLC指令下发。
+2025-09-30 17:58:24 - UF1 - INFO - [UF1] 状态已成功保存到 'device_states.json'。
+2025-09-30 17:58:24 - UF1 - INFO - 本轮决策完成,状态已更新并保存。下轮历史查询起始时间将是: 2025-09-30 17:58:23
+2025-09-30 17:58:24 - UF1 - INFO - [阶段4] 等待重置条件 (控制字 != 95)
+2025-09-30 17:58:24 - UF1 - INFO - 重置条件满足,即将开始新一轮监控。
+2025-09-30 17:58:24 - UF1 - INFO - --- UF1 本轮监控完成,重启循环 ---
+
+2025-09-30 17:58:24 - UF1 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-09-30 18:09:36 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 20:05:49 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 20:05:50 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 20:54:43 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 21:02:14 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 21:51:51 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 21:54:42 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 22:21:29 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 23:19:30 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-09-30 23:48:43 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-01 00:36:42 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-01 00:50:57 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-01 01:13:13 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-01 02:34:31 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-01 08:43:27 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-01 10:44:30 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-01 10:50:28 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-01 10:50:28 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-01 15:05:39 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-01 15:05:39 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-01 17:39:42 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-01 18:25:39 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-01 19:30:35 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-01 19:41:21 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-01 20:14:42 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-01 23:15:36 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-01 23:15:39 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-01 23:17:42 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-01 23:25:37 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-01 23:37:16 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-01 23:46:03 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-01 23:46:21 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-02 00:12:24 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-02 00:12:24 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-02 00:26:24 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-02 00:35:59 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-02 00:36:24 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-02 01:42:06 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-02 03:18:15 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,业务错误: ok
+2025-10-02 03:18:15 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,业务错误: ok
+2025-10-02 03:18:16 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-02 03:18:17 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-02 03:18:27 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-02 03:18:27 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-02 03:18:28 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-02 03:18:29 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-02 03:18:39 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-02 03:18:39 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-02 03:18:40 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,业务错误: ok
+2025-10-02 03:18:41 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-02 03:28:25 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-02 03:39:24 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-02 04:45:53 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-02 05:06:30 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-02 05:35:15 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-02 06:30:09 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-02 07:18:43 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-02 07:18:44 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-02 07:38:45 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-02 07:40:17 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-02 07:49:30 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-02 08:19:45 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-02 08:33:04 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-02 08:49:16 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-02 09:05:12 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-02 09:23:45 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-02 09:40:21 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-02 10:34:08 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-02 10:38:49 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-02 11:29:54 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-02 11:36:12 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-02 12:40:17 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-02 12:42:33 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-02 12:43:16 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-02 13:22:39 - UF3 - INFO - 触发条件满足,进入数据收集阶段。
+2025-10-02 13:22:39 - UF3 - INFO - [阶段2] 开始监控TMP数据变化,需收集 10 个稳定数据点
+2025-10-02 13:22:39 - UF3 - INFO - 获取到TMP初始基准值: 0.016
+2025-10-02 13:30:18 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-02 13:59:59 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-02 15:03:44 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-02 15:16:18 - UF3 - ERROR - [UF3][API] 获取'UF3_BW_After_TMP'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-02 15:19:02 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-02 15:24:45 - UF3 - INFO - TMP数据变化: 0.0160 -> 0.0158 [已收集 1/10]
+2025-10-02 15:24:50 - UF3 - INFO - TMP数据变化: 0.0158 -> 0.0160 [已收集 2/10]
+2025-10-02 15:24:54 - UF3 - INFO - TMP数据变化: 0.0160 -> 0.0163 [已收集 3/10]
+2025-10-02 15:24:58 - UF3 - INFO - TMP数据变化: 0.0163 -> 0.0158 [已收集 4/10]
+2025-10-02 15:25:00 - UF3 - INFO - TMP数据变化: 0.0158 -> 0.0161 [已收集 5/10]
+2025-10-02 15:25:09 - UF3 - INFO - TMP数据变化: 0.0161 -> 0.0160 [已收集 6/10]
+2025-10-02 15:25:15 - UF3 - INFO - TMP数据变化: 0.0160 -> 0.0161 [已收集 7/10]
+2025-10-02 15:25:21 - UF3 - INFO - TMP数据变化: 0.0161 -> 0.0167 [已收集 8/10]
+2025-10-02 15:25:26 - UF3 - INFO - TMP数据变化: 0.0167 -> 0.0160 [已收集 9/10]
+2025-10-02 15:25:28 - UF3 - INFO - TMP数据变化: 0.0160 -> 0.0161 [已收集 10/10]
+2025-10-02 15:25:30 - UF3 - INFO - [阶段3] 数据收集完成,开始计算决策
+2025-10-02 15:25:30 - UF3 - INFO - TMP中位数计算完成: 0.0161
+2025-10-02 15:25:30 - UF3 - INFO - [DB] 正在查询 'C.M.UF3_DB@press_PV' 从 2025-09-28 18:38:02 到 2025-10-02 15:25:30 的历史极值...
+2025-10-02 15:25:30 - UF3 - INFO -
+            SELECT
+                MAX(val) AS max_val,
+                MIN(val) AS min_val
+            FROM dc_item_history_data_minute
+            WHERE project_id = %s
+              AND item_name = %s
+              AND h_time IN (
+                  SELECT h_time
+                  FROM dc_item_history_data_minute
+                  WHERE project_id = %s
+                    AND item_name = %s
+                    AND val = 26
+                    AND h_time BETWEEN %s AND %s
+              )
+
+2025-10-02 15:25:30 - UF3 - INFO - {'max_val': Decimal('0.044409'), 'min_val': Decimal('0.004037')}
+2025-10-02 15:25:30 - UF3 - INFO - [DB] 查询成功: 最大值=0.044409, 最小值=0.004037
+2025-10-02 15:25:30 - UF3 - INFO - 开始DQN模型决策...
+2025-10-02 15:25:30 - UF3 - INFO - DQN决策结果: {'action': 31, 'L_s': 4100.0, 't_bw_s': 92.0, 'next_obs': array([0.15125], dtype=float32), 'reward': np.float64(0.8829086173067987), 'terminated': False, 'truncated': False, 'info': {'recovery': 0.9358847247009056, 'V_feed_super_m3': 16810.0, 'V_loss_super_m3': 1077.7777777777778, 'V_net_super_m3': 15732.222222222223, 'supercycle_time_h': np.float64(48.40888888888889), 'net_delivery_rate_m3ph': np.float64(324.98622842453176), 'max_TMP_during_filtration': 0.02358314664353877, 'max_residual_increase_per_run': 0.0001698634618565939, 'phi_bw_effective': 0.7700222270445147, 'TMP_after_ceb': 0.016050000000000002, 'headroom_ratio': 0.39305244405897954, 'daily_prod_time_h': np.float64(23.150018362100624), 'ton_water_energy_kWh_per_m3': 0.1015, 'k_bw_per_ceb': 41, 'feasible': True, 'step': 1}}
+2025-10-02 15:25:31 - UF3 - INFO - [UF3][回调] 准备发送决策数据:
+{
+  "list": [
+    {
+      "type": "UF3",
+      "project_id": 92,
+      "water_production_time": 4100,
+      "physical_backwash": 94,
+      "ceb_backwash_frequency": 41,
+      "duration_system": 4200,
+      "tmp_action": 0.016050000000000002,
+      "recovery_rate": 0.9345297111507701,
+      "ton_water_energy_kWh": 0.1015,
+      "max_permeability": 1741.7017587317316,
+      "daily_prod_time_h": 23.13913073402388,
+      "ctime": "2025-10-02 15:25:30"
+    }
+  ]
+}
+2025-10-02 15:25:31 - UF3 - INFO - [UF3][回调] 第 1/3 次尝试发送...
+2025-10-02 15:25:31 - UF3 - INFO - [UF3][回调] 决策数据发送成功!服务器响应: {"code":200,"msg":"success"}
+2025-10-02 15:25:31 - UF3 - INFO - 配置项 use_model=0,跳过PLC指令下发。
+2025-10-02 15:25:31 - UF3 - INFO - [UF3] 状态已成功保存到 'device_states.json'。
+2025-10-02 15:25:31 - UF3 - INFO - 本轮决策完成,状态已更新并保存。下轮历史查询起始时间将是: 2025-10-02 15:25:30
+2025-10-02 15:25:31 - UF3 - INFO - [阶段4] 等待重置条件 (控制字 != 95)
+2025-10-02 15:25:31 - UF3 - INFO - 重置条件满足,即将开始新一轮监控。
+2025-10-02 15:25:31 - UF3 - INFO - --- UF3 本轮监控完成,重启循环 ---
+
+2025-10-02 15:25:31 - UF3 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-10-02 15:38:03 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-02 16:52:24 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-02 17:30:41 - UF4 - INFO - 触发条件满足,进入数据收集阶段。
+2025-10-02 17:30:41 - UF4 - INFO - [阶段2] 开始监控TMP数据变化,需收集 10 个稳定数据点
+2025-10-02 17:30:41 - UF4 - INFO - 获取到TMP初始基准值: 0.0163
+2025-10-02 17:37:11 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-02 17:38:32 - UF4 - ERROR - [UF4][API] 获取'UF4_BW_After_TMP'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-02 18:09:44 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-02 18:11:16 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-02 18:18:57 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-02 18:25:39 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-02 18:41:27 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-02 18:43:12 - UF4 - ERROR - [UF4][API] 获取'UF4_BW_After_TMP'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-02 18:50:18 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-02 19:06:35 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-02 19:13:24 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-02 19:14:40 - UF4 - INFO - TMP数据变化: 0.0163 -> 0.0119 [已收集 1/10]
+2025-10-02 19:14:49 - UF4 - INFO - TMP数据变化: 0.0119 -> 0.0123 [已收集 2/10]
+2025-10-02 19:14:51 - UF4 - INFO - TMP数据变化: 0.0123 -> 0.0121 [已收集 3/10]
+2025-10-02 19:14:55 - UF4 - INFO - TMP数据变化: 0.0121 -> 0.0123 [已收集 4/10]
+2025-10-02 19:14:57 - UF4 - INFO - TMP数据变化: 0.0123 -> 0.0129 [已收集 5/10]
+2025-10-02 19:14:59 - UF4 - INFO - TMP数据变化: 0.0129 -> 0.0127 [已收集 6/10]
+2025-10-02 19:15:02 - UF4 - INFO - TMP数据变化: 0.0127 -> 0.0125 [已收集 7/10]
+2025-10-02 19:15:04 - UF4 - INFO - TMP数据变化: 0.0125 -> 0.0123 [已收集 8/10]
+2025-10-02 19:15:06 - UF4 - INFO - TMP数据变化: 0.0123 -> 0.0127 [已收集 9/10]
+2025-10-02 19:15:12 - UF4 - INFO - TMP数据变化: 0.0127 -> 0.0129 [已收集 10/10]
+2025-10-02 19:15:14 - UF4 - INFO - [阶段3] 数据收集完成,开始计算决策
+2025-10-02 19:15:14 - UF4 - INFO - TMP中位数计算完成: 0.0124
+2025-10-02 19:15:14 - UF4 - INFO - [DB] 正在查询 'C.M.UF4_DB@press_PV' 从 2025-09-28 23:04:41 到 2025-10-02 19:15:14 的历史极值...
+2025-10-02 19:15:14 - UF4 - INFO -
+            SELECT
+                MAX(val) AS max_val,
+                MIN(val) AS min_val
+            FROM dc_item_history_data_minute
+            WHERE project_id = %s
+              AND item_name = %s
+              AND h_time IN (
+                  SELECT h_time
+                  FROM dc_item_history_data_minute
+                  WHERE project_id = %s
+                    AND item_name = %s
+                    AND val = 26
+                    AND h_time BETWEEN %s AND %s
+              )
+
+2025-10-02 19:15:15 - UF4 - INFO - {'max_val': Decimal('0.021532'), 'min_val': Decimal('0.002691')}
+2025-10-02 19:15:15 - UF4 - INFO - [DB] 查询成功: 最大值=0.021532, 最小值=0.002691
+2025-10-02 19:15:15 - UF4 - INFO - 开始DQN模型决策...
+2025-10-02 19:15:15 - UF4 - INFO - DQN决策结果: {'action': 31, 'L_s': 4100.0, 't_bw_s': 92.0, 'next_obs': array([0.06], dtype=float32), 'reward': np.float64(0.896144823181618), 'terminated': False, 'truncated': False, 'info': {'recovery': 0.9358847247009056, 'V_feed_super_m3': 16810.0, 'V_loss_super_m3': 1077.7777777777778, 'V_net_super_m3': 15732.222222222223, 'supercycle_time_h': np.float64(48.40888888888889), 'net_delivery_rate_m3ph': np.float64(324.98622842453176), 'max_TMP_during_filtration': 0.0199331466435388, 'max_residual_increase_per_run': 0.00016986346185659564, 'phi_bw_effective': 0.7700222270445147, 'TMP_after_ceb': 0.012400000000000001, 'headroom_ratio': 0.3322191107256467, 'daily_prod_time_h': np.float64(23.150018362100624), 'ton_water_energy_kWh_per_m3': 0.1015, 'k_bw_per_ceb': 41, 'feasible': True, 'step': 1}}
+2025-10-02 19:15:15 - UF4 - INFO - [UF4][回调] 准备发送决策数据:
+{
+  "list": [
+    {
+      "type": "UF4",
+      "project_id": 92,
+      "water_production_time": 4100,
+      "physical_backwash": 94,
+      "ceb_backwash_frequency": 41,
+      "duration_system": 4200,
+      "tmp_action": 0.012400000000000001,
+      "recovery_rate": 0.9345297111507701,
+      "ton_water_energy_kWh": 0.1015,
+      "max_permeability": 2612.8762541806022,
+      "daily_prod_time_h": 23.13913073402388,
+      "ctime": "2025-10-02 19:15:14"
+    }
+  ]
+}
+2025-10-02 19:15:15 - UF4 - INFO - [UF4][回调] 第 1/3 次尝试发送...
+2025-10-02 19:15:15 - UF4 - INFO - [UF4][回调] 决策数据发送成功!服务器响应: {"code":200,"msg":"success"}
+2025-10-02 19:15:15 - UF4 - INFO - 配置项 use_model=0,跳过PLC指令下发。
+2025-10-02 19:15:15 - UF4 - INFO - [UF4] 状态已成功保存到 'device_states.json'。
+2025-10-02 19:15:15 - UF4 - INFO - 本轮决策完成,状态已更新并保存。下轮历史查询起始时间将是: 2025-10-02 19:15:14
+2025-10-02 19:15:15 - UF4 - INFO - [阶段4] 等待重置条件 (控制字 != 95)
+2025-10-02 19:15:16 - UF4 - INFO - 重置条件满足,即将开始新一轮监控。
+2025-10-02 19:15:16 - UF4 - INFO - --- UF4 本轮监控完成,重启循环 ---
+
+2025-10-02 19:15:16 - UF4 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-10-02 19:30:15 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-02 20:25:46 - UF2 - INFO - 触发条件满足,进入数据收集阶段。
+2025-10-02 20:25:46 - UF2 - INFO - [阶段2] 开始监控TMP数据变化,需收集 10 个稳定数据点
+2025-10-02 20:25:46 - UF2 - INFO - 获取到TMP初始基准值: 0.0115
+2025-10-02 20:33:34 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-02 21:10:18 - UF2 - ERROR - [UF2][API] 获取'UF2_BW_After_TMP'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-02 21:56:35 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-02 22:14:45 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-02 22:23:05 - UF2 - INFO - TMP数据变化: 0.0115 -> 0.0112 [已收集 1/10]
+2025-10-02 22:23:08 - UF2 - INFO - TMP数据变化: 0.0112 -> 0.0115 [已收集 2/10]
+2025-10-02 22:23:12 - UF2 - INFO - TMP数据变化: 0.0115 -> 0.0110 [已收集 3/10]
+2025-10-02 22:23:14 - UF2 - INFO - TMP数据变化: 0.0110 -> 0.0115 [已收集 4/10]
+2025-10-02 22:23:16 - UF2 - INFO - TMP数据变化: 0.0115 -> 0.0113 [已收集 5/10]
+2025-10-02 22:23:20 - UF2 - INFO - TMP数据变化: 0.0113 -> 0.0117 [已收集 6/10]
+2025-10-02 22:23:27 - UF2 - INFO - TMP数据变化: 0.0117 -> 0.0121 [已收集 7/10]
+2025-10-02 22:23:29 - UF2 - INFO - TMP数据变化: 0.0121 -> 0.0123 [已收集 8/10]
+2025-10-02 22:23:31 - UF2 - INFO - TMP数据变化: 0.0123 -> 0.0117 [已收集 9/10]
+2025-10-02 22:23:35 - UF2 - INFO - TMP数据变化: 0.0117 -> 0.0119 [已收集 10/10]
+2025-10-02 22:23:37 - UF2 - INFO - [阶段3] 数据收集完成,开始计算决策
+2025-10-02 22:23:37 - UF2 - INFO - TMP中位数计算完成: 0.0116
+2025-10-02 22:23:37 - UF2 - INFO - [DB] 正在查询 'C.M.UF2_DB@press_PV' 从 2025-09-28 18:26:46 到 2025-10-02 22:23:37 的历史极值...
+2025-10-02 22:23:37 - UF2 - INFO -
+            SELECT
+                MAX(val) AS max_val,
+                MIN(val) AS min_val
+            FROM dc_item_history_data_minute
+            WHERE project_id = %s
+              AND item_name = %s
+              AND h_time IN (
+                  SELECT h_time
+                  FROM dc_item_history_data_minute
+                  WHERE project_id = %s
+                    AND item_name = %s
+                    AND val = 26
+                    AND h_time BETWEEN %s AND %s
+              )
+
+2025-10-02 22:23:37 - UF2 - INFO - {'max_val': Decimal('0.020570'), 'min_val': Decimal('0.003268')}
+2025-10-02 22:23:37 - UF2 - INFO - [DB] 查询成功: 最大值=0.02057, 最小值=0.003268
+2025-10-02 22:23:37 - UF2 - INFO - 开始DQN模型决策...
+2025-10-02 22:23:37 - UF2 - INFO - DQN决策结果: {'action': 31, 'L_s': 4100.0, 't_bw_s': 92.0, 'next_obs': array([0.04], dtype=float32), 'reward': np.float64(0.8987492427340898), 'terminated': False, 'truncated': False, 'info': {'recovery': 0.9358847247009056, 'V_feed_super_m3': 16810.0, 'V_loss_super_m3': 1077.7777777777778, 'V_net_super_m3': 15732.222222222223, 'supercycle_time_h': np.float64(48.40888888888889), 'net_delivery_rate_m3ph': np.float64(324.98622842453176), 'max_TMP_during_filtration': 0.01913314664353881, 'max_residual_increase_per_run': 0.00016986346185659564, 'phi_bw_effective': 0.7700222270445147, 'TMP_after_ceb': 0.0116, 'headroom_ratio': 0.3188857773923135, 'daily_prod_time_h': np.float64(23.150018362100624), 'ton_water_energy_kWh_per_m3': 0.1015, 'k_bw_per_ceb': 41, 'feasible': True, 'step': 1}}
+2025-10-02 22:23:38 - UF2 - INFO - [UF2][回调] 准备发送决策数据:
+{
+  "list": [
+    {
+      "type": "UF2",
+      "project_id": 92,
+      "water_production_time": 4100,
+      "physical_backwash": 94,
+      "ceb_backwash_frequency": 41,
+      "duration_system": 4200,
+      "tmp_action": 0.0116,
+      "recovery_rate": 0.9345297111507701,
+      "ton_water_energy_kWh": 0.1015,
+      "max_permeability": 2151.545287637699,
+      "daily_prod_time_h": 23.13913073402388,
+      "ctime": "2025-10-02 22:23:37"
+    }
+  ]
+}
+2025-10-02 22:23:38 - UF2 - INFO - [UF2][回调] 第 1/3 次尝试发送...
+2025-10-02 22:23:38 - UF2 - INFO - [UF2][回调] 决策数据发送成功!服务器响应: {"code":200,"msg":"success"}
+2025-10-02 22:23:38 - UF2 - INFO - 配置项 use_model=0,跳过PLC指令下发。
+2025-10-02 22:23:38 - UF2 - INFO - [UF2] 状态已成功保存到 'device_states.json'。
+2025-10-02 22:23:38 - UF2 - INFO - 本轮决策完成,状态已更新并保存。下轮历史查询起始时间将是: 2025-10-02 22:23:37
+2025-10-02 22:23:38 - UF2 - INFO - [阶段4] 等待重置条件 (控制字 != 95)
+2025-10-02 22:23:38 - UF2 - INFO - 重置条件满足,即将开始新一轮监控。
+2025-10-02 22:23:38 - UF2 - INFO - --- UF2 本轮监控完成,重启循环 ---
+
+2025-10-02 22:23:38 - UF2 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-10-02 22:41:49 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-02 23:33:40 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-02 23:33:41 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-03 00:15:40 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-03 00:37:03 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-03 00:55:54 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-03 01:57:42 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-03 02:06:57 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-03 02:06:57 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-03 02:29:45 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-03 02:56:13 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-03 03:28:55 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-03 03:51:57 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-03 04:26:46 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-03 04:31:12 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-03 04:37:57 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-03 04:47:32 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-03 04:47:33 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-03 04:49:02 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-03 05:23:00 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-03 05:53:53 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-03 06:05:36 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-03 06:19:06 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-03 06:43:57 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-03 06:54:54 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-03 07:18:45 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-03 07:38:57 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-03 08:54:09 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-03 08:56:09 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-03 08:56:11 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-03 09:08:36 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-03 09:10:57 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-03 10:02:06 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-03 10:25:42 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-03 10:53:42 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-03 12:53:18 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-03 13:11:44 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-03 13:31:36 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-03 14:23:15 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-03 14:24:46 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-03 14:32:42 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-03 14:33:47 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-03 14:35:40 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-03 14:42:48 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-03 15:20:44 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-03 15:52:59 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-03 16:02:45 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-03 18:51:33 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-03 19:12:04 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-03 21:36:33 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-03 21:41:57 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-03 22:05:03 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-03 22:05:06 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-03 22:32:12 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-03 22:33:17 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-03 23:20:41 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-03 23:23:04 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-03 23:29:03 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-04 00:07:28 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-04 00:41:51 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-04 01:29:42 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-04 01:46:15 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-04 01:49:12 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-04 02:01:11 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-04 02:24:47 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-04 02:26:23 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-04 02:26:24 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-04 02:59:06 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-04 03:02:48 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-04 03:45:11 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-04 04:13:45 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-04 05:00:54 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-04 05:11:15 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-04 06:08:17 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-04 06:40:58 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-04 07:14:50 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-04 07:16:18 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-04 08:58:06 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-04 09:05:48 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-04 09:29:43 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-04 09:29:44 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-04 10:05:00 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-04 10:58:42 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-04 11:04:21 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-04 11:04:23 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-04 11:18:36 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-04 11:40:21 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-04 11:48:28 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-04 12:31:09 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-04 12:50:45 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-04 13:07:39 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-04 14:31:57 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-04 14:34:46 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-04 15:38:19 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-04 15:39:42 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-04 15:40:10 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-04 16:56:00 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-04 16:58:44 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-04 17:07:42 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-04 17:11:42 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-04 17:27:42 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-04 18:20:33 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-04 19:03:32 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-04 20:05:48 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-04 20:15:07 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-04 20:16:12 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-04 20:17:37 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-04 20:37:13 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-04 21:49:36 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-04 22:42:21 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-04 22:48:49 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-04 22:55:57 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-04 23:30:57 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-05 00:23:42 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-05 00:48:36 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-05 01:01:30 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-05 01:01:30 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-05 01:01:30 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-05 01:01:30 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-05 01:01:42 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-05 01:01:42 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-05 01:01:42 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-05 01:01:42 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-05 01:01:54 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-05 01:01:54 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-05 01:01:54 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-05 01:01:54 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-05 01:01:57 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,业务错误: ok
+2025-10-05 01:02:02 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: 502 Server Error: Bad Gateway for url: http://120.55.44.4:8900/api/v1/jinke-cloud/device/current-data
+2025-10-05 01:02:02 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: 502 Server Error: Bad Gateway for url: http://120.55.44.4:8900/api/v1/jinke-cloud/device/current-data
+2025-10-05 01:02:03 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: 502 Server Error: Bad Gateway for url: http://120.55.44.4:8900/api/v1/jinke-cloud/device/current-data
+2025-10-05 01:02:04 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: 502 Server Error: Bad Gateway for url: http://120.55.44.4:8900/api/v1/jinke-cloud/device/current-data
+2025-10-05 01:02:04 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: 502 Server Error: Bad Gateway for url: http://120.55.44.4:8900/api/v1/jinke-cloud/device/current-data
+2025-10-05 01:02:05 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: 502 Server Error: Bad Gateway for url: http://120.55.44.4:8900/api/v1/jinke-cloud/device/current-data
+2025-10-05 01:02:06 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: 502 Server Error: Bad Gateway for url: http://120.55.44.4:8900/api/v1/jinke-cloud/device/current-data
+2025-10-05 01:02:06 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-05 01:02:06 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: 502 Server Error: Bad Gateway for url: http://120.55.44.4:8900/api/v1/jinke-cloud/device/current-data
+2025-10-05 01:03:03 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-05 01:03:12 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-05 01:03:13 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-05 01:03:13 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-05 01:03:21 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-05 01:03:24 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-05 01:03:38 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-05 01:03:38 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-05 01:03:40 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-05 01:03:42 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-05 01:04:51 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-05 01:42:03 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-05 02:32:18 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-05 02:37:06 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-05 02:55:39 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-05 03:10:18 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-05 03:33:51 - UF1 - INFO - 触发条件满足,进入数据收集阶段。
+2025-10-05 03:33:51 - UF1 - INFO - [阶段2] 开始监控TMP数据变化,需收集 10 个稳定数据点
+2025-10-05 03:33:51 - UF1 - INFO - 获取到TMP初始基准值: 0.0167
+2025-10-05 03:38:00 - UF1 - ERROR - [UF1][API] 获取'UF1_BW_After_TMP'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-05 04:08:32 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-05 04:13:29 - UF1 - INFO - TMP数据变化: 0.0167 -> 0.0150 [已收集 1/10]
+2025-10-05 04:13:31 - UF1 - INFO - TMP数据变化: 0.0150 -> 0.0140 [已收集 2/10]
+2025-10-05 04:13:33 - UF1 - INFO - TMP数据变化: 0.0140 -> 0.0146 [已收集 3/10]
+2025-10-05 04:13:41 - UF1 - INFO - TMP数据变化: 0.0146 -> 0.0144 [已收集 4/10]
+2025-10-05 04:13:46 - UF1 - INFO - TMP数据变化: 0.0144 -> 0.0146 [已收集 5/10]
+2025-10-05 04:13:48 - UF1 - INFO - TMP数据变化: 0.0146 -> 0.0142 [已收集 6/10]
+2025-10-05 04:13:52 - UF1 - INFO - TMP数据变化: 0.0142 -> 0.0146 [已收集 7/10]
+2025-10-05 04:13:54 - UF1 - INFO - TMP数据变化: 0.0146 -> 0.0142 [已收集 8/10]
+2025-10-05 04:13:56 - UF1 - INFO - TMP数据变化: 0.0142 -> 0.0144 [已收集 9/10]
+2025-10-05 04:13:58 - UF1 - INFO - TMP数据变化: 0.0144 -> 0.0140 [已收集 10/10]
+2025-10-05 04:14:00 - UF1 - INFO - [阶段3] 数据收集完成,开始计算决策
+2025-10-05 04:14:00 - UF1 - INFO - TMP中位数计算完成: 0.0144
+2025-10-05 04:14:00 - UF1 - INFO - [DB] 正在查询 'C.M.UF1_DB@press_PV' 从 2025-09-30 17:58:23 到 2025-10-05 04:14:00 的历史极值...
+2025-10-05 04:14:00 - UF1 - INFO -
+            SELECT
+                MAX(val) AS max_val,
+                MIN(val) AS min_val
+            FROM dc_item_history_data_minute
+            WHERE project_id = %s
+              AND item_name = %s
+              AND h_time IN (
+                  SELECT h_time
+                  FROM dc_item_history_data_minute
+                  WHERE project_id = %s
+                    AND item_name = %s
+                    AND val = 26
+                    AND h_time BETWEEN %s AND %s
+              )
+
+2025-10-05 04:14:02 - UF1 - INFO - {'max_val': Decimal('0.020955'), 'min_val': Decimal('0.002499')}
+2025-10-05 04:14:02 - UF1 - INFO - [DB] 查询成功: 最大值=0.020955, 最小值=0.002499
+2025-10-05 04:14:02 - UF1 - INFO - 开始DQN模型决策...
+2025-10-05 04:14:02 - UF1 - INFO - DQN决策结果: {'action': 31, 'L_s': 4100.0, 't_bw_s': 92.0, 'next_obs': array([0.11], dtype=float32), 'reward': np.float64(0.8891671076337718), 'terminated': False, 'truncated': False, 'info': {'recovery': 0.9358847247009056, 'V_feed_super_m3': 16810.0, 'V_loss_super_m3': 1077.7777777777778, 'V_net_super_m3': 15732.222222222223, 'supercycle_time_h': np.float64(48.40888888888889), 'net_delivery_rate_m3ph': np.float64(324.98622842453176), 'max_TMP_during_filtration': 0.021933146643538782, 'max_residual_increase_per_run': 0.00016986346185659564, 'phi_bw_effective': 0.7700222270445147, 'TMP_after_ceb': 0.0144, 'headroom_ratio': 0.3655524440589797, 'daily_prod_time_h': np.float64(23.150018362100624), 'ton_water_energy_kWh_per_m3': 0.1015, 'k_bw_per_ceb': 41, 'feasible': True, 'step': 1}}
+2025-10-05 04:14:02 - UF1 - INFO - [UF1][回调] 准备发送决策数据:
+{
+  "list": [
+    {
+      "type": "UF1",
+      "project_id": 92,
+      "water_production_time": 4100,
+      "physical_backwash": 94,
+      "ceb_backwash_frequency": 41,
+      "duration_system": 4200,
+      "tmp_action": 0.0144,
+      "recovery_rate": 0.9345297111507701,
+      "ton_water_energy_kWh": 0.1015,
+      "max_permeability": 2813.625450180072,
+      "daily_prod_time_h": 23.13913073402388,
+      "ctime": "2025-10-05 04:14:00"
+    }
+  ]
+}
+2025-10-05 04:14:02 - UF1 - INFO - [UF1][回调] 第 1/3 次尝试发送...
+2025-10-05 04:14:03 - UF1 - INFO - [UF1][回调] 决策数据发送成功!服务器响应: {"code":200,"msg":"success"}
+2025-10-05 04:14:03 - UF1 - INFO - 配置项 use_model=0,跳过PLC指令下发。
+2025-10-05 04:14:03 - UF1 - INFO - [UF1] 状态已成功保存到 'device_states.json'。
+2025-10-05 04:14:03 - UF1 - INFO - 本轮决策完成,状态已更新并保存。下轮历史查询起始时间将是: 2025-10-05 04:14:00
+2025-10-05 04:14:03 - UF1 - INFO - [阶段4] 等待重置条件 (控制字 != 95)
+2025-10-05 04:14:03 - UF1 - INFO - 重置条件满足,即将开始新一轮监控。
+2025-10-05 04:14:03 - UF1 - INFO - --- UF1 本轮监控完成,重启循环 ---
+
+2025-10-05 04:14:03 - UF1 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-10-05 05:03:45 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-05 05:17:51 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-05 05:49:45 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-05 08:05:43 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-05 08:16:12 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-05 08:47:59 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-05 09:05:55 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-05 09:13:12 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-05 09:52:18 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-05 10:17:18 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-05 12:12:42 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-05 12:15:39 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-05 13:46:05 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-05 13:51:53 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-05 14:24:45 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-05 16:13:19 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-05 16:20:48 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-05 16:22:12 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-05 16:56:42 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-05 16:58:45 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-05 18:15:42 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-05 18:36:09 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-05 19:31:13 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-05 19:37:24 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-05 20:34:39 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-05 20:37:12 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-05 21:12:12 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-05 23:18:57 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-06 00:23:43 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-06 03:35:45 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-06 03:39:34 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-06 03:51:56 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-06 04:08:00 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-06 05:02:18 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-06 05:41:32 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-06 06:37:45 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-06 06:52:31 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-06 06:54:04 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-06 06:56:20 - UF3 - INFO - 触发条件满足,进入数据收集阶段。
+2025-10-06 06:56:20 - UF3 - INFO - [阶段2] 开始监控TMP数据变化,需收集 10 个稳定数据点
+2025-10-06 06:56:20 - UF3 - INFO - 获取到TMP初始基准值: 0.0277
+2025-10-06 07:17:54 - UF3 - ERROR - [UF3][API] 获取'UF3_BW_After_TMP'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-06 07:17:54 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-06 07:32:17 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-06 07:39:04 - UF2 - INFO - 触发条件满足,进入数据收集阶段。
+2025-10-06 07:39:04 - UF2 - INFO - [阶段2] 开始监控TMP数据变化,需收集 10 个稳定数据点
+2025-10-06 07:39:04 - UF2 - INFO - 获取到TMP初始基准值: 0.019
+2025-10-06 08:17:42 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-06 08:18:38 - UF3 - INFO - TMP数据变化: 0.0277 -> 0.0248 [已收集 1/10]
+2025-10-06 08:18:42 - UF3 - INFO - TMP数据变化: 0.0248 -> 0.0246 [已收集 2/10]
+2025-10-06 08:18:44 - UF3 - INFO - TMP数据变化: 0.0246 -> 0.0244 [已收集 3/10]
+2025-10-06 08:18:46 - UF3 - INFO - TMP数据变化: 0.0244 -> 0.0246 [已收集 4/10]
+2025-10-06 08:18:48 - UF3 - INFO - TMP数据变化: 0.0246 -> 0.0242 [已收集 5/10]
+2025-10-06 08:18:53 - UF3 - INFO - TMP数据变化: 0.0242 -> 0.0240 [已收集 6/10]
+2025-10-06 08:18:55 - UF3 - INFO - TMP数据变化: 0.0240 -> 0.0238 [已收集 7/10]
+2025-10-06 08:18:57 - UF3 - INFO - TMP数据变化: 0.0238 -> 0.0236 [已收集 8/10]
+2025-10-06 08:19:01 - UF3 - INFO - TMP数据变化: 0.0236 -> 0.0231 [已收集 9/10]
+2025-10-06 08:19:05 - UF3 - INFO - TMP数据变化: 0.0231 -> 0.0233 [已收集 10/10]
+2025-10-06 08:19:07 - UF3 - INFO - [阶段3] 数据收集完成,开始计算决策
+2025-10-06 08:19:07 - UF3 - INFO - TMP中位数计算完成: 0.0241
+2025-10-06 08:19:07 - UF3 - INFO - [DB] 正在查询 'C.M.UF3_DB@press_PV' 从 2025-10-02 15:25:30 到 2025-10-06 08:19:07 的历史极值...
+2025-10-06 08:19:07 - UF3 - INFO -
+            SELECT
+                MAX(val) AS max_val,
+                MIN(val) AS min_val
+            FROM dc_item_history_data_minute
+            WHERE project_id = %s
+              AND item_name = %s
+              AND h_time IN (
+                  SELECT h_time
+                  FROM dc_item_history_data_minute
+                  WHERE project_id = %s
+                    AND item_name = %s
+                    AND val = 26
+                    AND h_time BETWEEN %s AND %s
+              )
+
+2025-10-06 08:19:08 - UF3 - INFO - {'max_val': Decimal('0.046139'), 'min_val': Decimal('0.001153')}
+2025-10-06 08:19:08 - UF3 - INFO - [DB] 查询成功: 最大值=0.046139, 最小值=0.001153
+2025-10-06 08:19:08 - UF3 - INFO - 开始DQN模型决策...
+2025-10-06 08:19:08 - UF3 - INFO - DQN决策结果: {'action': 33, 'L_s': 4100.0, 't_bw_s': 96.0, 'next_obs': array([0.3525], dtype=float32), 'reward': np.float64(0.8437373948014673), 'terminated': False, 'truncated': False, 'info': {'recovery': 0.9331746976006345, 'V_feed_super_m3': 16810.0, 'V_loss_super_m3': 1123.3333333333335, 'V_net_super_m3': 15686.666666666666, 'supercycle_time_h': np.float64(48.45444444444444), 'net_delivery_rate_m3ph': np.float64(323.74051227957534), 'max_TMP_during_filtration': 0.03149441920741388, 'max_residual_increase_per_run': 0.00016639527595347162, 'phi_bw_effective': 0.7747177964240509, 'TMP_after_ceb': 0.0241, 'headroom_ratio': 0.5249069867902314, 'daily_prod_time_h': np.float64(23.128253342200004), 'ton_water_energy_kWh_per_m3': 0.1015, 'k_bw_per_ceb': 41, 'feasible': True, 'step': 1}}
+2025-10-06 08:19:08 - UF3 - INFO - [UF3][回调] 准备发送决策数据:
+{
+  "list": [
+    {
+      "type": "UF3",
+      "project_id": 92,
+      "water_production_time": 4100,
+      "physical_backwash": 94,
+      "ceb_backwash_frequency": 41,
+      "duration_system": 4200,
+      "tmp_action": 0.0241,
+      "recovery_rate": 0.9345297111507701,
+      "ton_water_energy_kWh": 0.1015,
+      "max_permeability": 6098.222029488292,
+      "daily_prod_time_h": 23.13913073402388,
+      "ctime": "2025-10-06 08:19:07"
+    }
+  ]
+}
+2025-10-06 08:19:08 - UF3 - INFO - [UF3][回调] 第 1/3 次尝试发送...
+2025-10-06 08:19:08 - UF3 - INFO - [UF3][回调] 决策数据发送成功!服务器响应: {"code":200,"msg":"success"}
+2025-10-06 08:19:08 - UF3 - INFO - 配置项 use_model=0,跳过PLC指令下发。
+2025-10-06 08:19:08 - UF3 - INFO - [UF3] 状态已成功保存到 'device_states.json'。
+2025-10-06 08:19:08 - UF3 - INFO - 本轮决策完成,状态已更新并保存。下轮历史查询起始时间将是: 2025-10-06 08:19:07
+2025-10-06 08:19:08 - UF3 - INFO - [阶段4] 等待重置条件 (控制字 != 95)
+2025-10-06 08:19:08 - UF3 - INFO - 重置条件满足,即将开始新一轮监控。
+2025-10-06 08:19:08 - UF3 - INFO - --- UF3 本轮监控完成,重启循环 ---
+
+2025-10-06 08:19:08 - UF3 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-10-06 09:16:59 - UF2 - INFO - TMP数据变化: 0.0190 -> 0.0096 [已收集 1/10]
+2025-10-06 09:17:03 - UF2 - INFO - TMP数据变化: 0.0096 -> 0.0098 [已收集 2/10]
+2025-10-06 09:17:05 - UF2 - INFO - TMP数据变化: 0.0098 -> 0.0096 [已收集 3/10]
+2025-10-06 09:17:08 - UF2 - INFO - TMP数据变化: 0.0096 -> 0.0100 [已收集 4/10]
+2025-10-06 09:17:10 - UF2 - INFO - TMP数据变化: 0.0100 -> 0.0098 [已收集 5/10]
+2025-10-06 09:17:14 - UF2 - INFO - TMP数据变化: 0.0098 -> 0.0092 [已收集 6/10]
+2025-10-06 09:17:18 - UF2 - INFO - TMP数据变化: 0.0092 -> 0.0096 [已收集 7/10]
+2025-10-06 09:17:22 - UF2 - INFO - TMP数据变化: 0.0096 -> 0.0100 [已收集 8/10]
+2025-10-06 09:17:26 - UF2 - INFO - TMP数据变化: 0.0100 -> 0.0106 [已收集 9/10]
+2025-10-06 09:17:31 - UF2 - INFO - TMP数据变化: 0.0106 -> 0.0113 [已收集 10/10]
+2025-10-06 09:17:33 - UF2 - INFO - [阶段3] 数据收集完成,开始计算决策
+2025-10-06 09:17:33 - UF2 - INFO - TMP中位数计算完成: 0.0098
+2025-10-06 09:17:33 - UF2 - INFO - [DB] 正在查询 'C.M.UF2_DB@press_PV' 从 2025-10-02 22:23:37 到 2025-10-06 09:17:33 的历史极值...
+2025-10-06 09:17:33 - UF2 - INFO -
+            SELECT
+                MAX(val) AS max_val,
+                MIN(val) AS min_val
+            FROM dc_item_history_data_minute
+            WHERE project_id = %s
+              AND item_name = %s
+              AND h_time IN (
+                  SELECT h_time
+                  FROM dc_item_history_data_minute
+                  WHERE project_id = %s
+                    AND item_name = %s
+                    AND val = 26
+                    AND h_time BETWEEN %s AND %s
+              )
+
+2025-10-06 09:17:33 - UF2 - INFO - {'max_val': Decimal('0.028837'), 'min_val': Decimal('0.002884')}
+2025-10-06 09:17:33 - UF2 - INFO - [DB] 查询成功: 最大值=0.028837, 最小值=0.002884
+2025-10-06 09:17:33 - UF2 - INFO - 开始DQN模型决策...
+2025-10-06 09:17:33 - UF2 - INFO - DQN决策结果: {'action': 31, 'L_s': 4100.0, 't_bw_s': 92.0, 'next_obs': array([-0.005], dtype=float32), 'reward': np.float64(0.9042191867271515), 'terminated': False, 'truncated': False, 'info': {'recovery': 0.9358847247009056, 'V_feed_super_m3': 16810.0, 'V_loss_super_m3': 1077.7777777777778, 'V_net_super_m3': 15732.222222222223, 'supercycle_time_h': np.float64(48.40888888888889), 'net_delivery_rate_m3ph': np.float64(324.98622842453176), 'max_TMP_during_filtration': 0.017333146643538827, 'max_residual_increase_per_run': 0.00016986346185659564, 'phi_bw_effective': 0.7700222270445147, 'TMP_after_ceb': 0.0098, 'headroom_ratio': 0.2888857773923138, 'daily_prod_time_h': np.float64(23.150018362100624), 'ton_water_energy_kWh_per_m3': 0.1015, 'k_bw_per_ceb': 41, 'feasible': True, 'step': 1}}
+2025-10-06 09:17:33 - UF2 - INFO - [UF2][回调] 准备发送决策数据:
+{
+  "list": [
+    {
+      "type": "UF2",
+      "project_id": 92,
+      "water_production_time": 4100,
+      "physical_backwash": 94,
+      "ceb_backwash_frequency": 41,
+      "duration_system": 7000,
+      "tmp_action": 0.0098,
+      "recovery_rate": 0.9345297111507701,
+      "ton_water_energy_kWh": 0.1015,
+      "max_permeability": 2438.0201109570044,
+      "daily_prod_time_h": 23.13913073402388,
+      "ctime": "2025-10-06 09:17:33"
+    }
+  ]
+}
+2025-10-06 09:17:33 - UF2 - INFO - [UF2][回调] 第 1/3 次尝试发送...
+2025-10-06 09:17:33 - UF2 - INFO - [UF2][回调] 决策数据发送成功!服务器响应: {"code":200,"msg":"success"}
+2025-10-06 09:17:33 - UF2 - INFO - 配置项 use_model=0,跳过PLC指令下发。
+2025-10-06 09:17:33 - UF2 - INFO - [UF2] 状态已成功保存到 'device_states.json'。
+2025-10-06 09:17:33 - UF2 - INFO - 本轮决策完成,状态已更新并保存。下轮历史查询起始时间将是: 2025-10-06 09:17:33
+2025-10-06 09:17:33 - UF2 - INFO - [阶段4] 等待重置条件 (控制字 != 95)
+2025-10-06 09:17:33 - UF2 - INFO - 重置条件满足,即将开始新一轮监控。
+2025-10-06 09:17:33 - UF2 - INFO - --- UF2 本轮监控完成,重启循环 ---
+
+2025-10-06 09:17:33 - UF2 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-10-06 10:08:22 - UF4 - INFO - 触发条件满足,进入数据收集阶段。
+2025-10-06 10:08:22 - UF4 - INFO - [阶段2] 开始监控TMP数据变化,需收集 10 个稳定数据点
+2025-10-06 10:08:22 - UF4 - INFO - 获取到TMP初始基准值: 0.0169
+2025-10-06 10:35:57 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-06 10:45:33 - UF4 - INFO - TMP数据变化: 0.0169 -> 0.0092 [已收集 1/10]
+2025-10-06 10:45:35 - UF4 - INFO - TMP数据变化: 0.0092 -> 0.0090 [已收集 2/10]
+2025-10-06 10:45:37 - UF4 - INFO - TMP数据变化: 0.0090 -> 0.0092 [已收集 3/10]
+2025-10-06 10:45:39 - UF4 - INFO - TMP数据变化: 0.0092 -> 0.0096 [已收集 4/10]
+2025-10-06 10:45:42 - UF4 - INFO - TMP数据变化: 0.0096 -> 0.0090 [已收集 5/10]
+2025-10-06 10:45:44 - UF4 - INFO - TMP数据变化: 0.0090 -> 0.0092 [已收集 6/10]
+2025-10-06 10:45:52 - UF4 - INFO - TMP数据变化: 0.0092 -> 0.0090 [已收集 7/10]
+2025-10-06 10:45:54 - UF4 - INFO - TMP数据变化: 0.0090 -> 0.0092 [已收集 8/10]
+2025-10-06 10:46:03 - UF4 - INFO - TMP数据变化: 0.0092 -> 0.0100 [已收集 9/10]
+2025-10-06 10:46:06 - UF4 - INFO - TMP数据变化: 0.0100 -> 0.0104 [已收集 10/10]
+2025-10-06 10:46:08 - UF4 - INFO - [阶段3] 数据收集完成,开始计算决策
+2025-10-06 10:46:08 - UF4 - INFO - TMP中位数计算完成: 0.0092
+2025-10-06 10:46:08 - UF4 - INFO - [DB] 正在查询 'C.M.UF4_DB@press_PV' 从 2025-10-02 19:15:14 到 2025-10-06 10:46:08 的历史极值...
+2025-10-06 10:46:08 - UF4 - INFO -
+            SELECT
+                MAX(val) AS max_val,
+                MIN(val) AS min_val
+            FROM dc_item_history_data_minute
+            WHERE project_id = %s
+              AND item_name = %s
+              AND h_time IN (
+                  SELECT h_time
+                  FROM dc_item_history_data_minute
+                  WHERE project_id = %s
+                    AND item_name = %s
+                    AND val = 26
+                    AND h_time BETWEEN %s AND %s
+              )
+
+2025-10-06 10:46:08 - UF4 - INFO - {'max_val': Decimal('0.028260'), 'min_val': Decimal('0.003268')}
+2025-10-06 10:46:08 - UF4 - INFO - [DB] 查询成功: 最大值=0.02826, 最小值=0.003268
+2025-10-06 10:46:08 - UF4 - INFO - 开始DQN模型决策...
+2025-10-06 10:46:08 - UF4 - INFO - DQN决策结果: {'action': 31, 'L_s': 4100.0, 't_bw_s': 92.0, 'next_obs': array([-0.02], dtype=float32), 'reward': np.float64(0.9059225013915053), 'terminated': False, 'truncated': False, 'info': {'recovery': 0.9358847247009056, 'V_feed_super_m3': 16810.0, 'V_loss_super_m3': 1077.7777777777778, 'V_net_super_m3': 15732.222222222223, 'supercycle_time_h': np.float64(48.40888888888889), 'net_delivery_rate_m3ph': np.float64(324.98622842453176), 'max_TMP_during_filtration': 0.016733146643538834, 'max_residual_increase_per_run': 0.00016986346185659564, 'phi_bw_effective': 0.7700222270445147, 'TMP_after_ceb': 0.0092, 'headroom_ratio': 0.2788857773923139, 'daily_prod_time_h': np.float64(23.150018362100624), 'ton_water_energy_kWh_per_m3': 0.1015, 'k_bw_per_ceb': 41, 'feasible': True, 'step': 1}}
+2025-10-06 10:46:08 - UF4 - INFO - [UF4][回调] 准备发送决策数据:
+{
+  "list": [
+    {
+      "type": "UF4",
+      "project_id": 92,
+      "water_production_time": 4100,
+      "physical_backwash": 94,
+      "ceb_backwash_frequency": 41,
+      "duration_system": 4200,
+      "tmp_action": 0.0092,
+      "recovery_rate": 0.9345297111507701,
+      "ton_water_energy_kWh": 0.1015,
+      "max_permeability": 2151.545287637699,
+      "daily_prod_time_h": 23.13913073402388,
+      "ctime": "2025-10-06 10:46:08"
+    }
+  ]
+}
+2025-10-06 10:46:08 - UF4 - INFO - [UF4][回调] 第 1/3 次尝试发送...
+2025-10-06 10:46:09 - UF4 - INFO - [UF4][回调] 决策数据发送成功!服务器响应: {"code":200,"msg":"success"}
+2025-10-06 10:46:09 - UF4 - INFO - 配置项 use_model=0,跳过PLC指令下发。
+2025-10-06 10:46:09 - UF4 - INFO - [UF4] 状态已成功保存到 'device_states.json'。
+2025-10-06 10:46:09 - UF4 - INFO - 本轮决策完成,状态已更新并保存。下轮历史查询起始时间将是: 2025-10-06 10:46:08
+2025-10-06 10:46:09 - UF4 - INFO - [阶段4] 等待重置条件 (控制字 != 95)
+2025-10-06 10:46:09 - UF4 - INFO - 重置条件满足,即将开始新一轮监控。
+2025-10-06 10:46:09 - UF4 - INFO - --- UF4 本轮监控完成,重启循环 ---
+
+2025-10-06 10:46:09 - UF4 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-10-06 10:56:42 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-06 13:05:04 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-06 13:18:30 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-06 13:34:24 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-06 13:40:39 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-06 13:47:42 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-06 13:48:40 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-06 15:08:39 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-06 15:34:12 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-06 16:11:57 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-06 17:08:18 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-06 18:18:44 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-06 19:39:42 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-06 19:41:16 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-06 19:43:16 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-06 20:24:09 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-06 20:34:44 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-06 20:44:44 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-06 21:02:06 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-06 21:31:36 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-06 22:39:26 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-06 22:39:26 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-06 22:56:38 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-06 23:10:54 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-06 23:17:30 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-07 00:50:54 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-07 01:22:33 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-07 01:30:46 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-07 01:30:47 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-07 01:30:48 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-07 01:30:48 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-07 01:30:58 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-07 01:30:59 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-07 01:31:00 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-07 01:31:00 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-07 01:31:02 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,业务错误: ok
+2025-10-07 01:31:02 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,业务错误: ok
+2025-10-07 01:32:16 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-07 01:32:21 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-07 01:32:21 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-07 01:32:21 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-07 01:32:33 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-07 01:32:39 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-07 01:33:57 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-07 01:34:02 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-07 03:08:35 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-07 03:45:06 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-07 04:28:55 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-07 05:02:33 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-07 05:37:21 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-07 06:26:00 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-07 07:17:36 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-07 07:34:21 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-07 07:44:35 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-07 08:11:15 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-07 08:36:20 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-07 08:38:16 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-07 08:38:17 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-07 09:43:42 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-07 10:02:57 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-07 10:27:47 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-07 10:59:42 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-07 11:03:41 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-07 11:13:58 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-07 13:06:02 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-07 13:06:03 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-07 14:13:00 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-07 14:15:25 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-07 14:53:02 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-07 14:55:36 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-07 15:16:48 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-07 16:16:06 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-07 16:45:45 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-07 16:54:33 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-07 16:55:53 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-07 18:26:40 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-07 18:34:39 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-07 18:46:03 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-07 18:55:40 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-07 19:08:30 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-07 19:43:50 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-07 21:27:54 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-07 21:56:56 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-07 22:35:23 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-07 23:03:05 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-07 23:09:43 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-07 23:09:43 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-08 00:13:18 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-08 00:48:54 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-08 00:56:39 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-08 01:51:48 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-08 01:52:03 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-08 02:56:23 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-08 02:56:23 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-08 04:15:38 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-08 04:37:12 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-08 05:09:38 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-08 05:28:03 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-08 05:46:21 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-08 05:53:18 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-08 06:02:45 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-08 06:20:37 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-08 06:23:59 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-08 06:39:36 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-08 06:49:16 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-08 06:49:16 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-08 06:54:08 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-08 08:09:42 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-08 09:59:42 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-08 10:07:30 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-08 10:18:56 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-08 10:18:56 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-08 10:18:56 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-08 10:18:56 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-08 10:19:08 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-08 10:19:08 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-08 10:19:08 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-08 10:19:08 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-08 10:19:20 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-08 10:19:20 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-08 10:19:20 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-08 10:19:20 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-08 10:19:29 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,业务错误: ok
+2025-10-08 10:19:30 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,业务错误: ok
+2025-10-08 10:19:31 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: 502 Server Error: Bad Gateway for url: http://120.55.44.4:8900/api/v1/jinke-cloud/device/current-data
+2025-10-08 10:19:32 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: 502 Server Error: Bad Gateway for url: http://120.55.44.4:8900/api/v1/jinke-cloud/device/current-data
+2025-10-08 10:19:32 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-08 10:19:33 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: 502 Server Error: Bad Gateway for url: http://120.55.44.4:8900/api/v1/jinke-cloud/device/current-data
+2025-10-08 10:19:33 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: 502 Server Error: Bad Gateway for url: http://120.55.44.4:8900/api/v1/jinke-cloud/device/current-data
+2025-10-08 10:19:34 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: 502 Server Error: Bad Gateway for url: http://120.55.44.4:8900/api/v1/jinke-cloud/device/current-data
+2025-10-08 10:19:34 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: 502 Server Error: Bad Gateway for url: http://120.55.44.4:8900/api/v1/jinke-cloud/device/current-data
+2025-10-08 10:19:35 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: 502 Server Error: Bad Gateway for url: http://120.55.44.4:8900/api/v1/jinke-cloud/device/current-data
+2025-10-08 10:19:35 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: 502 Server Error: Bad Gateway for url: http://120.55.44.4:8900/api/v1/jinke-cloud/device/current-data
+2025-10-08 10:19:36 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: 502 Server Error: Bad Gateway for url: http://120.55.44.4:8900/api/v1/jinke-cloud/device/current-data
+2025-10-08 10:19:36 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: 502 Server Error: Bad Gateway for url: http://120.55.44.4:8900/api/v1/jinke-cloud/device/current-data
+2025-10-08 10:19:37 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: 502 Server Error: Bad Gateway for url: http://120.55.44.4:8900/api/v1/jinke-cloud/device/current-data
+2025-10-08 10:19:37 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: 502 Server Error: Bad Gateway for url: http://120.55.44.4:8900/api/v1/jinke-cloud/device/current-data
+2025-10-08 10:19:38 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: 502 Server Error: Bad Gateway for url: http://120.55.44.4:8900/api/v1/jinke-cloud/device/current-data
+2025-10-08 10:19:38 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: 502 Server Error: Bad Gateway for url: http://120.55.44.4:8900/api/v1/jinke-cloud/device/current-data
+2025-10-08 10:19:39 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: 502 Server Error: Bad Gateway for url: http://120.55.44.4:8900/api/v1/jinke-cloud/device/current-data
+2025-10-08 10:19:39 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: 502 Server Error: Bad Gateway for url: http://120.55.44.4:8900/api/v1/jinke-cloud/device/current-data
+2025-10-08 10:20:57 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-08 10:20:58 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-08 10:21:01 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-08 10:21:09 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-08 10:22:27 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-08 10:38:30 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-08 10:51:21 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-08 10:52:50 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-08 10:53:56 - UF1 - INFO - 触发条件满足,进入数据收集阶段。
+2025-10-08 10:53:56 - UF1 - INFO - [阶段2] 开始监控TMP数据变化,需收集 10 个稳定数据点
+2025-10-08 10:53:56 - UF1 - INFO - 获取到TMP初始基准值: 0.0167
+2025-10-08 11:13:44 - UF1 - ERROR - [UF1][API] 获取'UF1_BW_After_TMP'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-08 11:13:45 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-08 11:19:14 - UF1 - INFO - TMP数据变化: 0.0167 -> 0.0138 [已收集 1/10]
+2025-10-08 11:19:16 - UF1 - INFO - TMP数据变化: 0.0138 -> 0.0135 [已收集 2/10]
+2025-10-08 11:19:21 - UF1 - INFO - TMP数据变化: 0.0135 -> 0.0138 [已收集 3/10]
+2025-10-08 11:19:23 - UF1 - INFO - TMP数据变化: 0.0138 -> 0.0136 [已收集 4/10]
+2025-10-08 11:19:27 - UF1 - INFO - TMP数据变化: 0.0136 -> 0.0135 [已收集 5/10]
+2025-10-08 11:19:33 - UF1 - INFO - TMP数据变化: 0.0135 -> 0.0138 [已收集 6/10]
+2025-10-08 11:19:35 - UF1 - INFO - TMP数据变化: 0.0138 -> 0.0140 [已收集 7/10]
+2025-10-08 11:19:37 - UF1 - INFO - TMP数据变化: 0.0140 -> 0.0136 [已收集 8/10]
+2025-10-08 11:19:41 - UF1 - INFO - TMP数据变化: 0.0136 -> 0.0138 [已收集 9/10]
+2025-10-08 11:19:43 - UF1 - INFO - TMP数据变化: 0.0138 -> 0.0140 [已收集 10/10]
+2025-10-08 11:19:45 - UF1 - INFO - [阶段3] 数据收集完成,开始计算决策
+2025-10-08 11:19:45 - UF1 - INFO - TMP中位数计算完成: 0.0138
+2025-10-08 11:19:45 - UF1 - INFO - [DB] 正在查询 'C.M.UF1_DB@press_PV' 从 2025-10-05 04:14:00 到 2025-10-08 11:19:45 的历史极值...
+2025-10-08 11:19:45 - UF1 - INFO -
+            SELECT
+                MAX(val) AS max_val,
+                MIN(val) AS min_val
+            FROM dc_item_history_data_minute
+            WHERE project_id = %s
+              AND item_name = %s
+              AND h_time IN (
+                  SELECT h_time
+                  FROM dc_item_history_data_minute
+                  WHERE project_id = %s
+                    AND item_name = %s
+                    AND val = 26
+                    AND h_time BETWEEN %s AND %s
+              )
+
+2025-10-08 11:19:46 - UF1 - INFO - {'max_val': Decimal('0.024415'), 'min_val': Decimal('0.004614')}
+2025-10-08 11:19:46 - UF1 - INFO - [DB] 查询成功: 最大值=0.024415, 最小值=0.004614
+2025-10-08 11:19:46 - UF1 - INFO - 开始DQN模型决策...
+2025-10-08 11:19:46 - UF1 - INFO - DQN决策结果: {'action': 31, 'L_s': 4100.0, 't_bw_s': 92.0, 'next_obs': array([0.095], dtype=float32), 'reward': np.float64(0.8913304222981258), 'terminated': False, 'truncated': False, 'info': {'recovery': 0.9358847247009056, 'V_feed_super_m3': 16810.0, 'V_loss_super_m3': 1077.7777777777778, 'V_net_super_m3': 15732.222222222223, 'supercycle_time_h': np.float64(48.40888888888889), 'net_delivery_rate_m3ph': np.float64(324.98622842453176), 'max_TMP_during_filtration': 0.021333146643538786, 'max_residual_increase_per_run': 0.00016986346185659564, 'phi_bw_effective': 0.7700222270445147, 'TMP_after_ceb': 0.0138, 'headroom_ratio': 0.3555524440589798, 'daily_prod_time_h': np.float64(23.150018362100624), 'ton_water_energy_kWh_per_m3': 0.1015, 'k_bw_per_ceb': 41, 'feasible': True, 'step': 1}}
+2025-10-08 11:19:46 - UF1 - INFO - [UF1][回调] 准备发送决策数据:
+{
+  "list": [
+    {
+      "type": "UF1",
+      "project_id": 92,
+      "water_production_time": 4100,
+      "physical_backwash": 94,
+      "ceb_backwash_frequency": 41,
+      "duration_system": 4200,
+      "tmp_action": 0.0138,
+      "recovery_rate": 0.9345297111507701,
+      "ton_water_energy_kWh": 0.1015,
+      "max_permeability": 1523.8946684005202,
+      "daily_prod_time_h": 23.13913073402388,
+      "ctime": "2025-10-08 11:19:45"
+    }
+  ]
+}
+2025-10-08 11:19:46 - UF1 - INFO - [UF1][回调] 第 1/3 次尝试发送...
+2025-10-08 11:19:46 - UF1 - INFO - [UF1][回调] 决策数据发送成功!服务器响应: {"code":200,"msg":"success"}
+2025-10-08 11:19:46 - UF1 - INFO - 配置项 use_model=0,跳过PLC指令下发。
+2025-10-08 11:19:46 - UF1 - INFO - [UF1] 状态已成功保存到 'device_states.json'。
+2025-10-08 11:19:46 - UF1 - INFO - 本轮决策完成,状态已更新并保存。下轮历史查询起始时间将是: 2025-10-08 11:19:45
+2025-10-08 11:19:46 - UF1 - INFO - [阶段4] 等待重置条件 (控制字 != 95)
+2025-10-08 11:19:47 - UF1 - INFO - 重置条件满足,即将开始新一轮监控。
+2025-10-08 11:19:47 - UF1 - INFO - --- UF1 本轮监控完成,重启循环 ---
+
+2025-10-08 11:19:47 - UF1 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-10-08 13:28:17 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-08 15:01:28 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-08 15:42:43 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-08 18:11:42 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-08 19:35:12 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-08 19:35:27 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-08 19:46:18 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-08 21:32:09 - UF3 - INFO - 触发条件满足,进入数据收集阶段。
+2025-10-08 21:32:09 - UF3 - INFO - [阶段2] 开始监控TMP数据变化,需收集 10 个稳定数据点
+2025-10-08 21:32:09 - UF3 - INFO - 获取到TMP初始基准值: 0.0171
+2025-10-08 21:34:31 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-08 22:13:21 - UF4 - INFO - 触发条件满足,进入数据收集阶段。
+2025-10-08 22:13:21 - UF4 - INFO - [阶段2] 开始监控TMP数据变化,需收集 10 个稳定数据点
+2025-10-08 22:13:21 - UF4 - INFO - 获取到TMP初始基准值: 0.0146
+2025-10-08 22:55:18 - UF3 - INFO - TMP数据变化: 0.0171 -> 0.0294 [已收集 1/10]
+2025-10-08 22:55:26 - UF3 - INFO - TMP数据变化: 0.0294 -> 0.0296 [已收集 2/10]
+2025-10-08 22:55:28 - UF3 - INFO - TMP数据变化: 0.0296 -> 0.0294 [已收集 3/10]
+2025-10-08 22:55:32 - UF3 - INFO - TMP数据变化: 0.0294 -> 0.0298 [已收集 4/10]
+2025-10-08 22:55:34 - UF3 - INFO - TMP数据变化: 0.0298 -> 0.0296 [已收集 5/10]
+2025-10-08 22:55:36 - UF3 - INFO - TMP数据变化: 0.0296 -> 0.0294 [已收集 6/10]
+2025-10-08 22:55:41 - UF3 - INFO - TMP数据变化: 0.0294 -> 0.0292 [已收集 7/10]
+2025-10-08 22:55:45 - UF3 - INFO - TMP数据变化: 0.0292 -> 0.0275 [已收集 8/10]
+2025-10-08 22:55:47 - UF3 - INFO - TMP数据变化: 0.0275 -> 0.0252 [已收集 9/10]
+2025-10-08 22:55:49 - UF3 - INFO - TMP数据变化: 0.0252 -> 0.0242 [已收集 10/10]
+2025-10-08 22:55:51 - UF3 - INFO - [阶段3] 数据收集完成,开始计算决策
+2025-10-08 22:55:51 - UF3 - INFO - TMP中位数计算完成: 0.0294
+2025-10-08 22:55:51 - UF3 - INFO - [DB] 正在查询 'C.M.UF3_DB@press_PV' 从 2025-10-06 08:19:07 到 2025-10-08 22:55:51 的历史极值...
+2025-10-08 22:55:51 - UF3 - INFO -
+            SELECT
+                MAX(val) AS max_val,
+                MIN(val) AS min_val
+            FROM dc_item_history_data_minute
+            WHERE project_id = %s
+              AND item_name = %s
+              AND h_time IN (
+                  SELECT h_time
+                  FROM dc_item_history_data_minute
+                  WHERE project_id = %s
+                    AND item_name = %s
+                    AND val = 26
+                    AND h_time BETWEEN %s AND %s
+              )
+
+2025-10-08 22:55:52 - UF3 - INFO - {'max_val': Decimal('0.042294'), 'min_val': Decimal('0.002115')}
+2025-10-08 22:55:52 - UF3 - INFO - [DB] 查询成功: 最大值=0.042294, 最小值=0.002115
+2025-10-08 22:55:52 - UF3 - INFO - 开始DQN模型决策...
+2025-10-08 22:55:52 - UF3 - INFO - DQN决策结果: {'action': 31, 'L_s': 4100.0, 't_bw_s': 92.0, 'next_obs': array([0.485], dtype=float32), 'reward': np.float64(0.815584241024925), 'terminated': False, 'truncated': False, 'info': {'recovery': 0.9358847247009056, 'V_feed_super_m3': 16810.0, 'V_loss_super_m3': 1077.7777777777778, 'V_net_super_m3': 15732.222222222223, 'supercycle_time_h': np.float64(48.40888888888889), 'net_delivery_rate_m3ph': np.float64(324.98622842453176), 'max_TMP_during_filtration': 0.03693314664353877, 'max_residual_increase_per_run': 0.00016986346185659737, 'phi_bw_effective': 0.7700222270445147, 'TMP_after_ceb': 0.0294, 'headroom_ratio': 0.6155524440589796, 'daily_prod_time_h': np.float64(23.150018362100624), 'ton_water_energy_kWh_per_m3': 0.1015, 'k_bw_per_ceb': 41, 'feasible': True, 'step': 1}}
+2025-10-08 22:55:52 - UF3 - INFO - [UF3][回调] 准备发送决策数据:
+{
+  "list": [
+    {
+      "type": "UF3",
+      "project_id": 92,
+      "water_production_time": 4100,
+      "physical_backwash": 94,
+      "ceb_backwash_frequency": 41,
+      "duration_system": 4200,
+      "tmp_action": 0.0294,
+      "recovery_rate": 0.9345297111507701,
+      "ton_water_energy_kWh": 0.1015,
+      "max_permeability": 3324.4680851063827,
+      "daily_prod_time_h": 23.13913073402388,
+      "ctime": "2025-10-08 22:55:51"
+    }
+  ]
+}
+2025-10-08 22:55:52 - UF3 - INFO - [UF3][回调] 第 1/3 次尝试发送...
+2025-10-08 22:55:52 - UF3 - INFO - [UF3][回调] 决策数据发送成功!服务器响应: {"code":200,"msg":"success"}
+2025-10-08 22:55:52 - UF3 - INFO - 配置项 use_model=0,跳过PLC指令下发。
+2025-10-08 22:55:52 - UF3 - INFO - [UF3] 状态已成功保存到 'device_states.json'。
+2025-10-08 22:55:52 - UF3 - INFO - 本轮决策完成,状态已更新并保存。下轮历史查询起始时间将是: 2025-10-08 22:55:51
+2025-10-08 22:55:52 - UF3 - INFO - [阶段4] 等待重置条件 (控制字 != 95)
+2025-10-08 22:55:52 - UF3 - INFO - 重置条件满足,即将开始新一轮监控。
+2025-10-08 22:55:52 - UF3 - INFO - --- UF3 本轮监控完成,重启循环 ---
+
+2025-10-08 22:55:52 - UF3 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-10-08 22:56:35 - UF4 - ERROR - [UF4][API] 获取'UF4_BW_After_TMP'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-08 23:04:12 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-08 23:17:46 - UF4 - INFO - TMP数据变化: 0.0146 -> 0.0096 [已收集 1/10]
+2025-10-08 23:17:48 - UF4 - INFO - TMP数据变化: 0.0096 -> 0.0102 [已收集 2/10]
+2025-10-08 23:17:50 - UF4 - INFO - TMP数据变化: 0.0102 -> 0.0098 [已收集 3/10]
+2025-10-08 23:17:56 - UF4 - INFO - TMP数据变化: 0.0098 -> 0.0100 [已收集 4/10]
+2025-10-08 23:17:58 - UF4 - INFO - TMP数据变化: 0.0100 -> 0.0098 [已收集 5/10]
+2025-10-08 23:18:03 - UF4 - INFO - TMP数据变化: 0.0098 -> 0.0100 [已收集 6/10]
+2025-10-08 23:18:07 - UF4 - INFO - TMP数据变化: 0.0100 -> 0.0098 [已收集 7/10]
+2025-10-08 23:18:15 - UF4 - INFO - TMP数据变化: 0.0098 -> 0.0106 [已收集 8/10]
+2025-10-08 23:18:21 - UF4 - INFO - TMP数据变化: 0.0106 -> 0.0112 [已收集 9/10]
+2025-10-08 23:18:23 - UF4 - INFO - TMP数据变化: 0.0112 -> 0.0110 [已收集 10/10]
+2025-10-08 23:18:25 - UF4 - INFO - [阶段3] 数据收集完成,开始计算决策
+2025-10-08 23:18:25 - UF4 - INFO - TMP中位数计算完成: 0.0100
+2025-10-08 23:18:25 - UF4 - INFO - [DB] 正在查询 'C.M.UF4_DB@press_PV' 从 2025-10-06 10:46:08 到 2025-10-08 23:18:25 的历史极值...
+2025-10-08 23:18:25 - UF4 - INFO -
+            SELECT
+                MAX(val) AS max_val,
+                MIN(val) AS min_val
+            FROM dc_item_history_data_minute
+            WHERE project_id = %s
+              AND item_name = %s
+              AND h_time IN (
+                  SELECT h_time
+                  FROM dc_item_history_data_minute
+                  WHERE project_id = %s
+                    AND item_name = %s
+                    AND val = 26
+                    AND h_time BETWEEN %s AND %s
+              )
+
+2025-10-08 23:18:26 - UF4 - INFO - {'max_val': Decimal('0.026338'), 'min_val': Decimal('0.004806')}
+2025-10-08 23:18:26 - UF4 - INFO - [DB] 查询成功: 最大值=0.026338, 最小值=0.004806
+2025-10-08 23:18:26 - UF4 - INFO - 开始DQN模型决策...
+2025-10-08 23:18:26 - UF4 - INFO - DQN决策结果: {'action': 31, 'L_s': 4100.0, 't_bw_s': 92.0, 'next_obs': array([0.], dtype=float32), 'reward': np.float64(0.9036380818390335), 'terminated': False, 'truncated': False, 'info': {'recovery': 0.9358847247009056, 'V_feed_super_m3': 16810.0, 'V_loss_super_m3': 1077.7777777777778, 'V_net_super_m3': 15732.222222222223, 'supercycle_time_h': np.float64(48.40888888888889), 'net_delivery_rate_m3ph': np.float64(324.98622842453176), 'max_TMP_during_filtration': 0.017533146643538826, 'max_residual_increase_per_run': 0.00016986346185659564, 'phi_bw_effective': 0.7700222270445147, 'TMP_after_ceb': 0.01, 'headroom_ratio': 0.2922191107256471, 'daily_prod_time_h': np.float64(23.150018362100624), 'ton_water_energy_kWh_per_m3': 0.1015, 'k_bw_per_ceb': 41, 'feasible': True, 'step': 1}}
+2025-10-08 23:18:26 - UF4 - INFO - [UF4][回调] 准备发送决策数据:
+{
+  "list": [
+    {
+      "type": "UF4",
+      "project_id": 92,
+      "water_production_time": 4100,
+      "physical_backwash": 94,
+      "ceb_backwash_frequency": 41,
+      "duration_system": 4200,
+      "tmp_action": 0.01,
+      "recovery_rate": 0.9345297111507701,
+      "ton_water_energy_kWh": 0.1015,
+      "max_permeability": 1463.0149812734082,
+      "daily_prod_time_h": 23.13913073402388,
+      "ctime": "2025-10-08 23:18:25"
+    }
+  ]
+}
+2025-10-08 23:18:26 - UF4 - INFO - [UF4][回调] 第 1/3 次尝试发送...
+2025-10-08 23:18:26 - UF4 - INFO - [UF4][回调] 决策数据发送成功!服务器响应: {"code":200,"msg":"success"}
+2025-10-08 23:18:26 - UF4 - INFO - 配置项 use_model=0,跳过PLC指令下发。
+2025-10-08 23:18:26 - UF4 - INFO - [UF4] 状态已成功保存到 'device_states.json'。
+2025-10-08 23:18:26 - UF4 - INFO - 本轮决策完成,状态已更新并保存。下轮历史查询起始时间将是: 2025-10-08 23:18:25
+2025-10-08 23:18:26 - UF4 - INFO - [阶段4] 等待重置条件 (控制字 != 95)
+2025-10-08 23:18:26 - UF4 - INFO - 重置条件满足,即将开始新一轮监控。
+2025-10-08 23:18:26 - UF4 - INFO - --- UF4 本轮监控完成,重启循环 ---
+
+2025-10-08 23:18:26 - UF4 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-10-09 00:29:06 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-09 01:23:21 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-09 02:36:48 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-09 03:59:21 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-09 05:27:03 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-09 05:37:10 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-09 06:16:02 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-09 07:11:18 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-09 07:28:03 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-09 07:48:39 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-09 08:58:12 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-09 09:02:37 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-09 10:24:20 - UF2 - INFO - 触发条件满足,进入数据收集阶段。
+2025-10-09 10:24:20 - UF2 - INFO - [阶段2] 开始监控TMP数据变化,需收集 10 个稳定数据点
+2025-10-09 10:24:21 - UF2 - INFO - 获取到TMP初始基准值: 0.0169
+2025-10-09 10:36:50 - UF2 - INFO - TMP数据变化: 0.0169 -> 0.0119 [已收集 1/10]
+2025-10-09 10:36:54 - UF2 - INFO - TMP数据变化: 0.0119 -> 0.0115 [已收集 2/10]
+2025-10-09 10:36:56 - UF2 - INFO - TMP数据变化: 0.0115 -> 0.0117 [已收集 3/10]
+2025-10-09 10:36:58 - UF2 - INFO - TMP数据变化: 0.0117 -> 0.0121 [已收集 4/10]
+2025-10-09 10:37:01 - UF2 - INFO - TMP数据变化: 0.0121 -> 0.0119 [已收集 5/10]
+2025-10-09 10:37:05 - UF2 - INFO - TMP数据变化: 0.0119 -> 0.0117 [已收集 6/10]
+2025-10-09 10:37:09 - UF2 - INFO - TMP数据变化: 0.0117 -> 0.0119 [已收集 7/10]
+2025-10-09 10:37:11 - UF2 - INFO - TMP数据变化: 0.0119 -> 0.0115 [已收集 8/10]
+2025-10-09 10:37:13 - UF2 - INFO - TMP数据变化: 0.0115 -> 0.0117 [已收集 9/10]
+2025-10-09 10:37:24 - UF2 - INFO - TMP数据变化: 0.0117 -> 0.0121 [已收集 10/10]
+2025-10-09 10:37:26 - UF2 - INFO - [阶段3] 数据收集完成,开始计算决策
+2025-10-09 10:37:26 - UF2 - INFO - TMP中位数计算完成: 0.0118
+2025-10-09 10:37:26 - UF2 - INFO - [DB] 正在查询 'C.M.UF2_DB@press_PV' 从 2025-10-06 09:17:33 到 2025-10-09 10:37:26 的历史极值...
+2025-10-09 10:37:26 - UF2 - INFO -
+            SELECT
+                MAX(val) AS max_val,
+                MIN(val) AS min_val
+            FROM dc_item_history_data_minute
+            WHERE project_id = %s
+              AND item_name = %s
+              AND h_time IN (
+                  SELECT h_time
+                  FROM dc_item_history_data_minute
+                  WHERE project_id = %s
+                    AND item_name = %s
+                    AND val = 26
+                    AND h_time BETWEEN %s AND %s
+              )
+
+2025-10-09 10:37:26 - UF2 - INFO - {'max_val': Decimal('0.026530'), 'min_val': Decimal('0.003268')}
+2025-10-09 10:37:26 - UF2 - INFO - [DB] 查询成功: 最大值=0.02653, 最小值=0.003268
+2025-10-09 10:37:26 - UF2 - INFO - 开始DQN模型决策...
+2025-10-09 10:37:26 - UF2 - INFO - DQN决策结果: {'action': 31, 'L_s': 4100.0, 't_bw_s': 92.0, 'next_obs': array([0.045], dtype=float32), 'reward': np.float64(0.8981081378459719), 'terminated': False, 'truncated': False, 'info': {'recovery': 0.9358847247009056, 'V_feed_super_m3': 16810.0, 'V_loss_super_m3': 1077.7777777777778, 'V_net_super_m3': 15732.222222222223, 'supercycle_time_h': np.float64(48.40888888888889), 'net_delivery_rate_m3ph': np.float64(324.98622842453176), 'max_TMP_during_filtration': 0.019333146643538808, 'max_residual_increase_per_run': 0.00016986346185659564, 'phi_bw_effective': 0.7700222270445147, 'TMP_after_ceb': 0.011800000000000001, 'headroom_ratio': 0.3222191107256468, 'daily_prod_time_h': np.float64(23.150018362100624), 'ton_water_energy_kWh_per_m3': 0.1015, 'k_bw_per_ceb': 41, 'feasible': True, 'step': 1}}
+2025-10-09 10:37:27 - UF2 - INFO - [UF2][回调] 准备发送决策数据:
+{
+  "list": [
+    {
+      "type": "UF2",
+      "project_id": 92,
+      "water_production_time": 4100,
+      "physical_backwash": 94,
+      "ceb_backwash_frequency": 41,
+      "duration_system": 4200,
+      "tmp_action": 0.011800000000000001,
+      "recovery_rate": 0.9345297111507701,
+      "ton_water_energy_kWh": 0.1015,
+      "max_permeability": 2151.545287637699,
+      "daily_prod_time_h": 23.13913073402388,
+      "ctime": "2025-10-09 10:37:26"
+    }
+  ]
+}
+2025-10-09 10:37:27 - UF2 - INFO - [UF2][回调] 第 1/3 次尝试发送...
+2025-10-09 10:37:27 - UF2 - INFO - [UF2][回调] 决策数据发送成功!服务器响应: {"code":200,"msg":"success"}
+2025-10-09 10:37:27 - UF2 - INFO - 配置项 use_model=0,跳过PLC指令下发。
+2025-10-09 10:37:27 - UF2 - INFO - [UF2] 状态已成功保存到 'device_states.json'。
+2025-10-09 10:37:27 - UF2 - INFO - 本轮决策完成,状态已更新并保存。下轮历史查询起始时间将是: 2025-10-09 10:37:26
+2025-10-09 10:37:27 - UF2 - INFO - [阶段4] 等待重置条件 (控制字 != 95)
+2025-10-09 10:37:27 - UF2 - INFO - 重置条件满足,即将开始新一轮监控。
+2025-10-09 10:37:27 - UF2 - INFO - --- UF2 本轮监控完成,重启循环 ---
+
+2025-10-09 10:37:27 - UF2 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-10-09 10:40:17 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-09 11:13:03 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-09 11:18:59 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-09 11:27:32 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-09 12:46:54 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-09 13:43:37 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-09 14:02:00 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-09 14:15:24 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-09 15:36:15 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-09 15:46:00 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-09 16:16:17 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-09 16:16:18 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-09 16:28:15 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-09 16:55:12 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-09 17:01:18 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-09 17:11:57 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-09 17:41:47 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-09 20:15:52 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-09 20:43:00 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-09 20:51:39 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-09 20:51:51 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-09 20:56:16 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-09 21:33:49 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-09 21:33:50 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-09 21:45:54 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-09 22:45:14 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-09 23:54:57 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-10 00:12:24 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-10 01:07:39 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-10 02:11:24 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-10 02:22:54 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-10 03:25:41 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-10 04:57:03 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-10 05:05:56 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-10 05:20:42 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-10 08:34:12 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-10 12:52:57 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-10 14:16:24 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-10 15:44:12 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-10 15:48:45 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-10 15:55:36 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-10 16:27:12 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-10 16:33:12 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-10 17:39:41 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-10 17:42:09 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-10 19:15:27 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-10 20:03:49 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-10 21:06:15 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-10 22:40:36 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-10 23:10:42 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-10 23:54:15 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-11 00:37:42 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-11 01:28:48 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-11 01:43:13 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-11 01:50:27 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-11 01:53:51 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-11 02:05:20 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-11 02:12:04 - UF1 - INFO - 触发条件满足,进入数据收集阶段。
+2025-10-11 02:12:04 - UF1 - INFO - [阶段2] 开始监控TMP数据变化,需收集 10 个稳定数据点
+2025-10-11 02:12:04 - UF1 - INFO - 获取到TMP初始基准值: 0.0183
+2025-10-11 02:13:06 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-11 02:35:28 - UF1 - INFO - TMP数据变化: 0.0183 -> 0.0148 [已收集 1/10]
+2025-10-11 02:35:30 - UF1 - INFO - TMP数据变化: 0.0148 -> 0.0150 [已收集 2/10]
+2025-10-11 02:35:34 - UF1 - INFO - TMP数据变化: 0.0150 -> 0.0146 [已收集 3/10]
+2025-10-11 02:35:36 - UF1 - INFO - TMP数据变化: 0.0146 -> 0.0150 [已收集 4/10]
+2025-10-11 02:35:39 - UF1 - INFO - TMP数据变化: 0.0150 -> 0.0144 [已收集 5/10]
+2025-10-11 02:35:43 - UF1 - INFO - TMP数据变化: 0.0144 -> 0.0150 [已收集 6/10]
+2025-10-11 02:35:47 - UF1 - INFO - TMP数据变化: 0.0150 -> 0.0146 [已收集 7/10]
+2025-10-11 02:35:49 - UF1 - INFO - TMP数据变化: 0.0146 -> 0.0144 [已收集 8/10]
+2025-10-11 02:35:51 - UF1 - INFO - TMP数据变化: 0.0144 -> 0.0146 [已收集 9/10]
+2025-10-11 02:35:55 - UF1 - INFO - TMP数据变化: 0.0146 -> 0.0150 [已收集 10/10]
+2025-10-11 02:35:57 - UF1 - INFO - [阶段3] 数据收集完成,开始计算决策
+2025-10-11 02:35:57 - UF1 - INFO - TMP中位数计算完成: 0.0147
+2025-10-11 02:35:57 - UF1 - INFO - [DB] 正在查询 'C.M.UF1_DB@press_PV' 从 2025-10-08 11:19:45 到 2025-10-11 02:35:57 的历史极值...
+2025-10-11 02:35:57 - UF1 - INFO -
+            SELECT
+                MAX(val) AS max_val,
+                MIN(val) AS min_val
+            FROM dc_item_history_data_minute
+            WHERE project_id = %s
+              AND item_name = %s
+              AND h_time IN (
+                  SELECT h_time
+                  FROM dc_item_history_data_minute
+                  WHERE project_id = %s
+                    AND item_name = %s
+                    AND val = 26
+                    AND h_time BETWEEN %s AND %s
+              )
+
+2025-10-11 02:35:58 - UF1 - INFO - {'max_val': Decimal('0.025761'), 'min_val': Decimal('0.004998')}
+2025-10-11 02:35:58 - UF1 - INFO - [DB] 查询成功: 最大值=0.025761, 最小值=0.004998
+2025-10-11 02:35:58 - UF1 - INFO - 开始DQN模型决策...
+2025-10-11 02:35:58 - UF1 - INFO - DQN决策结果: {'action': 31, 'L_s': 4100.0, 't_bw_s': 92.0, 'next_obs': array([0.1175], dtype=float32), 'reward': np.float64(0.8880629503015949), 'terminated': False, 'truncated': False, 'info': {'recovery': 0.9358847247009056, 'V_feed_super_m3': 16810.0, 'V_loss_super_m3': 1077.7777777777778, 'V_net_super_m3': 15732.222222222223, 'supercycle_time_h': np.float64(48.40888888888889), 'net_delivery_rate_m3ph': np.float64(324.98622842453176), 'max_TMP_during_filtration': 0.02223314664353878, 'max_residual_increase_per_run': 0.00016986346185659564, 'phi_bw_effective': 0.7700222270445147, 'TMP_after_ceb': 0.014700000000000001, 'headroom_ratio': 0.3705524440589797, 'daily_prod_time_h': np.float64(23.150018362100624), 'ton_water_energy_kWh_per_m3': 0.1015, 'k_bw_per_ceb': 41, 'feasible': True, 'step': 1}}
+2025-10-11 02:35:58 - UF1 - INFO - [UF1][回调] 准备发送决策数据:
+{
+  "list": [
+    {
+      "type": "UF1",
+      "project_id": 92,
+      "water_production_time": 4100,
+      "physical_backwash": 94,
+      "ceb_backwash_frequency": 41,
+      "duration_system": 4200,
+      "tmp_action": 0.014700000000000001,
+      "recovery_rate": 0.9345297111507701,
+      "ton_water_energy_kWh": 0.1015,
+      "max_permeability": 1406.812725090036,
+      "daily_prod_time_h": 23.13913073402388,
+      "ctime": "2025-10-11 02:35:57"
+    }
+  ]
+}
+2025-10-11 02:35:58 - UF1 - INFO - [UF1][回调] 第 1/3 次尝试发送...
+2025-10-11 02:35:58 - UF1 - INFO - [UF1][回调] 决策数据发送成功!服务器响应: {"code":200,"msg":"success"}
+2025-10-11 02:35:58 - UF1 - INFO - 配置项 use_model=0,跳过PLC指令下发。
+2025-10-11 02:35:58 - UF1 - INFO - [UF1] 状态已成功保存到 'device_states.json'。
+2025-10-11 02:35:58 - UF1 - INFO - 本轮决策完成,状态已更新并保存。下轮历史查询起始时间将是: 2025-10-11 02:35:57
+2025-10-11 02:35:58 - UF1 - INFO - [阶段4] 等待重置条件 (控制字 != 95)
+2025-10-11 02:35:59 - UF1 - INFO - 重置条件满足,即将开始新一轮监控。
+2025-10-11 02:35:59 - UF1 - INFO - --- UF1 本轮监控完成,重启循环 ---
+
+2025-10-11 02:35:59 - UF1 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-10-11 02:57:21 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-11 03:42:42 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-11 04:08:53 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-11 04:17:33 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-11 04:50:15 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-11 04:56:01 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-11 05:15:11 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-11 05:16:21 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-11 05:24:16 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-11 05:24:16 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-11 06:19:03 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-11 07:59:45 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-11 08:00:45 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-11 08:19:12 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-11 08:41:24 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-11 08:59:55 - UF4 - ERROR - [UF4][API] 获取'C.M.UF4_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-11 10:07:12 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-11 10:33:05 - UF2 - ERROR - [UF2][API] 获取'C.M.UF2_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-11 10:44:24 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-11 11:05:18 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-11 12:29:42 - UF1 - ERROR - [UF1][API] 获取'C.M.UF1_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-11 13:12:33 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-11 13:20:12 - UF3 - ERROR - [UF3][API] 获取'C.M.UF3_DB@word_control'失败,网络错误: HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-11 13:50:02 - UF4 - INFO - 触发条件满足,进入数据收集阶段。
+2025-10-11 13:50:02 - UF4 - INFO - [阶段2] 开始监控TMP数据变化,需收集 10 个稳定数据点
+2025-10-11 13:50:02 - UF4 - INFO - 获取到TMP初始基准值: 0.015
+2025-10-11 14:40:39 - UF3 - INFO - 触发条件满足,进入数据收集阶段。
+2025-10-11 14:40:39 - UF3 - INFO - [阶段2] 开始监控TMP数据变化,需收集 10 个稳定数据点
+2025-10-11 14:40:39 - UF3 - INFO - 获取到TMP初始基准值: 0.0083
+2025-10-11 15:35:13 - UF2 - INFO - 触发条件满足,进入数据收集阶段。
+2025-10-11 15:35:13 - UF2 - INFO - [阶段2] 开始监控TMP数据变化,需收集 10 个稳定数据点
+2025-10-11 15:35:13 - UF2 - INFO - 获取到TMP初始基准值: 0.0158
+2025-10-11 15:47:08 - UF4 - INFO - TMP数据变化: 0.0150 -> 0.0088 [已收集 1/10]
+2025-10-11 15:47:12 - UF4 - INFO - TMP数据变化: 0.0088 -> 0.0092 [已收集 2/10]
+2025-10-11 15:47:17 - UF4 - INFO - TMP数据变化: 0.0092 -> 0.0094 [已收集 3/10]
+2025-10-11 15:47:19 - UF4 - INFO - TMP数据变化: 0.0094 -> 0.0096 [已收集 4/10]
+2025-10-11 15:47:21 - UF4 - INFO - TMP数据变化: 0.0096 -> 0.0100 [已收集 5/10]
+2025-10-11 15:47:25 - UF4 - INFO - TMP数据变化: 0.0100 -> 0.0102 [已收集 6/10]
+2025-10-11 15:47:32 - UF4 - INFO - TMP数据变化: 0.0102 -> 0.0108 [已收集 7/10]
+2025-10-11 15:47:34 - UF4 - INFO - TMP数据变化: 0.0108 -> 0.0115 [已收集 8/10]
+2025-10-11 15:47:39 - UF4 - INFO - TMP数据变化: 0.0115 -> 0.0121 [已收集 9/10]
+2025-10-11 15:47:41 - UF4 - INFO - TMP数据变化: 0.0121 -> 0.0123 [已收集 10/10]
+2025-10-11 15:47:43 - UF4 - INFO - [阶段3] 数据收集完成,开始计算决策
+2025-10-11 15:47:43 - UF4 - INFO - TMP中位数计算完成: 0.0101
+2025-10-11 15:47:43 - UF4 - INFO - [DB] 正在查询 'C.M.UF4_DB@press_PV' 从 2025-10-08 23:18:25 到 2025-10-11 15:47:43 的历史极值...
+2025-10-11 15:47:43 - UF4 - INFO -
+            SELECT
+                MAX(val) AS max_val,
+                MIN(val) AS min_val
+            FROM dc_item_history_data_minute
+            WHERE project_id = %s
+              AND item_name = %s
+              AND h_time IN (
+                  SELECT h_time
+                  FROM dc_item_history_data_minute
+                  WHERE project_id = %s
+                    AND item_name = %s
+                    AND val = 26
+                    AND h_time BETWEEN %s AND %s
+              )
+
+2025-10-11 15:47:43 - UF4 - INFO - {'max_val': Decimal('0.027299'), 'min_val': Decimal('0.001922')}
+2025-10-11 15:47:43 - UF4 - INFO - [DB] 查询成功: 最大值=0.027299, 最小值=0.001922
+2025-10-11 15:47:43 - UF4 - INFO - 开始DQN模型决策...
+2025-10-11 15:47:43 - UF4 - INFO - DQN决策结果: {'action': 31, 'L_s': 4100.0, 't_bw_s': 92.0, 'next_obs': array([0.0025], dtype=float32), 'reward': np.float64(0.9033450293949745), 'terminated': False, 'truncated': False, 'info': {'recovery': 0.9358847247009056, 'V_feed_super_m3': 16810.0, 'V_loss_super_m3': 1077.7777777777778, 'V_net_super_m3': 15732.222222222223, 'supercycle_time_h': np.float64(48.40888888888889), 'net_delivery_rate_m3ph': np.float64(324.98622842453176), 'max_TMP_during_filtration': 0.017633146643538825, 'max_residual_increase_per_run': 0.00016986346185659564, 'phi_bw_effective': 0.7700222270445147, 'TMP_after_ceb': 0.010100000000000001, 'headroom_ratio': 0.29388577739231375, 'daily_prod_time_h': np.float64(23.150018362100624), 'ton_water_energy_kWh_per_m3': 0.1015, 'k_bw_per_ceb': 41, 'feasible': True, 'step': 1}}
+2025-10-11 15:47:43 - UF4 - INFO - [UF4][回调] 准备发送决策数据:
+{
+  "list": [
+    {
+      "type": "UF4",
+      "project_id": 92,
+      "water_production_time": 4100,
+      "physical_backwash": 94,
+      "ceb_backwash_frequency": 41,
+      "duration_system": 4200,
+      "tmp_action": 0.010100000000000001,
+      "recovery_rate": 0.9345297111507701,
+      "ton_water_energy_kWh": 0.1015,
+      "max_permeability": 3658.2986472424554,
+      "daily_prod_time_h": 23.13913073402388,
+      "ctime": "2025-10-11 15:47:43"
+    }
+  ]
+}
+2025-10-11 15:47:43 - UF4 - INFO - [UF4][回调] 第 1/3 次尝试发送...
+2025-10-11 15:47:43 - UF4 - INFO - [UF4][回调] 决策数据发送成功!服务器响应: {"code":200,"msg":"success"}
+2025-10-11 15:47:43 - UF4 - INFO - 配置项 use_model=0,跳过PLC指令下发。
+2025-10-11 15:47:43 - UF4 - INFO - [UF4] 状态已成功保存到 'device_states.json'。
+2025-10-11 15:47:43 - UF4 - INFO - 本轮决策完成,状态已更新并保存。下轮历史查询起始时间将是: 2025-10-11 15:47:43
+2025-10-11 15:47:43 - UF4 - INFO - [阶段4] 等待重置条件 (控制字 != 95)
+2025-10-11 15:47:44 - UF4 - INFO - 重置条件满足,即将开始新一轮监控。
+2025-10-11 15:47:44 - UF4 - INFO - --- UF4 本轮监控完成,重启循环 ---
+
+2025-10-11 15:47:44 - UF4 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-10-11 16:01:06 - UF3 - INFO - TMP数据变化: 0.0083 -> 0.0140 [已收集 1/10]
+2025-10-11 16:01:10 - UF3 - INFO - TMP数据变化: 0.0140 -> 0.0138 [已收集 2/10]
+2025-10-11 16:01:12 - UF3 - INFO - TMP数据变化: 0.0138 -> 0.0142 [已收集 3/10]
+2025-10-11 16:01:14 - UF3 - INFO - TMP数据变化: 0.0142 -> 0.0140 [已收集 4/10]
+2025-10-11 16:01:19 - UF3 - INFO - TMP数据变化: 0.0140 -> 0.0144 [已收集 5/10]
+2025-10-11 16:01:21 - UF3 - INFO - TMP数据变化: 0.0144 -> 0.0146 [已收集 6/10]
+2025-10-11 16:01:26 - UF3 - INFO - TMP数据变化: 0.0146 -> 0.0140 [已收集 7/10]
+2025-10-11 16:01:28 - UF3 - INFO - TMP数据变化: 0.0140 -> 0.0144 [已收集 8/10]
+2025-10-11 16:01:30 - UF3 - INFO - TMP数据变化: 0.0144 -> 0.0142 [已收集 9/10]
+2025-10-11 16:01:37 - UF3 - INFO - TMP数据变化: 0.0142 -> 0.0140 [已收集 10/10]
+2025-10-11 16:01:39 - UF3 - INFO - [阶段3] 数据收集完成,开始计算决策
+2025-10-11 16:01:39 - UF3 - INFO - TMP中位数计算完成: 0.0141
+2025-10-11 16:01:39 - UF3 - INFO - [DB] 正在查询 'C.M.UF3_DB@press_PV' 从 2025-10-08 22:55:51 到 2025-10-11 16:01:39 的历史极值...
+2025-10-11 16:01:39 - UF3 - INFO -
+            SELECT
+                MAX(val) AS max_val,
+                MIN(val) AS min_val
+            FROM dc_item_history_data_minute
+            WHERE project_id = %s
+              AND item_name = %s
+              AND h_time IN (
+                  SELECT h_time
+                  FROM dc_item_history_data_minute
+                  WHERE project_id = %s
+                    AND item_name = %s
+                    AND val = 26
+                    AND h_time BETWEEN %s AND %s
+              )
+
+2025-10-11 16:01:39 - UF3 - INFO - {'max_val': Decimal('0.038449'), 'min_val': Decimal('0.000577')}
+2025-10-11 16:01:39 - UF3 - INFO - [DB] 查询成功: 最大值=0.038449, 最小值=0.000577
+2025-10-11 16:01:39 - UF3 - INFO - 开始DQN模型决策...
+2025-10-11 16:01:39 - UF3 - INFO - DQN决策结果: {'action': 31, 'L_s': 4100.0, 't_bw_s': 92.0, 'next_obs': array([0.1025], dtype=float32), 'reward': np.float64(0.8902562649659488), 'terminated': False, 'truncated': False, 'info': {'recovery': 0.9358847247009056, 'V_feed_super_m3': 16810.0, 'V_loss_super_m3': 1077.7777777777778, 'V_net_super_m3': 15732.222222222223, 'supercycle_time_h': np.float64(48.40888888888889), 'net_delivery_rate_m3ph': np.float64(324.98622842453176), 'max_TMP_during_filtration': 0.021633146643538784, 'max_residual_increase_per_run': 0.00016986346185659564, 'phi_bw_effective': 0.7700222270445147, 'TMP_after_ceb': 0.014100000000000001, 'headroom_ratio': 0.36055244405897974, 'daily_prod_time_h': np.float64(23.150018362100624), 'ton_water_energy_kWh_per_m3': 0.1015, 'k_bw_per_ceb': 41, 'feasible': True, 'step': 1}}
+2025-10-11 16:01:40 - UF3 - INFO - [UF3][回调] 准备发送决策数据:
+{
+  "list": [
+    {
+      "type": "UF3",
+      "project_id": 92,
+      "water_production_time": 4100,
+      "physical_backwash": 94,
+      "ceb_backwash_frequency": 41,
+      "duration_system": 4200,
+      "tmp_action": 0.014100000000000001,
+      "recovery_rate": 0.9345297111507701,
+      "ton_water_energy_kWh": 0.1015,
+      "max_permeability": 12185.875216637782,
+      "daily_prod_time_h": 23.13913073402388,
+      "ctime": "2025-10-11 16:01:39"
+    }
+  ]
+}
+2025-10-11 16:01:40 - UF3 - INFO - [UF3][回调] 第 1/3 次尝试发送...
+2025-10-11 16:01:40 - UF3 - INFO - [UF3][回调] 决策数据发送成功!服务器响应: {"code":200,"msg":"success"}
+2025-10-11 16:01:40 - UF3 - INFO - 配置项 use_model=0,跳过PLC指令下发。
+2025-10-11 16:01:40 - UF3 - INFO - [UF3] 状态已成功保存到 'device_states.json'。
+2025-10-11 16:01:40 - UF3 - INFO - 本轮决策完成,状态已更新并保存。下轮历史查询起始时间将是: 2025-10-11 16:01:39
+2025-10-11 16:01:40 - UF3 - INFO - [阶段4] 等待重置条件 (控制字 != 95)
+2025-10-11 16:01:40 - UF3 - INFO - 重置条件满足,即将开始新一轮监控。
+2025-10-11 16:01:40 - UF3 - INFO - --- UF3 本轮监控完成,重启循环 ---
+
+2025-10-11 16:01:40 - UF3 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-10-11 16:17:54 - UF2 - INFO - TMP数据变化: 0.0158 -> 0.0096 [已收集 1/10]
+2025-10-11 16:17:56 - UF2 - INFO - TMP数据变化: 0.0096 -> 0.0090 [已收集 2/10]
+2025-10-11 16:17:58 - UF2 - INFO - TMP数据变化: 0.0090 -> 0.0094 [已收集 3/10]
+2025-10-11 16:18:03 - UF2 - INFO - TMP数据变化: 0.0094 -> 0.0090 [已收集 4/10]
+2025-10-11 16:18:05 - UF2 - INFO - TMP数据变化: 0.0090 -> 0.0094 [已收集 5/10]
+2025-10-11 16:18:07 - UF2 - INFO - TMP数据变化: 0.0094 -> 0.0090 [已收集 6/10]
+2025-10-11 16:18:09 - UF2 - INFO - TMP数据变化: 0.0090 -> 0.0092 [已收集 7/10]
+2025-10-11 16:18:15 - UF2 - INFO - TMP数据变化: 0.0092 -> 0.0094 [已收集 8/10]
+2025-10-11 16:18:17 - UF2 - INFO - TMP数据变化: 0.0094 -> 0.0096 [已收集 9/10]
+2025-10-11 16:18:21 - UF2 - INFO - TMP数据变化: 0.0096 -> 0.0098 [已收集 10/10]
+2025-10-11 16:18:23 - UF2 - INFO - [阶段3] 数据收集完成,开始计算决策
+2025-10-11 16:18:23 - UF2 - INFO - TMP中位数计算完成: 0.0094
+2025-10-11 16:18:23 - UF2 - INFO - [DB] 正在查询 'C.M.UF2_DB@press_PV' 从 2025-10-09 10:37:26 到 2025-10-11 16:18:23 的历史极值...
+2025-10-11 16:18:23 - UF2 - INFO -
+            SELECT
+                MAX(val) AS max_val,
+                MIN(val) AS min_val
+            FROM dc_item_history_data_minute
+            WHERE project_id = %s
+              AND item_name = %s
+              AND h_time IN (
+                  SELECT h_time
+                  FROM dc_item_history_data_minute
+                  WHERE project_id = %s
+                    AND item_name = %s
+                    AND val = 26
+                    AND h_time BETWEEN %s AND %s
+              )
+
+2025-10-11 16:18:24 - UF2 - INFO - {'max_val': Decimal('0.025569'), 'min_val': Decimal('0.002884')}
+2025-10-11 16:18:24 - UF2 - INFO - [DB] 查询成功: 最大值=0.025569, 最小值=0.002884
+2025-10-11 16:18:24 - UF2 - INFO - 开始DQN模型决策...
+2025-10-11 16:18:24 - UF2 - INFO - DQN决策结果: {'action': 31, 'L_s': 4100.0, 't_bw_s': 92.0, 'next_obs': array([-0.015], dtype=float32), 'reward': np.float64(0.9053613965033874), 'terminated': False, 'truncated': False, 'info': {'recovery': 0.9358847247009056, 'V_feed_super_m3': 16810.0, 'V_loss_super_m3': 1077.7777777777778, 'V_net_super_m3': 15732.222222222223, 'supercycle_time_h': np.float64(48.40888888888889), 'net_delivery_rate_m3ph': np.float64(324.98622842453176), 'max_TMP_during_filtration': 0.016933146643538833, 'max_residual_increase_per_run': 0.00016986346185659564, 'phi_bw_effective': 0.7700222270445147, 'TMP_after_ceb': 0.0094, 'headroom_ratio': 0.2822191107256472, 'daily_prod_time_h': np.float64(23.150018362100624), 'ton_water_energy_kWh_per_m3': 0.1015, 'k_bw_per_ceb': 41, 'feasible': True, 'step': 1}}
+2025-10-11 16:18:24 - UF2 - INFO - [UF2][回调] 准备发送决策数据:
+{
+  "list": [
+    {
+      "type": "UF2",
+      "project_id": 92,
+      "water_production_time": 4100,
+      "physical_backwash": 94,
+      "ceb_backwash_frequency": 41,
+      "duration_system": 4200,
+      "tmp_action": 0.0094,
+      "recovery_rate": 0.9345297111507701,
+      "ton_water_energy_kWh": 0.1015,
+      "max_permeability": 2438.0201109570044,
+      "daily_prod_time_h": 23.13913073402388,
+      "ctime": "2025-10-11 16:18:23"
+    }
+  ]
+}
+2025-10-11 16:18:24 - UF2 - INFO - [UF2][回调] 第 1/3 次尝试发送...
+2025-10-11 16:18:24 - UF2 - INFO - [UF2][回调] 决策数据发送成功!服务器响应: {"code":200,"msg":"success"}
+2025-10-11 16:18:24 - UF2 - INFO - 配置项 use_model=0,跳过PLC指令下发。
+2025-10-11 16:18:24 - UF2 - INFO - [UF2] 状态已成功保存到 'device_states.json'。
+2025-10-11 16:18:24 - UF2 - INFO - 本轮决策完成,状态已更新并保存。下轮历史查询起始时间将是: 2025-10-11 16:18:23
+2025-10-11 16:18:24 - UF2 - INFO - [阶段4] 等待重置条件 (控制字 != 95)
+2025-10-11 16:18:24 - UF2 - INFO - 重置条件满足,即将开始新一轮监控。
+2025-10-11 16:18:24 - UF2 - INFO - --- UF2 本轮监控完成,重启循环 ---
+2025-10-11 16:18:24 - UF2 - INFO - [阶段1] 等待触发条件 (控制字 == 95)
+2025-10-11 18:10:21 - UF4 - INFO - 等待触发 控制字需等于 95
+2025-10-14 10:16:17 - UF1 - INFO - 触发条件满足
+2025-10-14 10:16:17 - UF1 - INFO - 开始收集TMP数据 需要 10 个有效数据点
+2025-10-14 10:16:18 - UF1 - INFO - TMP基准值 0.019
+2025-10-14 10:28:46 - UF1 - INFO - TMP变化 0.0190 到 0.0208 已收集 1/10
+2025-10-14 10:28:48 - UF1 - INFO - TMP变化 0.0208 到 0.0204 已收集 2/10
+2025-10-14 10:28:51 - UF1 - INFO - TMP变化 0.0204 到 0.0206 已收集 3/10
+2025-10-14 10:28:55 - UF1 - INFO - TMP变化 0.0206 到 0.0208 已收集 4/10
+2025-10-14 10:28:57 - UF1 - INFO - TMP变化 0.0208 到 0.0206 已收集 5/10
+2025-10-14 10:29:03 - UF1 - INFO - TMP变化 0.0206 到 0.0208 已收集 6/10
+2025-10-14 10:29:09 - UF1 - INFO - TMP变化 0.0208 到 0.0210 已收集 7/10
+2025-10-14 10:29:12 - UF1 - INFO - TMP变化 0.0210 到 0.0206 已收集 8/10
+2025-10-14 10:29:14 - UF1 - INFO - TMP变化 0.0206 到 0.0204 已收集 9/10
+2025-10-14 10:29:16 - UF1 - INFO - TMP变化 0.0204 到 0.0208 已收集 10/10
+2025-10-14 10:29:18 - UF1 - INFO - 数据收集完成,开始决策计算
+2025-10-14 10:29:18 - UF1 - INFO - TMP中位数 0.0207
+2025-10-14 10:29:18 - UF1 - INFO - 查询历史极值 C.M.UF1_DB@press_PV 从 2025-10-11 02:35:57 到 2025-10-14 10:29:18
+2025-10-14 10:29:18 - UF1 - INFO - 查询成功 最大值=0.025953 最小值=0.003076
+2025-10-14 10:29:18 - UF1 - INFO - 调用DQN决策模型
+2025-10-14 10:29:19 - UF1 - INFO - 模型决策结果 {'action': 33, 'L_s': 4100.0, 't_bw_s': 96.0, 'next_obs': array([0.2675], dtype=float32), 'reward': np.float64(0.8606208990190019), 'terminated': False, 'truncated': False, 'info': {'recovery': 0.9331746976006345, 'V_feed_super_m3': 16810.0, 'V_loss_super_m3': 1123.3333333333335, 'V_net_super_m3': 15686.666666666666, 'supercycle_time_h': np.float64(48.45444444444444), 'net_delivery_rate_m3ph': np.float64(323.74051227957534), 'max_TMP_during_filtration': 0.028094419207413877, 'max_residual_increase_per_run': 0.00016639527595347162, 'phi_bw_effective': 0.7747177964240509, 'TMP_after_ceb': 0.0207, 'headroom_ratio': 0.46824032012356465, 'daily_prod_time_h': np.float64(23.128253342200004), 'ton_water_energy_kWh_per_m3': 0.1015, 'k_bw_per_ceb': 41, 'feasible': True, 'step': 1}}
+2025-10-14 10:29:19 - UF1 - INFO - 计算运行指标 TMP=0.0207 L_s=4100 t_bw_s=94.0
+2025-10-14 10:29:19 - UF1 - INFO - [UF1] 发送决策数据
+{
+  "list": [
+    {
+      "type": "UF1",
+      "project_id": 92,
+      "water_production_time": 4100,
+      "physical_backwash": 94,
+      "ceb_backwash_frequency": 41,
+      "duration_system": 4200,
+      "tmp_action": 0.0207,
+      "recovery_rate": 0.9345297111507701,
+      "ton_water_energy_kWh": 0.1015,
+      "max_permeability": 2285.8420026007802,
+      "daily_prod_time_h": 23.13913073402388,
+      "ctime": "2025-10-14 10:29:18"
+    }
+  ]
+}
+2025-10-14 10:29:19 - UF1 - INFO - [UF1] 发送回调 尝试 1/3
+2025-10-14 10:29:19 - UF1 - INFO - [UF1] 回调发送成功 响应 {"code":200,"msg":"success"}
+2025-10-14 10:29:19 - UF1 - INFO - 模型开关已关闭,跳过PLC指令
+2025-10-14 10:29:19 - UF1 - INFO - [UF1] 状态保存成功
+2025-10-14 10:29:19 - UF1 - INFO - 状态保存完成 下次查询起始时间 2025-10-14 10:29:18
+2025-10-14 10:29:19 - UF1 - INFO - 等待重置 控制字需不等于 95
+2025-10-14 10:29:19 - UF1 - INFO - 重置条件满足,开始新一轮
+2025-10-14 10:29:19 - UF1 - INFO - UF1 本轮完成
+
+2025-10-14 10:29:19 - UF1 - INFO - 等待触发 控制字需等于 95
+2025-10-14 11:06:49 - UF3 - ERROR - [UF3] API网络错误 C.M.UF3_DB@word_control HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-14 11:14:36 - UF1 - ERROR - [UF1] API网络错误 C.M.UF1_DB@word_control HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-14 12:47:30 - UF2 - ERROR - [UF2] API网络错误 C.M.UF2_DB@word_control HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-14 12:56:52 - UF1 - ERROR - [UF1] API网络错误 C.M.UF1_DB@word_control HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-14 13:13:05 - UF3 - ERROR - [UF3] API网络错误 C.M.UF3_DB@word_control HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-14 13:16:23 - UF3 - ERROR - [UF3] API网络错误 C.M.UF3_DB@word_control HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-14 14:36:51 - UF3 - ERROR - [UF3] API网络错误 C.M.UF3_DB@word_control HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-14 14:58:15 - UF3 - INFO - 触发条件满足
+2025-10-14 14:58:15 - UF3 - INFO - 开始收集TMP数据 需要 10 个有效数据点
+2025-10-14 14:58:15 - UF3 - INFO - TMP基准值 0.0104
+2025-10-14 14:59:33 - UF1 - ERROR - [UF1] API网络错误 C.M.UF1_DB@word_control HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-14 15:10:49 - UF3 - INFO - TMP变化 0.0104 到 0.0088 已收集 1/10
+2025-10-14 15:10:51 - UF3 - INFO - TMP变化 0.0088 到 0.0087 已收集 2/10
+2025-10-14 15:10:57 - UF3 - INFO - TMP变化 0.0087 到 0.0088 已收集 3/10
+2025-10-14 15:10:59 - UF3 - INFO - TMP变化 0.0088 到 0.0083 已收集 4/10
+2025-10-14 15:11:07 - UF3 - INFO - TMP变化 0.0083 到 0.0079 已收集 5/10
+2025-10-14 15:11:09 - UF3 - INFO - TMP变化 0.0079 到 0.0083 已收集 6/10
+2025-10-14 15:11:16 - UF3 - INFO - TMP变化 0.0083 到 0.0087 已收集 7/10
+2025-10-14 15:11:20 - UF3 - INFO - TMP变化 0.0087 到 0.0085 已收集 8/10
+2025-10-14 15:11:22 - UF3 - INFO - TMP变化 0.0085 到 0.0087 已收集 9/10
+2025-10-14 15:11:24 - UF3 - INFO - TMP变化 0.0087 到 0.0081 已收集 10/10
+2025-10-14 15:11:26 - UF3 - INFO - 数据收集完成,开始决策计算
+2025-10-14 15:11:26 - UF3 - INFO - TMP中位数 0.0086
+2025-10-14 15:11:26 - UF3 - INFO - 查询历史极值 C.M.UF3_DB@press_PV 从 2025-10-11 16:01:39 到 2025-10-14 15:11:26
+2025-10-14 15:11:27 - UF3 - INFO - 查询成功 最大值=0.040756 最小值=-0.00173
+2025-10-14 15:11:27 - UF3 - INFO - 调用DQN决策模型
+2025-10-14 15:11:27 - UF3 - INFO - 模型决策结果 {'action': 31, 'L_s': 4100.0, 't_bw_s': 92.0, 'next_obs': array([-0.035], dtype=float32), 'reward': np.float64(0.9075658160558592), 'terminated': False, 'truncated': False, 'info': {'recovery': 0.9358847247009056, 'V_feed_super_m3': 16810.0, 'V_loss_super_m3': 1077.7777777777778, 'V_net_super_m3': 15732.222222222223, 'supercycle_time_h': np.float64(48.40888888888889), 'net_delivery_rate_m3ph': np.float64(324.98622842453176), 'max_TMP_during_filtration': 0.016133146643538838, 'max_residual_increase_per_run': 0.00016986346185659564, 'phi_bw_effective': 0.7700222270445147, 'TMP_after_ceb': 0.0086, 'headroom_ratio': 0.26888577739231395, 'daily_prod_time_h': np.float64(23.150018362100624), 'ton_water_energy_kWh_per_m3': 0.1015, 'k_bw_per_ceb': 41, 'feasible': True, 'step': 1}}
+2025-10-14 15:11:27 - UF3 - INFO - 计算运行指标 TMP=0.0086 L_s=4100.0 t_bw_s=94.0
+2025-10-14 15:11:27 - UF3 - INFO - [UF3] 发送决策数据
+{
+  "list": [
+    {
+      "type": "UF3",
+      "project_id": 92,
+      "water_production_time": 4100,
+      "physical_backwash": 94,
+      "ceb_backwash_frequency": 41,
+      "duration_system": 4200,
+      "tmp_action": 0.0086,
+      "recovery_rate": 0.9345297111507701,
+      "ton_water_energy_kWh": 0.1015,
+      "max_permeability": -4064.306358381503,
+      "daily_prod_time_h": 23.13913073402388,
+      "ctime": "2025-10-14 15:11:26"
+    }
+  ]
+}
+2025-10-14 15:11:27 - UF3 - INFO - [UF3] 发送回调 尝试 1/3
+2025-10-14 15:11:27 - UF3 - INFO - [UF3] 回调发送成功 响应 {"code":200,"msg":"success"}
+2025-10-14 15:11:27 - UF3 - INFO - 模型开关已关闭,跳过PLC指令
+2025-10-14 15:11:27 - UF3 - INFO - [UF3] 状态保存成功
+2025-10-14 15:11:27 - UF3 - INFO - 状态保存完成 下次查询起始时间 2025-10-14 15:11:26
+2025-10-14 15:11:27 - UF3 - INFO - 等待重置 控制字需不等于 95
+2025-10-14 15:11:27 - UF3 - INFO - 重置条件满足,开始新一轮
+2025-10-14 15:11:27 - UF3 - INFO - UF3 本轮完成
+
+2025-10-14 15:11:27 - UF3 - INFO - 等待触发 控制字需等于 95
+2025-10-14 15:12:06 - UF2 - ERROR - [UF2] API网络错误 C.M.UF2_DB@word_control HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-14 15:15:36 - UF1 - ERROR - [UF1] API网络错误 C.M.UF1_DB@word_control HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-14 16:04:12 - UF3 - ERROR - [UF3] API网络错误 C.M.UF3_DB@word_control HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-14 17:28:15 - UF2 - ERROR - [UF2] API网络错误 C.M.UF2_DB@word_control HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-14 18:00:42 - UF4 - ERROR - [UF4] API网络错误 C.M.UF4_DB@word_control HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-14 18:05:36 - UF2 - ERROR - [UF2] API网络错误 C.M.UF2_DB@word_control HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-14 18:07:04 - UF2 - INFO - 触发条件满足
+2025-10-14 18:07:04 - UF2 - INFO - 开始收集TMP数据 需要 10 个有效数据点
+2025-10-14 18:07:04 - UF2 - INFO - TMP基准值 0.0165
+2025-10-14 18:19:29 - UF2 - INFO - TMP变化 0.0165 到 0.0129 已收集 1/10
+2025-10-14 18:19:31 - UF2 - INFO - TMP变化 0.0129 到 0.0135 已收集 2/10
+2025-10-14 18:19:39 - UF2 - INFO - TMP变化 0.0135 到 0.0136 已收集 3/10
+2025-10-14 18:19:44 - UF2 - INFO - TMP变化 0.0136 到 0.0135 已收集 4/10
+2025-10-14 18:19:52 - UF2 - INFO - TMP变化 0.0135 到 0.0136 已收集 5/10
+2025-10-14 18:19:58 - UF2 - INFO - TMP变化 0.0136 到 0.0133 已收集 6/10
+2025-10-14 18:20:03 - UF2 - INFO - TMP变化 0.0133 到 0.0129 已收集 7/10
+2025-10-14 18:20:05 - UF2 - INFO - TMP变化 0.0129 到 0.0135 已收集 8/10
+2025-10-14 18:20:07 - UF2 - INFO - TMP变化 0.0135 到 0.0136 已收集 9/10
+2025-10-14 18:20:12 - UF2 - INFO - TMP变化 0.0136 到 0.0135 已收集 10/10
+2025-10-14 18:20:14 - UF2 - INFO - 数据收集完成,开始决策计算
+2025-10-14 18:20:14 - UF2 - INFO - TMP中位数 0.0135
+2025-10-14 18:20:14 - UF2 - INFO - 查询历史极值 C.M.UF2_DB@press_PV 从 2025-10-11 16:18:23 到 2025-10-14 18:20:14
+2025-10-14 18:20:14 - UF2 - INFO - 查询成功 最大值=0.02653 最小值=0.002499
+2025-10-14 18:20:14 - UF2 - INFO - 调用DQN决策模型
+2025-10-14 18:20:14 - UF2 - INFO - 模型决策结果 {'action': 31, 'L_s': 4100.0, 't_bw_s': 92.0, 'next_obs': array([0.0875], dtype=float32), 'reward': np.float64(0.8923895796303026), 'terminated': False, 'truncated': False, 'info': {'recovery': 0.9358847247009056, 'V_feed_super_m3': 16810.0, 'V_loss_super_m3': 1077.7777777777778, 'V_net_super_m3': 15732.222222222223, 'supercycle_time_h': np.float64(48.40888888888889), 'net_delivery_rate_m3ph': np.float64(324.98622842453176), 'max_TMP_during_filtration': 0.02103314664353879, 'max_residual_increase_per_run': 0.00016986346185659564, 'phi_bw_effective': 0.7700222270445147, 'TMP_after_ceb': 0.0135, 'headroom_ratio': 0.35055244405897984, 'daily_prod_time_h': np.float64(23.150018362100624), 'ton_water_energy_kWh_per_m3': 0.1015, 'k_bw_per_ceb': 41, 'feasible': True, 'step': 1}}
+2025-10-14 18:20:15 - UF2 - INFO - 计算运行指标 TMP=0.0135 L_s=4100 t_bw_s=94.0
+2025-10-14 18:20:15 - UF2 - INFO - [UF2] 发送决策数据
+{
+  "list": [
+    {
+      "type": "UF2",
+      "project_id": 92,
+      "water_production_time": 4100,
+      "physical_backwash": 94,
+      "ceb_backwash_frequency": 41,
+      "duration_system": 4200,
+      "tmp_action": 0.0135,
+      "recovery_rate": 0.9345297111507701,
+      "ton_water_energy_kWh": 0.1015,
+      "max_permeability": 2813.625450180072,
+      "daily_prod_time_h": 23.13913073402388,
+      "ctime": "2025-10-14 18:20:14"
+    }
+  ]
+}
+2025-10-14 18:20:15 - UF2 - INFO - [UF2] 发送回调 尝试 1/3
+2025-10-14 18:20:15 - UF2 - INFO - [UF2] 回调发送成功 响应 {"code":200,"msg":"success"}
+2025-10-14 18:20:15 - UF2 - INFO - 模型开关已关闭,跳过PLC指令
+2025-10-14 18:20:15 - UF2 - INFO - [UF2] 状态保存成功
+2025-10-14 18:20:15 - UF2 - INFO - 状态保存完成 下次查询起始时间 2025-10-14 18:20:14
+2025-10-14 18:20:15 - UF2 - INFO - 等待重置 控制字需不等于 95
+2025-10-14 18:20:15 - UF2 - INFO - 重置条件满足,开始新一轮
+2025-10-14 18:20:15 - UF2 - INFO - UF2 本轮完成
+
+2025-10-14 18:20:15 - UF2 - INFO - 等待触发 控制字需等于 95
+2025-10-14 19:03:38 - UF1 - ERROR - [UF1] API网络错误 C.M.UF1_DB@word_control HTTPConnectionPool(host='120.55.44.4', port=8900): Read timed out. (read timeout=10)
+2025-10-14 19:14:04 - UF4 - INFO - 触发条件满足
+2025-10-14 19:14:04 - UF4 - INFO - 开始收集TMP数据 需要 10 个有效数据点
+2025-10-14 19:14:04 - UF4 - INFO - TMP基准值 0.0163
+2025-10-14 19:33:11 - UF4 - INFO - TMP变化 0.0163 到 0.0136 已收集 1/10
+2025-10-14 19:33:15 - UF4 - INFO - TMP变化 0.0136 到 0.0138 已收集 2/10
+2025-10-14 19:33:17 - UF4 - INFO - TMP变化 0.0138 到 0.0136 已收集 3/10
+2025-10-14 19:33:19 - UF4 - INFO - TMP变化 0.0136 到 0.0138 已收集 4/10
+2025-10-14 19:33:23 - UF4 - INFO - TMP变化 0.0138 到 0.0136 已收集 5/10
+2025-10-14 19:33:25 - UF4 - INFO - TMP变化 0.0136 到 0.0138 已收集 6/10
+2025-10-14 19:33:27 - UF4 - INFO - TMP变化 0.0138 到 0.0135 已收集 7/10
+2025-10-14 19:33:32 - UF4 - INFO - TMP变化 0.0135 到 0.0136 已收集 8/10
+2025-10-14 19:33:36 - UF4 - INFO - TMP变化 0.0136 到 0.0135 已收集 9/10
+2025-10-14 19:33:38 - UF4 - INFO - TMP变化 0.0135 到 0.0138 已收集 10/10
+2025-10-14 19:33:40 - UF4 - INFO - 数据收集完成,开始决策计算
+2025-10-14 19:33:40 - UF4 - INFO - TMP中位数 0.0136
+2025-10-14 19:33:40 - UF4 - INFO - 查询历史极值 C.M.UF4_DB@press_PV 从 2025-10-11 15:47:43 到 2025-10-14 19:33:40
+2025-10-14 19:33:40 - UF4 - INFO - 查询成功 最大值=0.026145 最小值=0.004229
+2025-10-14 19:33:40 - UF4 - INFO - 调用DQN决策模型
+2025-10-14 19:33:40 - UF4 - INFO - 模型决策结果 {'action': 31, 'L_s': 4100.0, 't_bw_s': 92.0, 'next_obs': array([0.09], dtype=float32), 'reward': np.float64(0.8920381938529104), 'terminated': False, 'truncated': False, 'info': {'recovery': 0.9358847247009056, 'V_feed_super_m3': 16810.0, 'V_loss_super_m3': 1077.7777777777778, 'V_net_super_m3': 15732.222222222223, 'supercycle_time_h': np.float64(48.40888888888889), 'net_delivery_rate_m3ph': np.float64(324.98622842453176), 'max_TMP_during_filtration': 0.021133146643538787, 'max_residual_increase_per_run': 0.00016986346185659564, 'phi_bw_effective': 0.7700222270445147, 'TMP_after_ceb': 0.0136, 'headroom_ratio': 0.35221911072564643, 'daily_prod_time_h': np.float64(23.150018362100624), 'ton_water_energy_kWh_per_m3': 0.1015, 'k_bw_per_ceb': 41, 'feasible': True, 'step': 1}}
+2025-10-14 19:33:41 - UF4 - INFO - 计算运行指标 TMP=0.0136 L_s=4100 t_bw_s=94.0
+2025-10-14 19:33:41 - UF4 - INFO - [UF4] 发送决策数据
+{
+  "list": [
+    {
+      "type": "UF4",
+      "project_id": 92,
+      "water_production_time": 4100,
+      "physical_backwash": 94,
+      "ceb_backwash_frequency": 41,
+      "duration_system": 4200,
+      "tmp_action": 0.0136,
+      "recovery_rate": 0.9345297111507701,
+      "ton_water_energy_kWh": 0.1015,
+      "max_permeability": 1662.627098604871,
+      "daily_prod_time_h": 23.13913073402388,
+      "ctime": "2025-10-14 19:33:40"
+    }
+  ]
+}
+2025-10-14 19:33:41 - UF4 - INFO - [UF4] 发送回调 尝试 1/3
+2025-10-14 19:33:42 - UF4 - INFO - [UF4] 回调发送成功 响应 {"code":200,"msg":"success"}
+2025-10-14 19:33:42 - UF4 - INFO - 模型开关已关闭,跳过PLC指令
+2025-10-14 19:33:42 - UF4 - INFO - [UF4] 状态保存成功
+2025-10-14 19:33:42 - UF4 - INFO - 状态保存完成 下次查询起始时间 2025-10-14 19:33:40
+2025-10-14 19:33:42 - UF4 - INFO - 等待重置 控制字需不等于 95
+2025-10-14 19:33:42 - UF4 - INFO - 重置条件满足,开始新一轮
+2025-10-14 19:33:42 - UF4 - INFO - UF4 本轮完成
+
+2025-10-14 19:33:42 - UF4 - INFO - 等待触发 控制字需等于 95

+ 120 - 0
plc_test_dry_run.py

@@ -0,0 +1,120 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+"""
+PLC指令模拟测试工具
+仅显示请求详情,不实际发送,用于调试和验证
+"""
+
+import json
+import hashlib
+import time
+
+
+def load_config(config_file='config.json'):
+    """加载配置文件"""
+    with open(config_file, 'r', encoding='utf-8') as f:
+        return json.load(f)
+
+
+def generate_md5_signature(record_data, secret, timestamp):
+    """生成MD5签名"""
+    cal_str = f"{record_data}{secret}{timestamp}"
+    cal_md5 = hashlib.md5(cal_str.encode('utf-8')).hexdigest()
+    return cal_md5.upper()
+
+
+def prepare_plc_request(device_name, item, old_value, new_value, command_type):
+    """
+    准备PLC请求参数
+    
+    参数:
+        device_name: 设备名称
+        item: 参数项名称
+        old_value: 当前值
+        new_value: 目标值
+        command_type: 命令类型
+        
+    返回:
+        请求信息字典
+    """
+    config = load_config()
+    
+    PLC_URL = config['api']['base_url'] + config['api']['plc_endpoint']
+    PROJECT_ID = config['scada']['project_id']
+    SCADA_SECRET = config['scada']['secret']
+    
+    timestamp = int(time.time())
+    
+    record_dict = {
+        "project_id": PROJECT_ID,
+        "item": item,
+        "old_value": old_value,
+        "new_value": new_value,
+        "command_type": command_type
+    }
+    record_data = json.dumps(record_dict, separators=(',', ':'))
+    
+    signature = generate_md5_signature(record_data, SCADA_SECRET, timestamp)
+    full_url = f"{PLC_URL}?sign={signature}&timestamp={timestamp}"
+    payload = [record_dict]
+    
+    return {
+        'url': full_url,
+        'payload': payload,
+        'signature_data': record_data,
+        'signature': signature,
+        'timestamp': timestamp,
+        'secret': SCADA_SECRET
+    }
+
+if __name__ == "__main__":
+    print("=== PLC指令测试 - 模拟运行 ===")
+    print()
+    
+    # 测试参数
+    device_name = "UF2"
+    item = "C.M.UF2_DB@time_production"
+    old_value = "3800"
+    new_value = "3801"
+    command_type = 1
+    
+    # 准备请求
+    request_info = prepare_plc_request(device_name, item, old_value, new_value, command_type)
+    
+    print(f"📋 测试场景:")
+    print(f"   设备: {device_name}")
+    print(f"   参数项: {item}")
+    print(f"   当前值: {old_value}")
+    print(f"   目标值: {new_value}")
+    print(f"   命令类型: {command_type}")
+    print()
+    
+    print(f"🔧 请求详情:")
+    print(f"   完整URL: {request_info['url']}")
+    print()
+    
+    print(f"📝 请求头:")
+    print(f"   Content-Type: application/json")
+    print()
+    
+    print(f"📦 请求体:")
+    print(json.dumps(request_info['payload'], indent=4, ensure_ascii=False))
+    print()
+    
+    print(f"🔐 签名计算:")
+    print(f"   SCADA密钥: {request_info['secret']}")
+    print(f"   时间戳: {request_info['timestamp']}")
+    print(f"   签名原数据: {request_info['signature_data']}")
+    print(f"   计算字符串: {request_info['signature_data']}{request_info['secret']}{request_info['timestamp']}")
+    print(f"   MD5签名: {request_info['signature']}")
+    print()
+    
+    print(f"✨ curl命令:")
+    curl_cmd = f"""curl -X POST '{request_info['url']}' \\
+  -H 'Content-Type: application/json' \\
+  -d '{json.dumps(request_info['payload'], separators=(',', ':'), ensure_ascii=False)}'"""
+    print(curl_cmd)
+    print()
+    
+    print("🚀 这就是将要发送给PLC系统的完整请求!")
+    print("   如果看起来正确,您可以运行 test_plc_update.py 来实际发送。")

+ 18 - 0
requirements.txt

@@ -0,0 +1,18 @@
+# 超滤系统强化学习决策系统 - 依赖包
+
+# 科学计算
+numpy>=1.23.0
+
+# 深度学习框架
+torch>=2.0.0
+
+# 强化学习框架
+gymnasium>=0.29.0
+stable-baselines3>=2.0.0
+
+# 数据库连接
+pymysql>=1.0.0
+
+# HTTP请求
+requests>=2.28.0
+

+ 73 - 0
save_uf_models.py

@@ -0,0 +1,73 @@
+import torch
+import numpy as np
+
+
+class TMPIncreaseModel(torch.nn.Module):
+    """
+    跨膜压差上升模型
+    
+    计算过滤阶段的TMP增长量
+    """
+    def __init__(self):
+        super().__init__()
+    
+    def forward(self, p, L_h):
+        """
+        计算TMP增长量
+        
+        参数:
+            p: 系统参数对象
+            L_h: 过滤时长(小时)
+            
+        返回:
+            TMP增长量
+        """
+        return float(p.alpha * (p.q_UF ** p.belta) * L_h)
+
+
+class TMPDecreaseModel(torch.nn.Module):
+    """
+    跨膜压差恢复模型
+    
+    计算反洗阶段的TMP恢复比例
+    """
+    def __init__(self):
+        super().__init__()
+    
+    def forward(self, p, L_s, t_bw_s):
+        """
+        计算反洗恢复比例
+        
+        参数:
+            p: 系统参数对象
+            L_s: 过滤时长(秒)
+            t_bw_s: 反洗时长(秒)
+            
+        返回:
+            TMP恢复比例(0到1之间)
+        """
+        L = max(float(L_s), 1.0)
+        t = max(float(t_bw_s), 1e-6)
+        
+        # 计算恢复比例上限(随过滤时长增加而降低)
+        upper_L = p.phi_bw_min + (p.phi_bw_max - p.phi_bw_min) * np.exp(-L / p.L_ref_s)
+        
+        # 计算时间增益因子(反洗时间越长,恢复越好)
+        time_gain = 1.0 - np.exp(-(t / p.tau_bw_s) ** p.gamma_t)
+        
+        # 综合计算恢复比例
+        phi = upper_L * time_gain
+        
+        return float(np.clip(phi, 0.0, 0.999))
+
+
+if __name__ == "__main__":
+    # 创建模型实例
+    model_fp = TMPIncreaseModel()
+    model_bw = TMPDecreaseModel()
+
+    # 保存模型参数
+    torch.save(model_fp.state_dict(), "uf_fp.pth")
+    torch.save(model_bw.state_dict(), "uf_bw.pth")
+
+    print("模型已保存 uf_fp.pth uf_bw.pth")

+ 120 - 0
test_plc_update.py

@@ -0,0 +1,120 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+"""
+PLC指令测试工具
+用于测试PLC参数更新请求的实际发送
+"""
+
+import requests
+import json
+import hashlib
+import time
+
+
+def load_config(config_file='config.json'):
+    """加载配置文件"""
+    with open(config_file, 'r', encoding='utf-8') as f:
+        return json.load(f)
+
+
+def generate_md5_signature(record_data, secret, timestamp):
+    """生成MD5签名"""
+    cal_str = f"{record_data}{secret}{timestamp}"
+    cal_md5 = hashlib.md5(cal_str.encode('utf-8')).hexdigest()
+    return cal_md5.upper()
+
+
+def send_plc_update_test(device_name, item, old_value, new_value, command_type):
+    """
+    发送PLC参数更新测试
+    
+    参数:
+        device_name: 设备名称
+        item: 参数项名称
+        old_value: 当前值
+        new_value: 目标值
+        command_type: 命令类型
+        
+    返回:
+        是否发送成功
+    """
+    config = load_config()
+    
+    PLC_URL = config['api']['base_url'] + config['api']['plc_endpoint']
+    PROJECT_ID = config['scada']['project_id']
+    SCADA_SECRET = config['scada']['secret']
+    
+    timestamp = int(time.time())
+    
+    record_data = json.dumps({
+        "project_id": PROJECT_ID,
+        "item": item,
+        "old_value": old_value,
+        "new_value": new_value,
+        "command_type": command_type
+    }, separators=(',', ':'))
+    
+    signature = generate_md5_signature(record_data, SCADA_SECRET, timestamp)
+    url = f"{PLC_URL}?sign={signature}&timestamp={timestamp}"
+    
+    payload = [{
+        "project_id": PROJECT_ID,
+        "item": item,
+        "old_value": old_value,
+        "new_value": new_value,
+        "command_type": command_type
+    }]
+    
+    print(f"PLC测试")
+    print(f"设备 {device_name}")
+    print(f"参数 {item}")
+    print(f"旧值 {old_value}")
+    print(f"新值 {new_value}")
+    print(f"类型 {command_type}")
+    print(f"时间戳 {timestamp}")
+    print(f"URL {url}")
+    print(f"请求体 {json.dumps(payload, indent=2, ensure_ascii=False)}")
+    print(f"签名数据 {record_data}")
+    print(f"签名 {signature}")
+    print("-" * 50)
+    
+    try:
+        headers = {"Content-Type": "application/json"}
+        response = requests.post(url, headers=headers, json=payload, timeout=15)
+        
+        print(f"响应状态码 {response.status_code}")
+        print(f"响应头 {dict(response.headers)}")
+        
+        try:
+            response_json = response.json()
+            print(f"响应JSON {json.dumps(response_json, indent=2, ensure_ascii=False)}")
+        except:
+            print(f"响应文本 {response.text}")
+            
+        response.raise_for_status()
+        print("请求发送成功")
+        return True
+        
+    except requests.exceptions.RequestException as e:
+        print(f"请求失败 {e}")
+        return False
+    except Exception as e:
+        print(f"未知错误 {e}")
+        return False
+
+
+if __name__ == "__main__":
+    # 测试配置
+    device_name = "UF2"
+    item = "C.M.UF2_DB@time_production"
+    old_value = "3800"
+    new_value = "3801"
+    command_type = 1
+    
+    print("开始PLC指令测试")
+    success = send_plc_update_test(device_name, item, old_value, new_value, command_type)
+    
+    if success:
+        print("\n测试完成 请检查PLC系统")
+    else:
+        print("\n测试失败 请检查网络和配置")

BIN
uf_bw.pth


BIN
uf_fp.pth


Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików