From 0077a4ad906d6bb99d7a8af12f5bacf1ac4522da Mon Sep 17 00:00:00 2001 From: caoqianming Date: Wed, 25 Mar 2026 13:00:24 +0800 Subject: [PATCH] fix(engine): stop coal_feeder before starting distributor on acc_time trigger When accumulated_run_sec reaches acc_time_sec, the coal feeder must be stopped before entering DistributorRunning state. Previously the feeder was left running while the distributor also ran, which is incorrect per the control spec. Co-Authored-By: Claude Sonnet 4.6 --- src/control/engine.rs | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/control/engine.rs b/src/control/engine.rs index 326b04f..6be50d2 100644 --- a/src/control/engine.rs +++ b/src/control/engine.rs @@ -291,10 +291,31 @@ async fn tick_state_machine( return; } - // Check AccTime — trigger distributor + // Check AccTime — stop feeder then trigger distributor if unit.acc_time_sec > 0 && runtime.accumulated_run_sec >= unit.acc_time_sec as i64 * 1000 { + let monitor = state + .connection_manager + .get_point_monitor_data_read_guard() + .await; + if let Some((pid, vt)) = + feeder_roles.and_then(|r| find_cmd(r, "stop_cmd", &monitor)) + { + drop(monitor); + if let Err(e) = + send_pulse_command(&state.connection_manager, pid, vt.as_ref(), 300).await + { + tracing::warn!("Engine: stop coal_feeder before distributor failed: {}", e); + return; + } + if state.config.simulate_plc { + if let Some(eq_id) = feeder_eq_id { + crate::control::command::simulate_run_feedback(state, eq_id, false) + .await; + } + } + } runtime.state = UnitRuntimeState::DistributorRunning; runtime.distributor_run_elapsed_sec = 0; }