From f9c4b3f4cce8a0e2c2d149c426b6ed053a928900 Mon Sep 17 00:00:00 2001 From: helei Date: Tue, 8 Sep 2026 12:59:18 +0800 Subject: [PATCH] =?UTF-8?q?=E6=89=A9=E5=B1=95=E6=9D=BF=E5=8F=8D=E9=A6=88?= =?UTF-8?q?=E6=A0=A1=E9=AA=8C=E5=8A=A0=E8=B7=B3=E5=8F=98=E8=A6=81=E6=B1=82?= =?UTF-8?q?(=E5=AF=B9=E9=BD=90=E6=9D=BF=E8=BD=BD=E8=AF=AD=E4=B9=89):?= =?UTF-8?q?=E5=91=BD=E4=BB=A4=E5=89=8D=E5=BF=AB=E7=85=A7=E5=8F=8D=E9=A6=88?= =?UTF-8?q?=E4=BD=8D,=E6=97=A0=E8=B7=B3=E5=8F=98=E5=88=A4=E5=A4=B1?= =?UTF-8?q?=E8=B4=A5,=E9=98=B2=E4=BB=8E=E6=9C=BA=E5=8F=8D=E9=A6=88?= =?UTF-8?q?=E5=8D=A1=E9=AB=98=E8=AF=AF=E6=8A=A5OK?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Docs/RS485扩展继电器协议.md | 2 +- STM32F103_App1/HardWare/RELAY/ext_relay.c | 21 ++++++++++++++++----- 2 files changed, 17 insertions(+), 6 deletions(-) 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(); /* ϵ: ʵ״̬ */