Browse Source

1:配置文件更新,新增 ceb 次数
2:plc 下发逻辑优化,如果相同 不再下发 plc 指令,log 记录

wmy 1 month ago
parent
commit
a42c445b66
2 changed files with 112 additions and 19 deletions
  1. 36 8
      config.json
  2. 76 11
      loop_main.py

+ 36 - 8
config.json

@@ -60,14 +60,21 @@
         "_desc": "产水时长读取配置 - 用于模型输入",
         "deviceId": "1",
         "deviceItems": "C.M.UF1_DB@time_production",
-        "deviceName": "UF1_production_time",
+        "deviceName": "UF1过滤时长",
         "project_id": 92
       },
       "backwashing_payload": {
         "_desc": "反洗时长读取配置 - 用于模型输入",
         "deviceId": "1",
         "deviceItems": "C.M.UF1_DB@time_BW_SP",
-        "deviceName": "UF1_time_BW_SP",
+        "deviceName": "UF1反洗时长",
+        "project_id": 92
+      },
+      "ceb_payload": {
+        "_desc": "CEB次数读取配置 - 用于下发",
+        "deviceId": "1",
+        "deviceItems": "C.M.UF1_DB@cycle_sp",
+        "deviceName": "UF1CEB次数设定",
         "project_id": 92
       }
     },
@@ -90,13 +97,20 @@
       "production_time_payload": {
         "deviceId": "1",
         "deviceItems": "C.M.UF2_DB@time_production",
-        "deviceName": "UF2_production_time",
+        "deviceName": "UF2过滤时长",
         "project_id": 92
       },
       "backwashing_payload": {
         "deviceId": "1",
         "deviceItems": "C.M.UF2_DB@time_BW_SP",
-        "deviceName": "UF2_time_BW_SP",
+        "deviceName": "UF2反洗时长",
+        "project_id": 92
+      },
+      "ceb_payload": {
+        "_desc": "CEB次数读取配置 - 用于下发",
+        "deviceId": "1",
+        "deviceItems": "C.M.UF2_DB@cycle_sp",
+        "deviceName": "UF2CEB次数设定",
         "project_id": 92
       }
     },
@@ -119,13 +133,20 @@
       "production_time_payload": {
         "deviceId": "1",
         "deviceItems": "C.M.UF3_DB@time_production",
-        "deviceName": "UF3_production_time",
+        "deviceName": "UF3过滤时长",
         "project_id": 92
       },
       "backwashing_payload": {
         "deviceId": "1",
         "deviceItems": "C.M.UF3_DB@time_BW_SP",
-        "deviceName": "UF3_time_BW_SP",
+        "deviceName": "UF3反洗时长",
+        "project_id": 92
+      },
+      "ceb_payload": {
+        "_desc": "CEB次数读取配置 - 用于下发",
+        "deviceId": "1",
+        "deviceItems": "C.M.UF3_DB@cycle_sp",
+        "deviceName": "UF3CEB次数设定",
         "project_id": 92
       }
     },
@@ -148,13 +169,20 @@
       "production_time_payload": {
         "deviceId": "1",
         "deviceItems": "C.M.UF4_DB@time_production",
-        "deviceName": "UF4_production_time",
+        "deviceName": "UF4反洗时长",
         "project_id": 92
       },
       "backwashing_payload": {
         "deviceId": "1",
         "deviceItems": "C.M.UF4_DB@time_BW_SP",
-        "deviceName": "UF4_time_BW_SP",
+        "deviceName": "UF4反洗时长",
+        "project_id": 92
+      },
+      "ceb_payload": {
+        "_desc": "CEB次数读取配置 - 用于下发",
+        "deviceId": "1",
+        "deviceItems": "C.M.UF4_DB@cycle_sp",
+        "deviceName": "UF4CEB次数设定",
         "project_id": 92
       }
     }

+ 76 - 11
loop_main.py

@@ -484,11 +484,13 @@ def monitor_device(device):
 
             # 阶段1.5: 等待控制字变为26
             logger.info("等待控制字变为26")
+            previous_control_value = TRIGGER_VALUE  # 记录上一个控制字值
             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分钟数据")
+                if control_value is not None and int(control_value) == 26 and previous_control_value == TRIGGER_VALUE:
+                    logger.info("控制字从95变为26,开始收集10分钟数据")
                     break
+                previous_control_value = control_value
                 time.sleep(POLL_INTERVAL)
 
             # 阶段2: 收集10分钟数据并计算平均值
@@ -499,6 +501,19 @@ def monitor_device(device):
             
             while datetime.now() - start_collection_time < collection_duration:
                 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},停止收集")
+                    # 如果控制字变为95,说明系统重置了,需要重新开始
+                    if int(control_value) == TRIGGER_VALUE:
+                        logger.info("控制字变为95,系统重置,重新开始监控")
+                        break
+                    else:
+                        logger.info("控制字变为其他值,等待重置")
+                        break
+                    
                 if current_value is not None:
                     collected_values.append(current_value)
                     logger.info(f"收集TMP值 {current_value:.4f} 已收集 {len(collected_values)} 个数据点")
@@ -506,7 +521,16 @@ def monitor_device(device):
             
             if not collected_values:
                 logger.warning("10分钟内未收集到有效数据,跳过本轮")
-                continue
+                # 检查控制字状态,如果已经是95则直接开始新一轮
+                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)  # 等待10秒
+                    continue
 
             # 阶段3: 决策计算
             logger.info("数据收集完成,开始决策计算")
@@ -531,6 +555,7 @@ def monitor_device(device):
                 # 获取当前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
+                bw_per_ceb = get_device_value(device["ceb_payload"], name) or 40  # CEB 次数时间 默认40
 
                 # 生成PLC指令
                 L_s, t_bw_s = generate_plc_instructions(
@@ -542,13 +567,14 @@ def monitor_device(device):
                 # 计算运行指标
                 logger.info(f"计算运行指标 TMP={average_value} L_s={L_s} t_bw_s={t_bw_s}")
                 metrics = calc_uf_cycle_metrics(uf_params, average_value, max_tmp, min_tmp, L_s, t_bw_s)  # 计算运行指标
-
+                ceb_backwash_frequency = int(metrics["k_bw_per_ceb"])
+                
                 # 发送决策结果
                 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"]),  # 化学反洗频率
+                    ceb_backwash_frequency=ceb_backwash_frequency,  # 化学反洗频率
                     duration_system=int(prod_time),  # 系统运行时间
                     tmp_action=average_value,  # TMP动作
                     recovery_rate=metrics["recovery"],  # 回收率
@@ -560,9 +586,46 @@ def monitor_device(device):
 
                 # 判断是否下发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)  # 反洗时间
+                    logger.info("模型开关已开启,检查PLC指令")
+                    
+                    # 记录当前PLC值和模型决策值
+                    current_plc_values = {
+                        'prod_time': int(prod_time),
+                        'bw_time': int(bw_time),
+                        'bw_per_ceb': int(bw_per_ceb)
+                    }
+                    model_decision_values = {
+                        'L_s': int(L_s),
+                        't_bw_s': int(t_bw_s),
+                        'ceb_frequency': int(ceb_backwash_frequency)
+                    }
+                    
+                    logger.info(f"当前PLC值: 产水时间={current_plc_values['prod_time']}, 反洗时间={current_plc_values['bw_time']}, CEB次数={current_plc_values['bw_per_ceb']}")
+                    logger.info(f"模型决策值: L_s={model_decision_values['L_s']}, t_bw_s={model_decision_values['t_bw_s']}, ceb_frequency={model_decision_values['ceb_frequency']}")
+                    
+                    # 检查每个参数是否需要下发指令
+                    
+                    # 检查产水时间是否需要更新
+                    if current_plc_values['prod_time'] != model_decision_values['L_s']:
+                        logger.info(f"产水时间需要更新: {current_plc_values['prod_time']} -> {model_decision_values['L_s']}")
+                        send_plc_update(name, device["production_time_payload"]["deviceItems"], str(prod_time), str(model_decision_values['L_s']), 1)
+                    else:
+                        logger.info(f"产水时间无需更新: {current_plc_values['prod_time']}")
+                    
+                    # 检查反洗时间是否需要更新
+                    if current_plc_values['bw_time'] != model_decision_values['t_bw_s']:
+                        logger.info(f"反洗时间需要更新: {current_plc_values['bw_time']} -> {model_decision_values['t_bw_s']}")
+                        send_plc_update(name, device["backwashing_payload"]["deviceItems"], str(bw_time), str(model_decision_values['t_bw_s']), 4)
+                    else:
+                        logger.info(f"反洗时间无需更新: {current_plc_values['bw_time']}")
+                    
+                    # 检查CEB次数是否需要更新
+                    if current_plc_values['bw_per_ceb'] != model_decision_values['ceb_frequency']:
+                        logger.info(f"CEB次数需要更新: {current_plc_values['bw_per_ceb']} -> {model_decision_values['ceb_frequency']}")
+                        send_plc_update(name, device["ceb_payload"]["deviceItems"], str(bw_per_ceb), str(model_decision_values['ceb_frequency']), 2)
+                    else:
+                        logger.info(f"CEB次数无需更新: {current_plc_values['bw_per_ceb']}")
+
                 else:
                     logger.info("模型开关已关闭,跳过PLC指令")
 
@@ -580,11 +643,13 @@ def monitor_device(device):
                 logger.info(f"状态保存完成 下次查询起始时间 {last_cycle_end_time.strftime(DATETIME_FORMAT)}") 
 
             # 阶段4: 等待重置
-            logger.info(f"等待重置 控制字需不等于 {TRIGGER_VALUE}")
+            logger.info(f"等待重置 控制字需重新等于 {TRIGGER_VALUE}")
+            # 等待一段时间,确保不是立即开始新一轮
+            time.sleep(5)  # 等待5秒
             while True:
                 control_value = get_device_value(device["control_payload"], name)  # 控制字 
-                if control_value is None or int(control_value) != TRIGGER_VALUE:  # 控制字 不等于 触发值
-                    logger.info("重置条件满足,开始新一轮")
+                if control_value is not None and int(control_value) == TRIGGER_VALUE:  # 控制字 等于 触发值
+                    logger.info("完整周期结束,开始新一轮")
                     break
                 time.sleep(POLL_INTERVAL)