diff --git a/Docs/RS485扩展继电器协议.md b/Docs/RS485扩展继电器协议.md index c7f6908..f913710 100644 --- a/Docs/RS485扩展继电器协议.md +++ b/Docs/RS485扩展继电器协议.md @@ -87,7 +87,7 @@ 主控侧已实现(`HardWare/RELAY/ext_relay.c`): -- **命令流程**:平台/蓝牙下发 → FC05 → 等回显(300ms 超时,补发 1 次)→ 延时 150ms 等触点稳定 → FC03 读状态 → 校验"输出位=目标状态 **且 反馈位=目标状态**"(与板载继电器反馈同语义,失败应答 `Load unpowered / relay failure !`)→ 应答平台 → 上报全状态 +- **命令流程**:平台/蓝牙下发 → FC05 → 等回显(300ms 超时,补发 1 次)→ 延时 150ms 等触点稳定 → FC03 读状态 → 校验"输出位=目标 且 反馈位=目标 且 **反馈位有跳变**(命令前≠目标,与板载继电器反馈同语义;重复命令原本已在目标态的豁免)" → 应答平台(失败:`Load unpowered / relay failure !`)→ 上报全状态 - **周期轮询**:空闲每 2s 发一次 FC03,兼在线检测;连续 3 次无应答判离线(日志提示) - **断电记忆恢复**:扩展板状态存在主控 EEPROM(偏移 102 的 Relay_State[5],bit0~3);每次离线→上线时比对实际状态与记忆,不一致的回路逐路补发 FC05 纠正,恢复完成统一上报一次 - **离线行为**:离线期间下发命令直接回复平台 "ext relay board offline";板子恢复应答后自动上线并补一次状态上报 diff --git a/STM32F103_App1/HardWare/RELAY/ext_relay.c b/STM32F103_App1/HardWare/RELAY/ext_relay.c index 7b45306..4a7389c 100644 --- a/STM32F103_App1/HardWare/RELAY/ext_relay.c +++ b/STM32F103_App1/HardWare/RELAY/ext_relay.c @@ -101,6 +101,8 @@ static uint8_t cmd_is_poll = 0; /* static uint8_t cmd_is_restore = 0;/* ǰǶϵָ(Ӧƽ̨) */ static uint32_t cmd_tick = 0; static char cmd_id[20] = {0}; +static uint8_t cmd_state_before = 0; /* ǰλ(ѯֵ) */ +static uint8_t cmd_fb_before = 0; /* ǰλ(ѯֵ) */ #define EXT_STATE_EEPROM_IDX 5 /* MqttInfoStr.Relay_State[5] ԭֽ: չ״̬λ */ @@ -241,6 +243,9 @@ void ext_relay_process(void) cmd_pending = 0; cmd_is_poll = 0; cmd_retry = 0; + /* ǰ״̬(һ: У鷴, ӻгɹ) */ + cmd_state_before = (uint8_t)((s_state >> (cmd_ch - 1)) & 1u); + cmd_fb_before = (uint8_t)((s_fb >> (cmd_ch - 1)) & 1u); cmd_stage = 1; ext_send_fc05(cmd_ch, cmd_on); cmd_tick = now; @@ -302,16 +307,22 @@ void ext_relay_process(void) } } } else { - /* ؼ̵ͬ: λͷλҪĿ״̬ɹ - * ( 1s λ, 150ms ʱֱӱ REG1 , ©"ϵû") */ + /* ؼ̵ͬ: λ=Ŀ λ=Ŀ + * (ǰ!=Ŀ, =Ŀ); ظԭĿ̬ĻҪ + * λ(/Է)ʱ -> ʧ, OK */ uint8_t bit = (uint8_t)(1u << (cmd_ch - 1)); - int ok = (((s_state & bit) != 0) == cmd_on) && (((s_fb & bit) != 0) == cmd_on); + int state_ok = (((s_state & bit) != 0) == cmd_on); + int fb_ok = (((s_fb & bit) != 0) == cmd_on); + int fb_trans = (cmd_fb_before != cmd_on); + int was_already = (cmd_state_before == cmd_on); + int ok = state_ok && fb_ok && (fb_trans || was_already); if (ok) { log_info("> EXT: SW%d %sɹ (=%02X)", cmd_ch + 4, cmd_on ? "" : "", s_fb); ext_respond(1, "OK"); } else { - log_warn("> EXT: SW%d %sδЧ (=%02X =%02X =%02X)", - cmd_ch + 4, cmd_on ? "" : "", s_state, s_fb, s_fault); + log_warn("> EXT: SW%d %sδЧ (=%02X =%02X =%02X, ǰ=%d =%d)", + cmd_ch + 4, cmd_on ? "" : "", s_state, s_fb, s_fault, + cmd_state_before, cmd_fb_before); ext_respond(0, "Load unpowered / relay failure !"); /* ʧİһ */ } ext_save_state(); /* ϵ: ʵ״̬ */