修复传感器脱落无法上报故障: 发送指令 nack 计入连续失败,DP22 故障码改为 1

拔掉 AHT20 时 measure_start 返回 addr nack,原先直接跳过本次采样、fail_cnt 不增加,
导致永远判不出故障。发送指令失败与读数失败统一记失败,连续 3 次后显示 --。
fault_code:传感器故障报 1,2 预留;温湿度比较异常只闪显示、不上报。
This commit is contained in:
2026-08-31 18:35:01 +08:00
parent e324ebd99b
commit 6e2ce733a6
5 changed files with 32 additions and 25 deletions
+4 -3
View File
@@ -276,7 +276,7 @@ LED **不** 表示风扇档位,**不** 表示温湿度告警(告警走数码
|---|---|---| |---|---|---|
| 温度 2 位 | 整数 ℃ | 0~99 显示绝对值;<0 显示 `-9``-1`(负号用 G 段或自定义,P0 扫段后定);<−9 钳位 `-9`>99 钳位 `99` | | 温度 2 位 | 整数 ℃ | 0~99 显示绝对值;<0 显示 `-9``-1`(负号用 G 段或自定义,P0 扫段后定);<−9 钳位 `-9`>99 钳位 `99` |
| 湿度 2 位 | 整数 % | 0~99>99 钳位 `99` | | 湿度 2 位 | 整数 % | 0~99>99 钳位 `99` |
| 读失败 | 双管 `--` | 连续失败 **3** 次后;`fault_code=2` | | 读失败 | 双管 `--` | 连续失败 **3** 次后;`fault_code=1` |
APP DP3 仍是 0.1℃ 精度 float;显示不跟小数。 APP DP3 仍是 0.1℃ 精度 float;显示不跟小数。
@@ -285,7 +285,8 @@ APP DP3 仍是 0.1℃ 精度 float;显示不跟小数。
- 任一 **已使能**`cond_en=1` 的条件组,其温度比较 **当前已成立****不等待** Byte4 时长)→ 温度管 **500ms 亮 / 500ms 灭** - 任一 **已使能**`cond_en=1` 的条件组,其温度比较 **当前已成立****不等待** Byte4 时长)→ 温度管 **500ms 亮 / 500ms 灭**
- 湿度同理。两路可同时闪。 - 湿度同理。两路可同时闪。
- 比较不再成立 → 该侧停闪,常亮显示数值。 - 比较不再成立 → 该侧停闪,常亮显示数值。
- 同步:`fault_code=1`(温湿度异常)。传感器故障优先于 1:失败达 3 次则 `fault_code=2``--` - 温湿度比较异常只驱动对应管子闪烁,**不上报** `fault_code`
- 传感器连续失败 3 次:显示 `--`,同步 `fault_code=1``fault_code=2` 预留。
- `alarm_code` 预留,不上报具体码(保持 0)。 - `alarm_code` 预留,不上报具体码(保持 0)。
- `BOARD_DISP_ENABLE=0` 时不闪、不驱动管子,fault 仍可上报。 - `BOARD_DISP_ENABLE=0` 时不闪、不驱动管子,fault 仍可上报。
@@ -503,7 +504,7 @@ usr_rtc_get_time() 失败 → 全部定时不执行(等同 time_en=0)
| 13 time_en | 见第 11 章 | | 13 time_en | 见第 11 章 |
| 14~20 time_config | 8 字节 + 存 VM | | 14~20 time_config | 8 字节 + 存 VM |
| 21/23 en | 原样存,P0 不做位级过滤 | | 21/23 en | 原样存,P0 不做位级过滤 |
| 22 fault_code | 0 无 / 1 温湿度比较异常 / 2 传感器故障 | | 22 fault_code | 0 无 / 1 传感器故障 / 2 预留 |
| 24 alarm_code | 保持 0 | | 24 alarm_code | 保持 0 |
| 25 factory_reset | 第 14 章 | | 25 factory_reset | 第 14 章 |
| 26~28 | 存 RAM/VM 可不实现动作 | | 26~28 | 存 RAM/VM 可不实现动作 |
+1 -1
View File
@@ -56,7 +56,7 @@ void app_disp_set_temp_alarm(uint8_t en);
void app_disp_set_humi_alarm(uint8_t en); void app_disp_set_humi_alarm(uint8_t en);
/** /**
* @brief 温度或湿度管是否处于告警闪烁(供 fault_code=1 * @brief 温度或湿度管是否处于告警闪烁
* @return 1=任一侧告警,0=无 * @return 1=任一侧告警,0=无
*/ */
uint8_t app_disp_is_alarm(void); uint8_t app_disp_is_alarm(void);
+2 -9
View File
@@ -21,7 +21,6 @@
#include "app_cond.h" #include "app_cond.h"
#include "app_timer_task.h" #include "app_timer_task.h"
#include "app_th.h" #include "app_th.h"
#include "app_disp.h"
#include "app_led.h" #include "app_led.h"
#include "app_main.h" #include "app_main.h"
#include "usr_le_api.h" #include "usr_le_api.h"
@@ -83,14 +82,8 @@ void app_function_poll(void)
{ {
gDevData.fan_gear = app_fan_get_gear(); /* DP2 必须等于当前真实档位 */ gDevData.fan_gear = app_fan_get_gear(); /* DP2 必须等于当前真实档位 */
gDevData.mode = app_mode_get_active(); gDevData.mode = app_mode_get_active();
/* 规格书 8.2/15:传感器故障优先 2;否则温湿度比较成立报 1 */ /* DP22:传感器连续失败报 1;2 预留,温湿度比较异常只走显示闪烁不上报 */
if (app_th_is_fault()) { gDevData.fault_code = app_th_is_fault() ? 1 : 0;
gDevData.fault_code = 2;
} else if (app_disp_is_alarm()) {
gDevData.fault_code = 1;
} else {
gDevData.fault_code = 0;
}
} }
/** /**
+20 -7
View File
@@ -2,8 +2,8 @@
* @file app_th.c * @file app_th.c
* @brief CBR3 温湿度采集实现 * @brief CBR3 温湿度采集实现
* @author cyWu <1917507415@qq.com> * @author cyWu <1917507415@qq.com>
* @date 2026.08.29 * @date 2026.08.31
* @version V1.0.0首次发布 * @version V1.1.0发令阶段 nack 也计入连续失败;fault_code 由上层映射为 1
******************************************************************************/ ******************************************************************************/
#include "app_th.h" #include "app_th.h"
@@ -40,6 +40,19 @@ typedef struct {
static AppThCtx_t s_th; static AppThCtx_t s_th;
/**
* @brief 记一次采样失败(发令 nack / 读数失败共用)
* @return 无
*/
static void th_on_fail(void)
{
if (s_th.fail_cnt < 0xFF) {
s_th.fail_cnt++;
}
s_th.last_ok = 0;
log_error("th sample fail %d\n", s_th.fail_cnt);
}
/** /**
* @brief 初始化温湿度模块 * @brief 初始化温湿度模块
* @return 无 * @return 无
@@ -85,8 +98,10 @@ void app_th_poll(uint16_t dt)
if (bsp_aht20_measure_start() == 0) { if (bsp_aht20_measure_start() == 0) {
s_th.state = TH_ST_WAIT_DATA; s_th.state = TH_ST_WAIT_DATA;
s_th.wait_t0 = timer_get_ms(); s_th.wait_t0 = timer_get_ms();
} else {
/* 发令阶段 addr nack(未插/脱落)也算一次采样失败,不能直接跳过 */
th_on_fail();
} }
/* measure_start 非 0=通讯失败,跳过本次采样 */
} }
} else if (s_th.state == TH_ST_WAIT_DATA) { } else if (s_th.state == TH_ST_WAIT_DATA) {
clr_wdt(); clr_wdt();
@@ -106,9 +121,7 @@ void app_th_poll(uint16_t dt)
log_info("th %d.%dC %d%%\n", log_info("th %d.%dC %d%%\n",
(int)(t / 10), (int)((t < 0) ? (-t % 10) : (t % 10)), h); (int)(t / 10), (int)((t < 0) ? (-t % 10) : (t % 10)), h);
} else { } else {
s_th.fail_cnt++; th_on_fail();
s_th.last_ok = 0;
log_error("th sample fail %d\n", s_th.fail_cnt);
} }
} }
} }
@@ -152,7 +165,7 @@ uint8_t app_th_get_fail_cnt(void)
/** /**
* @brief 传感器故障(连续失败 ≥ BOARD_TH_FAIL_MAX * @brief 传感器故障(连续失败 ≥ BOARD_TH_FAIL_MAX
* @return 1=故障(显示 --、fault_code=2),0=正常 * @return 1=故障(显示 --、fault_code=1),0=正常
*/ */
uint8_t app_th_is_fault(void) uint8_t app_th_is_fault(void)
{ {
+5 -5
View File
@@ -2,12 +2,12 @@
* @file app_th.h * @file app_th.h
* @brief CBR3 温湿度采集:2s 周期、失败计数、最近有效值 * @brief CBR3 温湿度采集:2s 周期、失败计数、最近有效值
* @author cyWu <1917507415@qq.com> * @author cyWu <1917507415@qq.com>
* @date 2026.08.29 * @date 2026.08.31
* @version V1.0.0首次发布 * @version V1.1.0发令阶段 nack 也计入连续失败
* *
* @note 规格书 8.4:条件"持续时长"只在本次采样成功且比较成立时累加; * @note 规格书 8.4:条件"持续时长"只在本次采样成功且比较成立时累加;
* 采样失败不累加、不清零;连续 3 次失败显示 "--" fault_code=2 * 采样失败不累加、不清零;连续 3 次失败显示 "--"DP22 fault_code=1
* P0 不做条件比较,只做采样与失败计数 * fault_code=2 预留,本模块只给出 is_fault,由 app_function 映射
******************************************************************************/ ******************************************************************************/
#ifndef __APP_TH_H__ #ifndef __APP_TH_H__
@@ -54,7 +54,7 @@ uint8_t app_th_get_fail_cnt(void);
/** /**
* @brief 传感器故障(连续失败 ≥ BOARD_TH_FAIL_MAX * @brief 传感器故障(连续失败 ≥ BOARD_TH_FAIL_MAX
* @return 1=故障(显示 --、fault_code=2),0=正常 * @return 1=故障(显示 --、fault_code=1),0=正常
*/ */
uint8_t app_th_is_fault(void); uint8_t app_th_is_fault(void);