|
@@ -17,7 +17,8 @@ void BMS_InfoUpdate(void)
|
|
|
else
|
|
|
PeriodCnt = HAL_GetTick();
|
|
|
//仅主电池打开
|
|
|
- if((BMS_Magene_TPDOInfo_Main.BaseInfo.WorkState == 2) && (BMS_Magene_TPDOInfo_Back.BaseInfo.WorkState != 2))
|
|
|
+ if(((BMS_Magene_TPDOInfo_Main.BaseInfo.WorkState == 2) || (BMS_Magene_TPDOInfo_Main.BaseInfo.WorkState == 3)) &&
|
|
|
+ ((BMS_Magene_TPDOInfo_Back.BaseInfo.WorkState != 2) && (BMS_Magene_TPDOInfo_Back.BaseInfo.WorkState != 3)))
|
|
|
{
|
|
|
//运行信息
|
|
|
BMS_RunInfo.Voltage = BMS_Magene_TPDOInfo_Main.BaseInfo.Voltage;
|
|
@@ -58,15 +59,15 @@ void BMS_InfoUpdate(void)
|
|
|
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_VerInfo.Mode, "MAGENE ");
|
|
|
+ strcpy(BMS_VerInfo.SN_Num, "00000001");
|
|
|
+ strcpy(BMS_VerInfo.HW_Version, "V100");
|
|
|
+ strcpy(BMS_VerInfo.FW_Version, "V100");
|
|
|
//生产信息
|
|
|
- strcpy(BMS_MacInfo.Manufacturer, "MAGENE ");
|
|
|
- strcpy(BMS_MacInfo.MacAddr, "");
|
|
|
- strcpy(BMS_MacInfo.MacDate, "");
|
|
|
- strcpy(BMS_MacInfo.ProductTag, "");
|
|
|
+ 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;
|
|
@@ -74,7 +75,8 @@ void BMS_InfoUpdate(void)
|
|
|
BMS_UsrLog.MaxChgTime = BMS_Magene_TPDOInfo_Main.StaInfo.MaxChargeTime;
|
|
|
}
|
|
|
//仅副电池打开
|
|
|
- else if((BMS_Magene_TPDOInfo_Main.BaseInfo.WorkState != 2) && (BMS_Magene_TPDOInfo_Back.BaseInfo.WorkState == 2))
|
|
|
+ else if(((BMS_Magene_TPDOInfo_Back.BaseInfo.WorkState == 2) || (BMS_Magene_TPDOInfo_Back.BaseInfo.WorkState == 3)) &&
|
|
|
+ ((BMS_Magene_TPDOInfo_Main.BaseInfo.WorkState != 2) && (BMS_Magene_TPDOInfo_Main.BaseInfo.WorkState != 3)))
|
|
|
{
|
|
|
//运行信息
|
|
|
BMS_RunInfo.Voltage = BMS_Magene_TPDOInfo_Back.BaseInfo.Voltage;
|
|
@@ -115,15 +117,15 @@ void BMS_InfoUpdate(void)
|
|
|
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_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, "");
|
|
|
+ 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;
|
|
@@ -131,7 +133,8 @@ void BMS_InfoUpdate(void)
|
|
|
BMS_UsrLog.MaxChgTime = BMS_Magene_TPDOInfo_Back.StaInfo.MaxChargeTime;
|
|
|
}
|
|
|
//主副电池同时打开
|
|
|
- else if((BMS_Magene_TPDOInfo_Main.BaseInfo.WorkState == 2) && (BMS_Magene_TPDOInfo_Back.BaseInfo.WorkState == 2))
|
|
|
+ else if(((BMS_Magene_TPDOInfo_Main.BaseInfo.WorkState == 2) || (BMS_Magene_TPDOInfo_Main.BaseInfo.WorkState == 3)) &&
|
|
|
+ ((BMS_Magene_TPDOInfo_Back.BaseInfo.WorkState == 2) || (BMS_Magene_TPDOInfo_Back.BaseInfo.WorkState == 3)))
|
|
|
{
|
|
|
//暂不考虑
|
|
|
}
|
|
@@ -140,7 +143,14 @@ void BMS_InfoUpdate(void)
|
|
|
/*BMS开关控制*/
|
|
|
void BMS_SwitchCtl(void)
|
|
|
{
|
|
|
- //暂时只考虑单电池,电池需要先打开
|
|
|
+ //发送通用指令,主副电池同时发开,定时1s发送
|
|
|
+ static uint32_t PeriodCnt = 0;
|
|
|
+ uint8_t SendData[8] = {0xE4, 0x06, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00};
|
|
|
+ if((HAL_GetTick() - PeriodCnt) >= 1000)
|
|
|
+ {
|
|
|
+ PeriodCnt = HAL_GetTick();
|
|
|
+ CAN_SendData(BMS_MAGENE_BASE_RPDO + BMS_MAGENE_ADDRESS_COM, SendData, sizeof(SendData));
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/*BMS在线检测*/
|
|
@@ -167,7 +177,70 @@ void BMS_CanProcess(BMS_Magene_CanData_Struct_t* CanData)
|
|
|
{
|
|
|
if(CanData->Data[0] == BMS_MAGENE_STATUS_PAGE_ID) //识别PageID
|
|
|
{
|
|
|
- memcpy((uint8_t*)&BMS_Magene_TPDOInfo_Main.BaseInfo.PageID + (CanData->Data[1] - 9) * 8 + 2, (uint8_t*)CanData->Data + 2, 6); //起始状态码为0x09
|
|
|
+ switch(CanData->Data[1]) //根据指令码放置不同位置
|
|
|
+ {
|
|
|
+ case BMS_MAGENE_FUC_CODE_BASE_INFO:
|
|
|
+ {
|
|
|
+ memcpy((uint8_t*)&BMS_Magene_TPDOInfo_Main.BaseInfo.PageID + 2, (uint8_t*)CanData->Data + 2, 6);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case BMS_MAGENE_FUC_CODE_CAP_INFO:
|
|
|
+ {
|
|
|
+ memcpy((uint8_t*)&BMS_Magene_TPDOInfo_Main.CapInfo.PageID + 2, (uint8_t*)CanData->Data + 2, 6);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case BMS_MAGENE_FUC_CODE_CYC_INFO:
|
|
|
+ {
|
|
|
+ memcpy((uint8_t*)&BMS_Magene_TPDOInfo_Main.CycInfo.PageID + 2, (uint8_t*)CanData->Data + 2, 6);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case BMS_MAGENE_FUC_CODE_STA_INFO:
|
|
|
+ {
|
|
|
+ memcpy((uint8_t*)&BMS_Magene_TPDOInfo_Main.StaInfo.PageID + 2, (uint8_t*)CanData->Data + 2, 6);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case BMS_MAGENE_FUC_CODE_RTC_INFO:
|
|
|
+ {
|
|
|
+ memcpy((uint8_t*)&BMS_Magene_TPDOInfo_Main.RtcInfo.PageID + 2, (uint8_t*)CanData->Data + 2, 6);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case BMS_MAGENE_FUC_CODE_CELL1_INFO:
|
|
|
+ {
|
|
|
+ memcpy((uint8_t*)&BMS_Magene_TPDOInfo_Main.CellInfo1.PageID + 2, (uint8_t*)CanData->Data + 2, 6);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case BMS_MAGENE_FUC_CODE_CELL2_INFO:
|
|
|
+ {
|
|
|
+ memcpy((uint8_t*)&BMS_Magene_TPDOInfo_Main.CellInfo2.PageID + 2, (uint8_t*)CanData->Data + 2, 6);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case BMS_MAGENE_FUC_CODE_CELL3_INFO:
|
|
|
+ {
|
|
|
+ memcpy((uint8_t*)&BMS_Magene_TPDOInfo_Main.CellInfo3.PageID + 2, (uint8_t*)CanData->Data + 2, 6);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case BMS_MAGENE_FUC_CODE_CELL4_INFO:
|
|
|
+ {
|
|
|
+ memcpy((uint8_t*)&BMS_Magene_TPDOInfo_Main.CellInfo4.PageID + 2, (uint8_t*)CanData->Data + 2, 6);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case BMS_MAGENE_FUC_CODE_CELL5_INFO:
|
|
|
+ {
|
|
|
+ memcpy((uint8_t*)&BMS_Magene_TPDOInfo_Main.CellInfo5.PageID + 2, (uint8_t*)CanData->Data + 2, 6);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case BMS_MAGENE_FUC_CODE_TMP_INFO:
|
|
|
+ {
|
|
|
+ memcpy((uint8_t*)&BMS_Magene_TPDOInfo_Main.TmpInfo.PageID + 2, (uint8_t*)CanData->Data + 2, 6);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case BMS_MAGENE_FUC_CODE_SW_INFO:
|
|
|
+ {
|
|
|
+ memcpy((uint8_t*)&BMS_Magene_TPDOInfo_Main.BatStInfo.PageID + 2, (uint8_t*)CanData->Data + 2, 6);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ default:break;
|
|
|
+ }
|
|
|
}
|
|
|
BMS_Magene_OnLineCheck_Main.OnLineFlag = 1;
|
|
|
BMS_Magene_OnLineCheck_Main.TimeCnt = HAL_GetTick();
|
|
@@ -176,17 +249,80 @@ void BMS_CanProcess(BMS_Magene_CanData_Struct_t* CanData)
|
|
|
{
|
|
|
if(CanData->Data[0] == BMS_MAGENE_STATUS_PAGE_ID) //识别PageID
|
|
|
{
|
|
|
- memcpy((uint8_t*)&BMS_Magene_TPDOInfo_Back.BaseInfo.PageID + (CanData->Data[1] - 9) * 8 + 2, (uint8_t*)CanData->Data + 2, 6); //起始状态码为0x09
|
|
|
+ switch(CanData->Data[1]) //根据指令码放置不同位置
|
|
|
+ {
|
|
|
+ case BMS_MAGENE_FUC_CODE_BASE_INFO:
|
|
|
+ {
|
|
|
+ memcpy((uint8_t*)&BMS_Magene_TPDOInfo_Back.BaseInfo.PageID + 2, (uint8_t*)CanData->Data + 2, 6);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case BMS_MAGENE_FUC_CODE_CAP_INFO:
|
|
|
+ {
|
|
|
+ memcpy((uint8_t*)&BMS_Magene_TPDOInfo_Back.CapInfo.PageID + 2, (uint8_t*)CanData->Data + 2, 6);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case BMS_MAGENE_FUC_CODE_CYC_INFO:
|
|
|
+ {
|
|
|
+ memcpy((uint8_t*)&BMS_Magene_TPDOInfo_Back.CycInfo.PageID + 2, (uint8_t*)CanData->Data + 2, 6);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case BMS_MAGENE_FUC_CODE_STA_INFO:
|
|
|
+ {
|
|
|
+ memcpy((uint8_t*)&BMS_Magene_TPDOInfo_Back.StaInfo.PageID + 2, (uint8_t*)CanData->Data + 2, 6);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case BMS_MAGENE_FUC_CODE_RTC_INFO:
|
|
|
+ {
|
|
|
+ memcpy((uint8_t*)&BMS_Magene_TPDOInfo_Back.RtcInfo.PageID + 2, (uint8_t*)CanData->Data + 2, 6);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case BMS_MAGENE_FUC_CODE_CELL1_INFO:
|
|
|
+ {
|
|
|
+ memcpy((uint8_t*)&BMS_Magene_TPDOInfo_Back.CellInfo1.PageID + 2, (uint8_t*)CanData->Data + 2, 6);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case BMS_MAGENE_FUC_CODE_CELL2_INFO:
|
|
|
+ {
|
|
|
+ memcpy((uint8_t*)&BMS_Magene_TPDOInfo_Back.CellInfo2.PageID + 2, (uint8_t*)CanData->Data + 2, 6);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case BMS_MAGENE_FUC_CODE_CELL3_INFO:
|
|
|
+ {
|
|
|
+ memcpy((uint8_t*)&BMS_Magene_TPDOInfo_Back.CellInfo3.PageID + 2, (uint8_t*)CanData->Data + 2, 6);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case BMS_MAGENE_FUC_CODE_CELL4_INFO:
|
|
|
+ {
|
|
|
+ memcpy((uint8_t*)&BMS_Magene_TPDOInfo_Back.CellInfo4.PageID + 2, (uint8_t*)CanData->Data + 2, 6);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case BMS_MAGENE_FUC_CODE_CELL5_INFO:
|
|
|
+ {
|
|
|
+ memcpy((uint8_t*)&BMS_Magene_TPDOInfo_Back.CellInfo5.PageID + 2, (uint8_t*)CanData->Data + 2, 6);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case BMS_MAGENE_FUC_CODE_TMP_INFO:
|
|
|
+ {
|
|
|
+ memcpy((uint8_t*)&BMS_Magene_TPDOInfo_Back.TmpInfo.PageID + 2, (uint8_t*)CanData->Data + 2, 6);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case BMS_MAGENE_FUC_CODE_SW_INFO:
|
|
|
+ {
|
|
|
+ memcpy((uint8_t*)&BMS_Magene_TPDOInfo_Back.BatStInfo.PageID + 2, (uint8_t*)CanData->Data + 2, 6);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ default:break;
|
|
|
+ }
|
|
|
}
|
|
|
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();
|
|
|
+ //电池通信正常标志置位,用于续航计算
|
|
|
+ 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;
|
|
|
}
|
|
|
}
|