|
@@ -0,0 +1,252 @@
|
|
|
+#include "bms_magene.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) > 1000)
|
|
|
+ {
|
|
|
+ BMS_Magene_OnLineCheck_Main.OnLineFlag = 1;
|
|
|
+ }
|
|
|
+ //备电池检测
|
|
|
+ if((HAL_GetTick() - BMS_Magene_OnLineCheck_Back.TimeCnt) > 1000)
|
|
|
+ {
|
|
|
+ BMS_Magene_OnLineCheck_Back.OnLineFlag = 1;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/*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 = 0;
|
|
|
+ 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 = 0;
|
|
|
+ BMS_Magene_OnLineCheck_Back.TimeCnt = 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();
|
|
|
+}
|