EMS 知识库
首页 / knowledge/代码解析/data/fault_warn_log

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 布局与三元冗余

区域地址范围用途
备份 10xF63000~0xF63FFF地址结构 256 槽轮转备份
备份 20xF64000~0xF64FFF同上
备份 30xF65000~0xF65FFF同上
数据区0xF66000~0xFC8FFF32 字节/条的故障日志环形区(约 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 接口契约(由调用方约定的时序)

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. 依赖关系

依赖

被依赖

7. 备注与风险点

  1. #pragma pack(1) 作用域过大:从 fault_warn_log.h:487 一直到 :701 才 #pragma pack(),其间所有结构体(含 ERROR_LOG_TABLE_T)都是紧凑排列。这虽然是有意为之(保证落盘布局与 SDRAM 映射稳定),但任何在此区间新增成员都会改变 Flash 兼容性。
  2. 位域联合体依赖编译器实现:u8 x:1 位域在 32 位 ARM 上的打包顺序与 BIT_VALUE 宏的假设一致,属于"依赖工具链行为"的写法,换编译器(如 GCC -fshort-enums/位域策略不同)会有实际语义差异。
  3. 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)代价不低。
  4. STORE_ERROR_LOG_DATA_T 的"大小必须整除扇区"约束只写在注释里,没有 static_assert 或编译期检查,若后续加入字段会静默破坏跨扇区写入的零头对齐。
  5. fault_warn_log.h:728 的 read_bat_heat_fault_flag 声明带 extern,与同文件其它函数声明(如 set_bat_heat_fault_flag)风格不一致;功能上等价,但容易在阅读时被误认为变量。
  6. ERROR_LOG_DATA_CACHE_MAX_SIZE 注释"缓存不能超过 65535"与实际值 256 不符,提示该常量曾被设计为 u16 计数(实现中 l_u16_error_log_count 确为 u16),注释是遗留说明。
  7. DEBUG_FLASH_DATA_STORE 在本头文件与 data/resume_data/flash/flash_data_store.h 中同名重复定义,两个模块的调试开关会互相干扰。
  8. ERROR_CODE_E 枚举值有大量显式跳号(如 E0017 后直接 E0031、INV 段从 E100062 跳到 E100086),跳号部分依赖 fault_warn_log.c 中是否在映射表里出现;未出现在映射表中的枚举值是"已定义但永不产生"的幽灵故障码。