diff --git a/STM32F103_App1/HardWare/RELAY/ext_relay.c b/STM32F103_App1/HardWare/RELAY/ext_relay.c index 8f3da2b..7b45306 100644 --- a/STM32F103_App1/HardWare/RELAY/ext_relay.c +++ b/STM32F103_App1/HardWare/RELAY/ext_relay.c @@ -37,9 +37,17 @@ static uint16_t ext_crc16(const uint8_t *data, uint16_t len) return crc; } +/* 帧事件(on_frame 置位, process 消费; 同在 app_task 单线程) */ +static uint8_t rx_echo_ok = 0; +static uint8_t rx_state_ok = 0; +static uint8_t rx_exc = 0; + /* 总线发送: 等 50ms 静默 + 清接收缓冲(防陈旧帧) + 发送 + 刷新时间戳 */ static void ext_tx(const uint8_t *frame, uint16_t len) { + rx_echo_ok = 0; /* 清上一事务残留的应答标志, 防止迟到帧被当前事务误消费 */ + rx_state_ok = 0; + rx_exc = 0; uint32_t dt = HAL_GetTick() - rs485_bus_last_tick(); if (dt < 50u) vTaskDelay(50u - dt); USART2_FlushRxBuf(); @@ -82,6 +90,7 @@ static uint8_t s_fb = 0; /* REG1 static uint8_t s_fault = 0; /* REG2 故障标志 */ static uint16_t s_ver = 0; /* REG3 从机版本 */ static uint8_t s_miss = 0; /* 连续无应答计数 */ +static uint8_t s_fault_logged = 0; /* 已打印的故障位(变化才重打) */ static uint32_t s_last_poll = 0; /* 命令状态机 */ @@ -93,10 +102,6 @@ static uint8_t cmd_is_restore = 0;/* static uint32_t cmd_tick = 0; static char cmd_id[20] = {0}; -/* 帧事件(on_frame 置位, process 消费; 同在 app_task 单线程) */ -static uint8_t rx_echo_ok = 0; -static uint8_t rx_state_ok = 0; -static uint8_t rx_exc = 0; #define EXT_STATE_EEPROM_IDX 5 /* MqttInfoStr.Relay_State[5] 原保留字节: 扩展板状态位掩码 */ @@ -290,8 +295,11 @@ void ext_relay_process(void) } } else if (cmd_is_poll) { cmd_is_poll = 0; - if (s_fault) { - log_warn("> EXT: 反馈异常标志=%02X (输出=%02X 反馈=%02X)", s_fault, s_state, s_fb); + if (s_fault != s_fault_logged) { /* 故障位变化才打印, 防止每 2s 刷屏 */ + s_fault_logged = s_fault; + if (s_fault) { + log_warn("> EXT: 反馈异常标志=%02X (输出=%02X 反馈=%02X)", s_fault, s_state, s_fb); + } } } else { /* 与板载继电器反馈同语义: 输出位和反馈位都要等于目标状态才算成功 diff --git a/STM32F103_App1/HardWare/RELAY/relay.c b/STM32F103_App1/HardWare/RELAY/relay.c index 892266c..49fae19 100644 --- a/STM32F103_App1/HardWare/RELAY/relay.c +++ b/STM32F103_App1/HardWare/RELAY/relay.c @@ -135,7 +135,7 @@ GPIO_PinState relayReadFb(uint8_t ch) /* 设置指定继电器开关状态: 只写 GPIO 和 Relay_State, 不碰 EEPROM/网络 */ void relaySet(uint8_t ch, uint8_t on) { - if (ch < 1 || ch > 8) return; + if (ch < 1 || ch > 4) return; MqttInfoStr.Relay_State[ch] = on ? 1 : 0; switch (ch) { case 1: if (on) Relay1_ON; else Relay1_OFF; break; @@ -191,7 +191,7 @@ void relayAction(uint8_t *data) p = strstr((char *)data, "\"sw"); ch = p[3] - '0'; /* sw1 与 feeding 指令等效, 均控制继电器 1 */ - if (ch < 1 || ch > 4) { log_warn("> 继电器: sw 编号无效,仅支持 sw1~sw4"); return; } + if (ch < 1 || ch > 8) { log_warn("> 继电器: sw 编号无效,仅支持 sw1~sw8"); return; } swkey[0] = 's'; swkey[1] = 'w'; swkey[2] = (char)('0' + ch); swkey[3] = '\0'; if (!proto_get_bool((char *)data, swkey, &on)) { diff --git a/STM32F103_App1/MDK-ARM/STM32F103rb_App1.uvoptx b/STM32F103_App1/MDK-ARM/STM32F103rb_App1.uvoptx index 7ae1993..21ae48c 100644 --- a/STM32F103_App1/MDK-ARM/STM32F103rb_App1.uvoptx +++ b/STM32F103_App1/MDK-ARM/STM32F103rb_App1.uvoptx @@ -750,6 +750,19 @@ 0 0 0 + ..\HardWare\RELAY\ext_relay.c + ext_relay.c + 0 + 0 + + + 7 + 37 + 1 + 0 + 0 + 0 + 0 ..\HardWare\LOG\log.c log.c 0 @@ -757,7 +770,7 @@ 7 - 37 + 38 1 0 0 @@ -770,7 +783,7 @@ 7 - 38 + 39 1 0 0 @@ -783,7 +796,7 @@ 7 - 39 + 40 1 0 0 @@ -796,7 +809,7 @@ 7 - 40 + 41 1 0 0 @@ -809,7 +822,7 @@ 7 - 41 + 42 1 0 0 @@ -822,7 +835,7 @@ 7 - 42 + 43 1 0 0 @@ -835,7 +848,7 @@ 7 - 43 + 44 1 0 0 @@ -848,7 +861,7 @@ 7 - 44 + 45 1 0 0 @@ -861,7 +874,7 @@ 7 - 45 + 46 1 0 0 @@ -874,7 +887,7 @@ 7 - 46 + 47 1 0 0 @@ -887,7 +900,7 @@ 7 - 47 + 48 1 0 0 @@ -900,7 +913,7 @@ 7 - 48 + 49 1 0 0 @@ -913,7 +926,7 @@ 7 - 49 + 50 1 0 0 @@ -926,7 +939,7 @@ 7 - 50 + 51 1 0 0 @@ -939,7 +952,7 @@ 7 - 51 + 52 1 0 0 @@ -960,7 +973,7 @@ 0 8 - 52 + 53 5 0 0