|
@@ -72,7 +72,7 @@ void battWarningStateDisplay(void);
|
|
|
void battLockStateDisplay(UINT8 lockState);
|
|
|
void relayControlFunc(float DutyRatio,UINT8 BuzzerPeriod);
|
|
|
void SP_BMS_Update_Service(void);
|
|
|
-BOOL BattHeaterSwitch(UINT8* heaterSwitch);
|
|
|
+BOOL BattHeaterSwitch(UINT8* heaterSwitch,UINT8 HeatForceControl);
|
|
|
UINT16 encryptionAlgorithm (UINT16 plainText);
|
|
|
UINT8 decryptionAlgorithm (UINT16 cipherText);
|
|
|
UINT8 Uart_Encrypt_Send(void);
|
|
@@ -103,9 +103,7 @@ static void UartTask(void* arg)
|
|
|
PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_ENCRYPT);
|
|
|
UINT16 Reg_Num = 0;
|
|
|
UINT16 Uart_Uds_LEN;
|
|
|
- UINT16 Uart_Recv_LEN;
|
|
|
UINT32 currentTimerCount=0;
|
|
|
- BOOL uartReadSuccessFlag = false;
|
|
|
Uart_Read_Msg_Type Uart_Read_Msg;
|
|
|
memset(&(Uart_Read_Msg),0x00,sizeof(Uart_Read_Msg_Type));
|
|
|
Uart_Write_Data_Type UartWriteData; //Uart控制命令
|
|
@@ -147,15 +145,11 @@ static void UartTask(void* arg)
|
|
|
}
|
|
|
else if(Timer_count%10==0)
|
|
|
{
|
|
|
- #ifdef USING_PRINTF1
|
|
|
- printf("[%d]Uart Timer 1s:%d,uartReadSuccessFlag:%d\n",__LINE__,Timer_count,uartReadSuccessFlag);
|
|
|
- #endif
|
|
|
- if(osMessageQueueGet(UartWriteCmdHandle,&UartWriteData,0,0)==osOK && uartReadSuccessFlag==TRUE)
|
|
|
- {
|
|
|
- #ifdef USING_PRINTF
|
|
|
- printf("[%d]UartWriteCmdHandle :%x-%X%X\n",__LINE__,UartWriteData.WriteCmd,UartWriteData.Data[0],UartWriteData.Data[1]);
|
|
|
+ #ifdef USING_PRINTF
|
|
|
+ printf("[%d]AvgBattTemp :%d,UartBattInfoRecvFlag:%d,battHeatEnableState:%d \n",__LINE__,AvgBattTemp,UartBattInfoRecvFlag,battHeatEnableState);
|
|
|
#endif
|
|
|
- Ringtimes = 0;
|
|
|
+ if(osMessageQueueGet(UartWriteCmdHandle,&UartWriteData,0,0)==osOK && UartBattInfoRecvFlag==TRUE)
|
|
|
+ {
|
|
|
PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_WRITE);
|
|
|
break;
|
|
|
}
|
|
@@ -169,39 +163,26 @@ static void UartTask(void* arg)
|
|
|
{
|
|
|
AppDataInfo.RelayControl=TRUE;
|
|
|
}
|
|
|
- if((maxCellTemp>=45+40)&&(minCellTemp>=45+40)&&(battHeatEnableState==0x00)&&(MOSTemp>=70+40))//温度的判定需要加40摄氏度,如果模组最高>=45度,模组最低>=45度,mos温度>=70度,并且加热关闭,持续超过10s,则断开继电器,锁定放电mos
|
|
|
+ if((AvgBattTemp>=45+40)&&(battHeatEnableState==0x00)&&(MOSTemp>=70+40))//温度的判定需要加40摄氏度,如果模组最高>=45度,模组最低>=45度,mos温度>=70度,并且加热关闭,持续超过10s,则断开继电器,锁定放电mos
|
|
|
{
|
|
|
heatErrorCounter++;
|
|
|
if(heatErrorCounter>100)
|
|
|
{
|
|
|
+ AppDataInfo.ErrorMsg = 20;
|
|
|
heatErrorCounter = 0;
|
|
|
AppDataInfo.appDataModify = TRUE;
|
|
|
AppNVMData.appDataModify = TRUE;
|
|
|
AppDataInfo.RelayControl=TRUE;
|
|
|
AppNVMData.isBattLocked = TRUE;
|
|
|
- if(osOK==osMutexAcquire(Error_Mutex, 100))
|
|
|
- {
|
|
|
- UINT8 ErrorNumTemp = 20;
|
|
|
- PutErrorNum((UINT16 *)ErrorNum,sizeof(ErrorNum),ErrorNumTemp);
|
|
|
- }
|
|
|
- osMutexRelease(Error_Mutex);
|
|
|
}
|
|
|
}
|
|
|
- if(UartReadMsg.Header[2]>0)
|
|
|
- {
|
|
|
- uartReadSuccessFlag = true;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- uartReadSuccessFlag = false;
|
|
|
- }
|
|
|
if(Timer_count-currentTimerCount >= 1)
|
|
|
{
|
|
|
if(AppNVMData.isBattLocked != 0)
|
|
|
{
|
|
|
battLockStateDisplay(TRUE);
|
|
|
}
|
|
|
- else if(uartReadSuccessFlag)
|
|
|
+ else if(UartBattInfoRecvFlag)
|
|
|
{
|
|
|
battSOCDisplay();
|
|
|
battErrorStateDisplay();
|
|
@@ -232,19 +213,20 @@ static void UartTask(void* arg)
|
|
|
Ringtimes = 0;
|
|
|
}
|
|
|
}
|
|
|
- else if(UDSSwitch==1 && Ringtimes<=50)
|
|
|
+ else if(CanMsgFlag==1 && Ringtimes<=50)
|
|
|
{
|
|
|
relayControlFunc(0.6,5);//表示1s响2次,占比80%
|
|
|
Ringtimes++;
|
|
|
+ if(Ringtimes>=50)
|
|
|
+ {
|
|
|
+ Ringtimes = 51;
|
|
|
+ relayControl(FALSE);
|
|
|
+ }
|
|
|
}
|
|
|
else if(BuzzerControl==TRUE)
|
|
|
{
|
|
|
relayControlFunc(0.6,5);//表示1s响2次,占比80%
|
|
|
}
|
|
|
- if(Ringtimes>=50)
|
|
|
- {
|
|
|
- relayControl(FALSE);
|
|
|
- }
|
|
|
}
|
|
|
currentTimerCount = Timer_count;
|
|
|
if(BMS_Fota_update_flag)
|
|
@@ -256,56 +238,71 @@ static void UartTask(void* arg)
|
|
|
}
|
|
|
}
|
|
|
//限制充电测试
|
|
|
- if((battSOC>=95)&&(BattWorkStateDelay ==0x02)&&(((UartReadMsg.data[(0x1B+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2+1])&0x02)!=0x00))//try to lock lock the charge
|
|
|
+ if((battSOC>=95)&&(BattWorkStateDelay ==0x02)&&(((UartReadMsg.data[(0x1B+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2+1])&0x02)!=0x00)&&(UartBattInfoRecvFlag==TRUE))//try to lock lock the charge
|
|
|
{
|
|
|
+ #ifdef USING_PRINTF
|
|
|
+ printf("[%d]try to lock charge \n",__LINE__);
|
|
|
+ #endif
|
|
|
UartWriteData.WriteCmd = 0x01;
|
|
|
UartWriteData.Data[0] = 0x00|(UartReadMsg.data[(0x1B+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2]);
|
|
|
UartWriteData.Data[1] = 0x00|((UartReadMsg.data[(0x1B+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2+1])&0x01);
|
|
|
osMessageQueuePut(UartWriteCmdHandle,&UartWriteData,0,0);
|
|
|
}
|
|
|
- else if((battSOC<=90)&&(((UartReadMsg.data[(0x1B+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2+1])&0x02)!=0x02))//try to unlock lock the charge
|
|
|
+ else if((battSOC<=90)&&(((UartReadMsg.data[(0x1B+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2+1])&0x02)!=0x02)&&(UartBattInfoRecvFlag==TRUE))//try to unlock lock the charge
|
|
|
{
|
|
|
+ #ifdef USING_PRINTF
|
|
|
+ printf("[%d]try to unlock charge \n",__LINE__);
|
|
|
+ #endif
|
|
|
UartWriteData.WriteCmd = 0x01;
|
|
|
UartWriteData.Data[0] = 0x00|(UartReadMsg.data[(0x1B+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2]);
|
|
|
UartWriteData.Data[1] = 0x02|((UartReadMsg.data[(0x1B+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2+1])&0x01);
|
|
|
osMessageQueuePut(UartWriteCmdHandle,&UartWriteData,0,0);
|
|
|
}
|
|
|
- if((battWorkState ==0x00) && (AppNVMData.isBattLocked==TRUE) && (((UartReadMsg.data[(0x1B+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2+1])&0x01)!=0x00))//try to lock lock the discharge
|
|
|
+ if((battWorkState ==0x00) && (AppNVMData.isBattLocked==TRUE) && (((UartReadMsg.data[(0x1B+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2+1])&0x01)!=0x00)&&(UartBattInfoRecvFlag==TRUE))//try to lock lock the discharge
|
|
|
{
|
|
|
#ifdef USING_PRINTF
|
|
|
- printf("[%d]try to lock:%X-%X\n",__LINE__,AppNVMData.isBattLocked,(UartReadMsg.data[(0x1B+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2+1])&0x03);
|
|
|
+ printf("[%d]try to lock discharge \n",__LINE__);
|
|
|
#endif
|
|
|
UartWriteData.WriteCmd = 0x01;
|
|
|
UartWriteData.Data[0] = 0x00|(UartReadMsg.data[(0x1B+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2]);
|
|
|
UartWriteData.Data[1] = 0x00|((UartReadMsg.data[(0x1B+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2+1])&0x02);
|
|
|
osMessageQueuePut(UartWriteCmdHandle,&UartWriteData,0,0);
|
|
|
}
|
|
|
- else if (battWorkState ==0x00 && AppNVMData.isBattLocked==FALSE && (((UartReadMsg.data[(0x1B+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2+1])&0x01)!=0x01)&&(uartReadSuccessFlag==TRUE)) // try to unlock
|
|
|
+ else if (battWorkState ==0x00 && AppNVMData.isBattLocked==FALSE && (((UartReadMsg.data[(0x1B+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2+1])&0x01)!=0x01)&&(UartBattInfoRecvFlag==TRUE)) // try to unlock
|
|
|
{
|
|
|
#ifdef USING_PRINTF
|
|
|
- printf("[%d]try to unlock:%X-%X\n",__LINE__,AppNVMData.isBattLocked,(UartReadMsg.data[(0x1B+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2+1])&0x03);
|
|
|
+ printf("[%d]try to unlock discharge \n",__LINE__);
|
|
|
#endif
|
|
|
UartWriteData.WriteCmd = 0x01;
|
|
|
UartWriteData.Data[0] = 0x00|(UartReadMsg.data[(0x1B+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2]);
|
|
|
UartWriteData.Data[1] = 0x01|((UartReadMsg.data[(0x1B+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2+1])&0x02);
|
|
|
osMessageQueuePut(UartWriteCmdHandle,&UartWriteData,0,0);
|
|
|
}
|
|
|
- if((AppDataInfo.RelayControl==TRUE) && (((UartReadMsg.data[(0x1B+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2])&0x80)==0x00)&&(uartReadSuccessFlag==TRUE))//继电器断开
|
|
|
+ if((AppDataInfo.RelayControl==TRUE) && (((UartReadMsg.data[(0x1B+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2])&0x80)==0x00)&&(UartBattInfoRecvFlag==TRUE))//继电器断开
|
|
|
{
|
|
|
+ #ifdef USING_PRINTF
|
|
|
+ printf("[%d]try to cut relay \n",__LINE__);
|
|
|
+ #endif
|
|
|
UartWriteData.WriteCmd = 0x03;
|
|
|
UartWriteData.Data[0] = 0x80;
|
|
|
UartWriteData.Data[1] = 0x00|(UartReadMsg.data[(0x1B+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2+1]);
|
|
|
osMessageQueuePut(UartWriteCmdHandle,&UartWriteData,0,0);
|
|
|
}
|
|
|
- else if((AppDataInfo.RelayControl==FALSE) && (((UartReadMsg.data[(0x1B+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2])&0x80)==0x80)&&(uartReadSuccessFlag==TRUE))//继电器闭合
|
|
|
+ else if((AppDataInfo.RelayControl==FALSE) && (((UartReadMsg.data[(0x1B+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2])&0x80)==0x80)&&(UartBattInfoRecvFlag==TRUE))//继电器闭合
|
|
|
{
|
|
|
+ #ifdef USING_PRINTF
|
|
|
+ printf("[%d]try to recover relay \n",__LINE__);
|
|
|
+ #endif
|
|
|
UartWriteData.WriteCmd = 0x03;
|
|
|
UartWriteData.Data[0] = 0x00;
|
|
|
UartWriteData.Data[1] = 0x00|(UartReadMsg.data[(0x1B+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2+1]);
|
|
|
osMessageQueuePut(UartWriteCmdHandle,&UartWriteData,0,0);
|
|
|
}
|
|
|
- if(BattHeaterSwitch(&HeatSwitch)==TRUE)
|
|
|
+ if(BattHeaterSwitch(&HeatSwitch,HeatForceControl)==TRUE&&(UartBattInfoRecvFlag==TRUE))
|
|
|
{
|
|
|
+ #ifdef USING_PRINTF
|
|
|
+ printf("[%d]try to change heatstate \n",__LINE__);
|
|
|
+ #endif
|
|
|
UartWriteData.WriteCmd = 0x02;
|
|
|
UartWriteData.Data[0] = 0x00;
|
|
|
UartWriteData.Data[1] = HeatSwitch&0xFF;
|
|
@@ -316,6 +313,7 @@ static void UartTask(void* arg)
|
|
|
case PROCESS_UART_STATE_READ:
|
|
|
{
|
|
|
UINT16 CRC_chk_buffer;
|
|
|
+ UINT16 Uart_Recv_LEN = 0;
|
|
|
Reg_Num = 0x21+BATT_CELL_VOL_NUM+BATT_TEMP_NUM + BATT_OTHER_TEMP_NUM;//按照协议里面的0x21+X+N的结束地址
|
|
|
Uart_Read_Msg.Bms_Address = BMS_ADDRESS_CODE;
|
|
|
Uart_Read_Msg.Bms_Funcode = UART_READ_CODE;
|
|
@@ -341,14 +339,6 @@ static void UartTask(void* arg)
|
|
|
}
|
|
|
UartReadMsg.len = Uart_Recv_LEN;
|
|
|
PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_IDLE);
|
|
|
- if( battWorkState ==0x02)
|
|
|
- {
|
|
|
- BattChrgEndFlag=TRUE;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- BattChrgEndFlag=FALSE;
|
|
|
- }
|
|
|
#ifdef USING_PRINTF1
|
|
|
printf("[%d]lock:%X,permit:%X,Mos:%x\n",__LINE__,AppNVMData.isBattLocked,(UartReadMsg.data[(0x1B+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2+1])&0x03,((UartReadMsg.data[(0x09+BATT_CELL_VOL_NUM+BATT_OTHER_TEMP_NUM)*2+1])>>1)&0x03);
|
|
|
#endif
|
|
@@ -533,11 +523,14 @@ static BOOL uartBattInfoDecode(UINT8* dataPtr)
|
|
|
//SOC紧急修复
|
|
|
maxCellTemp = 0x00;
|
|
|
minCellTemp = 0xFF;
|
|
|
+ UINT16 TempBuffer = 0;
|
|
|
for(i=0;i<BATT_TEMP_NUM;i++)
|
|
|
{
|
|
|
+ TempBuffer = battCellTemp[i] + TempBuffer;
|
|
|
maxCellTemp = max(maxCellTemp,battCellTemp[i]);
|
|
|
minCellTemp = min(minCellTemp,battCellTemp[i]);
|
|
|
}
|
|
|
+ AvgBattTemp = (TempBuffer-maxCellTemp-minCellTemp)/(BATT_TEMP_NUM - 2);
|
|
|
nbSwVersion = APPSWVERSION;
|
|
|
nbHwVersion = HWVERSION;
|
|
|
BmsErrorDecode(battWarningState);
|
|
@@ -859,33 +852,51 @@ UINT8 Uart_DataRecv_func(Uart_Read_Msg_Type Uart_Read_Msg_Fun,UINT8* Uart_Recv_B
|
|
|
\return (BOOL) isNeedtoSwitch: true: need to send cmd to turn on/off the switch
|
|
|
false: do not need to do anything
|
|
|
*/
|
|
|
-BOOL BattHeaterSwitch(UINT8* heaterSwitch)
|
|
|
+BOOL BattHeaterSwitch(UINT8* heaterSwitch,UINT8 HeatForceControl)
|
|
|
{
|
|
|
- BOOL isNeedtoSwitch = FALSE;
|
|
|
-
|
|
|
- UINT8 i =0;
|
|
|
- UINT8 currentSwitchState = 0;
|
|
|
-
|
|
|
- //get the current switch state and the cell temp
|
|
|
- currentSwitchState = battHeatEnableState & 0x01;
|
|
|
+ BOOL isNeedtoSwitch = FALSE;
|
|
|
+
|
|
|
+ UINT8 i =0;
|
|
|
+ UINT8 currentSwitchState = 0;
|
|
|
|
|
|
- if(currentSwitchState==0) //当前状态为关闭,判断是否应该开启
|
|
|
+ //get the current switch state and the cell temp
|
|
|
+ currentSwitchState = battHeatEnableState & 0x01;
|
|
|
+ if(HeatForceControl==1)//强制开启
|
|
|
{
|
|
|
- if((chargerConnectState == 1 && minCellTemp<5+40 && minCellTemp>=-29+40 && maxCellTemp<25+40)||(chargerConnectState==0 && minCellTemp<5+40 && minCellTemp>=-29+40 && battSOC>=10 && (((battProtectState>> 21)&0x01) == 0)))//温度偏移为40
|
|
|
+ if(currentSwitchState==0)
|
|
|
{
|
|
|
*heaterSwitch = 1;
|
|
|
isNeedtoSwitch = true;
|
|
|
}
|
|
|
}
|
|
|
- else //当前状态为开启,判断是否应该关闭
|
|
|
+ else if(HeatForceControl==2)//强制关闭
|
|
|
{
|
|
|
- if((minCellTemp>=10+40 || maxCellTemp>=30+40)||(chargerConnectState == 0 && minCellTemp<5+40 && minCellTemp>=-29+40 && battSOC<5))
|
|
|
+ if(currentSwitchState==1)
|
|
|
{
|
|
|
*heaterSwitch = 0;
|
|
|
- isNeedtoSwitch= true;
|
|
|
+ isNeedtoSwitch = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else//不强制控制
|
|
|
+ {
|
|
|
+ if(currentSwitchState==0) //当前状态为关闭,判断是否应该开启
|
|
|
+ {
|
|
|
+ if((chargerConnectState == 1 && minCellTemp<5+40 && minCellTemp>=-29+40 && maxCellTemp<25+40)||(chargerConnectState==0 && minCellTemp<5+40 && minCellTemp>=-29+40 && battSOC>=10 && (((battProtectState>> 21)&0x01) == 0)))//温度偏移为40
|
|
|
+ {
|
|
|
+ *heaterSwitch = 1;
|
|
|
+ isNeedtoSwitch = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else //当前状态为开启,判断是否应该关闭
|
|
|
+ {
|
|
|
+ if((minCellTemp>=10+40 || maxCellTemp>=30+40)||(chargerConnectState == 0 && minCellTemp<5+40 && minCellTemp>=-29+40 && battSOC<5))
|
|
|
+ {
|
|
|
+ *heaterSwitch = 0;
|
|
|
+ isNeedtoSwitch= true;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
- return isNeedtoSwitch;
|
|
|
+ return isNeedtoSwitch;
|
|
|
}
|
|
|
|
|
|
void battSOCDisplay()
|