Files
jiacun-20s-200A/MOUDLE/Status.c
T
2026-08-25 17:30:40 +08:00

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