|
|
@@ -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)
|
|
|
|