fault_warn_log.h
源文件路径:
data/fault_warn_log/fault_warn_log.h所属模块:数据管理 / 故障告警日志(data/fault_warn_log) 代码行数:730
1. 文件职责
本头文件为 EMS 故障/告警日志模块定义全部对外契约:故障码常量表(ERROR_CODE_E)、设备类型与事件类型枚举(ERROR_DEVICE_TYPE_E / ERROR_TYPE_E)、落盘记录结构(STORE_ERROR_LOG_DATA_T)、地址备份结构(STORE_ERROR_LOG_ADDR_T)、模块总上下文(ERROR_LOG_TABLE_T,定位在 SDRAM)、LCD 故障码 FIFO(ERRCODE_FIFO_T)以及三个显示掩码联合体。它同时给出 Flash 分区宏(备份扇区与 396KB 日志环形区)、批量缓存/上传包尺寸宏和位操作宏(BIT_SET/BIT_CLEAR/BIT_IS_SET/BIT_VALUE)。fault_warn_log.c、hmi/led.c、hmi/ui/ui_history_error_log.c、net/ems.c 等通过包含它获得这些类型与接口。
2. 关键数据结构与宏
| 名称 | 类型 | 说明 | |
|---|---|---|---|
BIT_SET(byteData, index) | 宏 | `((byteData)[index/8]) \ | = (1 << (index%8))`,按位序号置位 |
BIT_CLEAR(byteData, index) | 宏 | ((byteData)[index/8]) &= ~(1 << (index%8)),按位序号清零 | |
BIT_IS_SET(byteData, index) | 宏 | (((byteData)[index/8] >> (index%8)) & 1) == 1,判定位为 1 | |
BIT_VALUE(byteData, index) | 宏 | (((byteData)[index/8] >> (index%8)) & 1),取出位值 0/1 | |
ERROR_LOG_DATA_CACHE_MAX_SIZE | 宏 | 256,RAM 写缓存条数上限,注释提示"缓存不能超过 65535" | |
ERROR_LOG_SERVER_PACK_MAX_SIZE | 宏 | 5*1024,单包上传缓冲大小 | |
ERROR_LOG_DATA_RECORD_ADDR_BACKUP1/2/3 | 宏 | 0xF63000 / 0xF64000 / 0xF65000,4K 地址备份扇区 | |
ERROR_LOG_DATA_RECORD_ADDR | 宏 | 0xF66000,故障日志数据区起始 | |
ERROR_LOG_DATA_RECORD_END | 宏 | 0xFC8FFF,故障日志数据区结束(约 396KB) | |
ERRCODE_FIFO_SIZE | 宏 | 10,LCD 主界面故障码缓冲深度 | |
DEBUG_FLASH_DATA_STORE | 宏 | 0,本文件内的调试开关 | |
FAULT_CODE_PAIR_T | 结构体 | {u16 faultBitPos; u32 fault_code;},位序号 ↔ 对外故障码的映射项 | |
ERROR_DEVICE_TYPE_E | 枚举 | ERROR_NONE, ERROR_EMS, ERROR_INV, ERROR_BMS, ERROR_EVC, ERROR_METER(顺序即 u8_device_type 取值) | |
ERROR_TYPE_E | 枚举 | NONE_TYPE, WARN_CLEAR, FAULT_CLEAR, WARN_OCCURRED, FAULT_OCCURRED, INFO_OCCURRED, PROTECTION_CLEAR, PROTECTION_OCCURRED | |
ERROR_CODE_E | 枚举 | 全量故障码:EMS E0000~E0094、事件 I10000~I10002、BMS E60000~E60031、W70000~W70015、P75000~P75009、P77500~P77532、INV E100000~E100456、INV 告警 W110000~W110137、EVC E200000~E200031、METER E160000~E160002 | |
BMS_DISPLAY_ERROR_U | 联合体(#pragma pack(1)) | u32 u32_all + 6 个位域:u8_bms_lost、u8_circuit_breaker_open、u8_dial_switching_mode_inconsistence、u8_slave_battery_communication_lost、u8_master_battery_communication_lost、u8_multi_master_error | |
INV_DISPLAY_ERROR_U | 联合体 | u32 u32_all + 25 个位域(u8_inv_lost、u8_grid_ovp/uvp/ofp/ufp、u8_bus_ovp1、u8_insulation_fault、u8_gfci_fault、u8_grid_relay_fault、u8_pv_reverse、u8_bat_reverse、u8_mppt1/2_ovp、u8_over_temperature、u8_bat_ovp/uvp、u8_battery_lose、u8_output_short、u8_output_overload、u8_backup_ovp、u8_para_can/sw_diff/module_fault/multi_master、u8_grid_loss_fault) | |
ACCESSORIES_DISPLAY_ERROR_U | 联合体 | u32 u32_all + 12 个位域(u8_grid_meter_lost、u8_pv_meter_lost、u8_evchargerlost、u8_relay_otp、u8_output_overload、u8_ac_leakage_current、u8_input_terminal_otp、u8_relay_abnormal、u8_ground_fault、u8_reverse_phase、u8_afci_self_check_fail、u8_afci_arc_drawing_fault) | |
STORE_ERROR_LOG_ADDR_T | 结构体(pack(1)) | 16 字节:u32_log_send_addr、u32_log_save_addr、u16_flash_idex、u8_reserve[4]、u16_crc_code;注释强调"结构体大小必须可以被扇区大小整除"(4096/16=256) | |
STORE_ERROR_LOG_DATA_T | 结构体(pack(1)) | 32 字节:struct RTC_DateTime Time(6)、u8_device_type、u8_fault_or_warn、u8_fault_location(电池簇号)、u8_fault_id(电池 ID 或逆变器通讯地址)、u32_fault_code、s32_fault_value、u8_reserve[12]、u16_crc_code | |
ERROR_LOG_TABLE_T | 结构体(pack(1)) | 模块总上下文(约 17.5KB,位于 SDRAM 预留 20K):u8_temp_buff[4096]、各设备本地位域快照(EMS 1 份、BMS 故障/保护/扩展1/扩展2/告警各 BATTERY_MAX_NUM+1=13 份、INV 故障/扩展1/扩展2/告警/告警扩展1 各 1 份、EVC 1 份、EVC-II MAX_EVC_II_NUM=4 份)、地址结构、t_error_log_data[256]、上传用 u32_error_log_addr_old/temp + 2 个标志 + u8_error_log_buff[5120] + u32_error_log_send_len、3 个显示掩码、u_bb_fault_u | |
ERRCODE_FIFO_T | 结构体(pack(1)) | LCD 主界面故障码 FIFO:u8_error_code_level_judgment_flag、u8_lcd_show_buf_len、u8_errcode_Write(写指针/有效条数)、u32_errcode_buf[10] | |
g_t_error_log_tab | 全局变量(extern) | ERROR_LOG_TABLE_T,__attribute__((at(SDRAM_FAULT_LOG_START_ADDR))) 定位在 SDRAM,定义在 fault_warn_log.c:27 | |
g_t_history_error_log[50] | 全局变量(extern) | 历史故障查询结果数组,get_history_error_log_data 的出口 | |
g_u8_get_history_error_log_flag | 全局变量(extern) | LCD 历史故障首次加载标志 |
3. 函数清单
本文件是纯声明头文件,不含任何函数定义;下表列出它声明的全部函数原型。
| 函数名 | 作用域 | 说明 |
|---|---|---|
error_log_data_init | 声明(全局) | 初始化故障日志模块上下文与地址 |
error_log_data_handle | 声明(全局) | 故障日志周期处理总入口 |
set_error_log_data_send_ok_true | 声明(全局) | 通知上传成功,推进发送指针 |
error_log_data_clear | 声明(全局) | 清空并擦除全部故障日志(注释:只能在同一任务内使用) |
get_history_error_log_data | 声明(全局) | 读取最近 len 条历史故障日志 |
get_show_errcode | 声明(全局) | 读取故障码 FIFO 指定偏移的故障码 |
lcd_get_errcode_buf_len | 声明(全局) | 返回故障码 FIFO 有效长度 |
get_bms_display_error_code | 声明(全局) | 返回 BMS 显示故障掩码 |
get_inv_display_error_code | 声明(全局) | 返回逆变器显示故障掩码 |
get_accessories_display_error_code | 声明(全局) | 返回附件/充电桩显示故障掩码 |
set_eeprom_fault_flag | 声明(全局) | 设置 EEPROM 页读写故障标志位 |
get_eeprom_hardware_read_fault_flag | 声明(全局) | 取硬件读故障掩码指针 |
get_eeprom_hardware_write_fault_flag | 声明(全局) | 取硬件写故障掩码指针 |
get_eeprom_software_read_fault_flag | 声明(全局) | 取软件读故障掩码指针 |
get_eeprom_software_write_fault_flag | 声明(全局) | 取软件写故障掩码指针 |
set_bat_heat_fault_flag | 声明(全局) | 设置电池加热故障标志 |
read_bat_heat_fault_flag | 声明(全局) | 读取电池加热故障标志(带 extern 前缀,风格与其它声明不一致) |
4. 核心逻辑解析
本文件不含可执行逻辑,此处说明其定义的数据布局在运行时的关键约束。
4.1 Flash 布局与三元冗余
| 区域 | 地址范围 | 用途 |
|---|---|---|
| 备份 1 | 0xF63000~0xF63FFF | 地址结构 256 槽轮转备份 |
| 备份 2 | 0xF64000~0xF64FFF | 同上 |
| 备份 3 | 0xF65000~0xF65FFF | 同上 |
| 数据区 | 0xF66000~0xFC8FFF | 32 字节/条的故障日志环形区(约 396KB ≈ 12972 条) |
地址备份结构大小 16 字节,正好把 4096 字节扇区切成 256 槽,与 fault_warn_log.c 中 u16_flash_idex 的 0~255 环回边界一致。数据记录 32 字节,同样可整除扇区大小,保证跨扇区写入时"零头"始终落在记录边界上。
4.2 位域联合体的位分配
三个显示联合体都采用"4 个 u8 交织成 u32"的写法。由于文件带 #pragma pack(1) 且位域声明为 u8 x:1,在 ARM little-endian 下 byteData 的第 index 位与 BIT_VALUE(byteData, index) 的语义等价——这正是 fault_warn_log.c 能用统一宏扫描的原因。注意 INV_DISPLAY_ERROR_U.u32_all 的第 24 位(u8_grid_loss_fault)与前一分组 BMS/附件的位定义完全不同,三套掩码的位含义必须分别对照各自的联合体解读。
4.3 接口契约(由调用方约定的时序)
error_log_data_init()必须在task_system_data启动阶段、任何error_log_data_handle()之前调用一次(data/data.c:259)。error_log_data_clear()与error_log_data_handle()必须在同一任务上下文调用(头文件注释 "只能做统一任务内使用"),因为二者共用g_t_error_log_tab中非原子的地址字段。get_history_error_log_data(len)的len必须在(0, 50],否则直接返回 0(实现于.c)。set_error_log_data_send_ok_true()由网络侧在收到平台回执后调用,与打包函数构成跨任务的"发送—确认"握手。
5. 对外接口
导出的类型与宏
全部结构体/联合体/枚举/宏(见第 2 节),以及 Flash 分区与尺寸常量。
导出的全局变量
| 变量 | 说明 |
|---|---|
g_t_error_log_tab | 模块总上下文,被 hmi/led.c、hmi/ui/ui_history_error_log.c、hmi/ui/ui_main.c、net/ems.c 直接读写 |
g_t_history_error_log[50] | 历史故障查询结果 |
g_u8_get_history_error_log_flag | 历史故障首次加载标志(同时被 hmi/ui/ui_history_error_log.c:74 清零以触发重载) |
导出的函数
见第 3 节全部原型。
本文件调用的外部接口
仅用于取类型与常量,无函数调用:chip.h、pcf8563.h、sdram.h、flash.h、data.h、bms.h、evc.h、evc_ii.h、inverter.h、meter.h。
6. 依赖关系
依赖
chip.h(u8/u16/u32/u64/s8/s32/TRUE/FALSE等基础类型)pcf8563.h(struct RTC_DateTime,用于STORE_ERROR_LOG_DATA_T.Time;FLASH_SECTOR_SIZE也经由该链最终从flash.h获得)sdram.h(SDRAM_FAULT_LOG_START_ADDR,g_t_error_log_tab的定位地址)flash.h(FLASH_SECTOR_SIZE)data.h(EMS_FAULT_U)、bms.h(BMS_FAULT_U、BMS_PROTECTION_U、BMS_PROTECTION_EXTEND1_U、BMS_PROTECTION_EXTEND2_U、BMS_WARN_U、BATTERY_MAX_NUM)、evc.h(EVC_FAULT_U)、evc_ii.h(EVC_II_FAULT_U、MAX_EVC_II_NUM)、inverter.h(INVERTER_FAULT_U、INVERTER_FAULT_EXTEND1_U、INVERTER_FAULT_EXTEND2_U、INVERTER_WARN_U、INVERTER_WARN_EXTEND1_U)、meter.h(BB_FAULT_U)
被依赖
data/fault_warn_log/fault_warn_log.c(唯一实现者)hmi/ui/ui_history_error_log.c、hmi/ui/ui_main.c、hmi/led.c(显示与历史界面)net/ems.c、net/server.c(上传与回执)data/data.c(初始化、周期处理、工厂复位)data/system_config/system_config.c、hardware/flash/feeprom.c(EEPROM 故障标志)
7. 备注与风险点
#pragma pack(1)作用域过大:从fault_warn_log.h:487一直到:701才#pragma pack(),其间所有结构体(含ERROR_LOG_TABLE_T)都是紧凑排列。这虽然是有意为之(保证落盘布局与 SDRAM 映射稳定),但任何在此区间新增成员都会改变 Flash 兼容性。- 位域联合体依赖编译器实现:
u8 x:1位域在 32 位 ARM 上的打包顺序与BIT_VALUE宏的假设一致,属于"依赖工具链行为"的写法,换编译器(如 GCC-fshort-enums/位域策略不同)会有实际语义差异。 ERROR_LOG_TABLE_T体积约 17.5KB,其中u8_temp_buff[4096]与u8_error_log_buff[5120]占了超过一半,只为"一个扇区读缓冲"和"一个上传包"服务;放在 SDRAM(20K 预留)是必要的,但也意味着memset(&g_t_error_log_tab, 0, sizeof(...))这类操作(fault_warn_log.c:54/1687)代价不低。STORE_ERROR_LOG_DATA_T的"大小必须整除扇区"约束只写在注释里,没有static_assert或编译期检查,若后续加入字段会静默破坏跨扇区写入的零头对齐。fault_warn_log.h:728的read_bat_heat_fault_flag声明带extern,与同文件其它函数声明(如set_bat_heat_fault_flag)风格不一致;功能上等价,但容易在阅读时被误认为变量。ERROR_LOG_DATA_CACHE_MAX_SIZE注释"缓存不能超过 65535"与实际值 256 不符,提示该常量曾被设计为u16计数(实现中l_u16_error_log_count确为u16),注释是遗留说明。DEBUG_FLASH_DATA_STORE在本头文件与data/resume_data/flash/flash_data_store.h中同名重复定义,两个模块的调试开关会互相干扰。ERROR_CODE_E枚举值有大量显式跳号(如E0017后直接E0031、INV 段从E100062跳到E100086),跳号部分依赖fault_warn_log.c中是否在映射表里出现;未出现在映射表中的枚举值是"已定义但永不产生"的幽灵故障码。