扩展板反馈校验加跳变要求(对齐板载语义):命令前快照反馈位,无跳变判失败,防从机反馈卡高误报OK
This commit is contained in:
parent
be448b07af
commit
f9c4b3f4cc
|
|
@ -87,7 +87,7 @@
|
||||||
|
|
||||||
主控侧已实现(`HardWare/RELAY/ext_relay.c`):
|
主控侧已实现(`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 次无应答判离线(日志提示)
|
- **周期轮询**:空闲每 2s 发一次 FC03,兼在线检测;连续 3 次无应答判离线(日志提示)
|
||||||
- **断电记忆恢复**:扩展板状态存在主控 EEPROM(偏移 102 的 Relay_State[5],bit0~3);每次离线→上线时比对实际状态与记忆,不一致的回路逐路补发 FC05 纠正,恢复完成统一上报一次
|
- **断电记忆恢复**:扩展板状态存在主控 EEPROM(偏移 102 的 Relay_State[5],bit0~3);每次离线→上线时比对实际状态与记忆,不一致的回路逐路补发 FC05 纠正,恢复完成统一上报一次
|
||||||
- **离线行为**:离线期间下发命令直接回复平台 "ext relay board offline";板子恢复应答后自动上线并补一次状态上报
|
- **离线行为**:离线期间下发命令直接回复平台 "ext relay board offline";板子恢复应答后自动上线并补一次状态上报
|
||||||
|
|
|
||||||
|
|
@ -101,6 +101,8 @@ static uint8_t cmd_is_poll = 0; /*
|
||||||
static uint8_t cmd_is_restore = 0;/* 当前事务是断电恢复(不应答平台) */
|
static uint8_t cmd_is_restore = 0;/* 当前事务是断电恢复(不应答平台) */
|
||||||
static uint32_t cmd_tick = 0;
|
static uint32_t cmd_tick = 0;
|
||||||
static char cmd_id[20] = {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] 原保留字节: 扩展板状态位掩码 */
|
#define EXT_STATE_EEPROM_IDX 5 /* MqttInfoStr.Relay_State[5] 原保留字节: 扩展板状态位掩码 */
|
||||||
|
|
@ -241,6 +243,9 @@ void ext_relay_process(void)
|
||||||
cmd_pending = 0;
|
cmd_pending = 0;
|
||||||
cmd_is_poll = 0;
|
cmd_is_poll = 0;
|
||||||
cmd_retry = 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;
|
cmd_stage = 1;
|
||||||
ext_send_fc05(cmd_ch, cmd_on);
|
ext_send_fc05(cmd_ch, cmd_on);
|
||||||
cmd_tick = now;
|
cmd_tick = now;
|
||||||
|
|
@ -302,16 +307,22 @@ void ext_relay_process(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* 与板载继电器反馈同语义: 输出位和反馈位都要等于目标状态才算成功
|
/* 与板载继电器反馈同语义: 输出位=目标 且 反馈位=目标 且 反馈有跳变
|
||||||
* (不等 1s 故障位, 150ms 时直接比 REG1 反馈, 漏判"吸合但负载没电") */
|
* (命令前!=目标, 命令后=目标); 重复命令原本就在目标态的豁免跳变要求。
|
||||||
|
* 反馈位卡死(悬空/极性反)时无跳变 -> 判失败, 不会误报 OK */
|
||||||
uint8_t bit = (uint8_t)(1u << (cmd_ch - 1));
|
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) {
|
if (ok) {
|
||||||
log_info("> EXT: SW%d %s成功 (反馈=%02X)", cmd_ch + 4, cmd_on ? "开" : "关", s_fb);
|
log_info("> EXT: SW%d %s成功 (反馈=%02X)", cmd_ch + 4, cmd_on ? "开" : "关", s_fb);
|
||||||
ext_respond(1, "OK");
|
ext_respond(1, "OK");
|
||||||
} else {
|
} else {
|
||||||
log_warn("> EXT: SW%d %s未生效 (输出=%02X 反馈=%02X 故障=%02X)",
|
log_warn("> EXT: SW%d %s未生效 (输出=%02X 反馈=%02X 故障=%02X, 命令前输出=%d 反馈=%d)",
|
||||||
cmd_ch + 4, cmd_on ? "开" : "关", s_state, s_fb, s_fault);
|
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_respond(0, "Load unpowered / relay failure !"); /* 与板载失败文案一致 */
|
||||||
}
|
}
|
||||||
ext_save_state(); /* 断电记忆: 以实际输出状态落盘 */
|
ext_save_state(); /* 断电记忆: 以实际输出状态落盘 */
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue