|
@@ -78,6 +78,11 @@ UINT16 encryptionAlgorithm (UINT16 plainText);
|
|
|
UINT8 decryptionAlgorithm (UINT16 cipherText);
|
|
|
UINT8 Uart_Encrypt_Send(void);
|
|
|
UINT8 BmsErrorDecode(UINT32 battWarningState);
|
|
|
+
|
|
|
+#ifdef SOC_TEST
|
|
|
+void Uart_Data_recv_SOC_test(void);
|
|
|
+#endif
|
|
|
+
|
|
|
//BMS升级函数声明
|
|
|
UINT8 SP_BMS_Update_CheckSUM(UINT8* pSendData,UINT8 len);
|
|
|
void SP_BMS_Update_Service();
|
|
@@ -115,7 +120,7 @@ static void UartTask(void* arg)
|
|
|
//上电起始控制区域
|
|
|
UINT8 ret = 0x00,Ringtimes = 0;
|
|
|
UINT8 HeatSwitch = 0;
|
|
|
-
|
|
|
+ UINT8 heatErrorCounter = 0;
|
|
|
while (1)
|
|
|
{
|
|
|
switch (gProcess_Uart_Task)
|
|
@@ -169,9 +174,20 @@ static void UartTask(void* arg)
|
|
|
{
|
|
|
AppDataInfo.RelayControl=FALSE;
|
|
|
}
|
|
|
- if(maxCellTemp>=50&&minCellTemp>=50&&battHeatEnableState==0x00)
|
|
|
+ if(maxCellTemp>=90&&minCellTemp>=90&&battHeatEnableState==0x00&&MOSTemp>=120)//温度的判定需要加40摄氏度,如果模组最高>50度,模组最低>50度,mos温度>80度,并且加热关闭,持续超过10s,则断开继电器
|
|
|
{
|
|
|
- AppDataInfo.RelayControl=TRUE;
|
|
|
+ heatErrorCounter++;
|
|
|
+ if(heatErrorCounter>100)
|
|
|
+ {
|
|
|
+ heatErrorCounter = 0;
|
|
|
+ AppDataInfo.RelayControl=TRUE;
|
|
|
+ if(osOK==osMutexAcquire(Error_Mutex, 100))
|
|
|
+ {
|
|
|
+ UINT8 ErrorNumTemp = 20;
|
|
|
+ PutErrorNum((UINT16 *)ErrorNum,sizeof(ErrorNum),ErrorNumTemp);
|
|
|
+ }
|
|
|
+ osMutexRelease(Error_Mutex);
|
|
|
+ }
|
|
|
}
|
|
|
if(UartReadMsg.Header[2]>0)
|
|
|
{
|
|
@@ -323,6 +339,13 @@ static void UartTask(void* arg)
|
|
|
#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
|
|
|
+ //SOC问题测试
|
|
|
+ #ifdef SOC_TEST
|
|
|
+ if(bmsSwVersion==8)
|
|
|
+ {
|
|
|
+ Uart_Data_recv_SOC_test();
|
|
|
+ }
|
|
|
+ #endif
|
|
|
break;
|
|
|
}
|
|
|
case PROCESS_UART_STATE_WRITE:
|
|
@@ -452,8 +475,18 @@ static BOOL uartBattInfoDecode(UINT8* dataPtr)
|
|
|
battHeatEnableState = dataPtr[(0x1C+BATT_CELL_VOL_NUM+TEMP_NUM)*2+1]&0x01;
|
|
|
|
|
|
//SOC问题紧急修复
|
|
|
+ #ifdef SOC_TEST
|
|
|
+ Data_Current = (dataPtr[(0x02+BATT_CELL_VOL_NUM)*2]<<8)|(dataPtr[(0x02+BATT_CELL_VOL_NUM)*2+1]);
|
|
|
static UINT8 Soc_change_flag = 0;//0-BMS原始值,1-计算值
|
|
|
- SOC1 = min((battPackVol*45-27000)/100,SOC1);
|
|
|
+ if((battI>10200U)||(battWorkState==2))//放电电流超过20A,使用上一时刻值,//如果有充电,使用计算值,最大不超过100
|
|
|
+ {
|
|
|
+ SOC1 = max((battPackVol*45-27000)/100,SOC1);
|
|
|
+ SOC1 = min(100,SOC1);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ SOC1 = min((battPackVol*45-27000)/100,SOC1);
|
|
|
+ }
|
|
|
SOC2 = battSOC;
|
|
|
if(Soc_change_flag == 0)//使用原始值
|
|
|
{
|
|
@@ -469,11 +502,9 @@ static BOOL uartBattInfoDecode(UINT8* dataPtr)
|
|
|
Soc_change_flag = 0;
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
if(Soc_change_flag==0)
|
|
|
{
|
|
|
battSOC = SOC2;
|
|
|
- SOC1 = SOC2;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
@@ -485,6 +516,8 @@ static BOOL uartBattInfoDecode(UINT8* dataPtr)
|
|
|
}
|
|
|
osMutexRelease(Error_Mutex);
|
|
|
}
|
|
|
+ #endif
|
|
|
+ //SOC紧急修复
|
|
|
maxCellTemp = 0x00;
|
|
|
minCellTemp = 0xFF;
|
|
|
for(i=0;i<BATT_TEMP_NUM;i++)
|
|
@@ -497,9 +530,50 @@ static BOOL uartBattInfoDecode(UINT8* dataPtr)
|
|
|
BmsErrorDecode(battWarningState);
|
|
|
return true;
|
|
|
}
|
|
|
+#ifdef SOC_TEST
|
|
|
+void Uart_Data_recv_SOC_test(void)
|
|
|
+{
|
|
|
|
|
|
-
|
|
|
-
|
|
|
+ UINT16 CRC_chk_buffer;
|
|
|
+ Uart_Read_Msg_Type Uart_Read_Msg;
|
|
|
+ memset(&(Uart_Read_Msg),0x00,sizeof(Uart_Read_Msg_Type));
|
|
|
+ UartReadMsgType UartReadMsg;
|
|
|
+ memset(&(UartReadMsg.UartFlag),0x00,sizeof(UartReadMsgType));
|
|
|
+ UINT8 Reg = 0,Uart_Uds_LEN = 0,Uart_Recv_LEN;
|
|
|
+ Reg = 0x33+BATT_CELL_VOL_NUM+BATT_TEMP_NUM + BATT_OTHER_TEMP_NUM;
|
|
|
+ Uart_Read_Msg.Bms_Address = BMS_ADDRESS_CODE;
|
|
|
+ Uart_Read_Msg.Bms_Funcode = UART_READ_CODE;
|
|
|
+ Uart_Read_Msg.Reg_Begin_H = Reg>>8;
|
|
|
+ Uart_Read_Msg.Reg_Begin_L= Reg;
|
|
|
+ Uart_Read_Msg.Reg_Num_H = 0;
|
|
|
+ Uart_Read_Msg.Reg_Num_L = 16;
|
|
|
+ Uart_Uds_LEN = 17*2;
|
|
|
+ memset(UartReadMsg.Header,0x00,Uart_Uds_LEN);
|
|
|
+ CRC_chk_buffer = crc_chk((UINT8 *)&Uart_Read_Msg,6);
|
|
|
+ Uart_Read_Msg.CRC_L = CRC_chk_buffer;
|
|
|
+ Uart_Read_Msg.CRC_H = CRC_chk_buffer>>8;
|
|
|
+ Uart_Recv_LEN = Uart_DataRecv_func(Uart_Read_Msg,(UINT8*)(UartReadMsg.Header));
|
|
|
+ if(Uart_Recv_LEN>0)
|
|
|
+ {
|
|
|
+ Data_33 = (UartReadMsg.data[0]<<8|UartReadMsg.data[1]);
|
|
|
+ Data_34 = (UartReadMsg.data[2]<<8|UartReadMsg.data[3]);
|
|
|
+ Data_35 = (UartReadMsg.data[4]<<24|UartReadMsg.data[5]<<16|UartReadMsg.data[6]<<8|UartReadMsg.data[7]);
|
|
|
+ Data_37 = (UartReadMsg.data[8]<<8|UartReadMsg.data[9]);
|
|
|
+ Data_38 = (UartReadMsg.data[10]<<8|UartReadMsg.data[11]);
|
|
|
+ Data_39 = (UartReadMsg.data[12]<<8|UartReadMsg.data[13]);
|
|
|
+ Data_3A = (UartReadMsg.data[14]<<8|UartReadMsg.data[15]);
|
|
|
+ Data_3B = (UartReadMsg.data[16]<<8|UartReadMsg.data[17]);
|
|
|
+ Data_3C = (UartReadMsg.data[18]<<8|UartReadMsg.data[19]);
|
|
|
+ Data_3D = (UartReadMsg.data[20]<<8|UartReadMsg.data[21]);
|
|
|
+ Data_3E = (UartReadMsg.data[22]<<8|UartReadMsg.data[23]);
|
|
|
+ Data_3F = (UartReadMsg.data[24]<<8|UartReadMsg.data[25]);
|
|
|
+ Data_40 = (UartReadMsg.data[26]<<8|UartReadMsg.data[27]);
|
|
|
+ Data_41 = (UartReadMsg.data[28]<<8|UartReadMsg.data[29]);
|
|
|
+ Data_42 = (UartReadMsg.data[30]<<8|UartReadMsg.data[31]);
|
|
|
+ Data_43 = (UartReadMsg.data[32]<<8|UartReadMsg.data[33]);
|
|
|
+ }
|
|
|
+}
|
|
|
+#endif
|
|
|
|
|
|
|
|
|
|