From 5ee368da7cafe16a1d094bcc21097ec6a44b33c1 Mon Sep 17 00:00:00 2001 From: helei Date: Fri, 4 Sep 2026 21:26:25 +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=AF=B9=E9=BD=90=E6=9D=BF=E8=BD=BD=E8=AF=AD?= =?UTF-8?q?=E4=B9=89:=E5=91=BD=E4=BB=A4=E5=90=8E150ms=E7=9B=B4=E6=8E=A5?= =?UTF-8?q?=E6=AF=94FC03=E5=8F=8D=E9=A6=88=E4=BD=8D(=E4=B8=8D=E7=AD=891s?= =?UTF-8?q?=E6=95=85=E9=9A=9C=E4=BD=8D),=E5=A4=B1=E8=B4=A5=E6=96=87?= =?UTF-8?q?=E6=A1=88=E7=BB=9F=E4=B8=80=E4=B8=BALoad=20unpowered=20/=20rela?= =?UTF-8?q?y=20failure=20!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Docs/RS485扩展继电器协议.md | 4 ++-- STM32F103_App1/HardWare/RELAY/ext_relay.c | 6 ++++-- 版本说明.md | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/Docs/RS485扩展继电器协议.md b/Docs/RS485扩展继电器协议.md index 58dfc90..c7f6908 100644 --- a/Docs/RS485扩展继电器协议.md +++ b/Docs/RS485扩展继电器协议.md @@ -79,7 +79,7 @@ 不一致的回路会**逐路补发 FC05 纠正**——所以从机上线后紧跟着收到几条 FC05 属正常恢复流程,务必如实执行并回显) 2. FC05 收到并校验通过(地址/功能码/线圈范围/CRC)后**立即执行**再回显 3. 反馈输入:每路继电器配负载反馈检测(同主控板载继电器:吸合后负载得电=高)。从机自行维护 REG2 故障位:某路输出状态与反馈不一致**持续超过 1s** 置 1,恢复一致后清 0 -4. 反馈采样建议 10~50ms 周期,加简单消抖(如连续 3 次一致才更新 REG1) +4. 反馈采样建议 10~50ms 周期,加简单消抖(如连续 3 次一致才更新 REG1);**消抖总时长必须 <150ms**——主控在 FC05 回显后 150ms 就读 FC03 校验反馈位,反馈跟不上会误判"负载未通电" 5. 只响应地址 0x10 的帧;**不要响应广播/其它地址**(总线上还有秤,地址 0x01) 6. 收帧间隔不足 50ms 也要能正常解析(主控保证发送间隔,从机只做鲁棒接收) @@ -87,7 +87,7 @@ 主控侧已实现(`HardWare/RELAY/ext_relay.c`): -- **命令流程**:平台/蓝牙下发 → FC05 → 等回显(300ms 超时,补发 1 次)→ 延时 150ms 等触点稳定 → FC03 读状态 → 校验"输出位=目标状态 且 故障位=0" → 应答平台 OK/失败 → 上报全状态 +- **命令流程**:平台/蓝牙下发 → 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 5b60d00..8f3da2b 100644 --- a/STM32F103_App1/HardWare/RELAY/ext_relay.c +++ b/STM32F103_App1/HardWare/RELAY/ext_relay.c @@ -294,15 +294,17 @@ void ext_relay_process(void) log_warn("> EXT: 쳣־=%02X (=%02X =%02X)", s_fault, s_state, s_fb); } } else { + /* ؼ̵ͬ: λͷλҪĿ״̬ɹ + * ( 1s λ, 150ms ʱֱӱ REG1 , ©"ϵû") */ uint8_t bit = (uint8_t)(1u << (cmd_ch - 1)); - int ok = (((s_state & bit) != 0) == cmd_on) && ((s_fault & bit) == 0); + int ok = (((s_state & bit) != 0) == cmd_on) && (((s_fb & bit) != 0) == cmd_on); 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); - ext_respond(0, "ext relay failed / load unpowered"); + ext_respond(0, "Load unpowered / relay failure !"); /* ʧİһ */ } ext_save_state(); /* ϵ: ʵ״̬ */ relayStatueUpdata(); /* ɺϱȫ״̬ */ diff --git a/版本说明.md b/版本说明.md index 931ddb2..f5f38a8 100644 --- a/版本说明.md +++ b/版本说明.md @@ -5,7 +5,7 @@ ### 新增 - **485 级联扩展继电器板(4 路带反馈,Modbus RTU 从机 0x10)**,与称重秤共用 USART2 总线: - 新模块 `HardWare/RELAY/ext_relay.c`:FC05 写线圈控制 + FC03 读 4 寄存器(输出/反馈/故障/版本) - - 命令闭环:FC05 回显校验(300ms 超时补发 1 次)→ 150ms 触点稳定 → FC03 校验输出位+故障位 → 应答平台 → 全状态上报 + - 命令闭环:FC05 回显校验(300ms 超时补发 1 次)→ 150ms 触点稳定 → FC03 校验输出位+反馈位(与板载继电器反馈同语义,失败应答 `Load unpowered / relay failure !`)→ 应答平台 → 全状态上报 - 空闲 2s 轮询兼在线检测,连续 3 次无应答判离线;离线期间命令直接拒绝;恢复应答自动上线补报 - 反馈异常(故障位非 0)打 WARN 日志 - **485 总线多从机改造**:USART2 收帧统一在 feedScaleProcess 收取后按站号分发(0x01 秤 / 0x10 扩展板);