Переглянути джерело

1:同步json 文件
2:增加时每次 +120秒,减少时 -60秒
3:百分位数法优化最大渗透率传入数值

wmy 2 місяців тому
батько
коміт
c37b9b31c2
3 змінених файлів з 49 додано та 40 видалено
  1. 1 1
      DQN_decide.py
  2. 31 31
      device_states.json
  3. 17 8
      loop_main.py

+ 1 - 1
DQN_decide.py

@@ -162,7 +162,7 @@ def generate_plc_instructions(current_L_s, current_t_bw_s, model_prev_L_s, model
     L_adjustment = 0
     if abs(L_diff) >= adjustment_threshold * L_step_s:
         if L_diff >= 0:
-            L_adjustment = L_step_s
+            L_adjustment = L_step_s * 2
         else:
             L_adjustment = -L_step_s
     next_L_s = effective_current_L + L_adjustment

+ 31 - 31
device_states.json

@@ -1,51 +1,51 @@
 {
     "_comment": "此文件用于存储每个设备的运行时状态。时间格式为 YYYY-MM-DD HH:MM:SS",
     "UF1": {
-        "model_prev_L_s": 4340.0,
-        "model_prev_t_bw_s": 74.0,
-        "last_cycle_end_time": "2025-11-21 04:32:38",
+        "model_prev_L_s": 4400.0,
+        "model_prev_t_bw_s": 60.0,
+        "last_cycle_end_time": "2025-12-07 14:30:32",
         "recent_tmp_values": [
-            0.0222,
-            0.0212,
-            0.0197,
-            0.0205,
-            0.0209
+            0.0231,
+            0.0279,
+            0.0285,
+            0.0204,
+            0.0152
         ]
     },
     "UF2": {
-        "model_prev_L_s": 4400.0,
-        "model_prev_t_bw_s": 70.0,
-        "last_cycle_end_time": "2025-11-21 06:40:48",
+        "model_prev_L_s": 4340.0,
+        "model_prev_t_bw_s": 60.0,
+        "last_cycle_end_time": "2025-12-07 19:26:37",
         "recent_tmp_values": [
-            0.0202,
-            0.0244,
-            0.0183,
-            0.02,
-            0.0248
+            0.0221,
+            0.0286,
+            0.0263,
+            0.0134,
+            0.0193
         ]
     },
     "UF3": {
-        "model_prev_L_s": 4340.0,
-        "model_prev_t_bw_s": 72.0,
-        "last_cycle_end_time": "2025-11-21 09:22:55",
+        "model_prev_L_s": 4580.0,
+        "model_prev_t_bw_s": 60.0,
+        "last_cycle_end_time": "2025-12-09 04:41:52",
         "recent_tmp_values": [
-            0.0229,
-            0.0188,
-            0.0204,
-            0.0236,
-            0.0263
+            0.0225,
+            0.0283,
+            0.018,
+            0.0213,
+            0.0208
         ]
     },
     "UF4": {
         "model_prev_L_s": 4340.0,
-        "model_prev_t_bw_s": 76.0,
-        "last_cycle_end_time": "2025-11-19 16:00:13",
+        "model_prev_t_bw_s": 60.0,
+        "last_cycle_end_time": "2025-12-04 21:38:34",
         "recent_tmp_values": [
-            0.0235,
-            0.0248,
-            0.0215,
-            0.0171,
-            0.0185
+            0.021,
+            0.0254,
+            0.0127,
+            0.0154,
+            0.0154
         ]
     }
 }

+ 17 - 8
loop_main.py

@@ -9,6 +9,7 @@ import logging
 from logging.handlers import RotatingFileHandler
 
 # 第三方库导入
+import numpy as np
 import pymysql
 import requests
 
@@ -291,19 +292,27 @@ def get_tmp_extremes(item_name, start_time, end_time, word_control):
 
             if control_26_values:
                 logger.info(f"找到控制字为26的数据点,合并跨膜压差数据")
-                # 过滤掉小于 0.01 的异常值
-                valid_values = [v for v in control_26_values if v >= 0.01]
+                # 过滤掉小于等于 0.01 的异常值(传感器默认值/故障值)
+                valid_values = [v for v in control_26_values if v > 0.01]
                 
                 if valid_values:
-                    max_val = max(valid_values)
-                    min_val = min(valid_values)
-                    logger.info(f"过滤后有效数据点数量: {len(valid_values)}/{len(control_26_values)}")
-                    logger.info(f"控制字为26时的最大跨膜压差值={max_val},最小跨膜压差值={min_val}")
+                    # 使用百分位数法计算极值,避免边界异常值影响
+                    if len(valid_values) >= 10:
+                        # 数据点足够多时,使用5%-95%百分位数
+                        min_val = float(np.percentile(valid_values, 5))
+                        max_val = float(np.percentile(valid_values, 95))
+                        logger.info(f"使用百分位数法(5%-95%)计算极值,有效数据点: {len(valid_values)}/{len(control_26_values)}")
+                    else:
+                        # 数据点较少时,回退到传统 min/max
+                        max_val = max(valid_values)
+                        min_val = min(valid_values)
+                        logger.info(f"数据点较少({len(valid_values)}个),使用传统min/max计算极值")
+                    logger.info(f"控制字为26时的最大跨膜压差值={max_val:.4f},最小跨膜压差值={min_val:.4f}")
                 else:
-                    # 如果所有值都小于 0.01,使用 0.01 作为保护值
+                    # 如果所有值都小于等于 0.01,使用 0.01 作为保护值
                     max_val = 0.01
                     min_val = 0.01
-                    logger.warning(f"所有数据点均小于0.01,使用保护值0.01 (原始数据点数量: {len(control_26_values)})")
+                    logger.warning(f"所有数据点均小于等于0.01,使用保护值0.01 (原始数据点数量: {len(control_26_values)})")
 
         if max_val is not None and min_val is not None:
             logger.info(f"API查询成功 最大跨膜压差值={max_val} 最小跨膜压差值={min_val}")