123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258 |
- #include "bms_magene.h"
- #include "remain_distance.h"
- //全局变量
- BMS_Magene_TPDOInfo_Struct BMS_Magene_TPDOInfo_Main, BMS_Magene_TPDOInfo_Back; //电池主动上报数据
- BMS_Magene_RPDOInfo_Struct BMS_Magene_RPDOInfo_Main, BMS_Magene_RPDOInfo_Back; //电池控制参数
- BMS_Magene_OnLineCheck_Struct BMS_Magene_OnLineCheck_Main, BMS_Magene_OnLineCheck_Back; //电池在线检测
- BMS_Magene_CanData_Struct_t BMS_Magene_CanData; //电池报文数据
- //局部函数
- /*BMS数据更新*/
- void BMS_InfoUpdate(void)
- {
- static uint32_t PeriodCnt = 0;
- if((HAL_GetTick() - PeriodCnt <= 1000))
- return;
- else
- PeriodCnt = HAL_GetTick();
- //仅主电池打开
- if((BMS_Magene_TPDOInfo_Main.BatStInfo.State == 1) && (BMS_Magene_TPDOInfo_Back.BatStInfo.State == 0))
- {
- //运行信息
- BMS_RunInfo.Voltage = BMS_Magene_TPDOInfo_Main.BaseInfo.Voltage;
- BMS_RunInfo.Current = BMS_Magene_TPDOInfo_Main.BaseInfo.Current;
- BMS_RunInfo.RC = BMS_Magene_TPDOInfo_Main.CapInfo.RemainCapcity;
- BMS_RunInfo.FCC = BMS_Magene_TPDOInfo_Main.CapInfo.FullCapcity;
- BMS_RunInfo.Cell_NTC = BMS_Magene_TPDOInfo_Main.BaseInfo.Temperature;
- BMS_RunInfo.SOC = BMS_Magene_TPDOInfo_Main.CapInfo.SOC;
- BMS_RunInfo.Status.Status = (BMS_Magene_TPDOInfo_Main.BaseInfo.WorkState == 3) ? 0x01 : 0x00;
- BMS_RunInfo.SOH = BMS_Magene_TPDOInfo_Main.CapInfo.SOH;
- BMS_RunInfo.CycleCount = BMS_Magene_TPDOInfo_Main.CycInfo.CycleCount;
- if(BMS_Magene_TPDOInfo_Main.BaseInfo.Current >= 100)
- BMS_RunInfo.RemainChgTime = (BMS_Magene_TPDOInfo_Main.CapInfo.FullCapcity - BMS_Magene_TPDOInfo_Main.CapInfo.RemainCapcity) * 60 / BMS_Magene_TPDOInfo_Main.BaseInfo.Current;
- else
- BMS_RunInfo.RemainChgTime = 0;
- //电芯电压
- BMS_CellVol.Cell1 = BMS_Magene_TPDOInfo_Main.CellInfo1.CellVol[0];
- BMS_CellVol.Cell2 = BMS_Magene_TPDOInfo_Main.CellInfo1.CellVol[1];
- BMS_CellVol.Cell3 = BMS_Magene_TPDOInfo_Main.CellInfo1.CellVol[2];
- BMS_CellVol.Cell4 = BMS_Magene_TPDOInfo_Main.CellInfo2.CellVol[0];
- BMS_CellVol.Cell5 = BMS_Magene_TPDOInfo_Main.CellInfo2.CellVol[1];
- BMS_CellVol.Cell6 = BMS_Magene_TPDOInfo_Main.CellInfo2.CellVol[2];
- BMS_CellVol.Cell7 = BMS_Magene_TPDOInfo_Main.CellInfo3.CellVol[0];
- BMS_CellVol.Cell8 = BMS_Magene_TPDOInfo_Main.CellInfo3.CellVol[1];
- BMS_CellVol.Cell9 = BMS_Magene_TPDOInfo_Main.CellInfo3.CellVol[2];
- BMS_CellVol.Cell10 = BMS_Magene_TPDOInfo_Main.CellInfo4.CellVol[0];
- BMS_CellVol.Cell11 = BMS_Magene_TPDOInfo_Main.CellInfo4.CellVol[1];
- BMS_CellVol.Cell12 = BMS_Magene_TPDOInfo_Main.CellInfo4.CellVol[2];
- BMS_CellVol.Cell13 = BMS_Magene_TPDOInfo_Main.CellInfo5.CellVol[0];
- BMS_CellVol.Cell14 = BMS_Magene_TPDOInfo_Main.CellInfo5.CellVol[1];
- BMS_CellVol.Cell15 = BMS_Magene_TPDOInfo_Main.CellInfo5.CellVol[2];
- BMS_CellVol.Cell16 = 0;
- //故障码
- BMS_ErrorCode.Code = 0; //BMS故障时无法放电,不处理
- //设计信息
- BMS_DesignInfo.Capacity = BMS_Magene_TPDOInfo_Main.CycInfo.DesignCapcity;
- BMS_DesignInfo.Voltage = BMS_Magene_TPDOInfo_Main.RtcInfo.DesignVol;
- strcpy(BMS_DesignInfo.CellMode, "NONE ");
- BMS_DesignInfo.CellNum = 0;
- //版本信息
- strcpy(BMS_VerInfo.Mode, "MAGENE ");
- strcpy(BMS_VerInfo.SN_Num, "");
- strcpy(BMS_VerInfo.HW_Version, "");
- strcpy(BMS_VerInfo.FW_Version, "");
- //生产信息
- strcpy(BMS_MacInfo.Manufacturer, "MAGENE ");
- strcpy(BMS_MacInfo.MacAddr, "");
- strcpy(BMS_MacInfo.MacDate, "");
- strcpy(BMS_MacInfo.ProductTag, "");
- //使用记录
- BMS_UsrLog.Max_Tmp = BMS_Magene_TPDOInfo_Main.TmpInfo.CellT_Max;
- BMS_UsrLog.Min_Tmp = BMS_Magene_TPDOInfo_Main.TmpInfo.CellT_Min;
- BMS_UsrLog.LastChgTime = BMS_Magene_TPDOInfo_Main.StaInfo.LastChargeTime;
- BMS_UsrLog.MaxChgTime = BMS_Magene_TPDOInfo_Main.StaInfo.MaxChargeTime;
- }
- //仅副电池打开
- else if((BMS_Magene_TPDOInfo_Main.BatStInfo.State == 0) && (BMS_Magene_TPDOInfo_Back.BatStInfo.State == 1))
- {
- //运行信息
- BMS_RunInfo.Voltage = BMS_Magene_TPDOInfo_Back.BaseInfo.Voltage;
- BMS_RunInfo.Current = BMS_Magene_TPDOInfo_Back.BaseInfo.Current;
- BMS_RunInfo.RC = BMS_Magene_TPDOInfo_Back.CapInfo.RemainCapcity;
- BMS_RunInfo.FCC = BMS_Magene_TPDOInfo_Back.CapInfo.FullCapcity;
- BMS_RunInfo.Cell_NTC = BMS_Magene_TPDOInfo_Back.BaseInfo.Temperature;
- BMS_RunInfo.SOC = BMS_Magene_TPDOInfo_Back.CapInfo.SOC;
- BMS_RunInfo.Status.Status = (BMS_Magene_TPDOInfo_Back.BaseInfo.WorkState == 3) ? 0x01 : 0x00;
- BMS_RunInfo.SOH = BMS_Magene_TPDOInfo_Back.CapInfo.SOH;
- BMS_RunInfo.CycleCount = BMS_Magene_TPDOInfo_Back.CycInfo.CycleCount;
- if(BMS_Magene_TPDOInfo_Back.BaseInfo.Current >= 100)
- BMS_RunInfo.RemainChgTime = (BMS_Magene_TPDOInfo_Back.CapInfo.FullCapcity - BMS_Magene_TPDOInfo_Back.CapInfo.RemainCapcity) * 60 / BMS_Magene_TPDOInfo_Back.BaseInfo.Current;
- else
- BMS_RunInfo.RemainChgTime = 0;
- //电芯电压
- BMS_CellVol.Cell1 = BMS_Magene_TPDOInfo_Back.CellInfo1.CellVol[0];
- BMS_CellVol.Cell2 = BMS_Magene_TPDOInfo_Back.CellInfo1.CellVol[1];
- BMS_CellVol.Cell3 = BMS_Magene_TPDOInfo_Back.CellInfo1.CellVol[2];
- BMS_CellVol.Cell4 = BMS_Magene_TPDOInfo_Back.CellInfo2.CellVol[0];
- BMS_CellVol.Cell5 = BMS_Magene_TPDOInfo_Back.CellInfo2.CellVol[1];
- BMS_CellVol.Cell6 = BMS_Magene_TPDOInfo_Back.CellInfo2.CellVol[2];
- BMS_CellVol.Cell7 = BMS_Magene_TPDOInfo_Back.CellInfo3.CellVol[0];
- BMS_CellVol.Cell8 = BMS_Magene_TPDOInfo_Back.CellInfo3.CellVol[1];
- BMS_CellVol.Cell9 = BMS_Magene_TPDOInfo_Back.CellInfo3.CellVol[2];
- BMS_CellVol.Cell10 = BMS_Magene_TPDOInfo_Back.CellInfo4.CellVol[0];
- BMS_CellVol.Cell11 = BMS_Magene_TPDOInfo_Back.CellInfo4.CellVol[1];
- BMS_CellVol.Cell12 = BMS_Magene_TPDOInfo_Back.CellInfo4.CellVol[2];
- BMS_CellVol.Cell13 = BMS_Magene_TPDOInfo_Back.CellInfo5.CellVol[0];
- BMS_CellVol.Cell14 = BMS_Magene_TPDOInfo_Back.CellInfo5.CellVol[1];
- BMS_CellVol.Cell15 = BMS_Magene_TPDOInfo_Back.CellInfo5.CellVol[2];
- BMS_CellVol.Cell16 = 0;
- //故障码
- BMS_ErrorCode.Code = 0; //BMS故障时无法放电,不处理
- //设计信息
- BMS_DesignInfo.Capacity = BMS_Magene_TPDOInfo_Back.CycInfo.DesignCapcity;
- BMS_DesignInfo.Voltage = BMS_Magene_TPDOInfo_Back.RtcInfo.DesignVol;
- strcpy(BMS_DesignInfo.CellMode, "NONE ");
- BMS_DesignInfo.CellNum = 0;
- //版本信息
- strcpy(BMS_VerInfo.Mode, "MAGENE ");
- strcpy(BMS_VerInfo.SN_Num, "");
- strcpy(BMS_VerInfo.HW_Version, "");
- strcpy(BMS_VerInfo.FW_Version, "");
- //生产信息
- strcpy(BMS_MacInfo.Manufacturer, "MAGENE ");
- strcpy(BMS_MacInfo.MacAddr, "");
- strcpy(BMS_MacInfo.MacDate, "");
- strcpy(BMS_MacInfo.ProductTag, "");
- //使用记录
- BMS_UsrLog.Max_Tmp = BMS_Magene_TPDOInfo_Back.TmpInfo.CellT_Max;
- BMS_UsrLog.Min_Tmp = BMS_Magene_TPDOInfo_Back.TmpInfo.CellT_Min;
- BMS_UsrLog.LastChgTime = BMS_Magene_TPDOInfo_Back.StaInfo.LastChargeTime;
- BMS_UsrLog.MaxChgTime = BMS_Magene_TPDOInfo_Back.StaInfo.MaxChargeTime;
- }
- //主副电池同时打开
- else if((BMS_Magene_TPDOInfo_Main.BatStInfo.State == 1) && (BMS_Magene_TPDOInfo_Back.BatStInfo.State == 1))
- {
- //暂不考虑
- }
- }
- /*BMS开关控制*/
- void BMS_SwitchCtl(void)
- {
- //暂时只考虑单电池,电池需要先打开
- }
- /*BMS在线检测*/
- void BMS_OnLineCheck(void)
- {
- //主电池检测
- if((HAL_GetTick() - BMS_Magene_OnLineCheck_Main.TimeCnt) > 3000)
- {
- BMS_Magene_OnLineCheck_Main.OnLineFlag = 0;
- }
- //备电池检测
- if((HAL_GetTick() - BMS_Magene_OnLineCheck_Back.TimeCnt) > 3000)
- {
- BMS_Magene_OnLineCheck_Back.OnLineFlag = 0;
- }
- }
- /*BMS数据解析*/
- void BMS_CanProcess(BMS_Magene_CanData_Struct_t* CanData)
- {
- if(CanData->RefreshFlag == 1)
- {
- if(CanData->ID == (BMS_MAGENE_BASE_TPDO + BMS_MAGENE_ADDRESS_MAIN)) //主电池
- {
- if(CanData->Data[0] == BMS_MAGENE_STATUS_PAGE_ID) //识别PageID
- {
- memcpy((uint8_t*)CanData->Data + 2, (uint8_t*)&BMS_Magene_TPDOInfo_Main.BaseInfo.PageID + (CanData->Data[1] - 9) * 8 + 2, 6);
- }
- BMS_Magene_OnLineCheck_Main.OnLineFlag = 1;
- BMS_Magene_OnLineCheck_Main.TimeCnt = HAL_GetTick();
- }
- else if(CanData->ID == (BMS_MAGENE_BASE_TPDO + BMS_MAGENE_ADDRESS_BACK)) //备电池
- {
- if(CanData->Data[0] == BMS_MAGENE_STATUS_PAGE_ID) //识别PageID
- {
- memcpy((uint8_t*)CanData->Data + 2, (uint8_t*)&BMS_Magene_TPDOInfo_Back.BaseInfo.PageID + (CanData->Data[1] - 9) * 8 + 2, 6);
- }
- BMS_Magene_OnLineCheck_Back.OnLineFlag = 1;
- BMS_Magene_OnLineCheck_Back.TimeCnt = HAL_GetTick();
- }
- //电池通信正常标志置位,用于续航计算
- RemainDis.IsBMS_ComOK_Flag = TRUE;
- RemainDis.BMS_Com_DelayTimeCnt = HAL_GetTick();
- //BMS通信正常标志置位
- IsComOK_BMS.IsOK_Flag = TRUE;
- IsComOK_BMS.OK_TrigTime = HAL_GetTick();
- CanData->RefreshFlag = 0;
- }
- }
- //全局函数
- /*参数初始化*/
- void BMS_Magene_VarInit(void)
- {
- BMS_Magene_TPDOInfo_Main.BaseInfo.PageID = BMS_MAGENE_STATUS_PAGE_ID;
- BMS_Magene_TPDOInfo_Main.BaseInfo.Code = BMS_MAGENE_FUC_CODE_BASE_INFO;
- BMS_Magene_TPDOInfo_Main.CapInfo.PageID = BMS_MAGENE_STATUS_PAGE_ID;
- BMS_Magene_TPDOInfo_Main.CapInfo.Code = BMS_MAGENE_FUC_CODE_CAP_INFO;
- BMS_Magene_TPDOInfo_Main.CycInfo.PageID = BMS_MAGENE_STATUS_PAGE_ID;
- BMS_Magene_TPDOInfo_Main.CycInfo.Code = BMS_MAGENE_FUC_CODE_CYC_INFO;
- BMS_Magene_TPDOInfo_Main.StaInfo.PageID = BMS_MAGENE_STATUS_PAGE_ID;
- BMS_Magene_TPDOInfo_Main.StaInfo.Code = BMS_MAGENE_FUC_CODE_STA_INFO;
- BMS_Magene_TPDOInfo_Main.RtcInfo.PageID = BMS_MAGENE_STATUS_PAGE_ID;
- BMS_Magene_TPDOInfo_Main.RtcInfo.Code = BMS_MAGENE_FUC_CODE_RTC_INFO;
- BMS_Magene_TPDOInfo_Main.CellInfo1.PageID = BMS_MAGENE_STATUS_PAGE_ID;
- BMS_Magene_TPDOInfo_Main.CellInfo1.Code = BMS_MAGENE_FUC_CODE_CELL1_INFO;
- BMS_Magene_TPDOInfo_Main.CellInfo2.PageID = BMS_MAGENE_STATUS_PAGE_ID;
- BMS_Magene_TPDOInfo_Main.CellInfo2.Code = BMS_MAGENE_FUC_CODE_CELL2_INFO;
- BMS_Magene_TPDOInfo_Main.CellInfo3.PageID = BMS_MAGENE_STATUS_PAGE_ID;
- BMS_Magene_TPDOInfo_Main.CellInfo3.Code = BMS_MAGENE_FUC_CODE_CELL3_INFO;
- BMS_Magene_TPDOInfo_Main.CellInfo4.PageID = BMS_MAGENE_STATUS_PAGE_ID;
- BMS_Magene_TPDOInfo_Main.CellInfo4.Code = BMS_MAGENE_FUC_CODE_CELL4_INFO;
- BMS_Magene_TPDOInfo_Main.CellInfo5.PageID = BMS_MAGENE_STATUS_PAGE_ID;
- BMS_Magene_TPDOInfo_Main.CellInfo5.Code = BMS_MAGENE_FUC_CODE_CELL5_INFO;
- BMS_Magene_TPDOInfo_Main.TmpInfo.PageID = BMS_MAGENE_STATUS_PAGE_ID;
- BMS_Magene_TPDOInfo_Main.TmpInfo.Code = BMS_MAGENE_FUC_CODE_TMP_INFO;
- BMS_Magene_TPDOInfo_Main.BatStInfo.PageID = BMS_MAGENE_STATUS_PAGE_ID;
- BMS_Magene_TPDOInfo_Main.BatStInfo.Code = BMS_MAGENE_FUC_CODE_SW_INFO;
- BMS_Magene_TPDOInfo_Back.BaseInfo.PageID = BMS_MAGENE_STATUS_PAGE_ID;
- BMS_Magene_TPDOInfo_Back.BaseInfo.Code = BMS_MAGENE_FUC_CODE_BASE_INFO;
- BMS_Magene_TPDOInfo_Back.CapInfo.PageID = BMS_MAGENE_STATUS_PAGE_ID;
- BMS_Magene_TPDOInfo_Back.CapInfo.Code = BMS_MAGENE_FUC_CODE_CAP_INFO;
- BMS_Magene_TPDOInfo_Back.CycInfo.PageID = BMS_MAGENE_STATUS_PAGE_ID;
- BMS_Magene_TPDOInfo_Back.CycInfo.Code = BMS_MAGENE_FUC_CODE_CYC_INFO;
- BMS_Magene_TPDOInfo_Back.StaInfo.PageID = BMS_MAGENE_STATUS_PAGE_ID;
- BMS_Magene_TPDOInfo_Back.StaInfo.Code = BMS_MAGENE_FUC_CODE_STA_INFO;
- BMS_Magene_TPDOInfo_Back.RtcInfo.PageID = BMS_MAGENE_STATUS_PAGE_ID;
- BMS_Magene_TPDOInfo_Back.RtcInfo.Code = BMS_MAGENE_FUC_CODE_RTC_INFO;
- BMS_Magene_TPDOInfo_Back.CellInfo1.PageID = BMS_MAGENE_STATUS_PAGE_ID;
- BMS_Magene_TPDOInfo_Back.CellInfo1.Code = BMS_MAGENE_FUC_CODE_CELL1_INFO;
- BMS_Magene_TPDOInfo_Back.CellInfo2.PageID = BMS_MAGENE_STATUS_PAGE_ID;
- BMS_Magene_TPDOInfo_Back.CellInfo2.Code = BMS_MAGENE_FUC_CODE_CELL2_INFO;
- BMS_Magene_TPDOInfo_Back.CellInfo3.PageID = BMS_MAGENE_STATUS_PAGE_ID;
- BMS_Magene_TPDOInfo_Back.CellInfo3.Code = BMS_MAGENE_FUC_CODE_CELL3_INFO;
- BMS_Magene_TPDOInfo_Back.CellInfo4.PageID = BMS_MAGENE_STATUS_PAGE_ID;
- BMS_Magene_TPDOInfo_Back.CellInfo4.Code = BMS_MAGENE_FUC_CODE_CELL4_INFO;
- BMS_Magene_TPDOInfo_Back.CellInfo5.PageID = BMS_MAGENE_STATUS_PAGE_ID;
- BMS_Magene_TPDOInfo_Back.CellInfo5.Code = BMS_MAGENE_FUC_CODE_CELL5_INFO;
- BMS_Magene_TPDOInfo_Back.TmpInfo.PageID = BMS_MAGENE_STATUS_PAGE_ID;
- BMS_Magene_TPDOInfo_Back.TmpInfo.Code = BMS_MAGENE_FUC_CODE_TMP_INFO;
- BMS_Magene_TPDOInfo_Back.BatStInfo.PageID = BMS_MAGENE_STATUS_PAGE_ID;
- BMS_Magene_TPDOInfo_Back.BatStInfo.Code = BMS_MAGENE_FUC_CODE_SW_INFO;
- BMS_Magene_CanData.RefreshFlag = 0;
- }
- /*BMS处理主循环*/
- void BMS_Magene_Loop(void)
- {
- BMS_CanProcess(&BMS_Magene_CanData);
- BMS_OnLineCheck();
- BMS_SwitchCtl();
- BMS_InfoUpdate();
- }
|