2648 lines
55 KiB
C
2648 lines
55 KiB
C
/**
|
|
******************************************************************************
|
|
* @file Status.c
|
|
* @author
|
|
* @version
|
|
* @date
|
|
* @brief
|
|
******************************************************************************
|
|
* @attention
|
|
*
|
|
*
|
|
******************************************************************************
|
|
*/
|
|
|
|
/* Includes ------------------------------------------------------------------*/
|
|
#include "stm32f10x.h"
|
|
#include "global.h"
|
|
#include "string.h"
|
|
|
|
/*电压*/
|
|
uint8_t cellov_alarmcount; //单体过压告警的延时计数
|
|
uint8_t celluv_alarmcount; //单体欠压告警的延时计数
|
|
uint8_t packov_alarmcount; //总体过压告警的延时计数
|
|
uint8_t packuv_alarmcount; //总体欠压告警的延时计数
|
|
uint8_t cellovr_alarmcount; //单体过压告警释放的延时计数
|
|
uint8_t celluvr_alarmcount; //单体欠压告警释放的延时计数
|
|
uint8_t packovr_alarmcount; //总体过压告警释放的延时计数
|
|
uint8_t packuvr_alarmcount; //总体欠压告警释放的延时计数
|
|
|
|
uint8_t cellov_count; //单体过压保护的延时计数
|
|
uint8_t celluv_count; //单体欠压保护的延时计数
|
|
uint8_t packov_count; //总体过压保护的延时计数
|
|
uint8_t packuv_count; //总体欠压保护的延时计数
|
|
uint8_t cellovr_count; //单体过压保护释放的延时计数
|
|
uint8_t celluvr_count; //单体欠压保护释放的延时计数
|
|
uint8_t packovr_count; //总体过压保护释放的延时计数
|
|
uint8_t packuvr_count; //总体欠压保护释放的延时计数
|
|
|
|
uint16_t cell_OV; //单体过压值
|
|
uint16_t cell_UV; //单体欠压值
|
|
uint16_t cell_OVT; //单体过压延时参数,对应表格1s~40s
|
|
uint16_t cell_UVT; //单体欠压延时参数,对应表格1s~40s
|
|
uint16_t cell_OVR; //单体过压释放值
|
|
uint16_t cell_UVR; //单体欠压释放值
|
|
|
|
uint8_t cellovr_alarmcount2; //单体过压告警特殊释放的延时计数
|
|
uint8_t celluvr_alarmcount2; //单体欠压告警特殊释放的延时计数
|
|
uint8_t packovr_alarmcount2; //总体过压告警特殊释放的延时计数
|
|
uint8_t packuvr_alarmcount2; //总体欠压告警特殊释放的延时计数
|
|
|
|
uint8_t cellovr_alarmcount3; //单体过压告警特殊释放的延时计数
|
|
uint8_t celluvr_alarmcount3; //单体欠压告警特殊释放的延时计数
|
|
uint8_t packovr_alarmcount3; //总体过压告警特殊释放的延时计数
|
|
uint8_t packuvr_alarmcount3; //总体欠压告警特殊释放的延时计数
|
|
|
|
uint8_t cellovr_count2; //单体过压保护特殊释放的延时计数
|
|
uint8_t celluvr_count2; //单体欠压保护特殊释放的延时计数
|
|
uint8_t packovr_count2; //总体过压保护特殊释放的延时计数
|
|
uint8_t packuvr_count2; //总体欠压保护特殊释放的延时计数
|
|
|
|
uint8_t cellovr_count3; //单体过压保护特殊释放的延时计数
|
|
uint8_t celluvr_count3; //单体欠压保护特殊释放的延时计数
|
|
uint8_t packovr_count3; //总体过压保护特殊释放的延时计数
|
|
uint8_t packuvr_count3; //总体欠压保护特殊释放的延时计数
|
|
|
|
uint8_t cellovr_alarmflag; //单体过压告警特殊释放的标志(因为过压会校准SOC,不考虑SOC<96%条件)
|
|
uint8_t packovr_alarmflag; //总体过压告警特殊释放的标志(因为过压会校准SOC,不考虑SOC<96%条件)
|
|
uint8_t celluvr_alarmflag; //单体欠压告警特殊释放的标志
|
|
uint8_t packuvr_alarmflag; //总体欠压告警特殊释放的标志
|
|
|
|
uint8_t cellovr_flag; //单体过压保护特殊释放的标志(因为过压会校准SOC,不考虑SOC<96%条件)
|
|
uint8_t packovr_flag; //总体过压保护特殊释放的标志(因为过压会校准SOC,不考虑SOC<96%条件)
|
|
uint8_t celluvr_flag; //单体欠压保护特殊释放的标志
|
|
uint8_t packuvr_flag; //总体欠压保护特殊释放的标志
|
|
|
|
/*电流*/
|
|
uint8_t occ_alarmcount; //充电过流告警的延时计数
|
|
uint8_t ocd1_alarmcount; //放电过流1告警的延时计数
|
|
uint8_t occr_alarmcount; //充电过流告警恢复的延时计数
|
|
uint8_t occr_alarmcount2;
|
|
uint8_t ocd1r_alarmcount; //放电过流1告警恢复的延时计数
|
|
uint8_t ocd1r_alarmcount2;
|
|
|
|
uint8_t scr_count; //浪涌短路保护释放的延时计数
|
|
|
|
uint8_t occ_count; //充电过流保护的延时计数
|
|
uint8_t ocd_count; //放电过流1保护的延时计数
|
|
uint8_t ocr_count; //电流保护释放的延时计数
|
|
|
|
uint8_t occ_OccurFlag; //充电过流出现过的标志
|
|
uint8_t ocd1_OccurFlag; //放电过流1出现过的标志
|
|
uint8_t ocd2_OccurFlag; //放电过流1出现过的标志
|
|
|
|
uint8_t occ_RepeatFlag; //持续出现的标志
|
|
uint8_t occ_RepeatTime; //等待倒计时,最大60s =>消失后60s内未再次出现,说明正常
|
|
uint8_t occ_RepeatCount; //重复的计数,最大5次 =>连续5次出现,会在第五次短路将标志位置1,控制MOS关闭
|
|
|
|
uint8_t ocd1_RepeatFlag; //持续出现的标志
|
|
uint8_t ocd1_RepeatTime; //等待倒计时,最大60s =>消失后60s内未再次出现,说明正常
|
|
uint8_t ocd1_RepeatCount; //重复的计数,最大5次 =>连续5次出现,会在第五次短路将标志位置1,控制MOS关闭
|
|
|
|
uint8_t ocd2_RepeatFlag; //持续出现的标志
|
|
uint8_t ocd2_RepeatTime; //等待倒计时,最大60s =>消失后60s内未再次出现,说明正常
|
|
uint8_t ocd2_RepeatCount; //重复的计数,最大5次 =>连续5次出现,会在第五次短路将标志位置1,控制MOS关闭
|
|
|
|
/*温度*/
|
|
uint8_t mcuotc_alarmcount; //电芯充电高温告警的延时计数
|
|
uint8_t mcuutc_alarmcount; //电芯充电低温告警的延时计数
|
|
uint8_t mcuotd_alarmcount; //电芯放电高温告警的延时计数
|
|
uint8_t mcuutd_alarmcount; //电芯放电低温告警的延时计数
|
|
uint8_t mcuotcr_alarmcount; //电芯充电高温告警释放的延时计数
|
|
uint8_t mcuutcr_alarmcount; //电芯充电低温告警释放的延时计数
|
|
uint8_t mcuotdr_alarmcount; //电芯放电高温告警释放的延时计数
|
|
uint8_t mcuutdr_alarmcount; //电芯放电低温告警释放的延时计数
|
|
|
|
uint8_t dsg_htp_count;
|
|
uint8_t dsg_ltp_count;
|
|
uint8_t chg_htp_count;
|
|
uint8_t chg_ltp_count;
|
|
uint8_t dsg_htpr_count;
|
|
uint8_t dsg_ltpr_count;
|
|
uint8_t chg_htpr_count;
|
|
uint8_t chg_ltpr_count;
|
|
|
|
uint8_t am_otc_alarmcount;
|
|
uint8_t am_utc_alarmcount;
|
|
uint8_t am_otd_alarmcount;
|
|
uint8_t am_utd_alarmcount;
|
|
uint8_t am_otcr_alarmcount;
|
|
uint8_t am_utcr_alarmcount;
|
|
uint8_t am_otdr_alarmcount;
|
|
uint8_t am_utdr_alarmcount;
|
|
|
|
uint8_t am_otc_count;
|
|
uint8_t am_otcr_count;
|
|
uint8_t am_otd_count;
|
|
uint8_t am_otdr_count;
|
|
uint8_t am_utc_count;
|
|
uint8_t am_utcr_count;
|
|
uint8_t am_utd_count;
|
|
uint8_t am_utdr_count;
|
|
|
|
uint8_t afeotc_alarmcount; //MOS温度告警的延时计数
|
|
//uint8_t afeutc_alarmcount;
|
|
uint8_t afeotd_alarmcount;
|
|
//uint8_t afeutd_alarmcount;
|
|
uint8_t afeotcr_alarmcount;
|
|
//uint8_t afeutcr_alarmcount;
|
|
uint8_t afeotdr_alarmcount;
|
|
//uint8_t afeutdr_alarmcount;
|
|
|
|
uint8_t afeotc_count; //MOS温度保护的延时计数
|
|
//uint8_t afeutc_count;
|
|
uint8_t afeotd_count;
|
|
//uint8_t afeutd_count;
|
|
uint8_t afeotcr_count;
|
|
//uint8_t afeutcr_count;
|
|
uint8_t afeotdr_count;
|
|
//uint8_t afeutdr_count;
|
|
|
|
/****出现告警/保护/故障/状态事件的上传****/
|
|
#define MaxSaveNum 50
|
|
|
|
uint8_t incident_flag; //4G上报_要执行上报事件的标志
|
|
uint8_t incident_DataInf; //4G上报_要上报发生事件的类型
|
|
uint8_t incident_DataFlg; //4G上报_要上报发生事件时的数据的标志 2:保护 1:其他 0:不用记录
|
|
|
|
uint8_t staChange[MaxSaveNum+5]; //4G上报_最多同时存储50条
|
|
uint32_t staChange_time[MaxSaveNum+5]; //4G上报_发生时间,最多同时存储50条
|
|
uint8_t staChange_num; //4G上报_当前存储待上报状态的总个数 若总个数到达最大,就不再放入,直到全部发送后才清零重新计数
|
|
uint8_t staChange_index; //4G上报_目前上报对应的序号
|
|
|
|
/*状态改变*/
|
|
//常见状态
|
|
uint16_t NomalStatus; //1~8bit -> 有0x01~0x08 无不算事件 (这个从0x01开始表示)
|
|
//特殊状态
|
|
uint16_t SpecialStatus; //0~8bit -> 有0x10~0x19 无+0x80
|
|
//保护
|
|
uint16_t Protect_Vol; //0~5bit -> 有0x20~0x25 无+0x80
|
|
uint16_t Protect_Cur; //0~4bit -> 有0x30~0x34 无+0x80
|
|
uint16_t Protect_Temp; //0~11bit -> 有0x40~0x4B 无+0x80
|
|
//报警
|
|
uint16_t Warning_Vol; //0~3bit -> 有0x50~0x53 无+0x80
|
|
uint16_t Warning_Cur; //0~1bit -> 有0x60~0x61 无+0x80
|
|
uint16_t Warning_Temp; //0~11bit -> 有0x70~0x7B 无+0x80
|
|
|
|
uint16_t status_New[8]; //当前状态拷贝
|
|
uint16_t status_Old[8]; //当上报过出现的报警/保护后,置位对应位
|
|
|
|
|
|
const uint8_t VP_Time[16-6]=
|
|
{
|
|
1, 2, 3, 4, 6, 8, 10, 20, 30, 40
|
|
};
|
|
|
|
|
|
//过压的告警
|
|
void Trigger_OVAlarm(void)
|
|
{
|
|
//单体过压告警判断
|
|
if((bmsMem.bStatus3 & 0x0100) == 0)
|
|
{
|
|
if(cellVoltageMax >= paraMem.alarm_cov)
|
|
{
|
|
if(cellovr_alarmflag == 0) //特殊释放不会因为电压重复触发
|
|
{
|
|
cellov_alarmcount++;
|
|
if(cellov_alarmcount > 3)
|
|
{
|
|
bmsMem.bStatus3 |= 0x0100;
|
|
cellov_alarmcount = 0;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
cellovr_alarmflag = 0;
|
|
|
|
cellov_alarmcount = 0;
|
|
}
|
|
|
|
if(bDSGING == 0)
|
|
{
|
|
cellovr_alarmflag = 0;
|
|
}
|
|
}
|
|
|
|
//总体过压告警判断
|
|
if((bmsMem.bStatus3 & 0x0400) == 0)
|
|
{
|
|
if(bmsMem.packVoltage >= paraMem.alarm_pov * 100)
|
|
{
|
|
if(packovr_alarmflag == 0)
|
|
{
|
|
packov_alarmcount++;
|
|
if(packov_alarmcount > 3)
|
|
{
|
|
bmsMem.bStatus3 |= 0x0400;
|
|
packov_alarmcount = 0;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
packovr_alarmflag = 0;
|
|
packov_alarmcount = 0;
|
|
}
|
|
|
|
if(bDSGING == 0)
|
|
{
|
|
packovr_alarmflag = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
//欠压的告警
|
|
void Trigger_UVAlarm(void)
|
|
{
|
|
//单体欠压告警判断
|
|
if((bmsMem.bStatus3 & 0x0200) == 0)
|
|
{
|
|
if(cellVoltageMin <= paraMem.alarm_cuv)
|
|
{
|
|
if(celluvr_alarmflag == 0)
|
|
{
|
|
celluv_alarmcount++;
|
|
if(celluv_alarmcount > 3)
|
|
{
|
|
bmsMem.bStatus3 |= 0x0200;
|
|
celluv_alarmcount = 0;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
celluvr_alarmflag = 0;
|
|
celluv_alarmcount = 0;
|
|
}
|
|
|
|
if(bCHGING == 0)
|
|
{
|
|
celluvr_alarmflag = 0;
|
|
}
|
|
}
|
|
|
|
//总体欠压告警判断
|
|
if((bmsMem.bStatus3 & 0x0800) == 0)
|
|
{
|
|
if(bmsMem.packVoltage <= paraMem.alarm_puv * 100)
|
|
{
|
|
if(packuvr_alarmflag == 0)
|
|
{
|
|
packuv_alarmcount++;
|
|
if(packuv_alarmcount > 3)
|
|
{
|
|
bmsMem.bStatus3 |= 0x0800;
|
|
packuv_alarmcount = 0;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
packuvr_alarmflag = 0;
|
|
packuv_alarmcount = 0;
|
|
}
|
|
|
|
if(bCHGING == 0)
|
|
{
|
|
packuvr_alarmflag = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
//过压的告警释放
|
|
void Release_OVAlarm(void)
|
|
{
|
|
//单体过压恢复值
|
|
cell_OVR = ( (bmsMem.ee_uvt_ovrh & 0x03) <<8 | bmsMem.ee_ovrl ) * 5;
|
|
|
|
//单体过压告警恢复判断
|
|
if((bmsMem.bStatus3 & 0x0100) != 0)
|
|
{
|
|
if(cellVoltageMax < cell_OVR)
|
|
{
|
|
cellovr_alarmcount++;
|
|
if(cellovr_alarmcount > 1)
|
|
{
|
|
bmsMem.bStatus3 &= ~0x0100;
|
|
cellovr_alarmcount = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
cellovr_alarmcount = 0;
|
|
}
|
|
|
|
if(bmsMem.soc < paraMem.cellovr_soc) //特殊解除项:①SOC<96%
|
|
{
|
|
cellovr_alarmcount2++;
|
|
if(cellovr_alarmcount2 > 1)
|
|
{
|
|
bmsMem.bStatus3 &= ~0x0100;
|
|
cellovr_alarmcount2 = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
cellovr_alarmcount2 = 0;
|
|
}
|
|
|
|
if(bmsMem.packCurrent < -3000) //特殊解除项:②放电电流>3A
|
|
{
|
|
cellovr_alarmcount3++;
|
|
if(cellovr_alarmcount3 > 1)
|
|
{
|
|
cellovr_alarmflag = 1;
|
|
|
|
bmsMem.bStatus3 &= ~0x0100;
|
|
cellovr_alarmcount3 = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
cellovr_alarmcount3 = 0;
|
|
}
|
|
}
|
|
|
|
//总体过压告警恢复判断
|
|
if((bmsMem.bStatus3 & 0x0400) != 0)
|
|
{
|
|
if(bmsMem.packVoltage < paraMem.pack_ovrv * 100)
|
|
{
|
|
packovr_alarmcount++;
|
|
if(packovr_alarmcount > 1)
|
|
{
|
|
bmsMem.bStatus3 &= ~0x0400;
|
|
packovr_alarmcount = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
packovr_alarmcount = 0;
|
|
}
|
|
|
|
if(bmsMem.soc < paraMem.packovr_soc) //特殊解除项:①SOC<96%
|
|
{
|
|
packovr_alarmcount2++;
|
|
if(packovr_alarmcount2 > 1)
|
|
{
|
|
bmsMem.bStatus3 &= ~0x0400;
|
|
packovr_alarmcount2 = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
packovr_alarmcount2 = 0;
|
|
}
|
|
|
|
if(bmsMem.packCurrent < -3000) //特殊解除项:②放电电流>3A
|
|
{
|
|
packovr_alarmcount3++;
|
|
if(packovr_alarmcount3 > 1)
|
|
{
|
|
packovr_alarmflag = 1;
|
|
|
|
bmsMem.bStatus3 &= ~0x0400;
|
|
packovr_alarmcount3 = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
packovr_alarmcount3 = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
//欠压的告警释放
|
|
void Release_UVAlarm(void)
|
|
{
|
|
//单体欠压恢复值
|
|
cell_UVR = bmsMem.ee_uvr * 20;
|
|
|
|
//单体欠压告警恢复判断
|
|
if((bmsMem.bStatus3 & 0x0200) != 0)
|
|
{
|
|
if(cellVoltageMin > cell_UVR)
|
|
{
|
|
celluvr_alarmcount++;
|
|
if(celluvr_alarmcount > 1)
|
|
{
|
|
bmsMem.bStatus3 &= ~0x0200;
|
|
celluvr_alarmcount = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
celluvr_alarmcount = 0;
|
|
}
|
|
|
|
if(bmsMem.packCurrent > 200) //特殊解除项:接入充电器 0.2A
|
|
{
|
|
celluvr_alarmcount2++;
|
|
if(celluvr_alarmcount2 > 1)
|
|
{
|
|
celluvr_alarmflag = 1;
|
|
|
|
bmsMem.bStatus3 &= ~0x0200;
|
|
celluvr_alarmcount2 = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
celluvr_alarmcount2 = 0;
|
|
}
|
|
}
|
|
|
|
//总体欠压告警恢复判断
|
|
if((bmsMem.bStatus3 & 0x0800) != 0)
|
|
{
|
|
if(bmsMem.packVoltage > paraMem.pack_uvrv * 100)
|
|
{
|
|
packuvr_alarmcount++;
|
|
if(packuvr_alarmcount > 1)
|
|
{
|
|
bmsMem.bStatus3 &= ~0x0800;
|
|
packuvr_alarmcount = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
packuvr_alarmcount = 0;
|
|
}
|
|
|
|
if(bmsMem.packCurrent > 200) //特殊解除项:接入充电器 0.2A
|
|
{
|
|
packuvr_alarmcount2++;
|
|
if(packuvr_alarmcount2 > 1)
|
|
{
|
|
packuvr_alarmflag = 1;
|
|
|
|
bmsMem.bStatus3 &= ~0x0800;
|
|
packuvr_alarmcount2 = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
packuvr_alarmcount2 = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
//过压的保护
|
|
void Trigger_OVProtect(void)
|
|
{
|
|
uint8_t temp;
|
|
|
|
//单体过压值
|
|
cell_OV = ( (bmsMem.ee_ovt_ldrt_ovh & 0x03) <<8 | bmsMem.ee_ovl ) * 5;
|
|
|
|
//单体过压的延时,单位1s
|
|
temp = bmsMem.ee_ovt_ldrt_ovh >> 4;
|
|
temp = temp>=6?(temp-6):0;
|
|
cell_OVT = VP_Time[temp];
|
|
|
|
//单体过压判断
|
|
if((bmsMem.bStatus1 & 0x0001) == 0)
|
|
{
|
|
if(cellVoltageMax >= cell_OV)
|
|
{
|
|
if(cellovr_flag == 0)
|
|
{
|
|
cellov_count++;
|
|
if(cellov_count > cell_OVT)
|
|
{
|
|
bmsMem.bStatus1 |= 0x0001;
|
|
cellov_count = 0;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
cellovr_flag = 0;
|
|
cellov_count = 0;
|
|
}
|
|
|
|
if(bDSGING == 0)
|
|
{
|
|
cellovr_flag = 0;
|
|
}
|
|
}
|
|
|
|
//总体过压判断
|
|
if((bmsMem.bStatus1 & 0x0100) == 0)
|
|
{
|
|
if(bmsMem.packVoltage >= paraMem.pack_ovv * 100)
|
|
{
|
|
if(packovr_flag == 0)
|
|
{
|
|
packov_count++;
|
|
if(packov_count > paraMem.pack_ovt)
|
|
{
|
|
bmsMem.bStatus1 |= 0x0100;
|
|
packov_count = 0;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
packovr_flag = 0;
|
|
packov_count = 0;
|
|
}
|
|
|
|
if(bDSGING == 0)
|
|
{
|
|
packovr_flag = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
//欠压的保护
|
|
void Trigger_UVProtect(void)
|
|
{
|
|
uint8_t temp;
|
|
|
|
//单体欠压值
|
|
cell_UV = bmsMem.ee_uv * 20;
|
|
|
|
//单体欠压的延时,单位1s
|
|
temp = bmsMem.ee_uvt_ovrh >> 4;
|
|
temp = temp>=6?(temp-6):0;
|
|
cell_UVT = VP_Time[temp];
|
|
|
|
//单体欠压判断
|
|
if((bmsMem.bStatus1 & 0x0002) == 0)
|
|
{
|
|
if(cellVoltageMin <= cell_UV)
|
|
{
|
|
if(celluvr_flag == 0)
|
|
{
|
|
celluv_count++;
|
|
if(celluv_count > cell_UVT)
|
|
{
|
|
bmsMem.bStatus1 |= 0x0002;
|
|
celluv_count = 0;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
celluvr_flag = 0;
|
|
celluv_count = 0;
|
|
}
|
|
|
|
if(bCHGING == 0)
|
|
{
|
|
celluvr_flag = 0;
|
|
}
|
|
}
|
|
|
|
//总体欠压判断
|
|
if((bmsMem.bStatus1 & 0x0200) == 0)
|
|
{
|
|
if(bmsMem.packVoltage <= paraMem.pack_uvv * 100)
|
|
{
|
|
if(packuvr_flag == 0)
|
|
{
|
|
packuv_count++;
|
|
if(packuv_count > paraMem.pack_uvt)
|
|
{
|
|
bmsMem.bStatus1 |= 0x0200;
|
|
packuv_count = 0;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
packuvr_flag = 0;
|
|
packuv_count = 0;
|
|
}
|
|
|
|
if(bCHGING == 0)
|
|
{
|
|
packuvr_flag = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
//过压的保护释放
|
|
void Release_OVProtect(void)
|
|
{
|
|
//单体过压恢复判断
|
|
if((bmsMem.bStatus1 & 0x0001) != 0)
|
|
{
|
|
if(cellVoltageMax < cell_OVR)
|
|
{
|
|
cellovr_count++;
|
|
if(cellovr_count > 1)
|
|
{
|
|
bmsMem.bStatus1 &= ~0x0001;
|
|
cellovr_count = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
cellovr_count = 0;
|
|
}
|
|
|
|
if(bmsMem.soc < paraMem.cellovr_soc) //特殊解除项:①SOC<96%
|
|
{
|
|
cellovr_count2++;
|
|
if(cellovr_count2 > 1)
|
|
{
|
|
bmsMem.bStatus1 &= ~0x0001;
|
|
cellovr_count2 = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
cellovr_count2 = 0;
|
|
}
|
|
if(bmsMem.packCurrent < -3000) //特殊解除项:②放电电流>3A
|
|
{
|
|
cellovr_count3++;
|
|
if(cellovr_count3 > 1)
|
|
{
|
|
cellovr_flag = 1;
|
|
|
|
bmsMem.bStatus1 &= ~0x0001;
|
|
cellovr_count3 = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
cellovr_count3 = 0;
|
|
}
|
|
}
|
|
|
|
//总体过压恢复判断
|
|
if((bmsMem.bStatus1 & 0x0100) != 0)
|
|
{
|
|
if(bmsMem.packVoltage < paraMem.pack_ovrv * 100)
|
|
{
|
|
packovr_count++;
|
|
if(packovr_count > 1)
|
|
{
|
|
bmsMem.bStatus1 &= ~0x0100;
|
|
packovr_count = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
packovr_count = 0;
|
|
}
|
|
|
|
if(bmsMem.soc < paraMem.packovr_soc) //特殊解除项:①SOC<96%
|
|
{
|
|
packovr_count2++;
|
|
if(packovr_count2 > 1)
|
|
{
|
|
bmsMem.bStatus1 &= ~0x0100;
|
|
packovr_count2 = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
packovr_count2 = 0;
|
|
}
|
|
if(bmsMem.packCurrent < -3000) //特殊解除项:②放电电流>3A
|
|
{
|
|
packovr_count3++;
|
|
if(packovr_count3 > 1)
|
|
{
|
|
packovr_flag = 1;
|
|
|
|
bmsMem.bStatus1 &= ~0x0100;
|
|
packovr_count3 = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
packovr_count3 = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
//欠压的保护释放
|
|
void Release_UVProtect(void)
|
|
{
|
|
//单体欠压恢复判断
|
|
if((bmsMem.bStatus1 & 0x0002) != 0)
|
|
{
|
|
if(cellVoltageMin > cell_UVR)
|
|
{
|
|
celluvr_count++;
|
|
if(celluvr_count > 1)
|
|
{
|
|
bmsMem.bStatus1 &= ~0x0002;
|
|
celluvr_count = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
celluvr_count = 0;
|
|
}
|
|
|
|
if(bmsMem.packCurrent > 200) //特殊解除项:接入充电器 0.2A
|
|
{
|
|
celluvr_count2++;
|
|
if(celluvr_count2 > 1)
|
|
{
|
|
celluvr_flag = 1;
|
|
|
|
bmsMem.bStatus1 &= ~0x0002;
|
|
celluvr_count2 = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
celluvr_count2 = 0;
|
|
}
|
|
}
|
|
|
|
//总体欠压恢复判断
|
|
if((bmsMem.bStatus1 & 0x0200) != 0)
|
|
{
|
|
if(bmsMem.packVoltage > paraMem.pack_uvrv * 100)
|
|
{
|
|
packuvr_count++;
|
|
if(packuvr_count > 1)
|
|
{
|
|
bmsMem.bStatus1 &= ~0x0200;
|
|
packuvr_count = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
packuvr_count = 0;
|
|
}
|
|
|
|
if(bmsMem.packCurrent > 200) //特殊解除项:接入充电器 0.2A
|
|
{
|
|
packuvr_count2++;
|
|
if(packuvr_count2 > 1)
|
|
{
|
|
packuvr_flag = 1;
|
|
|
|
bmsMem.bStatus1 &= ~0x0200;
|
|
packuvr_count2 = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
packuvr_count2 = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
//电流的告警
|
|
void Trigger_CurAlarm(void)
|
|
{
|
|
uint32_t current;
|
|
uint32_t alarm_occ,alarm_ocd1;
|
|
|
|
if(bmsMem.packCurrent >=0)
|
|
{
|
|
current = bmsMem.packCurrent;
|
|
}
|
|
else
|
|
{
|
|
current = -bmsMem.packCurrent;
|
|
}
|
|
alarm_occ = paraMem.alarm_occ * 1000;
|
|
alarm_ocd1 = paraMem.alarm_ocd1 * 1000;
|
|
|
|
|
|
//充电过流告警
|
|
if((bmsMem.bStatus3 & BIT12) == 0)
|
|
{
|
|
if((current > alarm_occ) && (bCHGING==1)) //充电状态
|
|
{
|
|
occ_alarmcount++;
|
|
if(occ_alarmcount > 3)
|
|
{
|
|
bmsMem.bStatus3 |= BIT12;
|
|
occ_alarmcount = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
occ_alarmcount = 0;
|
|
}
|
|
}
|
|
//放电过流1告警
|
|
if((bmsMem.bStatus3 & BIT13) == 0)
|
|
{
|
|
if((current > alarm_ocd1) && (bDSGING==1)) //放电状态
|
|
{
|
|
ocd1_alarmcount++;
|
|
if(ocd1_alarmcount > 3)
|
|
{
|
|
bmsMem.bStatus3 |= BIT13;
|
|
ocd1_alarmcount = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
ocd1_alarmcount = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
//电流的告警释放
|
|
void Release_CurAlarm(void)
|
|
{
|
|
uint32_t current;
|
|
uint32_t alarm_occ,alarm_ocd1;
|
|
|
|
if(bmsMem.packCurrent >=0)
|
|
{
|
|
current = bmsMem.packCurrent;
|
|
}
|
|
else
|
|
{
|
|
current = -bmsMem.packCurrent;
|
|
}
|
|
alarm_occ = paraMem.alarm_occ * 1000;
|
|
alarm_ocd1 = paraMem.alarm_ocd1 * 1000;
|
|
|
|
|
|
//充电过流告警释放
|
|
if((bmsMem.bStatus3 & BIT12) != 0)
|
|
{
|
|
if(current <= alarm_occ)
|
|
{
|
|
if(((current <= alarm_occ) && (bCHGING == 1)) || (bmsMem.packCurrent < -2000)) //特殊解除项:放电电流>2A
|
|
{
|
|
occr_alarmcount++;
|
|
if(occr_alarmcount > 3)
|
|
{
|
|
bmsMem.bStatus3 &= ~BIT12;
|
|
occr_alarmcount = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
occr_alarmcount = 0;
|
|
}
|
|
|
|
//[定时恢复]
|
|
if(bmsMem.mcu_ocr_t != 0xFF) // 255 - 不自动恢复
|
|
{
|
|
occr_alarmcount2++;
|
|
if(occr_alarmcount2 > bmsMem.mcu_ocr_t)
|
|
{
|
|
bmsMem.bStatus3 &= ~BIT12;
|
|
occr_alarmcount2 = 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
//放电过流1告警释放
|
|
if((bmsMem.bStatus3 & BIT13) != 0)
|
|
{
|
|
if(current <= alarm_ocd1)
|
|
{
|
|
if(((current <= alarm_ocd1) && (bDSGING == 1)) || (bmsMem.packCurrent > 2000)) //特殊解除项:充电电流>2A
|
|
{
|
|
ocd1r_alarmcount++;
|
|
if(ocd1r_alarmcount > 3)
|
|
{
|
|
bmsMem.bStatus3 &= ~BIT13;
|
|
ocd1r_alarmcount = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
ocd1r_alarmcount = 0;
|
|
}
|
|
|
|
//[定时恢复]
|
|
if(bmsMem.mcu_ocr_t != 0xFF) // 255 - 不自动恢复
|
|
{
|
|
ocd1r_alarmcount2++;
|
|
if(ocd1r_alarmcount2 > bmsMem.mcu_ocr_t)
|
|
{
|
|
bmsMem.bStatus3 &= ~BIT13;
|
|
ocd1r_alarmcount2 = 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//电流的保护
|
|
void Trigger_CurProtect(void)
|
|
{
|
|
uint32_t current;
|
|
uint32_t occ,ocd;
|
|
|
|
if(bmsMem.packCurrent >=0)
|
|
{
|
|
current = bmsMem.packCurrent;
|
|
}
|
|
else
|
|
{
|
|
current = -bmsMem.packCurrent;
|
|
}
|
|
|
|
occ = bmsMem.mcu_occ * 1000;
|
|
ocd = bmsMem.mcu_ocd * 1000;
|
|
|
|
|
|
//充电过流
|
|
if((bmsMem.temperaStatus & BIT4) == 0)
|
|
{
|
|
if((current > occ) && (bCHGING==1))
|
|
{
|
|
occ_count++;
|
|
if(occ_count > bmsMem.mcu_occ_t)
|
|
{
|
|
bmsMem.temperaStatus |= BIT4;
|
|
occ_count = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
occ_count = 0;
|
|
}
|
|
}
|
|
//放电过流1
|
|
if((bmsMem.temperaStatus & BIT5) == 0)
|
|
{
|
|
if((current > ocd) && (bDSGING==1))
|
|
{
|
|
ocd_count++;
|
|
if(ocd_count > bmsMem.mcu_ocd_t)
|
|
{
|
|
bmsMem.temperaStatus |= BIT5;
|
|
ocd_count = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
ocd_count = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
//电流的保护释放
|
|
void Release_CurProtect(void)
|
|
{
|
|
uint8_t scr_t = (bmsMem.ee_most_ocrt_pft >> 2) & 0x03; //取bit2-3
|
|
if(scr_t == 0) scr_t = 8;
|
|
else if(scr_t == 1) scr_t = 16;
|
|
else if(scr_t == 2) scr_t = 32;
|
|
else if(scr_t == 3) scr_t = 64;
|
|
|
|
//短路保护自恢复
|
|
if(((bmsMem.bStatus1 & BIT5) != 0) && (sc_close_flag == 0))
|
|
{
|
|
scr_count++;
|
|
if(scr_count > scr_t)
|
|
{
|
|
sc_close_flag = 1;
|
|
scr_count = 0;
|
|
}
|
|
}
|
|
//充电过流/放电过流1/放电过流2保护释放[定时恢复]
|
|
if(((bmsMem.temperaStatus & BIT4) != 0) || ((bmsMem.temperaStatus & BIT5) != 0) || ((bmsMem.bStatus1 & BIT10) != 0))
|
|
{
|
|
if(bmsMem.mcu_ocr_t != 0xFF) // 255 - 不自动恢复
|
|
{
|
|
ocr_count++;
|
|
if(ocr_count > bmsMem.mcu_ocr_t)
|
|
{
|
|
//充电过流释放
|
|
bmsMem.temperaStatus &= ~BIT4;
|
|
//放电过流1释放
|
|
bmsMem.temperaStatus &= ~BIT5;
|
|
//放电过流2释放
|
|
bmsMem.bStatus1 &= ~BIT10;
|
|
|
|
ocr_count = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
//充电过流保护释放[放电解除]
|
|
if((bmsMem.temperaStatus & BIT4) != 0)
|
|
{
|
|
if(bmsMem.packCurrent < -2000) //特殊解除项:充电电流>2A
|
|
{
|
|
//充电过流释放
|
|
bmsMem.temperaStatus &= ~BIT4;
|
|
}
|
|
}
|
|
//放电过流1保护释放[充电解除]
|
|
if((bmsMem.temperaStatus & BIT5) != 0)
|
|
{
|
|
if(bmsMem.packCurrent > 2000) //特殊解除项:充电电流>2A
|
|
{
|
|
//放电过流1释放
|
|
bmsMem.temperaStatus &= ~BIT5;
|
|
}
|
|
}
|
|
//放电过流2保护释放[充电解除]
|
|
if((bmsMem.bStatus1 & BIT10) != 0)
|
|
{
|
|
if(bmsMem.packCurrent > 2000) //特殊解除项:充电电流>2A
|
|
{
|
|
//放电过流2释放
|
|
bmsMem.bStatus1 &= ~BIT10;
|
|
}
|
|
}
|
|
}
|
|
|
|
//电流保护的次数超限锁定
|
|
void Trigger_CurProtectLock(void)
|
|
{
|
|
// //充电过流保护出现
|
|
// if((bmsMem.temperaStatus & BIT4) != 0)
|
|
// {
|
|
// //刚出现时
|
|
// if(occ_OccurFlag == 0)
|
|
// {
|
|
// occ_OccurFlag = 1;
|
|
//
|
|
// //分析是否满足锁定条件
|
|
// if(occ_RepeatFlag == 0) //此前并未连续出现
|
|
// {
|
|
// occ_RepeatFlag = 1; //“充电过流保护60s内出现过”的标志,用于在消失后的计时判断
|
|
// }
|
|
// else
|
|
// {
|
|
// occ_RepeatCount++; //充电过流保护持续60s不出现的话,occ_OccurFlag会置0,所以这时候存在值1,说明是在60s内出现的,计数次数+1
|
|
// }
|
|
//
|
|
// if(occ_RepeatCount+1 >= 10) //当计数达到9时(即连续发生了十次充电过流保护),直接锁定,“充电过流保护”持续显示,持续关闭MOS
|
|
// {
|
|
// occ_RepeatCount = 0;
|
|
// bmsMem.balanceStatus |= BIT10; //充电过流保护锁定启用,只有重启和写MOS控制可清零
|
|
// }
|
|
// }
|
|
// }
|
|
// //充电过流保护消失
|
|
// else
|
|
// {
|
|
// occ_OccurFlag = 0;
|
|
//
|
|
// //充电过流保护出现后又消失,若在60s内监测到充电过流保护不开启则计数恢复0,否则计数+1
|
|
// if(occ_RepeatFlag == 1)
|
|
// {
|
|
// occ_RepeatTime++;
|
|
// if(occ_RepeatTime > 60) //持续60s
|
|
// {
|
|
// occ_RepeatFlag = 0; //“充电过流保护60s内出现过”的标志置0
|
|
// occ_RepeatCount = 0; //连续出现计数清零
|
|
// occ_RepeatTime = 0; //倒计时清零
|
|
// }
|
|
// }
|
|
// else
|
|
// {
|
|
// occ_RepeatTime = 0;
|
|
// }
|
|
// }
|
|
//
|
|
// //放电过流1保护出现
|
|
// if((bmsMem.temperaStatus & BIT5) != 0)
|
|
// {
|
|
// //刚出现时
|
|
// if(ocd1_OccurFlag == 0)
|
|
// {
|
|
// ocd1_OccurFlag = 1;
|
|
//
|
|
// //分析是否满足锁定条件
|
|
// if(ocd1_RepeatFlag == 0) //此前并未连续出现
|
|
// {
|
|
// ocd1_RepeatFlag = 1; //“放电过流1保护60s内出现过”的标志,用于在消失后的计时判断
|
|
// }
|
|
// else
|
|
// {
|
|
// ocd1_RepeatCount++; //放电过流1保护持续60s不出现的话,ocd1_OccurFlag会置0,所以这时候存在值1,说明是在60s内出现的,计数次数+1
|
|
// }
|
|
//
|
|
// if(ocd1_RepeatCount+1 >= 10) //当计数达到9时(即连续发生了十次放电过流1保护),直接锁定,“放电过流1保护”持续显示,持续关闭MOS
|
|
// {
|
|
// ocd1_RepeatCount = 0;
|
|
// bmsMem.balanceStatus |= BIT9; //放电过流1保护锁定启用,只有重启和写MOS控制可清零
|
|
// }
|
|
// }
|
|
// }
|
|
// //放电过流1保护消失
|
|
// else
|
|
// {
|
|
// ocd1_OccurFlag = 0;
|
|
//
|
|
// //放电过流1保护出现后又消失,若在60s内监测到放电过流1保护不开启则计数恢复0,否则计数+1
|
|
// if(ocd1_RepeatFlag == 1)
|
|
// {
|
|
// ocd1_RepeatTime++;
|
|
// if(ocd1_RepeatTime > 60) //持续60s
|
|
// {
|
|
// ocd1_RepeatFlag = 0; //“放电过流1保护60s内出现过”的标志置0
|
|
// ocd1_RepeatCount = 0; //连续出现计数清零
|
|
// ocd1_RepeatTime = 0; //倒计时清零
|
|
// }
|
|
// }
|
|
// else
|
|
// {
|
|
// ocd1_RepeatTime = 0;
|
|
// }
|
|
// }
|
|
//
|
|
// //放电过流2保护出现
|
|
// if((bmsMem.bStatus1 & BIT10) != 0)
|
|
// {
|
|
// //刚出现时
|
|
// if(ocd2_OccurFlag == 0)
|
|
// {
|
|
// ocd2_OccurFlag = 1;
|
|
//
|
|
// //分析是否满足锁定条件
|
|
// if(ocd2_RepeatFlag == 0) //此前并未连续出现
|
|
// {
|
|
// ocd2_RepeatFlag = 1; //“放电过流2保护60s内出现过”的标志,用于在消失后的计时判断
|
|
// }
|
|
// else
|
|
// {
|
|
// ocd2_RepeatCount++; //放电过流2保护持续60s不出现的话,ocd2_OccurFlag会置0,所以这时候存在值1,说明是在60s内出现的,计数次数+1
|
|
// }
|
|
//
|
|
// if(ocd2_RepeatCount+1 >= 3) //当计数达到2时(即连续发生了三次放电过流2保护),直接锁定,“放电过流2保护”持续显示,持续关闭MOS
|
|
// {
|
|
// ocd2_RepeatCount = 0;
|
|
// bmsMem.balanceStatus |= BIT8; //放电过流2保护锁定启用,只有重启和写MOS控制可清零
|
|
// }
|
|
// }
|
|
// }
|
|
// //放电过流2保护消失
|
|
// else
|
|
// {
|
|
// ocd2_OccurFlag = 0;
|
|
//
|
|
// //放电过流2保护出现后又消失,若在60s内监测到放电过流2保护不开启则计数恢复0,否则计数+1
|
|
// if(ocd2_RepeatFlag == 1)
|
|
// {
|
|
// ocd2_RepeatTime++;
|
|
// if(ocd2_RepeatTime > 60) //持续60s
|
|
// {
|
|
// ocd2_RepeatFlag = 0; //“放电过流2保护60s内出现过”的标志置0
|
|
// ocd2_RepeatCount = 0; //连续出现计数清零
|
|
// ocd2_RepeatTime = 0; //倒计时清零
|
|
// }
|
|
// }
|
|
// else
|
|
// {
|
|
// ocd2_RepeatTime = 0;
|
|
// }
|
|
// }
|
|
|
|
//浪涌短路和真短路,与预充相关,次数计算在别处执行
|
|
}
|
|
|
|
//电芯温度的告警
|
|
void Trigger_mcuTAlarm(void)
|
|
{
|
|
uint16_t alarm_otc,alarm_utc,alarm_otd,alarm_utd;
|
|
|
|
alarm_otc = paraMem.alarm_mcu_otc * 10 + 2731;
|
|
alarm_utc = paraMem.alarm_mcu_utc * 10 + 2731;
|
|
alarm_otd = paraMem.alarm_mcu_otd * 10 + 2731;
|
|
alarm_utd = paraMem.alarm_mcu_utd * 10 + 2731;
|
|
|
|
if(bmsMem.packCurrent > (-500)) //非放电状态下
|
|
{
|
|
//电芯充电高温告警
|
|
if((bmsMem.bStatus2 & BIT12) == 0)
|
|
{
|
|
if(TemperatureMax > alarm_otc)
|
|
{
|
|
mcuotc_alarmcount++;
|
|
if(mcuotc_alarmcount > 3)
|
|
{
|
|
bmsMem.bStatus2 |= BIT12;
|
|
mcuotc_alarmcount = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
mcuotc_alarmcount = 0;
|
|
}
|
|
}
|
|
|
|
//电芯充电低温告警
|
|
if((bmsMem.bStatus2 & BIT14) == 0)
|
|
{
|
|
if(TemperatureMin < alarm_utc)
|
|
{
|
|
mcuutc_alarmcount++;
|
|
if(mcuutc_alarmcount > 3)
|
|
{
|
|
bmsMem.bStatus2 |= BIT14;
|
|
mcuutc_alarmcount = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
mcuutc_alarmcount = 0;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
bmsMem.bStatus2 &= ~BIT12;
|
|
bmsMem.bStatus2 &= ~BIT14;
|
|
}
|
|
|
|
if(bmsMem.packCurrent < 500) //非充电状态下
|
|
{
|
|
//电芯放电高温告警
|
|
if((bmsMem.bStatus2 & BIT13) == 0)
|
|
{
|
|
if(TemperatureMax > alarm_otd)
|
|
{
|
|
mcuotd_alarmcount++;
|
|
if(mcuotd_alarmcount > 3)
|
|
{
|
|
bmsMem.bStatus2 |= BIT13;
|
|
mcuotd_alarmcount = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
mcuotd_alarmcount = 0;
|
|
}
|
|
}
|
|
|
|
//电芯放电低温告警
|
|
if((bmsMem.bStatus2 & BIT15) == 0)
|
|
{
|
|
if(TemperatureMin < alarm_utd)
|
|
{
|
|
mcuutd_alarmcount++;
|
|
if(mcuutd_alarmcount > 3)
|
|
{
|
|
bmsMem.bStatus2 |= BIT15;
|
|
mcuutd_alarmcount = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
mcuutd_alarmcount = 0;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
bmsMem.bStatus2 &= ~BIT13;
|
|
bmsMem.bStatus2 &= ~BIT15;
|
|
}
|
|
}
|
|
|
|
//电芯温度的告警释放
|
|
void Release_mcuTAlarm(void)
|
|
{
|
|
uint16_t otcr,utcr,otdr,utdr;
|
|
|
|
otcr = bmsMem.mcu_otcr * 10 + 2731;
|
|
utcr = bmsMem.mcu_utcr * 10 + 2731;
|
|
otdr = bmsMem.mcu_otdr * 10 + 2731;
|
|
utdr = bmsMem.mcu_utdr * 10 + 2731;
|
|
|
|
|
|
//电芯充电高温告警恢复判断
|
|
if((bmsMem.bStatus2 & BIT12) != 0)
|
|
{
|
|
if(TemperatureMax <= otcr)
|
|
{
|
|
mcuotcr_alarmcount++;
|
|
if(mcuotcr_alarmcount > 3)
|
|
{
|
|
bmsMem.bStatus2 &= ~BIT12;
|
|
mcuotcr_alarmcount = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
mcuotcr_alarmcount = 0;
|
|
}
|
|
}
|
|
|
|
//电芯充电低温告警恢复判断
|
|
if((bmsMem.bStatus2 & BIT14) != 0)
|
|
{
|
|
if(TemperatureMin >= utcr)
|
|
{
|
|
mcuutcr_alarmcount++;
|
|
if(mcuutcr_alarmcount > 3)
|
|
{
|
|
bmsMem.bStatus2 &= ~BIT14;
|
|
mcuutcr_alarmcount = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
mcuutcr_alarmcount = 0;
|
|
}
|
|
}
|
|
|
|
//电芯放电高温告警恢复判断
|
|
if((bmsMem.bStatus2 & BIT13) != 0)
|
|
{
|
|
if(TemperatureMax <= otdr)
|
|
{
|
|
mcuotdr_alarmcount++;
|
|
if(mcuotdr_alarmcount > 3)
|
|
{
|
|
bmsMem.bStatus2 &= ~BIT13;
|
|
mcuotdr_alarmcount = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
mcuotdr_alarmcount = 0;
|
|
}
|
|
}
|
|
|
|
//电芯放电低温告警恢复判断
|
|
if((bmsMem.bStatus2 & BIT15) != 0)
|
|
{
|
|
if(TemperatureMin >= utdr)
|
|
{
|
|
mcuutdr_alarmcount++;
|
|
if(mcuutdr_alarmcount > 3)
|
|
{
|
|
bmsMem.bStatus2 &= ~BIT15;
|
|
mcuutdr_alarmcount = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
mcuutdr_alarmcount = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
//电芯温度的保护
|
|
void Trigger_mcuTProtect(void)
|
|
{
|
|
uint16_t otc,utc,otd,utd;
|
|
|
|
otc = bmsMem.mcu_otc * 10 + 2731;
|
|
utc = bmsMem.mcu_utc * 10 + 2731;
|
|
otd = bmsMem.mcu_otd * 10 + 2731;
|
|
utd = bmsMem.mcu_utd * 10 + 2731;
|
|
|
|
|
|
if(bmsMem.packCurrent > (-500)) //非放电状态下
|
|
{
|
|
//充电高温保护
|
|
if((bmsMem.temperaStatus & BIT0) == 0) // 没有发生充电高温保护
|
|
{
|
|
if(TemperatureMax > otc)
|
|
{
|
|
chg_htp_count++;
|
|
if(chg_htp_count > 3)
|
|
{
|
|
bmsMem.temperaStatus |= BIT0; //连续发生过温,保护
|
|
chg_htp_count = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
chg_htp_count = 0;
|
|
}
|
|
}
|
|
|
|
//充电低温保护
|
|
if((bmsMem.temperaStatus & BIT2) == 0) // 没有发生充电低温保护
|
|
{
|
|
#if DO2_Warm
|
|
if((TemperatureMin < utc) && (bCHGING == 1))
|
|
#else
|
|
if(TemperatureMin < utc)
|
|
#endif
|
|
{
|
|
chg_ltp_count++;
|
|
if(chg_ltp_count > 3)
|
|
{
|
|
bmsMem.temperaStatus |= BIT2; //连续发生低温,保护
|
|
chg_ltp_count = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
chg_ltp_count = 0;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
bmsMem.temperaStatus &= ~BIT0;
|
|
bmsMem.temperaStatus &= ~BIT2;
|
|
}
|
|
|
|
if(bmsMem.packCurrent < 500) //非充电状态下
|
|
{
|
|
//放电高温保护
|
|
if((bmsMem.temperaStatus & BIT1) == 0) // 没有发生放电高温保护
|
|
{
|
|
if(TemperatureMax > otd)
|
|
{
|
|
dsg_htp_count++;
|
|
if(dsg_htp_count > 3)
|
|
{
|
|
bmsMem.temperaStatus |= BIT1; //连续发生过温,保护
|
|
dsg_htp_count = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
dsg_htp_count = 0;
|
|
}
|
|
}
|
|
|
|
//放电低温保护
|
|
if((bmsMem.temperaStatus & BIT3) == 0) // 没有发生放电低温保护
|
|
{
|
|
if(TemperatureMin < utd)
|
|
{
|
|
dsg_ltp_count++;
|
|
if(dsg_ltp_count > 3)
|
|
{
|
|
bmsMem.temperaStatus |= BIT3; //连续发生低温,保护
|
|
dsg_ltp_count = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
dsg_ltp_count = 0;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
bmsMem.temperaStatus &= ~BIT1;
|
|
bmsMem.temperaStatus &= ~BIT3;
|
|
}
|
|
}
|
|
|
|
//电芯温度的保护释放
|
|
void Release_mcuTProtect(void)
|
|
{
|
|
uint16_t otcr,utcr,otdr,utdr;
|
|
|
|
otcr = bmsMem.mcu_otcr * 10 + 2731;
|
|
utcr = bmsMem.mcu_utcr * 10 + 2731;
|
|
otdr = bmsMem.mcu_otdr * 10 + 2731;
|
|
utdr = bmsMem.mcu_utdr * 10 + 2731;
|
|
|
|
|
|
//充电高温保护释放
|
|
if((bmsMem.temperaStatus & BIT0) != 0) // 发生充电高温保护
|
|
{
|
|
if(TemperatureMax < otcr)
|
|
{
|
|
chg_htpr_count++;
|
|
if(chg_htpr_count > 3)
|
|
{
|
|
bmsMem.temperaStatus &= ~BIT0;
|
|
chg_htpr_count = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
chg_htpr_count = 0;
|
|
}
|
|
}
|
|
|
|
//充电低温保护释放
|
|
if((bmsMem.temperaStatus & BIT2) != 0) // 发生充电低温保护
|
|
{
|
|
if(TemperatureMin > utcr)
|
|
{
|
|
chg_ltpr_count++;
|
|
if(chg_ltpr_count > 3)
|
|
{
|
|
bmsMem.temperaStatus &= ~BIT2;
|
|
chg_ltpr_count = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
chg_ltpr_count = 0;
|
|
}
|
|
}
|
|
|
|
//放电高温保护释放
|
|
if((bmsMem.temperaStatus & BIT1) != 0) // 发生放电高温保护
|
|
{
|
|
if(TemperatureMax < otdr)
|
|
{
|
|
dsg_htpr_count++;
|
|
if(dsg_htpr_count > 3)
|
|
{
|
|
bmsMem.temperaStatus &= ~BIT1; //连续发生过温,保护
|
|
dsg_htpr_count = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
dsg_htpr_count = 0;
|
|
}
|
|
}
|
|
|
|
//放电低温保护释放
|
|
if((bmsMem.temperaStatus & BIT3) != 0) // 发生放电低温保护
|
|
{
|
|
if(TemperatureMin > utdr)
|
|
{
|
|
dsg_ltpr_count++;
|
|
if(dsg_ltpr_count > 3)
|
|
{
|
|
bmsMem.temperaStatus &= ~BIT3;
|
|
dsg_ltpr_count = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
dsg_ltpr_count = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
//环境温度的告警
|
|
void Trigger_amTAlarm(void)
|
|
{
|
|
uint16_t alarm_otc,alarm_utc,alarm_otd,alarm_utd;
|
|
|
|
//针对bmsMem.afe_T3,进行环境温度告警和告警释放
|
|
alarm_otc = paraMem.alarm_am_otc * 10 + 2731;
|
|
alarm_utc = paraMem.alarm_am_utc * 10 + 2731;
|
|
alarm_otd = paraMem.alarm_am_otd * 10 + 2731;
|
|
alarm_utd = paraMem.alarm_am_utd * 10 + 2731;
|
|
|
|
if(bmsMem.packCurrent > (-500)) //非放电状态下
|
|
{
|
|
//环境充电高温告警
|
|
if((bmsMem.temperaStatus & BIT12) == 0)
|
|
{
|
|
if(bmsMem.afe_T3 > alarm_otc)
|
|
{
|
|
am_otc_alarmcount++;
|
|
if(am_otc_alarmcount > 3)
|
|
{
|
|
bmsMem.temperaStatus |= BIT12;
|
|
am_otc_alarmcount = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
am_otc_alarmcount = 0;
|
|
}
|
|
}
|
|
|
|
//环境充电低温告警
|
|
if((bmsMem.temperaStatus & BIT14) == 0)
|
|
{
|
|
if(bmsMem.afe_T3 < alarm_utc)
|
|
{
|
|
am_utc_alarmcount++;
|
|
if(am_utc_alarmcount > 3)
|
|
{
|
|
bmsMem.temperaStatus |= BIT14;
|
|
am_utc_alarmcount = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
am_utc_alarmcount = 0;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
bmsMem.temperaStatus &= ~BIT12;
|
|
bmsMem.temperaStatus &= ~BIT14;
|
|
}
|
|
|
|
if(bmsMem.packCurrent < 500) //非充电状态下
|
|
{
|
|
//环境放电高温告警
|
|
if((bmsMem.temperaStatus & BIT13) == 0) // 没有发生放电高温保护
|
|
{
|
|
if(bmsMem.afe_T3 > alarm_otd)
|
|
{
|
|
am_otd_alarmcount++;
|
|
if(am_otd_alarmcount > 3)
|
|
{
|
|
bmsMem.temperaStatus |= BIT13; //连续发生过温,保护
|
|
am_otd_alarmcount = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
am_otd_alarmcount = 0;
|
|
}
|
|
}
|
|
|
|
//环境放电低温告警
|
|
if((bmsMem.temperaStatus & BIT15) == 0) // 没有发生放电低温保护
|
|
{
|
|
if(bmsMem.afe_T3 < alarm_utd)
|
|
{
|
|
am_utd_alarmcount++;
|
|
if(am_utd_alarmcount > 3)
|
|
{
|
|
bmsMem.temperaStatus |= BIT15; //连续发生低温,保护
|
|
am_utd_alarmcount = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
am_utd_alarmcount = 0;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
bmsMem.temperaStatus &= ~BIT13;
|
|
bmsMem.temperaStatus &= ~BIT15;
|
|
}
|
|
}
|
|
|
|
//环境温度的告警释放
|
|
void Release_amTAlarm(void)
|
|
{
|
|
uint16_t otcr,utcr,otdr,utdr;
|
|
|
|
otcr = paraMem.am_otcr * 10 + 2731;
|
|
utcr = paraMem.am_utcr * 10 + 2731;
|
|
otdr = paraMem.am_otdr * 10 + 2731;
|
|
utdr = paraMem.am_utdr * 10 + 2731;
|
|
|
|
|
|
//环境充电高温告警
|
|
if((bmsMem.temperaStatus & BIT12) !=0)
|
|
{
|
|
if(bmsMem.afe_T3 <= otcr)
|
|
{
|
|
am_otcr_alarmcount++;
|
|
if(am_otcr_alarmcount > 3)
|
|
{
|
|
bmsMem.temperaStatus &= ~BIT12;
|
|
am_otcr_alarmcount = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
am_otcr_alarmcount = 0;
|
|
}
|
|
}
|
|
|
|
//环境充电低温告警
|
|
if((bmsMem.temperaStatus & BIT14) !=0)
|
|
{
|
|
if(bmsMem.afe_T3 >= utcr)
|
|
{
|
|
am_utcr_alarmcount++;
|
|
if(am_utcr_alarmcount > 3)
|
|
{
|
|
bmsMem.temperaStatus &= ~BIT14;
|
|
am_utcr_alarmcount = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
am_utcr_alarmcount = 0;
|
|
}
|
|
}
|
|
|
|
//环境放电高温告警
|
|
if((bmsMem.temperaStatus & BIT13) !=0) // 没有发生放电高温保护
|
|
{
|
|
if(bmsMem.afe_T3 <= otdr)
|
|
{
|
|
am_otdr_alarmcount++;
|
|
if(am_otdr_alarmcount > 3)
|
|
{
|
|
bmsMem.temperaStatus &= ~BIT13; //连续发生过温,保护
|
|
am_otdr_alarmcount = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
am_otdr_alarmcount = 0;
|
|
}
|
|
}
|
|
|
|
//环境放电低温告警
|
|
if((bmsMem.temperaStatus & BIT15) !=0) // 没有发生放电低温保护
|
|
{
|
|
if(bmsMem.afe_T3 >= utdr)
|
|
{
|
|
am_utdr_alarmcount++;
|
|
if(am_utdr_alarmcount > 3)
|
|
{
|
|
bmsMem.temperaStatus &= ~BIT15; //连续发生低温,保护
|
|
am_utdr_alarmcount = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
am_utdr_alarmcount = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
//环境温度的保护
|
|
void Trigger_amTProtect(void)
|
|
{
|
|
uint16_t otc,utc,otd,utd;
|
|
|
|
otc = paraMem.am_otc * 10 + 2731;
|
|
utc = paraMem.am_utc * 10 + 2731;
|
|
otd = paraMem.am_otd * 10 + 2731;
|
|
utd = paraMem.am_utd * 10 + 2731;
|
|
|
|
if(bmsMem.packCurrent > (-500)) //非放电状态下
|
|
{
|
|
//充电高温保护
|
|
if((bmsMem.temperaStatus & BIT8) == 0) // 没有发生充电高温保护
|
|
{
|
|
if(bmsMem.afe_T3 > otc)
|
|
{
|
|
am_otc_count++;
|
|
if(am_otc_count > 3)
|
|
{
|
|
bmsMem.temperaStatus |= BIT8;
|
|
am_otc_count = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
am_otc_count = 0;
|
|
}
|
|
}
|
|
|
|
//充电低温保护
|
|
if((bmsMem.temperaStatus & BIT10) == 0) // 没有发生充电低温保护
|
|
{
|
|
if(bmsMem.afe_T3 < utc)
|
|
{
|
|
am_utc_count++;
|
|
if(am_utc_count > 3)
|
|
{
|
|
bmsMem.temperaStatus |= BIT10;
|
|
am_utc_count = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
am_utc_count = 0;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
bmsMem.temperaStatus &= ~BIT8;
|
|
bmsMem.temperaStatus &= ~BIT10;
|
|
}
|
|
|
|
if(bmsMem.packCurrent < 500) //非充电状态下
|
|
{
|
|
//放电高温保护
|
|
if((bmsMem.temperaStatus & BIT9) == 0) // 没有发生放电高温保护
|
|
{
|
|
if(bmsMem.afe_T3 > otd)
|
|
{
|
|
am_otd_count++;
|
|
if(am_otd_count > 3)
|
|
{
|
|
bmsMem.temperaStatus |= BIT9;
|
|
am_otd_count = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
am_otd_count = 0;
|
|
}
|
|
}
|
|
|
|
//放电低温保护
|
|
if((bmsMem.temperaStatus & BIT11) == 0) // 没有发生放电低温保护
|
|
{
|
|
if(bmsMem.afe_T3 < utd)
|
|
{
|
|
am_utd_count++;
|
|
if(am_utd_count > 3)
|
|
{
|
|
bmsMem.temperaStatus |= BIT11;
|
|
am_utd_count = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
am_utd_count = 0;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
bmsMem.temperaStatus &= ~BIT9;
|
|
bmsMem.temperaStatus &= ~BIT11;
|
|
}
|
|
}
|
|
|
|
//环境温度的保护释放
|
|
void Release_amTProtect(void)
|
|
{
|
|
uint16_t otcr,utcr,otdr,utdr;
|
|
|
|
otcr = paraMem.am_otcr * 10 + 2731;
|
|
utcr = paraMem.am_utcr * 10 + 2731;
|
|
otdr = paraMem.am_otdr * 10 + 2731;
|
|
utdr = paraMem.am_utdr * 10 + 2731;
|
|
|
|
|
|
//充电高温保护释放
|
|
if((bmsMem.temperaStatus & BIT8) != 0) // 发生充电高温保护
|
|
{
|
|
if(bmsMem.afe_T3 < otcr)
|
|
{
|
|
am_otcr_count++;
|
|
if(am_otcr_count > 3)
|
|
{
|
|
bmsMem.temperaStatus &= ~BIT8;
|
|
am_otcr_count = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
am_otcr_count = 0;
|
|
}
|
|
}
|
|
|
|
//充电低温保护释放
|
|
if((bmsMem.temperaStatus & BIT10) != 0) // 发生充电低温保护
|
|
{
|
|
if(bmsMem.afe_T3 > utcr)
|
|
{
|
|
am_utcr_count++;
|
|
if(am_utcr_count > 3)
|
|
{
|
|
bmsMem.temperaStatus &= ~BIT10;
|
|
am_utcr_count = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
am_utcr_count = 0;
|
|
}
|
|
}
|
|
|
|
//放电高温保护释放
|
|
if((bmsMem.temperaStatus & BIT9) != 0) // 发生放电高温保护
|
|
{
|
|
if(bmsMem.afe_T3 < otdr)
|
|
{
|
|
am_otdr_count++;
|
|
if(am_otdr_count > 3)
|
|
{
|
|
bmsMem.temperaStatus &= ~BIT9;
|
|
am_otdr_count = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
am_otdr_count = 0;
|
|
}
|
|
}
|
|
|
|
//放电低温保护释放
|
|
if((bmsMem.temperaStatus & BIT11) != 0) // 发生放电低温保护
|
|
{
|
|
if(bmsMem.afe_T3 > utdr)
|
|
{
|
|
am_utdr_count++;
|
|
if(am_utdr_count > 3)
|
|
{
|
|
bmsMem.temperaStatus &= ~BIT11;
|
|
am_utdr_count = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
am_utdr_count = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
//MOS温度的告警
|
|
void Trigger_afeTAlarm(void)
|
|
{
|
|
uint16_t alarm_afe_otc; //,alarm_afe_utc;
|
|
uint16_t alarm_afe_otd; //,alarm_afe_utd;
|
|
|
|
alarm_afe_otc = paraMem.alarm_afe_otc * 10 + 2731;
|
|
//alarm_afe_utc = paraMem.alarm_afe_utc * 10 + 2731;
|
|
alarm_afe_otd = paraMem.alarm_afe_otd * 10 + 2731;
|
|
//alarm_afe_utd = paraMem.alarm_afe_utd * 10 + 2731;
|
|
|
|
if(bmsMem.packCurrent > (-500)) //非放电状态下
|
|
{
|
|
//MOS充电高温告警
|
|
if((bmsMem.bStatus2 & BIT8) == 0)
|
|
{
|
|
if((bmsMem.afe_T1 > alarm_afe_otc) || (bmsMem.afe_T2 > alarm_afe_otc))
|
|
{
|
|
afeotc_alarmcount++;
|
|
if(afeotc_alarmcount > 3)
|
|
{
|
|
bmsMem.bStatus2 |= BIT8;
|
|
afeotc_alarmcount = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
afeotc_alarmcount = 0;
|
|
}
|
|
}
|
|
|
|
// //MOS充电低温告警
|
|
// if((bmsMem.bStatus2 & BIT10) == 0)
|
|
// {
|
|
// if((bmsMem.afe_T1 < alarm_afe_utc) || (bmsMem.afe_T2 < alarm_afe_utc))
|
|
// {
|
|
// afeutc_alarmcount++;
|
|
// if(afeutc_alarmcount > 3)
|
|
// {
|
|
// bmsMem.bStatus2 |= BIT10;
|
|
// afeutc_alarmcount = 0;
|
|
// }
|
|
// }
|
|
// else
|
|
// {
|
|
// afeutc_alarmcount = 0;
|
|
// }
|
|
// }
|
|
}
|
|
else
|
|
{
|
|
bmsMem.bStatus2 &= ~BIT8;
|
|
// bmsMem.bStatus2 &= ~BIT10;
|
|
}
|
|
|
|
if(bmsMem.packCurrent < 500) //非充电状态下
|
|
{
|
|
//MOS放电高温告警
|
|
if((bmsMem.bStatus2 & BIT9) == 0) // 没有发生放电高温保护
|
|
{
|
|
if((bmsMem.afe_T1 > alarm_afe_otd) || (bmsMem.afe_T2 > alarm_afe_otd))
|
|
{
|
|
afeotd_alarmcount++;
|
|
if(afeotd_alarmcount > 3)
|
|
{
|
|
bmsMem.bStatus2 |= BIT9; //连续发生过温,保护
|
|
afeotd_alarmcount = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
afeotd_alarmcount = 0;
|
|
}
|
|
}
|
|
|
|
// //MOS放电低温告警
|
|
// if((bmsMem.bStatus2 & BIT11) == 0) // 没有发生放电低温保护
|
|
// {
|
|
// if((bmsMem.afe_T1 < alarm_afe_utd) || (bmsMem.afe_T2 < alarm_afe_utd))
|
|
// {
|
|
// afeutd_alarmcount++;
|
|
// if(afeutd_alarmcount > 3)
|
|
// {
|
|
// bmsMem.bStatus2 |= BIT11; //连续发生低温,保护
|
|
// afeutd_alarmcount = 0;
|
|
// }
|
|
// }
|
|
// else
|
|
// {
|
|
// afeutd_alarmcount = 0;
|
|
// }
|
|
// }
|
|
}
|
|
else
|
|
{
|
|
bmsMem.bStatus2 &= ~BIT9;
|
|
// bmsMem.bStatus2 &= ~BIT11;
|
|
}
|
|
}
|
|
|
|
//MOS温度的告警释放
|
|
void Release_afeTAlarm(void)
|
|
{
|
|
uint16_t afe_otcr; //,afe_utcr;
|
|
uint16_t afe_otdr; //,afe_utdr;
|
|
|
|
afe_otcr = bmsMem.otcr * 10 + 2731;
|
|
//afe_utcr = bmsMem.utcr * 10 + 2731;
|
|
afe_otdr = bmsMem.otdr * 10 + 2731;
|
|
//afe_utdr = bmsMem.utdr * 10 + 2731;
|
|
|
|
|
|
//MOS充电高温告警恢复
|
|
if((bmsMem.bStatus2 & BIT8) != 0)
|
|
{
|
|
if((bmsMem.afe_T1 <= afe_otcr) && (bmsMem.afe_T2 <= afe_otcr))
|
|
{
|
|
afeotcr_alarmcount++;
|
|
if(afeotcr_alarmcount > 3)
|
|
{
|
|
bmsMem.bStatus2 &= ~BIT8;
|
|
afeotcr_alarmcount = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
afeotcr_alarmcount = 0;
|
|
}
|
|
}
|
|
|
|
// //MOS充电低温告警恢复
|
|
// if((bmsMem.bStatus2 & BIT10) != 0)
|
|
// {
|
|
// if((bmsMem.afe_T1 >= afe_utcr) && (bmsMem.afe_T2 >= afe_utcr))
|
|
// {
|
|
// afeutcr_alarmcount++;
|
|
// if(afeutcr_alarmcount > 3)
|
|
// {
|
|
// bmsMem.bStatus2 &= ~BIT10;
|
|
// afeutcr_alarmcount = 0;
|
|
// }
|
|
// }
|
|
// else
|
|
// {
|
|
// afeutcr_alarmcount = 0;
|
|
// }
|
|
// }
|
|
|
|
//MOS放电高温告警恢复
|
|
if((bmsMem.bStatus2 & BIT9) != 0) // 没有发生放电高温保护
|
|
{
|
|
if((bmsMem.afe_T1 <= afe_otdr) && (bmsMem.afe_T2 <= afe_otdr))
|
|
{
|
|
afeotdr_alarmcount++;
|
|
if(afeotdr_alarmcount > 3)
|
|
{
|
|
bmsMem.bStatus2 &= ~BIT9; //连续发生过温,保护
|
|
afeotdr_alarmcount = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
afeotdr_alarmcount = 0;
|
|
}
|
|
}
|
|
|
|
// //MOS放电低温告警恢复
|
|
// if((bmsMem.bStatus2 & BIT11) != 0) // 没有发生放电低温保护
|
|
// {
|
|
// if((bmsMem.afe_T1 >= afe_utdr) && (bmsMem.afe_T2 >= afe_utdr))
|
|
// {
|
|
// afeutdr_alarmcount++;
|
|
// if(afeutdr_alarmcount > 3)
|
|
// {
|
|
// bmsMem.bStatus2 &= ~BIT11; //连续发生低温,保护
|
|
// afeutdr_alarmcount = 0;
|
|
// }
|
|
// }
|
|
// else
|
|
// {
|
|
// afeutdr_alarmcount = 0;
|
|
// }
|
|
// }
|
|
}
|
|
|
|
//MOS温度的保护
|
|
void Trigger_afeTProtect(void)
|
|
{
|
|
uint16_t afe_otc;
|
|
uint16_t afe_otd;
|
|
|
|
afe_otc = bmsMem.otc * 10 + 2731;
|
|
afe_otd = bmsMem.otd * 10 + 2731;
|
|
|
|
if(bmsMem.packCurrent > (-500)) //非放电状态下
|
|
{
|
|
//MOS充电高温保护
|
|
if((bmsMem.bStatus2 & BIT1) == 0)
|
|
{
|
|
if((bmsMem.afe_T1 > afe_otc) || (bmsMem.afe_T2 > afe_otc))
|
|
{
|
|
afeotc_count++;
|
|
if(afeotc_count > 3)
|
|
{
|
|
bmsMem.bStatus2 |= BIT1;
|
|
afeotc_count = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
afeotc_count = 0;
|
|
}
|
|
}
|
|
// //MOS充电低温保护
|
|
// if((bmsMem.bStatus2 & BIT0) == 0)
|
|
// {
|
|
// if((bmsMem.afe_T1 < afe_utc) || (bmsMem.afe_T2 < afe_utc))
|
|
// {
|
|
// afeutc_count++;
|
|
// if(afeutc_count > 3)
|
|
// {
|
|
// bmsMem.bStatus2 |= BIT0;
|
|
// afeutc_count = 0;
|
|
// }
|
|
// }
|
|
// else
|
|
// {
|
|
// afeutc_count = 0;
|
|
// }
|
|
// }
|
|
}
|
|
else
|
|
{
|
|
bmsMem.bStatus2 &= ~BIT1;
|
|
// bmsMem.bStatus2 &= ~BIT0;
|
|
}
|
|
|
|
if(bmsMem.packCurrent < 500) //非充电状态下
|
|
{
|
|
//MOS放电高温保护
|
|
if((bmsMem.bStatus2 & BIT3) == 0) // 没有发生放电高温保护
|
|
{
|
|
if((bmsMem.afe_T1 > afe_otd) || (bmsMem.afe_T2 > afe_otd))
|
|
{
|
|
afeotd_count++;
|
|
if(afeotd_count > 3)
|
|
{
|
|
bmsMem.bStatus2 |= BIT3; //连续发生过温,保护
|
|
afeotd_count = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
afeotd_count = 0;
|
|
}
|
|
}
|
|
// //MOS放电低温保护
|
|
// if((bmsMem.bStatus2 & BIT2) == 0) // 没有发生放电低温保护
|
|
// {
|
|
// if((bmsMem.afe_T1 < afe_utd) || (bmsMem.afe_T2 < afe_utd))
|
|
// {
|
|
// afeutd_count++;
|
|
// if(afeutd_count > 3)
|
|
// {
|
|
// bmsMem.bStatus2 |= BIT2; //连续发生低温,保护
|
|
// afeutd_count = 0;
|
|
// }
|
|
// }
|
|
// else
|
|
// {
|
|
// afeutd_count = 0;
|
|
// }
|
|
// }
|
|
}
|
|
else
|
|
{
|
|
bmsMem.bStatus2 &= ~BIT3;
|
|
// bmsMem.bStatus2 &= ~BIT2;
|
|
}
|
|
}
|
|
|
|
//MOS温度的保护释放
|
|
void Release_afeTProtect(void)
|
|
{
|
|
uint16_t afe_otcr;
|
|
uint16_t afe_otdr;
|
|
|
|
afe_otcr = bmsMem.otcr * 10 + 2731;
|
|
afe_otdr = bmsMem.otdr * 10 + 2731;
|
|
|
|
|
|
//MOS充电高温保护恢复
|
|
if((bmsMem.bStatus2 & BIT1) != 0)
|
|
{
|
|
if((bmsMem.afe_T1 <= afe_otcr) && (bmsMem.afe_T2 <= afe_otcr))
|
|
{
|
|
afeotcr_count++;
|
|
if(afeotcr_count > 3)
|
|
{
|
|
bmsMem.bStatus2 &= ~BIT1;
|
|
afeotcr_count = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
afeotcr_count = 0;
|
|
}
|
|
}
|
|
|
|
//MOS放电高温保护恢复
|
|
if((bmsMem.bStatus2 & BIT3) != 0) // 没有发生放电高温保护
|
|
{
|
|
if((bmsMem.afe_T1 <= afe_otdr) && (bmsMem.afe_T2 <= afe_otdr))
|
|
{
|
|
afeotdr_count++;
|
|
if(afeotdr_count > 3)
|
|
{
|
|
bmsMem.bStatus2 &= ~BIT3; //连续发生过温,保护
|
|
afeotdr_count = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
afeotdr_count = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
#if LTE_Conn
|
|
//存放事件记录:广泛可用,又防止意外写错
|
|
uint8_t Protect[21] =
|
|
{
|
|
0x20, 0x21, 0x22, 0x23, 0x24, 0x25,
|
|
0x30, 0x31, 0x32, 0x33, 0x34,
|
|
0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49
|
|
};
|
|
|
|
void Write_Change(uint8_t code)
|
|
{
|
|
uint8_t i;
|
|
|
|
staChange_time[staChange_num] = timecount;
|
|
staChange[staChange_num] = code;
|
|
staChange_num++;
|
|
|
|
//确认该次事件的优先级
|
|
incident_DataInf = 1;
|
|
for(i=0;i<21;i++)
|
|
{
|
|
if(code == Protect[i]) //遍历保护
|
|
{
|
|
incident_DataInf = 2;
|
|
}
|
|
}
|
|
|
|
//保存此时的属性,若连续发生多个,只能记住第1个
|
|
//优先级:保护触发>其他
|
|
if((incident_DataFlg < 2) && (incident_DataInf == 2))
|
|
{
|
|
incident_DataFlg = 2;
|
|
LTE_Record_pubData();
|
|
}
|
|
else if((incident_DataFlg < 1) && (incident_DataInf == 1))
|
|
{
|
|
incident_DataFlg = 1;
|
|
LTE_Record_pubData();
|
|
}
|
|
}
|
|
|
|
//事件[发生和释放]的判断与记录
|
|
//code: 记录事件的对应码
|
|
void Check_Change(uint8_t STA_i, uint16_t BIT_n, uint8_t code)
|
|
{
|
|
if((status_Old[STA_i] & BIT_n) == 0)
|
|
{
|
|
if((status_New[STA_i] & BIT_n) != 0) //事件触发,未记录
|
|
{
|
|
status_Old[STA_i] |= BIT_n;
|
|
Write_Change(code);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if((status_New[STA_i] & BIT_n) == 0) //事件消失,恢复标志位
|
|
{
|
|
status_Old[STA_i] &= ~BIT_n;
|
|
Write_Change(code+0x80);
|
|
}
|
|
}
|
|
}
|
|
|
|
//事件[发生]的判断与记录,释放直接释放
|
|
//code: 记录事件的对应码
|
|
void Check_OnlyOn(uint8_t STA_i, uint16_t BIT_n, uint8_t code)
|
|
{
|
|
if((status_Old[STA_i] & BIT_n) == 0)
|
|
{
|
|
if((status_New[STA_i] & BIT_n) != 0) //事件触发,未记录
|
|
{
|
|
status_Old[STA_i] |= BIT_n;
|
|
Write_Change(code);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if((status_New[STA_i] & BIT_n) == 0) //事件消失,恢复标志位
|
|
{
|
|
status_Old[STA_i] &= ~BIT_n;
|
|
}
|
|
}
|
|
}
|
|
|
|
//应上报的状态转变的判断
|
|
void Check_staChange(void)
|
|
{
|
|
//Check_OnlyOn(0, BIT1, 0x01); //充电状态
|
|
//Check_OnlyOn(0, BIT2, 0x02); //放电状态
|
|
Check_Change(0, BIT3, 0x03); //预充状态
|
|
Check_Change(0, BIT4, 0x04); //充电MOS状态
|
|
Check_Change(0, BIT5, 0x05); //放电MOS状态
|
|
//Check_Change(0, BIT6, 0x06); //预充MOS状态
|
|
Check_Change(0, BIT7, 0x07); //充电限流状态
|
|
//Check_Change(0, BIT8, 0x08); //均衡控制状态
|
|
|
|
Check_OnlyOn(1, BIT0, 0x10); //充电过流保护多次锁定
|
|
Check_OnlyOn(1, BIT1, 0x11); //放电过流1保护多次锁定
|
|
Check_OnlyOn(1, BIT2, 0x12); //放电过流2保护多次锁定
|
|
Check_OnlyOn(1, BIT3, 0x13); //浪涌保护多次锁定
|
|
Check_OnlyOn(1, BIT4, 0x14); //短路保护多次锁定
|
|
Check_Change(1, BIT5, 0x15); //充电MOS故障
|
|
Check_Change(1, BIT6, 0x16); //放电MOS故障
|
|
Check_Change(1, BIT7, 0x17); //DO脱扣器功能
|
|
Check_Change(1, BIT8, 0x18); //强制关闭欠压保护功能
|
|
}
|
|
|
|
//应上报的的判断
|
|
void Check_protectChange(void)
|
|
{
|
|
Check_Change(2, BIT0, 0x20); //总体过压保护
|
|
Check_Change(2, BIT1, 0x21); //总体欠压保护
|
|
Check_Change(2, BIT2, 0x22); //单体过压保护
|
|
Check_Change(2, BIT3, 0x23); //单体欠压保护
|
|
Check_OnlyOn(2, BIT4, 0x24); //异常高压保护
|
|
Check_OnlyOn(2, BIT5, 0x25); //低电压禁止充电
|
|
|
|
Check_Change(3, BIT0, 0x30); //充电过流保护
|
|
Check_Change(3, BIT1, 0x31); //放电过流1保护
|
|
Check_Change(3, BIT2, 0x32); //放电过流2保护
|
|
Check_Change(3, BIT3, 0x33); //浪涌保护
|
|
Check_Change(3, BIT4, 0x34); //短路保护
|
|
|
|
Check_Change(4, BIT0, 0x40); //电芯充电高温保护
|
|
Check_Change(4, BIT1, 0x41); //电芯放电高温保护
|
|
Check_Change(4, BIT2, 0x42); //电芯充电低温保护
|
|
Check_Change(4, BIT3, 0x43); //电芯放电低温保护
|
|
Check_Change(4, BIT4, 0x44); //环境充电高温保护
|
|
Check_Change(4, BIT5, 0x45); //环境放电高温保护
|
|
Check_Change(4, BIT6, 0x46); //环境充电低温保护
|
|
Check_Change(4, BIT7, 0x47); //环境放电低温保护
|
|
Check_Change(4, BIT8, 0x48); //MOS充电高温保护
|
|
Check_Change(4, BIT9, 0x49); //MOS放电高温保护
|
|
//Check_Change(4, BIT10, 0x4A); //MOS充电低温保护
|
|
//Check_Change(4, BIT11, 0x4B); //MOS放电低温保护
|
|
}
|
|
|
|
//应上报的报警的判断
|
|
void Check_warningChange(void)
|
|
{
|
|
// Check_Change(5, BIT0, 0x50); //总体过压报警
|
|
// Check_Change(5, BIT1, 0x51); //总体欠压报警
|
|
// Check_Change(5, BIT2, 0x52); //单体过压报警
|
|
// Check_Change(5, BIT3, 0x53); //单体欠压报警
|
|
//
|
|
// Check_Change(6, BIT0, 0x60); //充电过流报警
|
|
// Check_Change(6, BIT1, 0x61); //放电过流报警
|
|
//
|
|
// Check_Change(7, BIT0, 0x70); //电芯充电高温报警
|
|
// Check_Change(7, BIT1, 0x71); //电芯放电高温报警
|
|
// Check_Change(7, BIT2, 0x72); //电芯充电低温报警
|
|
// Check_Change(7, BIT3, 0x73); //电芯放电低温报警
|
|
// Check_Change(7, BIT4, 0x74); //环境充电高温报警
|
|
// Check_Change(7, BIT5, 0x75); //环境放电高温报警
|
|
// Check_Change(7, BIT6, 0x76); //环境充电低温报警
|
|
// Check_Change(7, BIT7, 0x77); //环境放电低温报警
|
|
// Check_Change(7, BIT8, 0x78); //MOS充电高温报警
|
|
// Check_Change(7, BIT9, 0x79); //MOS放电高温报警
|
|
// //Check_Change(7, BIT10, 0x7A); //MOS充电低温报警
|
|
// //Check_Change(7, BIT11, 0x7B); //MOS放电低温报警
|
|
}
|
|
|
|
//应上报的告警/保护/故障/加热/状态,转变的判断 每1s执行1次
|
|
void Check_eventChange(void)
|
|
{
|
|
//清零
|
|
NomalStatus = 0;
|
|
SpecialStatus = 0;
|
|
Protect_Vol = 0;
|
|
Protect_Cur = 0;
|
|
Protect_Temp = 0;
|
|
Warning_Vol = 0;
|
|
Warning_Cur = 0;
|
|
Warning_Temp = 0;
|
|
|
|
/*更新标志*/
|
|
//常见状态
|
|
NomalStatus |= ChargeStatus<<1;
|
|
NomalStatus |= DischargeStatus<<2;
|
|
NomalStatus |= PreChargeStatus<<3;
|
|
//NomalStatus |= ChgMosStatus<<4;
|
|
//NomalStatus |= DsgMosStatus<<5;
|
|
//NomalStatus |= PchgMosStatus<<6;
|
|
NomalStatus |= ChgLimitStatus<<7;
|
|
NomalStatus |= BalanceStatus<<8;
|
|
//特殊状态
|
|
SpecialStatus |= LockOCC<<0;
|
|
SpecialStatus |= LockOCD1<<1;
|
|
SpecialStatus |= LockOCD2<<2;
|
|
SpecialStatus |= LockSP<<3;
|
|
SpecialStatus |= LockSC<<4;
|
|
SpecialStatus |= ChgMosFault<<5;
|
|
SpecialStatus |= DsgMosFault<<6;
|
|
SpecialStatus |= DOStatus<<7;
|
|
SpecialStatus |= ForceOffUV<<8;
|
|
//保护
|
|
Protect_Vol |= PackOV<<0;
|
|
Protect_Vol |= PackUV<<1;
|
|
Protect_Vol |= CellOV<<2;
|
|
Protect_Vol |= CellUV<<3;
|
|
Protect_Vol |= PF<<4;
|
|
Protect_Vol |= L0V<<5;
|
|
Protect_Cur |= OCC<<0;
|
|
Protect_Cur |= OCD1<<1;
|
|
Protect_Cur |= OCD2<<2;
|
|
Protect_Cur |= SP<<3;
|
|
Protect_Cur |= SC<<4;
|
|
Protect_Temp |= McuOTC<<0;
|
|
Protect_Temp |= McuOTD<<1;
|
|
Protect_Temp |= McuUTC<<2;
|
|
Protect_Temp |= McuUTD<<3;
|
|
Protect_Temp |= AmbientOTC<<4;
|
|
Protect_Temp |= AmbientOTD<<5;
|
|
Protect_Temp |= AmbientUTC<<6;
|
|
Protect_Temp |= AmbientUTD<<7;
|
|
Protect_Temp |= MosOTC<<8;
|
|
Protect_Temp |= MosOTD<<9;
|
|
Protect_Temp |= MosUTC<<10;
|
|
Protect_Temp |= MosUTD<<11;
|
|
//报警
|
|
Warning_Vol |= PackOVWarning<<0;
|
|
Warning_Vol |= PackUVWarning<<1;
|
|
Warning_Vol |= CellOVWarning<<2;
|
|
Warning_Vol |= CellUVWarning<<3;
|
|
Warning_Cur |= OCCWarning<<0;
|
|
Warning_Cur |= OCDWarning<<1;
|
|
Warning_Temp |= McuOTCWarning<<0;
|
|
Warning_Temp |= McuOTDWarning<<1;
|
|
Warning_Temp |= McuUTCWarning<<2;
|
|
Warning_Temp |= McuUTDWarning<<3;
|
|
Warning_Temp |= AmbientOTCWarning<<4;
|
|
Warning_Temp |= AmbientOTDWarning<<5;
|
|
Warning_Temp |= AmbientUTCWarning<<6;
|
|
Warning_Temp |= AmbientUTDWarning<<7;
|
|
Warning_Temp |= MosOTCWarning<<8;
|
|
Warning_Temp |= MosOTDWarning<<9;
|
|
//Warning_Temp |= MosUTCWarning<<10;
|
|
//Warning_Temp |= MosUTDWarning<<11;
|
|
|
|
status_New[0] = NomalStatus;
|
|
status_New[1] = SpecialStatus;
|
|
status_New[2] = Protect_Vol;
|
|
status_New[3] = Protect_Cur;
|
|
status_New[4] = Protect_Temp;
|
|
status_New[5] = Warning_Vol;
|
|
status_New[6] = Warning_Cur;
|
|
status_New[7] = Warning_Temp;
|
|
|
|
//检查新变动
|
|
if(staChange_num < MaxSaveNum) //超出个数后不再记录,直到发完
|
|
{
|
|
Check_staChange();
|
|
Check_protectChange();
|
|
Check_warningChange();
|
|
}
|
|
}
|
|
|
|
//解析的固定格式
|
|
void To_incident(uint8_t flag, const char* str, uint8_t len)
|
|
{
|
|
incident_str = str; //事件名称
|
|
incident_len = len; //事件名称长度
|
|
incident_flag = flag; //上报true/false
|
|
}
|
|
|
|
//4G模块上报事件的解析
|
|
//code: 记录事件的对应码
|
|
//str: 事件名称
|
|
//len: 事件名称的长度
|
|
void Explain_incident(uint8_t code, const char* str, uint8_t len)
|
|
{
|
|
if(staChange[staChange_index] == code)
|
|
{
|
|
To_incident(1, str, len); //上报true
|
|
}
|
|
else if(staChange[staChange_index] == code+0x80)
|
|
{
|
|
To_incident(2, str, len); //上报false
|
|
}
|
|
}
|
|
|
|
//4G模块上报[事件]
|
|
void Transmit_incident(void)
|
|
{
|
|
//判断是否要上传事件
|
|
if(incident_flag == 0) //1次只上传1条,若之前有事件还在上传,不进行处理
|
|
{
|
|
if(staChange_num != 0) //存在事件
|
|
{
|
|
//if(staChange[staChange_index] == 0x01)
|
|
//{
|
|
// To_incident(1, "ChargeStatus", 12);
|
|
//}
|
|
//else if(staChange[staChange_index] == 0x02)
|
|
//{
|
|
// To_incident(1, "DischargeStatus", 15);
|
|
//}
|
|
|
|
Explain_incident(0x03, "PreChargeStatus", 15); //预充状态
|
|
Explain_incident(0x04, "ChgMosStatus", 12); //充电MOS状态
|
|
Explain_incident(0x05, "DsgMosStatus", 12); //放电MOS状态
|
|
//Explain_incident(0x06, "PchgMosStatus", 13); //预充MOS状态
|
|
Explain_incident(0x07, "ChgLimitStatus", 14); //充电限流状态
|
|
//Explain_incident(0x08, "BalanceStatus", 13); //均衡控制状态
|
|
|
|
Explain_incident(0x10, "LockOCC", 7); //充电过流保护多次锁定
|
|
Explain_incident(0x11, "LockOCD1", 8); //放电过流1保护多次锁定
|
|
Explain_incident(0x12, "LockOCD2", 8); //放电过流2保护多次锁定
|
|
Explain_incident(0x13, "LockSP", 6); //浪涌保护多次锁定
|
|
Explain_incident(0x14, "LockSC", 6); //短路保护多次锁定
|
|
Explain_incident(0x15, "ChgMosFault", 11); //充电MOS故障
|
|
Explain_incident(0x16, "DsgMosFault", 11); //放电MOS故障
|
|
Explain_incident(0x17, "DOStatus", 8); //DO脱扣器功能
|
|
Explain_incident(0x18, "ForceOffUV", 10); //强制关闭欠压保护功能
|
|
|
|
Explain_incident(0x20, "PackOV", 6); //总体过压保护
|
|
Explain_incident(0x21, "PackUV", 6); //总体欠压保护
|
|
Explain_incident(0x22, "CellOV", 6); //单体过压保护
|
|
Explain_incident(0x23, "CellUV", 6); //单体欠压保护
|
|
Explain_incident(0x24, "PF", 2); //异常高压保护
|
|
Explain_incident(0x25, "L0V", 2); //低电压禁止充电
|
|
Explain_incident(0x30, "OCC", 3); //充电过流保护
|
|
Explain_incident(0x31, "OCD1", 4); //放电过流1保护
|
|
Explain_incident(0x32, "OCD2", 4); //放电过流2保护
|
|
Explain_incident(0x33, "SP", 2); //浪涌保护
|
|
Explain_incident(0x34, "SC", 2); //短路保护
|
|
Explain_incident(0x40, "McuOTC", 6); //电芯充电高温保护
|
|
Explain_incident(0x41, "McuOTD", 6); //电芯放电高温保护
|
|
Explain_incident(0x42, "McuUTC", 6); //电芯充电低温保护
|
|
Explain_incident(0x43, "McuUTD", 6); //电芯放电低温保护
|
|
Explain_incident(0x44, "AmbientOTC", 10); //环境充电高温保护
|
|
Explain_incident(0x45, "AmbientOTD", 10); //环境放电高温保护
|
|
Explain_incident(0x46, "AmbientUTC", 10); //环境充电低温保护
|
|
Explain_incident(0x47, "AmbientUTD", 10); //环境放电低温保护
|
|
Explain_incident(0x48, "MosOTC", 6); //MOS充电高温保护
|
|
Explain_incident(0x49, "MosOTD", 6); //MOS放电高温保护
|
|
//Explain_incident(0x4A, "MosUTC", 6); //MOS充电低温保护
|
|
//Explain_incident(0x4B, "MosUTD", 6); //MOS放电低温保护
|
|
|
|
// Explain_incident(0x50, "PackOVWarning", 6+7); //总体过压报警
|
|
// Explain_incident(0x51, "PackUVWarning", 6+7); //总体欠压报警
|
|
// Explain_incident(0x52, "CellOVWarning", 6+7); //单体过压报警
|
|
// Explain_incident(0x53, "CellUVWarning", 6+7); //单体欠压报警
|
|
// Explain_incident(0x60, "OCCWarning", 3+7); //充电过流报警
|
|
// Explain_incident(0x61, "OCDWarning", 3+7); //放电过流报警
|
|
// Explain_incident(0x70, "McuOTCWarning", 6+7); //电芯充电高温报警
|
|
// Explain_incident(0x71, "McuOTDWarning", 6+7); //电芯放电高温报警
|
|
// Explain_incident(0x72, "McuUTCWarning", 6+7); //电芯充电低温报警
|
|
// Explain_incident(0x73, "McuUTDWarning", 6+7); //电芯放电低温报警
|
|
// Explain_incident(0x74, "AmbientOTCWarning", 10+7); //环境充电高温报警
|
|
// Explain_incident(0x75, "AmbientOTDWarning", 10+7); //环境放电高温报警
|
|
// Explain_incident(0x76, "AmbientUTCWarning", 10+7); //环境充电低温报警
|
|
// Explain_incident(0x77, "AmbientUTDWarning", 10+7); //环境放电低温报警
|
|
// Explain_incident(0x78, "MosOTCWarning", 6+7); //MOS充电高温报警
|
|
// Explain_incident(0x79, "MosOTDWarning", 6+7); //MOS放电高温报警
|
|
// //Explain_incident(0x7A, "MosUTCWarning", 6+7); //MOS充电低温报警
|
|
// //Explain_incident(0x7B, "MosUTDWarning", 6+7); //MOS放电低温报警
|
|
|
|
|
|
//发生时间
|
|
incident_time = staChange_time[staChange_index];
|
|
incident_len += uint_str_len(incident_time);
|
|
|
|
|
|
//发送完最后一个,清空数组
|
|
staChange_index++;
|
|
if((staChange_index >= staChange_num) || (staChange_num > MaxSaveNum)) //当存储事件全部上报,清零重新积累 //总个数最大50,存在异常先清零
|
|
{
|
|
staChange_index = 0;
|
|
staChange_num = 0;
|
|
memset(staChange, 0, MaxSaveNum+5); //清零数组
|
|
memset(staChange_time, 0, MaxSaveNum+5);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
|