Initial commit: CCU621_M firmware project with BLE debug link support.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-07-08 17:28:36 +08:00
commit 9ceb218f80
1597 changed files with 724159 additions and 0 deletions
@@ -0,0 +1,81 @@
# fault_cheak 模块说明
> 路径:`app/fault_cheak/`
> 作用:完成故障检测、故障动作缓存、实时故障状态维护,以及历史故障持久化触发。
## 1. 模块组成
- `fault_interface.h/.c`
- 对外故障接口(`v_set_fault_data``v_get_fault_data``u8_get_fault_sum` 等)
- 故障动作缓存队列管理(`v_fault_cache_init``u8_fault_cache_add``v_fault_cache_process`
- 故障信息中文描述与故障位置描述
- `faultcheck_task.h/.c`
- 故障检测任务主循环
- 故障输入状态检查(急停、门禁、水浸、防雷、烟感、枪温等)
- 拔枪恢复逻辑与任务周期调度
## 2. 功能职责
### 2.1 实时故障状态管理
- 维护 `s_real_fault`
- `u8_fault_cnt`:当前故障数量
- `u8_warn_cnt`:当前告警数量
- `fault_data[]`:当前故障列表
- `warn_data[]`:当前告警列表
- 支持“同位置+同故障码”去重,避免重复入表。
### 2.2 故障动作缓存解耦
- 对外 `v_set_fault_data()` 只做“入缓存队列”,不直接重处理逻辑。
- 任务周期内由 `v_fault_cache_process()` 分批执行,避免单周期耗时过长影响主循环实时性。
### 2.3 历史故障持久化触发
- 故障/告警新增时,触发历史记录持久化:
- 主路径:`flash_file_mgr`(索引 EEPROM + 数据 externalflash
- 可选路径:`FATFS_ENABLE_FAULT` 打开时同步缓存到 FATFS 故障缓存
- 恢复动作当前仅更新实时状态(是否保存恢复动作可按业务再打开)。
## 3. 关键数据结构
- `HIS_FAULT_DATA_T``faultcheck_task.h`
- 故障位置 `e_site`
- 故障码 `e_fault_info`
- 发生时间 `s_occur_time`
- 动作类型 `ActType`(恢复/故障/告警)
- 扩展值 `s16_value1/s16_value2`
- `REAL_FAULT_DATA_T``fault_interface.h`
- 当前态故障/告警存储
- `FAULT_ACTION_CACHE_T``fault_interface.h`
- 故障动作缓存环形队列
## 4. 运行流程(简述)
1. 外部模块调用 `v_set_fault_data(...)` 上报动作;
2. 动作进入缓存队列;
3. `v_fault_task()` 周期调用 `v_fault_cache_process()`
4. 内部 `v_set_fault_data_internal()` 完成:
- 实时故障表增删
- 必要日志输出
- 新增故障/告警时持久化到历史存储模块。
## 5. 与 flash_file_mgr 的关系
- `fault_cheak` 负责“故障业务判断与动作触发”;
- `flash_file_mgr/fault_flash_impl` 负责“历史故障持久化实现”;
- 两者通过 `v_hisFault_save_record()` 解耦。
## 6. 配置与注意事项
- `FAULT_ACTION_CACHE_SIZE`:缓存大小,过小会丢动作;
- `FAULT_TEST`:测试开关,打开后可屏蔽实际故障处理;
- 当前接口运行在任务上下文,若在中断上下文调用需增加保护或改为事件投递。
## 7. 相关文档
- [主说明 README](../../README.md)
- [flash_file_mgr 模块说明](../../BSP/flash_file_mgr/flash_file_mgr模块说明.md)
- [eeprom 模块说明](../../BSP/eeprom/eeprom模块说明.md)
- [externalflash 模块说明](../../BSP/externalflash/externalflash模块说明.md)
+954
View File
@@ -0,0 +1,954 @@
#include "fault_cheak/faultcheck_task.h"
#include "flash_file_mgr/fault_flash_impl.h"
#include "app_init/app_init.h"
#include "mylog/mylog.h"
#include "app_rtc/app_rtc.h"
#include "fault_cheak/fault_interface.h"
#include "collect_ctrl/collect_task.h"
#include "flowctrl/flow_interface.h"
#if(FATFS_EN)
#include "app_fatfs/fatfs_init.h"
#endif
#if(MY_SHELL_EN) //Shell 使能
#include "letter_shell/shell_port.h"
#endif
#define FAULT_TEST 0 //测试使能 1则屏蔽故障信息
#define FAULT_LOG(fmt, ...) MYLOG_MSG(TASK_ID_FaultCheck, (fmt), ##__VA_ARGS__)
//extern S_HIS_FAULT_MNG s_hisFaultMng; //故障告警信息记录
extern REAL_FAULT_DATA_T s_real_fault; //实时故障告警记录存储
//故障动作缓存
static FAULT_ACTION_CACHE_T s_fault_action_cache = {0};
static void v_set_fault_data_internal(E_FAULT_SITE f_site ,E_FAULT_TYPE type , E_FAULT_INFO e_info, U8_T action_type, S16_T data1 , S16_T data2);
static void v_fault_persist_record(HIS_FAULT_DATA_T *fault_data);
/**
* @brief 将故障动作持久化到 Flash,并在 FATFS 故障模块使能时写入缓存
*/
static void v_fault_persist_record(HIS_FAULT_DATA_T *fault_data)
{
#if (FAULT_FLASH_MGR_ENABLE)
v_hisFault_save_record(fault_data);
#endif
#if FATFS_ENABLE_FAULT
cache_add_fault(fault_data);
#endif
}
#if 1 //故障说明映射表
const static S_FAULT_INFO fault_info[] =
{
//常规停止代码
{E_NORMAL_1000, "Charge complete stop"}, // 充满停止
{E_NORMAL_1001, "Local stop charging"}, // 本地停止充电
{E_NORMAL_1002, "Remote stop charging"}, // 后台停止充电
{E_NORMAL_1003, "Stop at set charging time"}, // 达到设置充电时长停止
{E_NORMAL_1004, "Stop at set energy"}, // 达到设置充电电量停止
{E_NORMAL_1005, "Stop at set amount"}, // 达到设置充电金额停止
{E_NORMAL_1006, "Stop at offline condition"}, // 达到离线停机条件
{E_NORMAL_1007, "Stop at SOC threshold"}, // 达到SOC终止条件停止
{E_NORMAL_1008, "User unplug stop"}, // 用户拔枪停止
{E_NORMAL_1009, "APP stop charging"}, // APP停止充电
// {E_NORMAL_1010, "Vehicle S2 proactive disconnect"}, // 车端S2主动断开
{E_NORMAL_1011, "BMS stop charging"}, // BMS停止充电
{E_NORMAL_1012, "Insufficient account balance"}, // 账户余额不足
{E_NORMAL_1013, "Insufficient prepay amount"}, // 预付金额不足
// {E_NORMAL_1014, "Vehicle S2 close timeout"}, // 车辆S2闭合超时
// {E_NORMAL_1015, "Vehicle S2 disconnect timeout while charging"}, // 充电中车辆S2断开超时
{E_NORMAL_1016, "Stop at trickle charging condition"}, // 达到涓流充电停机条件
//直流充电设备异常代码
{E_FAULT_13000, "AC input breaker fault"}, // 交流输入断路器故障
{E_FAULT_13001, "SPD fault"}, // 避雷器故障
{E_FAULT_13002, "AC input contactor sticking fault"}, // 交流输入接触器粘连故障
{E_FAULT_13003, "AC input contactor action fault"}, // 交流输入接触器拒动/误动故障
{E_FAULT_13004, "DC output contactor sticking fault"}, // 直流输出接触器粘连故障
{E_FAULT_13005, "DC output contactor action fault"}, // 直流输出接触器拒动/误动故障
{E_FAULT_13006, "DC output fuse fault"}, // 直流输出熔断器故障
{E_FAULT_13007, "Auxiliary power fault"}, // 辅助电源故障
{E_FAULT_13008, "Discharge relay action fault"}, // 泄放继电器拒动/误动故障
{E_FAULT_13009, "Discharge relay sticking"}, // 泄放继电器粘连
{E_FAULT_13010, "Gun e-lock lock fault"}, // 充电枪电子锁上锁故障
{E_FAULT_13011, "Gun e-lock unlock fault"}, // 充电枪电子锁解锁故障
// {E_FAULT_13012, "PE disconnection fault"}, // PE 断线故障
{E_FAULT_13013, "Charging connector overtemperature fault"}, // 充电接口过温故障
{E_FAULT_13014, "Charging connector overtemperature warning"}, // 充电接口过温告警
{E_FAULT_13015, "Control pilot voltage abnormal"}, // 控制导引电压异常
{E_FAULT_13016, "Control pilot fault while charging"}, // 充电中车辆控制导引故障
{E_FAULT_13017, "Emergency stop fault"}, // 急停
{E_FAULT_13018, "Door access fault"}, // 门禁
{E_FAULT_13019, "Cabinet door access fault"}, // 充电机柜门禁故障
{E_FAULT_13020, "Power control module fault"}, // 功率控制模块故障
{E_FAULT_13021, "Power control module warning"}, // 功率控制模块告警
{E_FAULT_13022, "Power control module communication fault"}, // 功率控制模块通信故障
{E_FAULT_13023, "Bridge contactor action fault"}, // 桥接接触器拒动/误动故障
{E_FAULT_13024, "Bridge contactor sticking fault"}, // 桥接接触器粘连故障
// {E_FAULT_13025, "ESAM fault"}, // ESAM 故障
{E_FAULT_13026, "Liquid cooling oil overtemperature"}, // 液冷油温过高
// {E_FAULT_13027, "Charger overtemperature fault optional"}, // 充电桩过温故障( 可选)
// {E_FAULT_13028, "Charger overtemperature warning optional"}, // 充电桩过温告警( 可选)
// {E_FAULT_13029, "Cabinet overtemperature warning"}, // 充电机柜过温告警
// {E_FAULT_13030, "Cabinet overtemperature fault"}, // 充电机柜过温故障
{E_FAULT_13031, "Liquid cooling warning"}, // 液冷报警
{E_FAULT_13032, "Smoke alarm warning"}, // 烟感报警
{E_FAULT_13033, "Charger water immersion fault"}, // 充电桩水浸故障
// {E_FAULT_13034, "Cabinet water immersion fault"}, // 充电机柜水浸故障
{E_FAULT_13035, "Cabinet humidity warning"}, // 充电机环境湿度告警
// {E_FAULT_13036, "Data validity check failure"}, // 数据合法性校验失败
// {E_FAULT_13037, "Controller version check not finished"}, // 充电控制器 版本校验 未完成
// {E_FAULT_13038, "Controller charging parameter download not finished"}, // 充电控制器 下发充电参数 未完成
// {E_FAULT_13039, "Charger paused service reject start"}, // 充电桩暂停服务, 拒绝启动
{E_FAULT_13040, "Previous charge complete but not unplugged"}, // 上次充电完成未拔枪
// {E_FAULT_13041, "Vehicle not connected reject start"}, // 充电桩与车辆处于未连接状态,拒绝启动
{E_FAULT_13042, "Insulation monitoring fault"}, // 绝缘监测故障
{E_FAULT_13043, "Insulation monitoring warning"}, // 绝缘监测告警
// {E_FAULT_13044, "Power allocation strategy execution failure"}, // 充电桩执行功率分配策略失败故障
// {E_FAULT_13045, "Reserved input overvoltage fault"}, // 预留( 输入电压过压故障)
// {E_FAULT_13046, "Reserved input undervoltage fault"}, // 预留( 输入电压欠压故障)
{E_FAULT_13047, "Discharge circuit fault"}, // 泄放回路故障
{E_FAULT_13048, "DC output overvoltage fault"}, // 直流输出电压过压故障
{E_FAULT_13049, "DC output overcurrent fault"}, // 直流输出电流过流故障
{E_FAULT_13050, "DC output undervoltage fault"}, // 直流输出电压欠压故障
// {E_FAULT_13051, "No idle module available"}, // 无空闲模块可用( 限智能分配功率)
// {E_FAULT_13052, "Battery reverse connection fault"}, // 电池反接故障
{E_FAULT_13053, "Precharge regulation failure"}, // 预充阶段调压失败
{E_FAULT_13054, "Output current exceeds vehicle demand"}, // 输出电流大于车辆需求电流
{E_FAULT_13055, "Power controller not in working state while charging"}, // 充电过程中功率控制器为非工作状态
{E_FAULT_13056, "Energy metering abnormal"}, // 电能计量异常
{E_FAULT_13057, "Vehicle authentication code mismatch"}, // 车辆鉴权码不一致
// {E_FAULT_13058, "Unreported transaction records full"}, // 未上送交易记录已满
// {E_FAULT_13059, "Transaction record storage failure"}, // 交易记录存储失败
// {E_FAULT_13060, "CAN protocol version check abnormal"}, // CAN 通讯版本校验异常
// {E_FAULT_13061, "Process running abnormal"}, // 进程运行异常
// {E_FAULT_13062, "Program file checksum failure"}, // 程序文件校验失败
// {E_FAULT_13063, "Program file damaged"}, // 程序文件损坏
{E_FAULT_13064, "Illegal VIN"}, // 非法 VIN
// {E_FAULT_13065, "Non plug and charge device"}, // 非即插即充设备
// {E_FAULT_13066, "Charger in pause state"}, // 充电桩处于“暂停” 状态( 27930中的暂停状态)
{E_FAULT_13067, "Plug and charge authentication failed"}, // 即插即充鉴权失败
// {E_FAULT_13068, "Pause timeout while charging"}, // 充电桩充电中暂停超时( 27930中的暂停充电)
{E_FAULT_13069, "Charging controller communication timeout"}, // 充电控制器通讯超时
{E_FAULT_13070, "Card reader communication timeout"}, // 读卡器通讯超时
{E_FAULT_13071, "Meter communication timeout"}, // 电表通讯超时
{E_FAULT_13072, "Controller communication timeout in dual gun one vehicle mode"}, // 两枪同充一车模式下充电控制器间通信超时
{E_FAULT_13074, "Liquid cooling communication timeout"}, // 液冷通讯超时
// {E_FAULT_13073, "Abnormal power loss"}, // 异常掉电
// {E_FAULT_13074, "Reserved"}, // 预留
{E_FAULT_13075, "Power controller inter-communication timeout"}, // 功率控制器间通讯超时
// {E_FAULT_13076, "Power controller remote control telemetry timeout"}, // 功率控制器接收遥控、 遥信报文超时故障
// {E_FAULT_13077, "Power controller environment module communication timeout"}, // 功率控制器与环境信息采集模块通讯超时
// {E_FAULT_13078, "Vehicle identification frame receive timeout"}, // 车辆识别数据帧接收超时
// {E_FAULT_13079, "Charge start command response timeout"}, // 充电启动命令应答超时
// {E_FAULT_13080, "Wait charge start complete timeout"}, // 等待充电启动完成状态超时
// {E_FAULT_13081, "Charge stop command response timeout"}, // 充电停止命令应答超时
// {E_FAULT_13082, "Wait charge stop complete timeout"}, // 等待充电停止完成状态超时
// {E_FAULT_13083, "Charge start complete confirm timeout"}, // 充电启动完成状态确认超时
// {E_FAULT_13084, "Power regulation command response timeout"}, // 功率调节指令应答超时
// {E_FAULT_13085, "Charge stop complete confirm timeout"}, // 充电停止完成状态确认超时
// {E_FAULT_13086, "Controller communication abnormal in parallel charging"}, // 充电控制器间并枪时通信异常
// {E_FAULT_13087, "Power controller address conflict"}, // 功率控制器地址冲突
// {E_FAULT_13088, "Charging controller address conflict"}, // 充电控制器地址冲突
{E_FAULT_13089, "HMI communication abnormal"}, // 人机通信异常
// {E_FAULT_13090, "Device self-check timeout fault"}, // 设备自检超时故障
// {E_FAULT_13091, "Internal communication fault"}, // 内部通讯故障
// {E_FAULT_13092, "Parking lock fault"}, // 车位锁故障
// {E_FAULT_13093, "Parking lock battery exhausted"}, // 车位锁电池耗尽故障
// {E_FAULT_13094, "Parking lock down lock failure"}, // 车位锁落锁失败故障
// {E_FAULT_13095, "Terminate order number abnormal"}, // 终止订单号异常
{E_FAULT_13096, "DCU output box communication fault"}, // 开出盒通讯故障(DCU)
// {E_FAULT_13097, "Input box communication fault"}, // 开入盒通讯故障
// {E_FAULT_13098, "Insulation sampling box communication fault"}, // 绝缘采样盒通讯故障
{E_FAULT_13099, "AB board communication fault"}, // AB板通讯故障
// {E_FAULT_13100, "Pilot board communication fault"}, // 导引板通讯故障
// {E_FAULT_13101, "Lamp board communication warning"}, // 灯板通讯告警
// {E_FAULT_13102, "Unknown stop reason from charging controller"}, // 充电控制器未知停止原因
{E_FAULT_13103, "Aux power voltage switching circuit fault"}, // 辅助电源电压切换回路故障
{E_FAULT_13104, "Output current exceeds vehicle maximum"}, // 输出电流超过车辆最高允许电流
// {E_FAULT_13105, "System clock abnormal"}, // 系统时钟异常
// {E_FAULT_13106, "Billing model request timeout fault"}, // 计费模型请求超时故障
// {E_FAULT_13107, "Billing model invalid fault"}, // 计费模型不合法故障
// {E_FAULT_13108, "Time synchronization timeout fault"}, // 对时超时故障
// {E_FAULT_13109, "Invalid time synchronization fault"}, // 对时时间不合法故障
//直流充电电源异常代码
{E_FAULT_14000, "Switch module fault"}, // 开关模块故障
{E_FAULT_14001, "Switch module warning"}, // 开关模块告警
{E_FAULT_14002, "Switch module communication fault"}, // 开关模块通信故障
{E_FAULT_14003, "Switch module action fault"}, // 开关模块拒动/误动故障
{E_FAULT_14004, "Switch module sticking fault"}, // 开关模块粘连故障
// {E_FAULT_14005, "Reserved switch module action warning"}, // 预留(开关模块拒动/误动告警)
// {E_FAULT_14006, "Reserved switch module sticking warning"}, // 预留(开关模块粘连告警)
{E_FAULT_14007, "Charging module fault"}, // 充电模块故障
// {E_FAULT_14008, "Charging module overtemperature fault"}, // 充电模块过温故障
// {E_FAULT_14009, "Charging module overtemperature warning"}, // 充电模块过温告警
// {E_FAULT_14010, "Charging module output short-circuit fault"}, // 充电模块输出短路故障
// {E_FAULT_14011, "Charging module output overcurrent warning"}, // 充电模块输出过流告警
// {E_FAULT_14012, "Charging module output overvoltage warning"}, // 充电模块输出过压告警
// {E_FAULT_14013, "Charging module output undervoltage warning"}, // 充电模块输出欠压告警
// {E_FAULT_14014, "Charging module AC input warning"}, // 充电模块交流输入告警
// {E_FAULT_14015, "Charging module input overvoltage warning"}, // 充电模块输入过压告警
// {E_FAULT_14016, "Charging module input undervoltage warning"}, // 充电模块输入欠压告警
// {E_FAULT_14017, "Charging module input phase loss warning"}, // 充电模块输入缺相告警
// {E_FAULT_14018, "Charging module input unbalance warning"}, // 充电模块输入不平衡告警
{E_FAULT_14019, "Charging module communication fault"}, // 充电模块通信故障
{E_FAULT_14020, "Charging module start failure"}, // 充电模块启动失败
{E_FAULT_14021, "Charging module shutdown failure"}, // 充电模块关机失败
// {E_FAULT_14022, "Charging module fan fault"}, // 充电模块风扇故障
// {E_FAULT_14023, "Charging module discharge fault"}, // 充电模块泄放故障
// {E_FAULT_14024, "Charging module address abnormal"}, // 充电模块地址异常
// {E_FAULT_14025, "PFC circuit overtemperature fault"}, // PFC 电路过温故障
// {E_FAULT_14026, "Main transformer overtemperature fault"}, // 主变压器过温故障
// {E_FAULT_14027, "DC/DC circuit overtemperature fault"}, // DC/DC 电路过温故障
// {E_FAULT_14028, "Output isolation diode fault"}, // 输出隔离二极管故障
// {E_FAULT_14029, "Module start fault non-protection induced"}, // 模块启动故障(非保护动作造成的模块启动失败)
// {E_FAULT_14030, "PFC circuit general fault"}, // PFC 电路总故障
// {E_FAULT_14031, "PFC circuit overvoltage fault"}, // PFC 电路过压故障
// {E_FAULT_14032, "PFC circuit bias fault"}, // PFC 电路偏压故障
// {E_FAULT_14033, "DC/DC circuit general fault"}, // DC/DC 电路总故障
// {E_FAULT_14034, "High/low voltage switching circuit fault"}, // 高低压切换电路故障
// {E_FAULT_14035, "Output circuit unbalance fault"}, // 输出电路不平衡故障
// {E_FAULT_14036, "Charging module no-output warning"}, // 充电模块不输出告警
// {E_FAULT_14037, "Outside contactor voltage above charger max before start"}, // 启动充电前直流输出接触器外侧电压大于充电机最大输出电压
// {E_FAULT_14038, "Outside contactor voltage below charger min before start"}, // 启动充电前直流输出接触器外侧电压小于充电机最小输出电压
//直流充电车辆异常代码
{E_FAULT_15000, "BMS communication fault"}, // BMS 通讯故障
{E_FAULT_15001, "DC charging controller judges BMS fault"}, // 直流充电控制模块判断BMS故障
// {E_FAULT_15002, "BMS fault information reported"}, // BMS 发送故障信息
{E_FAULT_15003, "BCP charging parameter frame timeout"}, // BCP 充电参数配置报文超时
{E_FAULT_15004, "BRO ready frame timeout"}, // BRO 充电准备就绪报文超时
{E_FAULT_15005, "BCS battery status frame timeout"}, // BCS 电池充电状态报文超时
{E_FAULT_15006, "BCL battery demand frame timeout"}, // BCL 电池充电需求报文超时
{E_FAULT_15007, "BST stop charging frame timeout"}, // BST 中止充电报文超时
{E_FAULT_15008, "BSM battery status frame timeout"}, // BSM 动力蓄电池状态报文超时
{E_FAULT_15009, "BRO frame 0x00 receive timeout"}, // BRO 报文(0x00 接收超时
{E_FAULT_15010, "BRO frame 0xAA receive timeout"}, // BRO 报文(0xAA 接收超时
{E_FAULT_15011, "BRM vehicle identification frame timeout"}, // BRM 车辆辨识报文超时
// {E_FAULT_15012, "BSM single cell overvoltage"}, // BSM 报文中单体动力蓄电池电压过高
// {E_FAULT_15013, "BSM single cell undervoltage"}, // BSM 报文中单体动力蓄电池电压过低
// {E_FAULT_15014, "BSM SOC too high"}, // BSM 报文中 SOC 过高
// {E_FAULT_15015, "BSM SOC too low"}, // BSM 报文中 SOC 过低
// {E_FAULT_15016, "BSM charging overcurrent"}, // BSM 报文中充电过流
// {E_FAULT_15017, "BSM battery overtemperature"}, // BSM 报文中动力蓄电池温度过高
// {E_FAULT_15018, "BSM battery insulation abnormal"}, // BSM 报文中动力蓄电池绝缘状态异常
// {E_FAULT_15019, "BSM connector connection abnormal"}, // BSM 报文中连接器连接状态异
// {E_FAULT_15020, "BRO canceled after ready"}, // BRO 准备就绪后取消
// {E_FAULT_15021, "BST unknown stop fault"}, // BST 停止未知故障
// {E_FAULT_15022, "BST insulation fault"}, // BST 绝缘故障
// {E_FAULT_15023, "BST connector overtemperature"}, // BST 连接器过温
// {E_FAULT_15024, "BST component and output connector overtemperature"}, // BST 元件、 输出连接器过温
// {E_FAULT_15025, "BST connector fault"}, // BST 连接器故障
// {E_FAULT_15026, "BST battery pack over-temperature"}, // BST 电池组过温
// {E_FAULT_15027, "BST other fault"}, // BST 其他故障
// {E_FAULT_15028, "BST detection point 2 voltage detection fault"}, // BST 检测点 2 电压检测故障
// {E_FAULT_15029, "BST high-voltage relay fault"}, // BST 高压继电器故障
// {E_FAULT_15030, "BST overcurrent"}, // BST 电流过大
// {E_FAULT_15031, "BST voltage abnormal"}, // BST 电压异常
// {E_FAULT_15032, "BRM frame data item abnormal"}, // BRM 报文数据项异常
// {E_FAULT_15033, "BCP frame data item abnormal"}, // BCP 报文数据项异常
{E_FAULT_15034, "Outside contactor voltage exceeds 60V before insulation test"}, // 绝缘监测前直流输出接触器外侧电压越限(60V)
{E_FAULT_15035, "Outside contactor voltage differs from battery frame over +/-5%"}, // 启动充电前直流输出接触器外侧电压与通信报文电池电压相差>±5%
{E_FAULT_15036, "Battery max charge voltage below charger minimum output voltage"}, // 电池最高允许充电电压小于充电机最小输出电压
{E_FAULT_15037, "Output voltage exceeds vehicle max charge voltage"}, // 输出电压大于车辆最高允许充电电压
{E_FAULT_15038, "Demand current exceeds vehicle max charge current"}, // 需求电流超过车辆最高允许充电电流
{E_FAULT_15039, "Demand voltage exceeds vehicle max charge voltage"}, // 需求电压超过车辆最高允许充电电压
{E_FAULT_15040, "BCS max cell voltage exceeds BCP allowed max cell voltage"}, // BCS 中最高单体电池电压超过BCP 中最高允许单体电池电压
// {E_FAULT_15041, "BSM max battery temp exceeds BCP allowed max temp"}, // BSM 中最高动力蓄电池温度超过BCP 中单体动力蓄电池最高允许温度
{E_FAULT_15042, "SOC reached upper limit"}, // SOC 达到上限值
// {E_FAULT_15043, "BMS communication protocol version mismatch"}, // BMS 通信协议版本不匹配
{E_FAULT_15044, "Output current exceeds maximum allowed charging current"}, // 输出电流大于最高允许充电电流
{E_FAULT_15045, "Battery terminal voltage exceeds maximum allowed charge voltage"}, // 电池端电压大于电池最高允许充电电压
// {E_FAULT_15046, "SOC reaches 100 with continuous large current request optional"}, // SOC 达到 100 持续请求大电流(可选)
};
#endif
#if 1 //故障动作缓存管理
/**
* ************************************************************************
* @brief - 故障动作缓存初始化
*
*
* @author jiankalka
* @date 2025-12-18
* ************************************************************************
*/
void v_fault_cache_init(void)
{
memset(&s_fault_action_cache, 0, sizeof(FAULT_ACTION_CACHE_T));
s_fault_action_cache.front = 0;
s_fault_action_cache.rear = 0;
s_fault_action_cache.count = 0;
}
/**
* ************************************************************************
* @brief - 添加故障动作到缓存队列
*
* @param[in] f_site - 故障位置
* @param[in] type - 动作类型
* @param[in] e_info - 故障信息
* @param[in] action_type - 拔枪恢复使能
* @param[in] data1 - 测量值1
* @param[in] data2 - 测量值2
*
* @return U8_T - 1成功,0失败(缓存已满)
*
* @author jiankalka
* @date 2025-12-18
* ************************************************************************
*/
U8_T u8_fault_cache_add(E_FAULT_SITE f_site ,E_FAULT_TYPE type , E_FAULT_INFO e_info, U8_T action_type, S16_T data1 , S16_T data2)
{
if(s_fault_action_cache.count >= FAULT_ACTION_CACHE_SIZE)
{
return 0; //缓存已满
}
//添加到队列尾部
s_fault_action_cache.items[s_fault_action_cache.rear].f_site = f_site;
s_fault_action_cache.items[s_fault_action_cache.rear].type = type;
s_fault_action_cache.items[s_fault_action_cache.rear].e_info = e_info;
s_fault_action_cache.items[s_fault_action_cache.rear].action_type = action_type;
s_fault_action_cache.items[s_fault_action_cache.rear].data1 = data1;
s_fault_action_cache.items[s_fault_action_cache.rear].data2 = data2;
s_fault_action_cache.rear = (s_fault_action_cache.rear + 1) % FAULT_ACTION_CACHE_SIZE;
s_fault_action_cache.count++;
return 1;
}
/**
* ************************************************************************
* @brief - 从缓存队列获取一个故障动作
*
* @param[out] p_item - 故障动作项指针
*
* @return U8_T - 1成功,0失败(缓存为空)
*
* @author jiankalka
* @date 2025-12-18
* ************************************************************************
*/
static U8_T u8_fault_cache_get(FAULT_ACTION_CACHE_ITEM_T *p_item)
{
if(s_fault_action_cache.count == 0)
{
return 0; //缓存为空
}
if(p_item == NULL)
{
return 0;
}
//从队列头部获取
memcpy(p_item, &s_fault_action_cache.items[s_fault_action_cache.front], sizeof(FAULT_ACTION_CACHE_ITEM_T));
s_fault_action_cache.front = (s_fault_action_cache.front + 1) % FAULT_ACTION_CACHE_SIZE;
s_fault_action_cache.count--;
return 1;
}
/**
* ************************************************************************
* @brief - 处理缓存中的故障动作
*
*
* @author jiankalka
* @date 2025-12-18
* ************************************************************************
*/
void v_fault_cache_process(void)
{
FAULT_ACTION_CACHE_ITEM_T item;
U8_T processed_count = 0;
const U8_T MAX_PROCESS_PER_CYCLE = 5; //每个周期最多处理5个动作,避免占用太多时间
//每个周期处理最多MAX_PROCESS_PER_CYCLE个缓存动作
while(processed_count < MAX_PROCESS_PER_CYCLE && u8_fault_cache_get(&item))
{
//调用内部函数执行实际的故障动作
v_set_fault_data_internal(item.f_site, item.type, item.e_info,
item.action_type, item.data1, item.data2);
processed_count++;
}
//如果缓存仍然有未处理的动作,记录日志
if(s_fault_action_cache.count > 0)
{
// FAULT_LOG("Fault cache pending=%d\n", s_fault_action_cache.count);
}
}
#endif
#if 1 //对外函数接口
/**
* ************************************************************************
* @brief - 设置故障内容-故障动作记录(内部实现,不对外公开)
*
* @param[in] f_site - 故障位置 E_WHOLE_PILE/整桩 E_GUN/A枪 E_GUN_B/B枪
* @param[in] type - 动作类型 E_RES = 0/恢复 E_FAULT/故障 E_WARN/警告
* @param[in] e_info - 故障信息 详看枚举
* @param[in] action_type - 拔枪恢复使能
* @param[in] data1 - 测量值1 故障内容自定义
* @param[in] data2 - 测量值2 故障内容自定义
*
*
* @author jiankalka
* @date 2025-09-09
* ************************************************************************
*/
static void v_set_fault_data_internal(E_FAULT_SITE f_site ,E_FAULT_TYPE type , E_FAULT_INFO e_info, U8_T action_type, S16_T data1 , S16_T data2)
{
HIS_FAULT_DATA_T fault_data;
Comm_Time curTime;
U8_T i;
char mag[FAULT_GET_MAG_MAX_LEN]= {0};
char c_site_mag[NUM_30] = {0};
if(FAULT_TEST == 1)
return;
memset(&fault_data,0,sizeof(HIS_FAULT_DATA_T));
GetCurrentTime(&curTime);
memcpy(&fault_data.s_occur_time, &curTime, sizeof(Comm_Time)); //发生时间
fault_data.e_site = f_site;
fault_data.ActType = type;
fault_data.e_fault_info = e_info;
fault_data.s16_value1 = data1;
fault_data.s16_value2 = data2;
v_fault_get_site_mag(f_site,c_site_mag,NUM_30);
if(type == E_RES) //恢复
{
if(s_real_fault.u8_fault_cnt != 0) //实时故障记录不为0,找到对应的故障数据 清空
{
for(i=0;i<CURR_FAULT_MAX_CNT;i++)
{
if(s_real_fault.fault_data[i].e_mag == e_info && s_real_fault.fault_data[i].e_ingun == f_site)
{
// v_hisFault_save_record(&fault_data); //保存动作记录
s_real_fault.u8_fault_cnt -- ;
memset(&s_real_fault.fault_data[i],0,sizeof(Fault_data));
v_get_fault_info(e_info , mag ,FAULT_GET_MAG_MAX_LEN);
FAULT_LOG("Fault RES %s:%d %s\n",c_site_mag,e_info,mag);
break;
}
}
}
if(s_real_fault.u8_warn_cnt != 0) //实时告警记录不为0,找到对应的故障数据 清空
{
for(i=0;i<CURR_ALARM_MAX_CNT;i++)
{
if(s_real_fault.warn_data[i].e_mag == e_info && s_real_fault.warn_data[i].e_ingun == f_site)
{
// v_hisFault_save_record(&fault_data); //保存动作记录
s_real_fault.u8_warn_cnt -- ;
memset(&s_real_fault.warn_data[i],0,sizeof(Fault_data));
v_get_fault_info(e_info , mag ,FAULT_GET_MAG_MAX_LEN);
FAULT_LOG("Warn RES %s:%d %s\n",c_site_mag,e_info,mag);
break;
}
}
}
}
else if(type == E_FAULT) //故障
{
for(i=0;i<CURR_FAULT_MAX_CNT;i++)
{
if(s_real_fault.fault_data[i].e_mag == e_info && s_real_fault.fault_data[i].e_ingun == f_site)
{
return; //故障粗在 则退出
}
}
if(s_real_fault.u8_fault_cnt < CURR_FAULT_MAX_CNT)
{
for(i=0;i<CURR_FAULT_MAX_CNT;i++)
{
if(s_real_fault.fault_data[i].e_mag == E_FAULT_NULL)
{
// 故障动作持久化(默认 Flash;可按宏同时写 FATFS 缓存)
v_fault_persist_record(&fault_data);
s_real_fault.u8_fault_cnt ++ ;
s_real_fault.fault_data[i].e_mag = e_info;
s_real_fault.fault_data[i].e_ingun = f_site;
s_real_fault.fault_data[i].u8_type = action_type;
memcpy(&s_real_fault.fault_data[i].time , &curTime , sizeof(Comm_Time));
v_get_fault_info(e_info , mag ,FAULT_GET_MAG_MAX_LEN);
FAULT_LOG("Fault SET %s:%d %s\n",c_site_mag,e_info,mag);
break;
}
}
}
}
else if(type == E_WARN) //告警
{
for(i=0;i<CURR_ALARM_MAX_CNT;i++)
{
if(s_real_fault.warn_data[i].e_mag == e_info && s_real_fault.warn_data[i].e_ingun == f_site)
{
return; //故障粗在 则退出
}
}
if(s_real_fault.u8_warn_cnt < CURR_ALARM_MAX_CNT)
{
for(i=0;i<CURR_ALARM_MAX_CNT;i++)
{
if(s_real_fault.warn_data[i].e_mag == E_FAULT_NULL)
{
// 告警动作持久化(默认 Flash;可按宏同时写 FATFS 缓存)
v_fault_persist_record(&fault_data);
s_real_fault.u8_warn_cnt ++ ;
s_real_fault.warn_data[i].e_mag = e_info;
s_real_fault.warn_data[i].e_ingun = f_site;
s_real_fault.warn_data[i].u8_type = action_type;
memcpy(&s_real_fault.warn_data[i].time ,&curTime, sizeof(Comm_Time)); //发生时间
v_get_fault_info(e_info , mag ,FAULT_GET_MAG_MAX_LEN);
FAULT_LOG("Warn SET %s:%d %s\n",c_site_mag,e_info,mag);
break;
}
}
}
}
}
/**
* ************************************************************************
* @brief - 设置故障内容-故障动作记录(对外接口,将动作缓存)
*
* @param[in] f_site - 故障位置 E_WHOLE_PILE/整桩 E_GUN/A枪 E_GUN_B/B枪
* @param[in] type - 动作类型 E_RES = 0/恢复 E_FAULT/故障 E_WARN/警告
* @param[in] e_info - 故障信息 详看枚举
* @param[in] action_type - 拔枪恢复使能
* @param[in] data1 - 测量值1 故障内容自定义
* @param[in] data2 - 测量值2 故障内容自定义
*
*
* @author jiankalka
* @date 2025-09-09
* ************************************************************************
*/
void v_set_fault_data(E_FAULT_SITE f_site ,E_FAULT_TYPE type , E_FAULT_INFO e_info, U8_T action_type, S16_T data1 , S16_T data2)
{
// 将故障动作添加到缓存队列
if(u8_fault_cache_add(f_site, type, e_info, action_type, data1, data2) == 0)
{
// FAULT_LOG("Fault cache add fail: %d %d %d\n", f_site, type, e_info);
}
}
/**
* ************************************************************************
* @brief - 获取故障告警数据的 中文解析数据
*
* @param[in] e_info - 故障告警数据
* @param[in] mag - 对应中文说明缓存数组
* @param[in] u16_len - 缓存数组长度
*
*
* @author jiankalka
* @date 2025-09-09
* ************************************************************************
*/
void v_get_fault_info(E_FAULT_INFO e_info , char *mag ,U16_T u16_len)
{
U16_T i;
U16_T info_size;
if ((mag == NULL) || (u16_len == 0u)) {
return;
}
info_size = (U16_T)(sizeof(fault_info) / sizeof(fault_info[0]));
memset(mag, 0, u16_len);
for (i = 0u; i < info_size; i++) {
if (e_info == fault_info[i].e_mag) {
strncpy(mag, fault_info[i].info, u16_len - 1u);
mag[u16_len - 1u] = '\0';
return;
}
}
(void)snprintf(mag, u16_len, "Unknown fault: %u", (unsigned int)e_info);
}
/**
* ************************************************************************
* @brief - 对外获取故障告警数量
*
* @param[in] u8_seat - 故障位置 0整桩,不包含A、B枪故障 1A枪 2B枪
* @param[in] flag - 故障类型 0故障数量 1告警数量
*
* @return U8_T - 故障、告警数量值返回
*
* @author jiankalka
* @date 2025-09-09
*
* ************************************************************************
*/
U8_T u8_get_fault_sum(U8_T u8_seat, U8_T u8_flag)
{
U8_T i,u8_ret = 0;
if(u8_seat >= 1 && u8_seat <= GUN_MAX_CNT) //1-N 是枪的范围
{
if(u8_flag == 0 && s_real_fault.u8_fault_cnt != 0)
{
for(i=0;i<CURR_FAULT_MAX_CNT;i++)
{
if(s_real_fault.fault_data[i].e_mag != 0 &&
s_real_fault.fault_data[i].e_ingun == E_GUN+u8_seat-1)
{
u8_ret++;
}
}
}
if(u8_flag == 1 && s_real_fault.u8_warn_cnt != 0)
{
for(i=0;i<CURR_ALARM_MAX_CNT;i++)
{
if(s_real_fault.warn_data[i].e_mag != 0 &&
s_real_fault.warn_data[i].e_ingun == E_GUN+u8_seat-1)
{
u8_ret++;
}
}
}
}
else //整桩故障、告警数量
{
if(u8_flag == 0 && s_real_fault.u8_fault_cnt != 0)
{
for(i=0;i<CURR_FAULT_MAX_CNT;i++)
{
if(s_real_fault.fault_data[i].e_mag != 0 &&
(s_real_fault.fault_data[i].e_ingun == E_WHOLE_PILE || //整桩
s_real_fault.fault_data[i].e_ingun == E_WHOLE_HOST)) //主机故障
//s_real_fault.fault_data[i].e_ingun >= E_CHAR_MDU)) //模块或开关故障 此处先不加了 模块开关故障 可能可以充电
{
u8_ret++;
}
}
}
if(u8_flag == 1 && s_real_fault.u8_warn_cnt != 0)
{
for(i=0;i<CURR_ALARM_MAX_CNT;i++)
{
if(s_real_fault.warn_data[i].e_mag != 0 &&
(s_real_fault.warn_data[i].e_ingun == E_WHOLE_PILE ||
s_real_fault.warn_data[i].e_ingun == E_WHOLE_HOST ))
//s_real_fault.warn_data[i].e_ingun >= E_CHAR_MDU))
{
u8_ret++;
}
}
}
}
return u8_ret;
}
/**
* ************************************************************************
* @brief - 对外接口 获取故障告警数据
*
* @param[in] rl_data - 故障告警获取结构体指针
*
*
* @author jiankalka
* @date 2025-09-09
* ************************************************************************
*/
void v_get_fault_data(REAL_FAULT_DATA_T *rl_data)
{
if(rl_data == NULL)
return;
memset(rl_data,0,sizeof(REAL_FAULT_DATA_T));
memcpy(rl_data,&s_real_fault,sizeof(REAL_FAULT_DATA_T));
}
/**
* ************************************************************************
* @brief - 获取 故障是否存在在列表中
*
* @param[in] e_info - 告警数据
* @param[in] f_site - 故障位置
*
* @return U8_T - 0 未存在 1存在为故障 2存在为告警
*
* @author jiankalka
* @date 2025-09-09
* ************************************************************************
*/
U8_T u8_cheak_fault_flag(E_FAULT_INFO e_info , E_FAULT_SITE f_site)
{
U8_T i,ret = 0;
if(s_real_fault.u8_fault_cnt != 0)
{
for(i=0;i<CURR_FAULT_MAX_CNT;i++)
{
if(s_real_fault.fault_data[i].e_mag == e_info && s_real_fault.fault_data[i].e_ingun == f_site)
{
ret = 1;
break;
}
}
}
if(s_real_fault.u8_warn_cnt != 0)
{
for(i=0;i<CURR_ALARM_MAX_CNT;i++)
{
if(s_real_fault.warn_data[i].e_mag == e_info && s_real_fault.warn_data[i].e_ingun == f_site)
{
ret = 2;
break;
}
}
}
return ret;
}
#endif
#if 1 //内部数据获取
/**
* ************************************************************************
* @brief - 故障检测任务 获取外部数据
*
* @param[in] u8_gunNo - 枪号 0-N 部分数据无意义
* @param[in] e_dataType - 数据类型 详看枚举
* @param[in] u16_dataPara - 数据参数 部分数据无意义
*
* @return U16_T - 返回值
*
* @author jiankalka
* @date 2025-09-09
* ************************************************************************
*/
U16_T u16_fault_get_sys_data(U8_T u8_gunNo,E_FAULT_GET_DATA_TYPE e_dataType,U16_T u16_dataPara)
{
U16_T u16_ret = 0;
switch (e_dataType)
{
case E_FAULT_GET_DATA_EMERGENCY : //急停
{
u16_ret = u8_get_sys_yx_data(YX_PILE_EMERGENCY);
break;
}
case E_FAULT_GET_DATA_DOOR: //门禁
{
u16_ret = u8_get_sys_yx_data(YX_PILE_DOOR);
break;
}
case E_FAULT_GET_DATA_WARTER: //水浸
{
u16_ret = u8_get_sys_yx_data(YX_PILE_WARTER);
break;
}
case E_FAULT_GET_DATA_SPD: //防雷状态
{
u16_ret = u8_get_sys_yx_data(YX_PILE_SPD);
break;
}
case E_FAULT_GET_DATA_SMOKE: //烟感
{
u16_ret = u8_get_sys_yx_data(YX_PILE_SMOKE);
break;
}
case E_FAULT_GET_DATA_GUN_DC_FUSE: //直流熔断器状态
{
u16_ret = u8_get_gun_yx_data(YX_GUN_DC_FUSE,u8_gunNo );
break;
}
case E_FAULT_GET_DATA_GUN_TEMP_THRESHOLD: //枪温阈值
{
u16_ret = g_t_share_data.t_sys_fix_cfg.u8_threshold_gunTemp*10;
break;
}
case E_FAULT_GET_DATA_GUN_TEMP: //枪温 精度 0.1度
{
if(u16_dataPara == 0) //正极枪温
u16_ret = (U16_T)(f32_get_gun_yc_data(ADC_GUN_TEMP_PLUS,u8_gunNo)*10);
else //负极枪温
u16_ret = (U16_T)(f32_get_gun_yc_data(ADC_GUN_TEMP_MINUS,u8_gunNo)*10);
break;
}
case E_FAULT_GET_DATA_GUN_CNT: //枪数量
{
u16_ret = g_t_share_data.t_sys_fix_cfg.u8_gunCnt;
break;
}
case E_FAULT_GET_DATA_DOOR_EN: //门禁使能
{
u16_ret = g_t_share_data.t_sys_fix_cfg.u_enable.bit_enable.bit_doorEnable;
break;
}
case E_FAULT_GET_DATA_AC_CONTACT_EN: //交流接触器使能
{
u16_ret = g_t_share_data.t_sys_fix_cfg.u_enable.bit_enable.bit_AcContactEna;
break;
}
case E_FAULT_GET_DATA_GUN_LINK: //枪连接标志 0未连接 1已连接
{
u16_ret = u8_get_gun_yx_data(YX_GUN_LINK,u8_gunNo);
break;
}
case E_FAULT_GET_DATA_GUN_CHAR_FLAG: //充电标志 0未充电 1充电中
{
E_FLOW_REAL_STATE flow_state = (E_FLOW_REAL_STATE)u16_flow_put_data(u8_gunNo , E_FLOW_PUT_DATA_GUN_REAL_STATE,0); //0空闲 1充电启动 2绝缘启动 3绝缘计算完成 4绝缘检测模块停止 5开始预充 6预充完成 7充电中 8BMS通讯超时 9充电停止 10充电停止完成
if(flow_state == E_FLOW_REAL_CHARGEING) //充电中
{
u16_ret = 1 ;
}
else
{
u16_ret = 0 ;
}
break;
}
case E_FAULT_GET_DATA_AC_KM: //交流输入接触器反馈
{
u16_ret = u8_get_sys_yx_data(YX_PILE_KM);
break;
}
case E_FAULT_GET_DATA_BUS_KM: //母联直流接触器反馈
{
u16_ret = u8_get_sys_yx_data(YX_PILE_BUS_KM);
break;
}
case E_FAULT_GET_DATA_BUS_KM_EN: //母联继电器使能
{
u16_ret = g_t_share_data.t_sys_fix_cfg.u_enable.bit_enable.bit_dcBusEn;
break;
}
case E_FAULT_GET_DATA_FLOW_STATE: //本枪流程状态(供故障检测,不对外混用 flow 枚举头时可只读数值)
{
if (u8_gunNo < GUN_MAX_CNT)
u16_ret = u16_flow_get_sys_data(u8_gunNo, E_FLOW_GET_DATA_FLOW_STATE, 0);
break;
}
case E_FAULT_GET_DATA_CHAR_TIME: //本枪充电持续时间 秒
{
if (u8_gunNo < GUN_MAX_CNT)
u16_ret = u16_flow_get_sys_data(u8_gunNo, E_FLOW_GET_DATA_CHAR_TIME, 0);
break;
}
case E_FAULT_GET_DATA_GUN_DC_KM_POS: //正母线直流输出接触器状态
{
if (u8_gunNo < GUN_MAX_CNT)
u16_ret = u16_flow_get_sys_data(u8_gunNo, E_FLOW_GET_DATA_KM_POS, 0);
break;
}
case E_FAULT_GET_DATA_GUN_DC_KM_NEG: //负母线直流输出接触器状态
{
if (u8_gunNo < GUN_MAX_CNT)
u16_ret = u16_flow_get_sys_data(u8_gunNo, E_FLOW_GET_DATA_KM_NEG, 0);
break;
}
default:
break;
}
return u16_ret;
}
void v_fault_get_site_mag(E_FAULT_SITE e_site , char *mag , U8_T u8_len)
{
memset(mag , 0 ,u8_len);
if(e_site == E_WHOLE_PILE)
snprintf(mag ,u8_len, "Pile-Terminal");
else if(e_site == E_WHOLE_HOST)
snprintf(mag ,u8_len, "Pile-Host");
else if(e_site < E_CHAR_MDU)
snprintf(mag ,u8_len, "[%d] Gun",e_site-E_GUN);
else if(e_site < E_SWH_MDU)
snprintf(mag ,u8_len, "[%d] Module",e_site-E_CHAR_MDU);
else if(e_site < E_OTHER)
snprintf(mag ,u8_len, "[%d] Switch",e_site-E_SWH_MDU);
else
snprintf(mag ,u8_len, "[%d] Other",e_site-E_OTHER);
}
#endif
#if(MY_SHELL_EN) //Shell 使能
//shell 注册命令
void v_fault_data_show()
{
char buffer[64] = {0};
char c_site_mag[NUM_30] = {0};
U8_T i,mag[FAULT_GET_MAG_MAX_LEN]={0};
E_FAULT_INFO e_info;
E_FAULT_SITE e_site;
sprintf( &buffer[0], "故障数量= %u ,告警数量= %u\r\n",
s_real_fault.u8_fault_cnt,s_real_fault.u8_warn_cnt);
shell_send_String(buffer);
for(i=0;i<CURR_FAULT_MAX_CNT;i++)
{
if(s_real_fault.fault_data[i].e_mag != 0)
{
e_info = s_real_fault.fault_data[i].e_mag;
e_site = s_real_fault.fault_data[i].e_ingun;
v_fault_get_site_mag(e_site,c_site_mag,NUM_30);
v_get_fault_info(e_info , (char*)mag,FAULT_GET_MAG_MAX_LEN);
memset(buffer , 0,64);
sprintf( &buffer[0], "%s故障 %d %s \r\n",c_site_mag,e_info,mag);
shell_send_String(buffer);
}
}
for(i=0;i<CURR_ALARM_MAX_CNT;i++)
{
if(s_real_fault.warn_data[i].e_mag != 0)
{
e_info = s_real_fault.warn_data[i].e_mag;
e_site = s_real_fault.warn_data[i].e_ingun;
v_fault_get_site_mag(e_site,c_site_mag,NUM_30);
v_get_fault_info(e_info , (char*)mag,FAULT_GET_MAG_MAX_LEN);
memset(buffer , 0,64);
sprintf( &buffer[0], "%s告警 %d %s \r\n",c_site_mag,e_info,mag);
shell_send_String(buffer);
}
}
}
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC), fault_data, v_fault_data_show,myshlle-- fault data info);
#endif
+372
View File
@@ -0,0 +1,372 @@
#ifndef FAULT_INTERFACE_H
#define FAULT_INTERFACE_H
#ifdef __cplusplus /*C++编译环境下兼容C语言*/
extern "C" {
#endif
/*------ Exported includes(头文件) ----------------------*/
#include "main.h"
#include "publicdata/publicdata.h"
/*------ Exported macro(宏定义) -------------------------*/
#define FAULT_ACTION_CACHE_SIZE 16 //故障动作缓存大小
/*------ Exported struct(结构体定义) --------------------*/
typedef enum
{
E_FAULT_NULL = 0,
//常规停止代码
E_NORMAL_1000 = 1000, //1 1000 充满停止
E_NORMAL_1001, //1 1001 本地停止充电
E_NORMAL_1002, //1 1002 后台停止充电
E_NORMAL_1003, //1 1003 达到设置充电时长停止
E_NORMAL_1004, //1 1004 达到设置充电电量停止
E_NORMAL_1005, //1 1005 达到设置充电金额停止
E_NORMAL_1006, //1 1006 达到离线停机条件
E_NORMAL_1007, //1 1007 达到SOC终止条件停止
E_NORMAL_1008, //1008 用户拔枪停止
E_NORMAL_1009, //1 1009 APP停止充电
E_NORMAL_1010, //1010 车端S2主动断开
E_NORMAL_1011, //1 1011 BMS停止充电
E_NORMAL_1012, //1 1012 账户余额不足
E_NORMAL_1013, //1 1013 预付金额不足
E_NORMAL_1014, //1014 车辆S2闭合超时
E_NORMAL_1015, //1015 充电中车辆S2断开超时
E_NORMAL_1016, //1016 达到涓流充电停机条件
//直流充电设备异常代码
E_FAULT_13000 = 13000, //1 13000 交流输入断路器故障
E_FAULT_13001, //1 13001 避雷器故障
E_FAULT_13002, //1 13002 交流输入接触器粘连故障
E_FAULT_13003, //1 13003 交流输入接触器拒动/误动故障
E_FAULT_13004, //1 13004 直流输出接触器粘连故障
E_FAULT_13005, //1 13005 直流输出接触器拒动/误动故障
E_FAULT_13006, //1 13006 直流输出熔断器故障
E_FAULT_13007, //1 13007 辅助电源故障
E_FAULT_13008, //13008 泄放继电器拒动/误动故障
E_FAULT_13009, //13009 泄放继电器粘连
E_FAULT_13010, //1 13010 充电枪电子锁上锁故障
E_FAULT_13011, //1 13011 充电枪电子锁解锁故障
E_FAULT_13012, //13012 PE 断线故障
E_FAULT_13013, //1 13013 充电接口过温故障
E_FAULT_13014, //1 13014 充电接口过温告警
E_FAULT_13015, //1 13015 控制导引电压异常
E_FAULT_13016, //1 13016 充电中车辆控制导引故障
E_FAULT_13017, //1 13017 急停按钮动作故障
E_FAULT_13018, //1 13018 充电桩门禁故障
E_FAULT_13019, //1 13019 充电机柜门禁故障
E_FAULT_13020, //13020 功率控制模块故障
E_FAULT_13021, //13021 功率控制模块告警
E_FAULT_13022, //1 13022 功率控制模块通信故障
E_FAULT_13023, //13023 桥接接触器拒动/误动故障
E_FAULT_13024, //13024 桥接接触器粘连故障
E_FAULT_13025, //13025 ESAM 故障
E_FAULT_13026, //13026 预留( 充电机柜加热部件故障)
E_FAULT_13027, //13027 充电桩过温故障( 可选)
E_FAULT_13028, //13028 充电桩过温告警( 可选)
E_FAULT_13029, //13029 充电机柜过温告警
E_FAULT_13030, //1 13030 充电机柜过温故障
E_FAULT_13031, //1 13031 预留( 散热系统故障)
E_FAULT_13032, //1 13032 烟感报警
E_FAULT_13033, //1 13033 充电桩水浸故障
E_FAULT_13034, //1 13034 充电机柜水浸故障
E_FAULT_13035, //13035 充电机环境湿度告警
E_FAULT_13036, //13036 数据合法性校验失败(“ 充电启动帧” 中“ 负荷控制开关” 等数据项合法性校验失败)
E_FAULT_13037, //13037 充电控制器“ 版本校验” 未完成
E_FAULT_13038, //13038 充电控制器“ 下发充电参数” 未完成
E_FAULT_13039, //1 13039 充电桩暂停服务, 拒绝启动
E_FAULT_13040, //1 13040 充电桩处于“工作” 状态, 拒绝启动
E_FAULT_13041, //1 13041 充电桩与车辆处于未连接状态,拒绝启动
E_FAULT_13042, //1 13042 绝缘监测故障
E_FAULT_13043, //1 13043 绝缘监测告警
E_FAULT_13044, //13044 充电桩执行功率分配策略失败故障( TBD)
E_FAULT_13045, //13045 预留( 输入电压过压故障) 改主机液冷故障
E_FAULT_13046, //13046 预留( 输入电压欠压故障) 改为主机柜急停
E_FAULT_13047, //1 13047 泄放回路故障
E_FAULT_13048, //1 13048 直流输出电压过压故障
E_FAULT_13049, //1 13049 直流输出电流过流故障
E_FAULT_13050, //1 13050 直流输出电压欠压故障
E_FAULT_13051, //13051 无空闲模块可用( 限智能分配功率) ( TBD)
E_FAULT_13052, //13052 电池反接故障( TBD)
E_FAULT_13053, //1 13053 预充阶段调压失败
E_FAULT_13054, //1 13054 输出电流大于车辆需求电流
E_FAULT_13055, //1 13055 充电过程中功率控制器为非工作状态
E_FAULT_13056, //1 13056 电能计量异常
E_FAULT_13057, //1 13057 车辆鉴权码不一致
E_FAULT_13058, //13058 未上送交易记录已满
E_FAULT_13059, //13059 交易记录存储失败
E_FAULT_13060, //13060 CAN 通讯版本校验异常
E_FAULT_13061, //13061 进程运行异常
E_FAULT_13062, //13062 程序文件校验失败
E_FAULT_13063, //13063 程序文件损坏
E_FAULT_13064, //1 13064 非法 VIN
E_FAULT_13065, //13065 非即插即充设备
E_FAULT_13066, //13066 充电桩处于“暂停” 状态( 27930中的暂停状态)
E_FAULT_13067, //1 13067 即插即充鉴权失败
E_FAULT_13068, //1 13068 充电桩充电中暂停超时( 27930中的暂停充电)
E_FAULT_13069, //13069 充电控制器通讯超时
E_FAULT_13070, //13070 读卡器通讯超时
E_FAULT_13071, //1 13071 电表通讯超时
E_FAULT_13072, //13072 两枪同充一车模式下充电控制器间通信超时
E_FAULT_13073, //1 13073 异常掉电
E_FAULT_13074, //1 13074 预留 液冷通讯超时
E_FAULT_13075, //13075 功率控制器间通讯超时( 功率并
E_FAULT_13076, //13076 功率控制器接收遥控、 遥信报文超时故障
E_FAULT_13077, //1 13077 功率控制器与环境信息采集模块通讯超时
E_FAULT_13078, //1 13078 车辆识别数据帧接收超时
E_FAULT_13079, //13079 充电启动命令应答超时
E_FAULT_13080, //13080 等待充电启动完成状态超时
E_FAULT_13081, //13081 充电停止命令应答超时
E_FAULT_13082, //13082 等待充电停止完成状态超时
E_FAULT_13083, //13083 充电启动完成状态确认超时
E_FAULT_13084, //13084 功率调节指令应答超时
E_FAULT_13085, //13085 充电停止完成状态确认超时
E_FAULT_13086, //13086 充电控制器间并枪时通信异常(充电控制器与充电控制器通讯超时)
E_FAULT_13087, //13087 功率控制器地址冲突(并柜时)
E_FAULT_13088, //13088 充电控制器地址冲突
E_FAULT_13089, //13089 人机通信异常
E_FAULT_13090, //1 13090 设备自检超时故障
E_FAULT_13091, //13091 内部通讯故障
E_FAULT_13092, //13092 车位锁故障
E_FAULT_13093, //13093 车位锁电池耗尽故障
E_FAULT_13094, //13094 车位锁落锁失败故障
E_FAULT_13095, //13095 终止订单号异常
E_FAULT_13096, //13096 开出盒通讯故障
E_FAULT_13097, //13097 开入盒通讯故障
E_FAULT_13098, //13098 绝缘采样盒通讯故障
E_FAULT_13099, //1 13099 直流采样盒通讯故障(AB板通讯故障)
E_FAULT_13100, //13100 导引板通讯故障
E_FAULT_13101, //13101 灯板通讯告警 //改为主机液冷通信超时
E_FAULT_13102, //13102 充电控制器未知停止原因
E_FAULT_13103, //13103 辅助电源电压切换回路故障
E_FAULT_13104, //1 13104 输出电流超过车辆最高允许电流
E_FAULT_13105, //13105 系统时钟异常
E_FAULT_13106, //13106 计费模型请求超时故障
E_FAULT_13107, //13107 计费模型不合法故障
E_FAULT_13108, //13108 对时超时故障
E_FAULT_13109, //13109 对时时间不合法故障
//直流充电电源异常代码
E_FAULT_14000 = 14000, //14000 开关模块故障
E_FAULT_14001, //1 14001 开关模块告警
E_FAULT_14002, //1 14002 开关模块通信故障
E_FAULT_14003, //14003 开关模块拒动/误动故障
E_FAULT_14004, //14004 开关模块粘连故障
E_FAULT_14005, //14005 预留(开关模块拒动/误动告警)
E_FAULT_14006, //14006 预留(开关模块粘连告警)
E_FAULT_14007, //1 14007 充电模块故障
E_FAULT_14008, //14008 充电模块过温故障
E_FAULT_14009, //1 14009 充电模块过温告警
E_FAULT_14010, //1 14010 充电模块输出短路故障
E_FAULT_14011, //1 14011 充电模块输出过流告警
E_FAULT_14012, //1 14012 充电模块输出过压告警
E_FAULT_14013, //1 14013 充电模块输出欠压告警
E_FAULT_14014, //1 14014 充电模块交流输入告警
E_FAULT_14015, //1 14015 充电模块输入过压告警
E_FAULT_14016, //1 14016 充电模块输入欠压告警
E_FAULT_14017, //1 14017 充电模块输入缺相告警
E_FAULT_14018, //14018 充电模块输入不平衡告警
E_FAULT_14019, //1 14019 充电模块通信故障
E_FAULT_14020, //1 14020 充电模块启动失败
E_FAULT_14021, //1 14021 充电模块关机失败
E_FAULT_14022, //1 14022 充电模块风扇故障
E_FAULT_14023, //1 14023 充电模块泄放故障
E_FAULT_14024, //14024 充电模块地址异常
E_FAULT_14025, //14025 PFC 电路过温故障
E_FAULT_14026, //14026 主变压器过温故障
E_FAULT_14027, //14027 DC/DC 电路过温故障
E_FAULT_14028, //14028 输出隔离二极管故障
E_FAULT_14029, //14029 模块启动故障(非保护动作造成的模块启动失败)
E_FAULT_14030, //14030 PFC 电路总故障
E_FAULT_14031, //14031 PFC 电路过压故障
E_FAULT_14032, //14032 PFC 电路偏压故障
E_FAULT_14033, //14033 DC/DC 电路总故障
E_FAULT_14034, //14034 高低压切换电路故障
E_FAULT_14035, //14035 输出电路不平衡故障
E_FAULT_14036, //1 14036 充电模块不输出告警
E_FAULT_14037, //1 14037 启动充电前直流输出接触器外侧电压大于充电机最大输出电压
E_FAULT_14038, //1 14038 启动充电前直流输出接触器外侧电压小于充电机最小输出电压
//直流充电车辆异常代码
E_FAULT_15000 = 15000, //1 15000 BMS 通讯故障
E_FAULT_15001, //1 15001 直流充电控制模块判断BMS故障
E_FAULT_15002, //1 15002 BMS 发送故障信息
E_FAULT_15003, //1 15003 BCP 充电参数配置报文超时
E_FAULT_15004, //1 15004 BRO 充电准备就绪报文超时
E_FAULT_15005, //1 15005 BCS 电池充电状态报文超时
E_FAULT_15006, //1 15006 BCL 电池充电需求报文超时
E_FAULT_15007, //1 15007 BST 中止充电报文超时
E_FAULT_15008, //1 15008 BSM 动力蓄电池状态报文超时
E_FAULT_15009, //1 15009 BRO 报文(0x00 接收超时
E_FAULT_15010, //1 15010 BRO 报文(0xAA 接收超时
E_FAULT_15011, //1 15011 BRM 车辆辨识报文超时
E_FAULT_15012, //1 15012 BSM 报文中单体动力蓄电池电压过高
E_FAULT_15013, //1 15013 BSM 报文中单体动力蓄电池电压过低
E_FAULT_15014, //1 15014 BSM 报文中 SOC 过高
E_FAULT_15015, //1 15015 BSM 报文中 SOC 过低
E_FAULT_15016, //1 15016 BSM 报文中充电过流
E_FAULT_15017, //1 15017 BSM 报文中动力蓄电池温度过高
E_FAULT_15018, //1 15018 BSM 报文中动力蓄电池绝缘状态异常
E_FAULT_15019, //1 15019 BSM 报文中连接器连接状态异
E_FAULT_15020, //1 15020 BRO 准备就绪后取消
E_FAULT_15021, //1 15021 BST 停止未知故障
E_FAULT_15022, //1 15022 BST 绝缘故障
E_FAULT_15023, //1 15023 BST 连接器过温
E_FAULT_15024, //1 15024 BST 元件、 输出连接器过温
E_FAULT_15025, //1 15025 BST 连接器故障
E_FAULT_15026, //1 15026 BST 电池组过温
E_FAULT_15027, //1 15027 BST 其他故障
E_FAULT_15028, //1 15028 BST 检测点 2 电压检测故障
E_FAULT_15029, //1 15029 BST 高压继电器故障
E_FAULT_15030, //1 15030 BST 电流过大
E_FAULT_15031, //1 15031 BST 电压异常
E_FAULT_15032, //1 15032 BRM 报文数据项异常(报文数据长度错误, BMS 通信协议版本号错误, 其他数据错误)
E_FAULT_15033, //1 15033 BCP 报文数据项异常(报文数据长度错误, 电池当前电压越限,其他数据项错误)
E_FAULT_15034, //1 15034 绝缘监测前直流输出接触器外侧电压越限(60V)
E_FAULT_15035, //1 15035 启动充电前直流输出接触器外侧电压与通信报文电池电压相差>±5%
E_FAULT_15036, //1 15036 电池最高允许充电电压小于充电机最小输出电压
E_FAULT_15037, //1 15037 输出电压大于车辆最高允许充电电压
E_FAULT_15038, //1 15038 需求电流超过车辆最高允许充电电流
E_FAULT_15039, //1 15039 需求电压超过车辆最高允许充电电压
E_FAULT_15040, //1 15040 BCS 中最高单体电池电压超过BCP 中最高允许单体电池电压
E_FAULT_15041, //1 15041 BSM 中最高动力蓄电池温度超过BCP 中单体动力蓄电池最高允许温度
E_FAULT_15042, //1 15042 SOC 达到上限值
E_FAULT_15043, //1 15043 BMS 通信协议版本不匹配
E_FAULT_15044, //1 15044 输出电流大于最高允许充电电流
E_FAULT_15045, //1 15045 电池端电压大于电池最高允许充电电压
E_FAULT_15046, //1 15046 SOC 达到 100 持续请求大电流(可选)
E_FAULT_16000 = 16000, //1 16000 液冷高压力故障
E_FAULT_16001, //1 16001 液冷低压力故障
E_FAULT_16002, //1 16002 液冷低液位故障
E_FAULT_16003, //1 16003 液冷循环泵过流故障
E_FAULT_16004, //1 16004 循环泵欠压报警
E_FAULT_16005, //1 16005 循环泵过压报警
E_FAULT_16006, //1 16006 循环泵过温报警
E_FAULT_16007, //1 16007 循环泵堵转报警
E_FAULT_16008, //1 16008 循环泵通信故障报警
E_FAULT_16009, //1 16009 低流量报警报警
E_FAULT_16010, //1 16010 高流量报警报警
E_FAULT_16011, //1 16011 风机过流报警
//主机故障
E_FAULT_17000 = 17000, //主机急停故障
E_FAULT_17001, //主机门禁
E_FAULT_17002, //主机水浸
E_FAULT_17003, //主机防雷
E_FAULT_17004, //主机烟感
E_FAULT_17005, //主机充电枪通信超时
E_FAULT_17006, //主机风扇调速通信超时
E_FAULT_17007, //主机计量计费 电表跳变故障
E_FAULT_17008, //主机计量计费 长时间未更新故障
E_FAULT_17009, //主机计量计费 费率异常故障
E_FAULT_17010, //主机
E_FAULT_17999, //主机故障范围
}E_FAULT_INFO;
//故障位置
typedef enum
{
E_WHOLE_PILE = 0, //整桩-终端
E_WHOLE_HOST = 500, //整桩-主机-功率分配
E_GUN = 1000, //枪地址
E_CHAR_MDU = 2000, //充电模块地址
E_SWH_MDU = 3000, //开关模块地址
E_OTHER = 4000, //其他位置
}E_FAULT_SITE;
//故障类型
typedef enum
{
E_RES = 0, //恢复
E_FAULT, //故障
E_WARN, //警告
}E_FAULT_TYPE;
typedef struct
{
U8_T u8_type; //拔枪恢复使能 0拔枪不恢复 1拔枪恢复
E_FAULT_SITE e_ingun; //归属枪号 0无 1一枪 2二枪
E_FAULT_INFO e_mag; //当前故障结构体数组
Comm_Time time; //动作时间
}Fault_data;
//实时故障告警数据
typedef struct
{
U8_T u8_fault_cnt; //故障数量
U8_T u8_warn_cnt; //告警数量
Fault_data fault_data[CURR_FAULT_MAX_CNT];
Fault_data warn_data[CURR_ALARM_MAX_CNT];
}REAL_FAULT_DATA_T;
typedef enum
{
E_FAULT_GET_DATA_EMERGENCY = 0, //急停
E_FAULT_GET_DATA_DOOR, //门禁
E_FAULT_GET_DATA_WARTER, //水浸
E_FAULT_GET_DATA_SPD, //防雷状态
E_FAULT_GET_DATA_SMOKE, //烟感
E_FAULT_GET_DATA_GUN_DC_FUSE, //直流熔断器状态
E_FAULT_GET_DATA_GUN_TEMP_THRESHOLD, //枪温阈值 精度 0.1度
E_FAULT_GET_DATA_GUN_TEMP, //枪温 精度 0.1度 参数值 0正极枪温 1负极枪温
E_FAULT_GET_DATA_GUN_CNT, //枪数量
E_FAULT_GET_DATA_DOOR_EN, //门禁使能
E_FAULT_GET_DATA_AC_CONTACT_EN, //交流接触器使能(与 sharedata bit_AcContactEna 一致)
E_FAULT_GET_DATA_GUN_LINK, //枪连接标志 0未连接 1已连接
E_FAULT_GET_DATA_GUN_CHAR_FLAG, //充电充电标志 0未充电 1充电中
E_FAULT_GET_DATA_AC_KM, //交流输入接触器反馈 0断开 1闭合(YX_PILE_KM
E_FAULT_GET_DATA_BUS_KM, //母联直流接触器反馈 0断开 1闭合(YX_PILE_BUS_KM
E_FAULT_GET_DATA_BUS_KM_EN, //母联继电器使能标识
E_FAULT_GET_DATA_FLOW_STATE, //枪 u8_gunNo 充电流程状态,与 flow 中 E_FLOW_STATE 一致
E_FAULT_GET_DATA_CHAR_TIME, //枪充电持续时间 秒(故障模块统一取数,内部转调 flow)
E_FAULT_GET_DATA_GUN_DC_KM_POS, //枪正母线直流输出接触器遥信 0断 1合
E_FAULT_GET_DATA_GUN_DC_KM_NEG, //枪负母线直流输出接触器遥信 0断 1合
}E_FAULT_GET_DATA_TYPE;
//故障动作缓存项
typedef struct
{
E_FAULT_SITE f_site; //故障位置
E_FAULT_TYPE type; //动作类型
E_FAULT_INFO e_info; //故障信息
U8_T action_type; //拔枪恢复使能
S16_T data1; //测量值1
S16_T data2; //测量值2
}FAULT_ACTION_CACHE_ITEM_T;
//故障动作缓存队列
typedef struct
{
FAULT_ACTION_CACHE_ITEM_T items[FAULT_ACTION_CACHE_SIZE];
U8_T front; //队列头
U8_T rear; //队列尾
U8_T count; //队列中元素数量
}FAULT_ACTION_CACHE_T;
/*------ Exported variables(变量定义) -------------------*/
extern const char fault_site_mag[3][20];
/*------ Exported function prototypes (函数声明) -------*/
void v_get_fault_info(E_FAULT_INFO e_info , char *mag ,U16_T u16_len);
void v_set_fault_data(E_FAULT_SITE f_site ,E_FAULT_TYPE type , E_FAULT_INFO e_info, U8_T action_type, S16_T data1 , S16_T data2);
U8_T u8_get_fault_sum(U8_T u8_seat, U8_T u8_flag);
void v_get_fault_data(REAL_FAULT_DATA_T *rl_data);
U8_T u8_cheak_fault_flag(E_FAULT_INFO e_info , E_FAULT_SITE f_site);
void v_fault_get_site_mag(E_FAULT_SITE e_site , char *mag , U8_T u8_len);
//故障动作缓存相关函数
void v_fault_cache_init(void);
U8_T u8_fault_cache_add(E_FAULT_SITE f_site ,E_FAULT_TYPE type , E_FAULT_INFO e_info, U8_T action_type, S16_T data1 , S16_T data2);
void v_fault_cache_process(void);
//对内使用函数接口
U16_T u16_fault_get_sys_data(U8_T u8_gunNo,E_FAULT_GET_DATA_TYPE e_dataType,U16_T u16_dataPara);
#ifdef __cplusplus
}
#endif
#endif /* FAULT_INTERFACE_H */
+418
View File
@@ -0,0 +1,418 @@
#include "fault_cheak/faultcheck_task.h"
#include "app_init/app_init.h"
#include "app_init/task_lock.h"
#include "mylog/mylog.h"
#include "publicdata/publicdata.h"
#include "flash_file_mgr/fault_flash_impl.h"
#include "app_rtc/app_rtc.h"
#include "wdt_task/wdt_task.h"
#include "collect_ctrl/yk_ctrl.h"
#include "flowctrl/flowctrl_task.h"
/* 本任务ID定义:用于统一索引任务表、日志与锁资源。 */
#define FAULTCHECK_TASK_ID (TASK_ID_FaultCheck)
/* 获取本任务睡眠时间(ms)。 */
#define FAULTCHECK_SLEEP_TIME_MS() (MY_GET_SLEEP_TIME(FAULTCHECK_TASK_ID))
/* 本任务锁操作宏:简化锁接口调用。 */
#define FAULTCHECK_LOCK_INIT() (u8_task_lock_ctrl(FAULTCHECK_TASK_ID, TASK_LOCK_OP_INIT))
#define FAULTCHECK_LOCK_TAKE() (u8_task_lock_ctrl(FAULTCHECK_TASK_ID, TASK_LOCK_OP_TAKE))
#define FAULTCHECK_LOCK_GIVE() (u8_task_lock_ctrl(FAULTCHECK_TASK_ID, TASK_LOCK_OP_GIVE))
/* 本任务喂狗宏:标记本任务周期正常运行。 */
#define FAULTCHECK_FEED_DOG() (v_wdt_setFlag(FAULTCHECK_TASK_ID))
/* 本任务打印接口。 */
#define FAULTCHECK_LOG(fmt, ...) MYLOG_MSG(FAULTCHECK_TASK_ID, (fmt), ##__VA_ARGS__)
S_HIS_FAULT_MNG s_hisFaultMng; //故障告警信息记录
REAL_FAULT_DATA_T s_real_fault; //实时故障告警记录存储
#if 1 //故障检测
/**
* ************************************************************************
* @brief - 遥信数据故障检查- 多次调用 因此统一函数接口
*
* @param[in] u8_yx_state - 遥信状态 0正常 1故障
* @param[in] e_info - 对应故障信息
* @param[in] f_site - 故障位置
* @param[in] data1 - 数据1
* @param[in] data2 - 数据2
*
*
* @author jiankalka
* @date 2025-09-09
* ************************************************************************
*/
static void v_fault_yx_action_cheak(U8_T u8_yx_state, E_FAULT_INFO e_info , E_FAULT_SITE f_site, S16_T data1 , S16_T data2)
{
U8_T u8_fault_in_flag = u8_cheak_fault_flag(e_info , f_site); //故障存在标志
if(u8_yx_state == 1 && u8_fault_in_flag == 0) //故障动作 且故障不存在,则设置故障动作
v_set_fault_data(f_site,E_FAULT,e_info,0,data1,data2);
else if(u8_yx_state == 0 && u8_fault_in_flag != 0) //故障恢复 且故障仍然存在,则设置故障恢复
v_set_fault_data(f_site,E_RES,e_info,0,data1,data2);
}
/** 遥控命令与反馈不一致时的防抖:u8_slot 1=拒动类 2=粘连类,同一时间只累计一类(整桩或单枪 deb 块独立) */
typedef struct
{
U8_T u8_slot; /* 0 未在防抖累计;1 拒动;2 粘连 */
U32_T u32_sec0; /* 当前 u8_slot 对应异常持续计时的起点秒 */
} S_FAULT_KM_MISMATCH_DEB;
/** 交流、母联、各枪直流 13004/13005 防抖块在 s_km_deb[] 中的下标;枪 g 的 13004/13005 为 DC04_BASE+g、DC05_BASE+g */
typedef enum
{
E_FAULT_KM_DEB_AC = 0,
E_FAULT_KM_DEB_BUS = 1,
E_FAULT_KM_DEB_DC04_BASE = 2,
E_FAULT_KM_DEB_DC05_BASE = 2 + GUN_MAX_CNT,
E_FAULT_KM_DEB_COUNT = 2 + 2 * GUN_MAX_CNT
} E_FAULT_KM_DEB_IDX;
static S_FAULT_KM_MISMATCH_DEB s_km_deb[E_FAULT_KM_DEB_COUNT];
/**
* @brief 接触器命令与反馈不一致:NUM_10 秒防抖后置故障或恢复
* @param[in] f_site E_WHOLE_PILE 走 v_set_fault_data;枪位 E_GUN+枪号 走 v_flow_set_fault_data
* @param[in] u8_action_type 拔枪恢复等,与 v_flow_set_fault_data 一致
* @param[in] s16_data1 故障记录 data1(交流/母联为遥控命令,直流枪为命令或正极反馈见调用处)
* @param[in] s16_data2 故障记录 data2(交流/母联为单路反馈;直流枪为负极 KM 遥信)
*/
static void v_fault_km_mismatch_debounce_cheak(S_FAULT_KM_MISMATCH_DEB *p_deb, U8_T u8_mismatch, U8_T u8_slot, E_FAULT_INFO e_info, S16_T s16_data1, S16_T s16_data2, E_FAULT_SITE f_site, U8_T u8_action_type)
{
if (u8_mismatch == 0) /* 本类异常已消失 */
{
if (p_deb->u8_slot == u8_slot) /* 正在累计的正是本类:清零防抖状态 */
{
p_deb->u8_slot = 0;
p_deb->u32_sec0 = 0;
}
if (u8_cheak_fault_flag(e_info, f_site) != 0) /* 列表中仍有本码则恢复 */
{
if (f_site == E_WHOLE_PILE)
v_set_fault_data(f_site, E_RES, e_info, u8_action_type, s16_data1, s16_data2);
else
v_set_fault_data(f_site, E_RES, e_info, u8_action_type, s16_data1, s16_data2);
}
return;
}
/* 本类异常成立:若刚切换异常类型或未开始计时,则重新开始 NUM_10 秒窗口 */
if (p_deb->u8_slot != u8_slot || p_deb->u32_sec0 == 0)
{
p_deb->u8_slot = u8_slot;
p_deb->u32_sec0 = get_current_seconds();
}
if (u32_safe_seconds_since(p_deb->u32_sec0) > NUM_10) /* 防抖时间到 */
{
if (u8_cheak_fault_flag(e_info, f_site) == 0) /* 尚未登记 */
{
if (f_site == E_WHOLE_PILE)
v_set_fault_data(f_site, E_FAULT, e_info, u8_action_type, s16_data1, s16_data2);
else
{
v_set_fault_data(f_site, E_FAULT, e_info, u8_action_type, s16_data1, s16_data2);
}
}
}
}
/**
* @brief 单枪直流输出接触器:e_yk_get_ctrl_cmd(DC_CONT1/2) 与 u16_fault_get_sys_data(KM/流程/时长)
* 13004 空闲粘连、13005 充电中拒动,均经 v_fault_km_mismatch_debounce_cheak
* @param[in] u8_gunNo 枪索引 0..GUN_MAX_CNT-1
*/
static void v_fault_dc_output_km_check_gun(U8_T u8_gunNo)
{
E_FAULT_SITE f_dc_site;
E_CMD e_cmd_dc;
E_YK_CTRL_TYPE e_ky_dc;
U16_T u16_st;
U16_T u16_pos;
U16_T u16_neg;
U16_T u16_char;
if (u8_gunNo >= GUN_MAX_CNT)
return;
f_dc_site = (E_FAULT_SITE)(E_GUN + u8_gunNo);
e_ky_dc = (u8_gunNo == 0u) ? E_KY_TYPE_DC_CONT1 : E_KY_TYPE_DC_CONT2;
e_cmd_dc = e_yk_get_ctrl_cmd(e_ky_dc);
u16_pos = u16_fault_get_sys_data(u8_gunNo, E_FAULT_GET_DATA_GUN_DC_KM_POS, 0);
u16_neg = u16_fault_get_sys_data(u8_gunNo, E_FAULT_GET_DATA_GUN_DC_KM_NEG, 0);
u16_st = u16_fault_get_sys_data(u8_gunNo, E_FAULT_GET_DATA_FLOW_STATE, 0);
u16_char = u16_fault_get_sys_data(u8_gunNo, E_FAULT_GET_DATA_CHAR_TIME, 0);
if (u16_st == (U16_T)E_FLOW_FREE)
{
v_fault_km_mismatch_debounce_cheak(&s_km_deb[E_FAULT_KM_DEB_DC04_BASE + u8_gunNo],
(U8_T)(e_cmd_dc == CMD_OFF && (u16_pos == 1u || u16_neg == 1u)),
2, E_FAULT_13004, (S16_T)u16_pos, (S16_T)u16_neg, f_dc_site, 0);
}
if (u16_st == (U16_T)E_FLOW_CHARGE_RUNING && u16_char > NUM_60)
{
v_fault_km_mismatch_debounce_cheak(&s_km_deb[E_FAULT_KM_DEB_DC05_BASE + u8_gunNo],
(U8_T)(e_cmd_dc == CMD_ON && (u16_pos == 0u || u16_neg == 0u)),
1, E_FAULT_13005, (S16_T)u16_pos, (S16_T)u16_neg, f_dc_site, 1);
}
}
/**
* ************************************************************************
* @brief - 桩故障信息检查
*
*
*
* @author jiankalka
* @date 2025-09-09
* ************************************************************************
*/
void v_fault_action_cheak()
{
U16_T u16_yx_emergency = u16_fault_get_sys_data(WHOLE_PILE, E_FAULT_GET_DATA_EMERGENCY, 0); //急停
U16_T u16_yx_door = u16_fault_get_sys_data(WHOLE_PILE, E_FAULT_GET_DATA_DOOR, 0); //门禁
U16_T u16_yx_warter = u16_fault_get_sys_data(WHOLE_PILE, E_FAULT_GET_DATA_WARTER, 0); //水浸
U16_T u16_yx_spd = u16_fault_get_sys_data(WHOLE_PILE, E_FAULT_GET_DATA_SPD, 0); //防雷状态
U16_T u16_yx_smoke = u16_fault_get_sys_data(WHOLE_PILE, E_FAULT_GET_DATA_SMOKE, 0); //烟感
U16_T u16_yx_door_en = u16_fault_get_sys_data(WHOLE_PILE, E_FAULT_GET_DATA_DOOR_EN, 0); //门禁使能
U16_T u16_gunTemp_thrd = u16_fault_get_sys_data(WHOLE_PILE,E_FAULT_GET_DATA_GUN_TEMP_THRESHOLD,0); //枪温阈值 0.1度
U16_T u16_ac_km_en = u16_fault_get_sys_data(WHOLE_PILE, E_FAULT_GET_DATA_AC_CONTACT_EN, 0); //交流接触器检测使能
U16_T u16_bus_km_en = u16_fault_get_sys_data(WHOLE_PILE, E_FAULT_GET_DATA_BUS_KM_EN, 0); //母联继电器命令/反馈检测使能(双枪及以上)
U16_T u16_yx_DC_FUSE ; //直流熔断器状态
U16_T u16_gunTemp_plus,u16_gunTemp_minus;
U8_T u8_gunNo;
E_CMD e_cmd_ac;
U8_T u8_ac_km_fb;
E_CMD e_cmd_bus;
U8_T u8_bus_km_fb;
v_fault_yx_action_cheak(u16_yx_emergency ,E_FAULT_13017, E_WHOLE_PILE,0,0); //急停 故障动作检查
if(u16_yx_door_en) //门禁使能 检测
v_fault_yx_action_cheak(u16_yx_door ,E_FAULT_13018, E_WHOLE_PILE,0,0); //门禁 故障动作检查
v_fault_yx_action_cheak(u16_yx_warter ,E_FAULT_13033, E_WHOLE_PILE,0,0); //水浸 故障动作检查
v_fault_yx_action_cheak(u16_yx_spd ,E_FAULT_13001, E_WHOLE_PILE,0,0); //防雷状态 故障动作检查
v_fault_yx_action_cheak(u16_yx_smoke ,E_FAULT_13032, E_WHOLE_PILE,0,0); //烟感 故障动作检查
for (u8_gunNo = 0; u8_gunNo < GUN_MAX_CNT; u8_gunNo++)
{
//直流熔断器状态
u16_yx_DC_FUSE = u16_fault_get_sys_data(u8_gunNo, E_FAULT_GET_DATA_GUN_DC_FUSE, 0); //
v_fault_yx_action_cheak(u16_yx_DC_FUSE ,E_FAULT_13006, (E_FAULT_SITE)(E_GUN + u8_gunNo),0,0); //直流熔断器状态 故障动作检查
//枪温阈值检测
u16_gunTemp_plus = u16_fault_get_sys_data(u8_gunNo ,E_FAULT_GET_DATA_GUN_TEMP ,0 ); //正极枪温值
u16_gunTemp_minus = u16_fault_get_sys_data(u8_gunNo ,E_FAULT_GET_DATA_GUN_TEMP ,1 ); //负极枪温值
u16_gunTemp_plus = (u16_gunTemp_plus > u16_gunTemp_minus)?u16_gunTemp_plus:u16_gunTemp_minus;
v_fault_yx_action_cheak((u16_gunTemp_plus > u16_gunTemp_thrd) ,E_FAULT_13014, (E_FAULT_SITE)(E_GUN + u8_gunNo),u16_gunTemp_plus,u16_gunTemp_thrd); //直流熔断器状态 故障动作检查
v_fault_dc_output_km_check_gun(u8_gunNo); //直流输出接触器 13004/13005(见 static 实现)
}
if (u16_ac_km_en) //交流接触器使能:遥控与反馈比对,防抖后判 13003 拒动 / 13002 粘连;使能 0 不检测、不清计时
{
e_cmd_ac = e_yk_get_ctrl_cmd(E_KY_TYPE_AC1);
u8_ac_km_fb = (U8_T)u16_fault_get_sys_data(WHOLE_PILE, E_FAULT_GET_DATA_AC_KM, 0);
v_fault_km_mismatch_debounce_cheak(&s_km_deb[E_FAULT_KM_DEB_AC], (U8_T)(e_cmd_ac == CMD_ON && u8_ac_km_fb == 0), 1, E_FAULT_13003, (S16_T)e_cmd_ac, (S16_T)u8_ac_km_fb, E_WHOLE_PILE, 0);
v_fault_km_mismatch_debounce_cheak(&s_km_deb[E_FAULT_KM_DEB_AC], (U8_T)(e_cmd_ac == CMD_OFF && u8_ac_km_fb == 1), 2, E_FAULT_13002, (S16_T)e_cmd_ac, (S16_T)u8_ac_km_fb, E_WHOLE_PILE, 0);
}
if (u16_bus_km_en) //母联:e_yk_get_ctrl_cmd(E_KY_TYPE_DC_CONT_BUS) 与 YX_PILE_BUS_KM,防抖后判 13023 拒动 / 13024 粘连
{
e_cmd_bus = e_yk_get_ctrl_cmd(E_KY_TYPE_DC_CONT_BUS);
u8_bus_km_fb = (U8_T)u16_fault_get_sys_data(WHOLE_PILE, E_FAULT_GET_DATA_BUS_KM, 0);
v_fault_km_mismatch_debounce_cheak(&s_km_deb[E_FAULT_KM_DEB_BUS], (U8_T)(e_cmd_bus == CMD_ON && u8_bus_km_fb == 0), 1, E_FAULT_13023, (S16_T)e_cmd_bus, (S16_T)u8_bus_km_fb, E_WHOLE_PILE, 0);
v_fault_km_mismatch_debounce_cheak(&s_km_deb[E_FAULT_KM_DEB_BUS], (U8_T)(e_cmd_bus == CMD_OFF && u8_bus_km_fb == 1), 2, E_FAULT_13024, (S16_T)e_cmd_bus, (S16_T)u8_bus_km_fb, E_WHOLE_PILE, 0);
}
}
#endif
#if 1 //拔枪恢复故障检查
/****************************************************
*函数名称: v_fault_res_cheak()
*功能说明: 拔枪故障恢复检查
*参数说明:
* 输入参数:
* 输出参数: void
****************************************************/
void v_fault_res_cheak(U8_T u8_gunNo)
{
U8_T i;
HIS_FAULT_DATA_T fault_data;
Comm_Time curTime;
U32_T u32_now_time;
static U32_T u32_gun_free_time[GUN_MAX_CNT] = {0}; //枪空闲时间-从工作变到空闲的时间 时间戳
U8_T u8_gunLink = u16_fault_get_sys_data(u8_gunNo,E_FAULT_GET_DATA_GUN_LINK,0); //枪连接标志
U8_T u8_gunWork = u16_fault_get_sys_data(u8_gunNo,E_FAULT_GET_DATA_GUN_CHAR_FLAG,0); //充电标志 1充电中 0未充电
//获取当前时间
GetCurrentTime(&curTime);
u32_now_time = xDate2Seconds(&curTime); //获取当前时间 时间戳
//更新工作空闲时间
if(u8_gunWork == 1)
{
u32_gun_free_time[u8_gunNo] = 0; //工作中,时间清零
}
else //非工作 获取当前时间
{
if(u32_gun_free_time[u8_gunNo] == 0) u32_gun_free_time[u8_gunNo] = u32_now_time;
}
//故障数量检查
if(s_real_fault.u8_fault_cnt == 0 &&
s_real_fault.u8_warn_cnt == 0) //不存在故障 则不需要判断故障恢复
return;
//判断拔枪恢复 或 充电完成5分钟后恢复条件是否满足
if(u8_gunLink == 1 && //枪连接 且时间没有到到超时时间,不做恢复判断
(u32_gun_free_time[u8_gunNo] == 0 || (u32_now_time - u32_gun_free_time[u8_gunNo]) < FAULT_GUN_NOLINK_RES_TIME))
return;
//遍历所有故障信息 检查故障恢复内容
for(i=0;i<CURR_FAULT_MAX_CNT;i++)
{
if(s_real_fault.fault_data[i].e_ingun == (u8_gunNo+1+E_GUN) && //故障归属本枪(故障存储枪号从1000开始,+E_GUN) 且为 拔枪恢复
s_real_fault.fault_data[i].u8_type == 1)
{
memset(&fault_data,0,sizeof(HIS_FAULT_DATA_T));
memcpy(&fault_data.s_occur_time, &curTime, sizeof(Comm_Time)); //发生时间
fault_data.e_site = (E_FAULT_SITE)(u8_gunNo + E_GUN);
fault_data.ActType = E_RES;
fault_data.e_fault_info = s_real_fault.fault_data[i].e_mag;
//v_hisFault_save_record(&fault_data); //保存动作记录
if(s_real_fault.u8_fault_cnt != 0)
s_real_fault.u8_fault_cnt -- ;
memset(&s_real_fault.fault_data[i],0,sizeof(Fault_data));
}
}
for(i=0;i<CURR_ALARM_MAX_CNT;i++)
{
if(s_real_fault.warn_data[i].e_ingun == (u8_gunNo+1+E_GUN) && s_real_fault.warn_data[i].u8_type == 1) //拔枪恢复
{
memset(&fault_data,0,sizeof(HIS_FAULT_DATA_T));
memcpy(&fault_data.s_occur_time, &curTime, sizeof(Comm_Time)); //发生时间
fault_data.e_site = (E_FAULT_SITE)(u8_gunNo + E_GUN);
fault_data.ActType = E_RES;
fault_data.e_fault_info = s_real_fault.warn_data[i].e_mag;
//v_hisFault_save_record(&fault_data); //保存动作记录
if(s_real_fault.u8_warn_cnt != 0)
s_real_fault.u8_warn_cnt -- ;
memset(&s_real_fault.warn_data[i],0,sizeof(Fault_data));
}
}
}
#endif
#if 1 //故障信息打印
/**
* ************************************************************************
* @brief - 故障信息打印
*
*
*
* @author jiankalka
* @date 2025-09-10
* ************************************************************************
*/
static void v_fault_info_print()
{
U8_T i,mag[FAULT_GET_MAG_MAX_LEN]={0};
char c_site_mag[NUM_30] = {0};
E_FAULT_INFO e_info;
E_FAULT_SITE e_site;
if(s_real_fault.u8_fault_cnt != 0 || s_real_fault.u8_warn_cnt != 0) //存在故障 或者告警
{
FAULTCHECK_LOG("**** Fault=%d, Warn=%d ****\n",
s_real_fault.u8_fault_cnt,s_real_fault.u8_warn_cnt);
for(i=0;i<CURR_FAULT_MAX_CNT;i++)
{
if(s_real_fault.fault_data[i].e_mag != 0)
{
e_info = s_real_fault.fault_data[i].e_mag;
e_site = s_real_fault.fault_data[i].e_ingun;
v_fault_get_site_mag(e_site,c_site_mag,NUM_30);
v_get_fault_info(e_info , (char*)mag,FAULT_GET_MAG_MAX_LEN);
FAULTCHECK_LOG("%s Fault %d %s\n",c_site_mag,e_info,mag);
}
}
for(i=0;i<CURR_ALARM_MAX_CNT;i++)
{
if(s_real_fault.warn_data[i].e_mag != 0)
{
e_info = s_real_fault.warn_data[i].e_mag;
e_site = s_real_fault.warn_data[i].e_ingun;
v_fault_get_site_mag(e_site,c_site_mag,NUM_30);
v_get_fault_info(e_info , (char*)mag,FAULT_GET_MAG_MAX_LEN);
FAULTCHECK_LOG("%s Warn %d %s\n",c_site_mag,e_info,mag);
}
}
FAULTCHECK_LOG("*************************************\n",
s_real_fault.u8_fault_cnt,s_real_fault.u8_warn_cnt);
}
}
#endif
//故障记录相关初始化
void v_fault_data_init(void)
{
/* 统一走 flash_file_mgr 初始化,避免与 BSP 初始化逻辑分叉。 */
#if (FAULT_FLASH_MGR_ENABLE)
v_fault_flash_init();
#endif
//初始化后 增加历史故障数量打印
FAULTCHECK_LOG("history fault count: %d", u16_fault_get_his_count());
}
void v_fault_task(void *argument)
{
uint16_t sleep_time_ms;
uint32_t last_send_time;
uint32_t current_time;
v_fault_data_init();
(void)argument;
(void)FAULTCHECK_LOCK_INIT();
sleep_time_ms = FAULTCHECK_SLEEP_TIME_MS();
last_send_time = get_current_seconds();
U8_T u8_gunNo, u8_gunCnt = u16_fault_get_sys_data(0,E_FAULT_GET_DATA_GUN_CNT,0); //枪数量
for (;;) {
FAULTCHECK_FEED_DOG();
current_time = get_current_seconds();
if ((TASK_RUN_PRINT_TIME != 0U) && (u32_safe_seconds_since(last_send_time) >= TASK_RUN_PRINT_TIME)) {
if (FAULTCHECK_LOCK_TAKE() == 1U) {
FAULTCHECK_LOG("faultcheck task is runing, sleep time is %ums", sleep_time_ms);
(void)FAULTCHECK_LOCK_GIVE();
}
last_send_time = current_time;
}
//故障信息打印
if (FUALT_INFO_PRINT_TIME != 0 && u32_safe_seconds_since(last_send_time) >= FUALT_INFO_PRINT_TIME) {
v_fault_info_print(); //故障信息打印
last_send_time = current_time;
}
for (u8_gunNo = 0; u8_gunNo < u8_gunCnt; u8_gunNo++)
{
v_fault_res_cheak(u8_gunNo); //故障拔枪恢复检测
}
v_fault_action_cheak() ; //故障动作检查
// 处理缓存中的故障动作
v_fault_cache_process();
mSleep(sleep_time_ms);
}
}
+41
View File
@@ -0,0 +1,41 @@
#ifndef FAULTCHECK_TASK_H
#define FAULTCHECK_TASK_H
#ifdef __cplusplus /*C++编译环境下兼容C语言*/
extern "C" {
#endif
/*------ Exported includes(头文件) ----------------------*/
#include "main.h"
#include "fault_cheak/fault_interface.h"
/*------ Exported macro(宏定义) -------------------------*/
/*------ Exported struct(结构体定义) --------------------*/
//历史故障结构体
typedef struct
{
E_FAULT_SITE e_site; //故障位置
E_FAULT_INFO e_fault_info; //故障信息
Comm_Time s_occur_time; //发生时间
E_FAULT_TYPE ActType; //动作类型(0:复归;1:告警;2:故障)
S16_T s16_value1; //动作测量值 - 如果有的话
S16_T s16_value2; //动作测量值 - 如果有的话
}HIS_FAULT_DATA_T;
/*------ Exported variables(变量定义) -------------------*/
/*------ Exported function prototypes (函数声明) -------*/
void v_fault_task(void *argument);
#ifdef __cplusplus
}
#endif
#endif /* FAULTCHECK_TASK_H */