Quellcode durchsuchen

1:更新运行json文件
2:更新控制字逻辑 过滤 26 修正为后续 22-26直接的都可以

wmy vor 6 Tagen
Ursprung
Commit
831170ff83
2 geänderte Dateien mit 77 neuen und 30 gelöschten Zeilen
  1. 33 12
      device_states.json
  2. 44 18
      loop_main.py

+ 33 - 12
device_states.json

@@ -1,23 +1,44 @@
 {
     "_comment": "此文件用于存储每个设备的运行时状态。时间格式为 YYYY-MM-DD HH:MM:SS",
     "UF1": {
-        "model_prev_L_s": 4220.0,
-        "model_prev_t_bw_s": 90.0,
-        "last_cycle_end_time": "2025-10-29 09:29:48"
+        "model_prev_L_s": 4340.0,
+        "model_prev_t_bw_s": 84.0,
+        "last_cycle_end_time": "2025-11-06 11:47:26",
+        "recent_tmp_values": [
+            0.0248,
+            0.0242,
+            0.0235
+        ]
     },
     "UF2": {
-       "model_prev_L_s": 4280.0,
-        "model_prev_t_bw_s": 88.0,
-        "last_cycle_end_time": "2025-10-29 14:17:57"
+        "model_prev_L_s": 4340.0,
+        "model_prev_t_bw_s": 80.0,
+        "last_cycle_end_time": "2025-11-09 02:33:18",
+        "recent_tmp_values": [
+            0.0215,
+            0.0302,
+            0.0225,
+            0.0233
+        ]
     },
     "UF3": {
-        "model_prev_L_s": 4280.0,
-        "model_prev_t_bw_s": 88.0,
-        "last_cycle_end_time": "2025-10-29 16:55:15"
+        "model_prev_L_s": 4340.0,
+        "model_prev_t_bw_s": 82.0,
+        "last_cycle_end_time": "2025-11-07 22:19:07",
+        "recent_tmp_values": [
+            0.0177,
+            0.0204,
+            0.0242
+        ]
     },
     "UF4": {
-        "model_prev_L_s": 4220.0,
-        "model_prev_t_bw_s": 90.0,
-        "last_cycle_end_time": "2025-10-27 13:44:35"
+        "model_prev_L_s": 4340.0,
+        "model_prev_t_bw_s": 84.0,
+        "last_cycle_end_time": "2025-11-08 10:25:28",
+        "recent_tmp_values": [
+            0.0211,
+            0.0221,
+            0.0235
+        ]
     }
 }

+ 44 - 18
loop_main.py

@@ -494,15 +494,18 @@ def monitor_device(device):
             while True:
                 control_value = get_device_value(device["control_payload"], name)  # 控制字
                 if control_value is not None and int(control_value) == 26:  # 控制字 等于 26
-                    logger.info("控制字变为26,开始收集10分钟数据")
+                    logger.info("控制字变为26,开始收集数据(控制字在22-26范围内有效)")
                     break
                 time.sleep(POLL_INTERVAL)
 
-            # 阶段2: 收集10分钟数据并计算平均值
-            logger.info("开始收集10分钟TMP数据")
+            # 阶段2: 收集数据(控制字在22-26范围内视为有效,初始10分钟,未收集到有效数据时延长到30分钟)
+            logger.info("开始收集TMP数据(控制字在22-26范围内有效)")
             collected_values = []
             start_collection_time = datetime.now()
-            collection_duration = timedelta(minutes=10)  # 10分钟
+            initial_duration = timedelta(minutes=10)  # 初始10分钟
+            extended_duration = timedelta(minutes=30)  # 延长到30分钟
+            collection_duration = initial_duration
+            has_valid_data = False  # 标记是否收集到22-26范围内的有效数据
             
             # 日志计数器,每收集60个点打印一次,避免日志过多
             log_interval = 60
@@ -511,26 +514,37 @@ def monitor_device(device):
                 current_value = get_device_value(device["target_payload"], name)  # 当前值
                 control_value = get_device_value(device["control_payload"], name)  # 检查控制字
                 
-                # 检查控制字是否保持26
-                if control_value is not None and int(control_value) != 26:
-                    logger.warning(f"数据收集期间控制字发生变化: {control_value},停止收集")
+                if control_value is not None:
+                    control_int = int(control_value)
+                    
                     # 如果控制字变为95,说明系统重置了,需要重新开始
-                    if int(control_value) == TRIGGER_VALUE:
+                    if control_int == TRIGGER_VALUE:
                         logger.info("控制字变为95,系统重置,重新开始监控")
                         break
-                    else:
-                        logger.info("控制字变为其他值,等待重置")
-                        break
                     
-                if current_value is not None:
-                    collected_values.append(current_value)
-                    # 每收集60个点或第一个点时打印日志,减少日志数量
-                    if len(collected_values) == 1 or len(collected_values) % log_interval == 0:
-                        logger.info(f"收集TMP值 {current_value:.4f} 已收集 {len(collected_values)} 个数据点")
+                    # 如果控制字在22-26范围内,视为有效,收集数据
+                    elif 22 <= control_int <= 26:
+                        has_valid_data = True
+                        if current_value is not None:
+                            collected_values.append(current_value)
+                            # 每收集60个点或第一个点时打印日志,减少日志数量
+                            if len(collected_values) == 1 or len(collected_values) % log_interval == 0:
+                                logger.info(f"收集TMP值 {current_value:.4f} 控制字={control_int} 已收集 {len(collected_values)} 个数据点")
+                    
+                    # 如果控制字不在22-26范围内,不停止,继续等待(可能后续会回到22-26范围)
+                    # 不记录日志,避免日志过多
+                
                 time.sleep(POLL_INTERVAL)
+                
+                # 如果10分钟内没有收集到22-26范围内的数据,延长收集时间到30分钟
+                elapsed_time = datetime.now() - start_collection_time
+                if elapsed_time >= initial_duration and not has_valid_data and collection_duration == initial_duration:
+                    logger.info("10分钟内未收集到22-26范围内的数据,延长收集时间到30分钟")
+                    collection_duration = extended_duration
             
-            if not collected_values:
-                logger.warning("10分钟内未收集到有效数据,跳过本轮")
+            # 检查是否收集到了22-26范围内的有效数据
+            if not has_valid_data:
+                logger.warning("30分钟内未收集到22-26范围内的有效数据,跳过本轮")
                 # 检查控制字状态,如果已经是95则直接开始新一轮
                 control_value = get_device_value(device["control_payload"], name)
                 if control_value is not None and int(control_value) == TRIGGER_VALUE:
@@ -541,6 +555,18 @@ def monitor_device(device):
                     logger.info("等待控制字重置...")
                     time.sleep(10)  # 等待10秒
                     continue
+            
+            # 如果收集到了有效数据但数据为空
+            if not collected_values:
+                logger.warning("收集到有效控制字但未收集到TMP数据,跳过本轮")
+                control_value = get_device_value(device["control_payload"], name)
+                if control_value is not None and int(control_value) == TRIGGER_VALUE:
+                    logger.info("控制字已经是95,直接开始新一轮")
+                    continue
+                else:
+                    logger.info("等待控制字重置...")
+                    time.sleep(10)
+                    continue
 
             # 阶段3: 决策计算
             logger.info(f"数据收集完成,共收集 {len(collected_values)} 个数据点,开始决策计算")