Bladeren bron

【3.0.0.25】1.强制控制增加,2.Tcp调试信息发送更改,3.LED闪灯逻辑更改

CHENJIE-PC\QiXiang_CHENJIE 3 jaren geleden
bovenliggende
commit
707db48e53
13 gewijzigde bestanden met toevoegingen van 436 en 199 verwijderingen
  1. 3 2
      inc/AppConfig.h
  2. 2 1
      inc/AppSignal.h
  3. 6 2
      inc/EmbeddedCoder_inc/BCUDisp.h
  4. 25 23
      inc/EmbeddedCoder_inc/SFM.h
  5. 107 26
      src/AppFunc.c
  6. 3 2
      src/AppSignal.c
  7. 4 29
      src/AppTaskCan.c
  8. 2 2
      src/AppTaskMain.c
  9. 20 10
      src/AppTaskTcp.c
  10. 20 4
      src/AppTaskUart.c
  11. 23 10
      src/BCU.c
  12. 6 3
      src/EmbeddedCoder_src/BCUDisp.c
  13. 215 85
      src/EmbeddedCoder_src/SFM.c

+ 3 - 2
inc/AppConfig.h

@@ -2,7 +2,7 @@
  * @Author       : ChenJie
  * @Date         : 2021-10-14 09:27:15
  * @LastEditors  : ChenJie
- * @LastEditTime : 2021-10-22 19:23:20
+ * @LastEditTime : 2021-10-25 18:51:26
  * @Description  : App Config H file 配置文件,可以针对不同参数进行更改
  * @FilePath     : \PLAT\project\ec616_0h00\apps\qx_app\inc\AppConfig.h
  */
@@ -14,7 +14,7 @@
 #define DATA_MODULE_TYPE (1)           //1表示NB模块,2表示4G cat1
 #define EOLSTATE (0)                   //1表示下线检测跳过,使用默认值,0表示使用下线检测
 #define DEFAULT_SN "RLTEST00000000001" //默认上传的SN编码
-#define APPSWVERSION 0x03000018        //数据模块软件版本号
+#define APPSWVERSION 0x03000019        //数据模块软件版本号
 #define RELAYCONFIG 0                  //继电器配置
 #define TCP_ADD "iotp.fast-fun.cn"     //数据上传的地址
 #define TCP_PORT 8712                  //数据上传的端口
@@ -126,6 +126,7 @@ typedef struct _AppAlgorithmType
     BOOL sfmd_flg_mainCirClosFltE;
     BOOL sfmd_flg_heatCirClosFltE;
     BOOL sfmd_flg_heatCirOpenFltE;
+    BOOL sfmd_flg_heatRunFltE;
 } AppAlgorithmData;
 typedef struct _AppDataHeader
 {

+ 2 - 1
inc/AppSignal.h

@@ -2,7 +2,7 @@
  * @Author       : ChenJie
  * @Date         : 2021-10-14 09:27:15
  * @LastEditors  : ChenJie
- * @LastEditTime : 2021-10-22 11:54:52
+ * @LastEditTime : 2021-10-26 16:07:37
  * @Description  : Global variable definition H file
  * @FilePath     : \PLAT\project\ec616_0h00\apps\qx_app\inc\AppSignal.h
  */
@@ -54,6 +54,7 @@ extern UINT8 packTemp;
 extern UINT8 PadInterrupt;
 extern UINT8 PosFlag;
 extern UINT8 RelayForbiddenControl;
+extern UINT8 RelayForceControl;
 extern UINT8 reservedSignal1;
 extern UINT8 reservedSignal2;
 extern UINT8 reservedSignal3;

+ 6 - 2
inc/EmbeddedCoder_inc/BCUDisp.h

@@ -72,6 +72,8 @@ extern boolean_T sfmd_flg_heatCirClosFltEi;              /*加热回路常闭故
 extern boolean_T sfmd_flg_heatCirClosFltEo;              /*加热回路常闭故障写入量 */  
 extern boolean_T sfmd_flg_heatCirOpenFltEi;              /*加热回路常开故障读取量 */  
 extern boolean_T sfmd_flg_heatCirOpenFltEo;              /*加热回路常开故障写入量 */  
+extern boolean_T sfmd_flg_heatRunFltEi;
+extern boolean_T sfmd_flg_heatRunFltEo;
 
 extern uint16_T socd_pct_ahSoc;                          /*安时SOC; */
 extern uint16_T socd_pct_estSoc;                         /*估算SOC;*/
@@ -103,7 +105,7 @@ extern uint16_T sohv_V_chrgStartStatEo[28];              /*充电开始时刻的
 
 extern uint8_T cmd_st_chrgMod;                           /* 充电模式  */
 extern uint8_T cmd_st_chrgSt;                            /* 充电状态  */
-extern uint16_T cmd_I_chrgCurrReq;                       /* 充电需求电流  */
+extern int16_T cmd_I_chrgCurrReq;                       /* 充电需求电流  */
 extern uint8_T cmd_idx_chrgEndReason;                    /* 充电结束原因  */
 
 extern uint16_T cand_Nr_cellNr;                          /*循环发送的单体编号; */
@@ -116,4 +118,6 @@ extern uint16_T cand_Q_totalCp;                          /*循环发送的单体
 extern uint16_T test_efkSocMin;
 extern uint16_T test_efkSocMax;
 extern real_T test_UpMin;
-extern real_T test_UpMax;
+extern real_T test_UpMax;
+extern uint16_T test_ekfSoc;
+extern uint16_T test_ekfSoc0;

+ 25 - 23
inc/EmbeddedCoder_inc/SFM.h

@@ -6,7 +6,8 @@ extern boolean_T FirstRun_SFM;
 extern void SFM_Init(void);
 extern void SFM(void);
 
-typedef struct {
+typedef struct
+{
     uint8_T fltNum81;
     uint8_T recNum81;
     uint8_T fltNum82;
@@ -31,7 +32,7 @@ typedef struct {
     uint8_T recNum97;
     uint8_T fltNum98;
     uint8_T recNum98;
-	uint8_T fltNum99;
+    uint8_T fltNum99;
     uint8_T recNum99;
     uint8_T fltNum100;
     uint8_T recNum100;
@@ -75,24 +76,25 @@ typedef struct {
     uint8_T recNum131;
     uint8_T fltNum132;
     uint8_T recNum132;
-}DiagThrstruct;
+} DiagThrstruct;
 
-typedef struct {
-	uint16_T N22;
-	uint16_T N24;
-	uint16_T N32;
-	uint16_T N33;
-	uint16_T N34;
-	uint16_T N54;
-	uint16_T N56;
-	uint16_T N57;
-	uint16_T N58;
-	uint16_T N59;
-	uint16_T N62;
-	uint16_T N64;
-	uint16_T N65;
-	uint16_T N66;
-	uint16_T N67;
+typedef struct
+{
+    uint16_T N22;
+    uint16_T N24;
+    uint16_T N32;
+    uint16_T N33;
+    uint16_T N34;
+    uint16_T N54;
+    uint16_T N56;
+    uint16_T N57;
+    uint16_T N58;
+    uint16_T N59;
+    uint16_T N62;
+    uint16_T N64;
+    uint16_T N65;
+    uint16_T N66;
+    uint16_T N67;
     uint16_T N151;
     uint16_T N152;
     uint16_T N153;
@@ -105,9 +107,9 @@ typedef struct {
     uint16_T N160;
     uint16_T N161;
     uint16_T N162;
-	uint16_T N179;
-}DiagTimestruct;
+    uint16_T N179;
+} DiagTimestruct;
 
-extern boolean_T DiagThrSystem1(boolean_T Enable, boolean_T precondition, uint16_T Input,uint16_T fltThr,uint16_T recThr,uint16_T fltNumThr,uint16_T recNumThr,uint8_T *fltNum,uint8_T *recNum,boolean_T *fitFlg);
-extern boolean_T DiagThrSystem2(boolean_T Enable, boolean_T precondition, uint16_T Input,uint16_T fltThr,uint16_T recThr,uint16_T fltNumThr,uint16_T recNumThr,uint8_T *fltNum,uint8_T *recNum,boolean_T *fitFlg);
+extern boolean_T DiagThrSystem1(boolean_T Enable, boolean_T precondition, uint16_T Input, uint16_T fltThr, uint16_T recThr, uint8_T fltNumThr, uint8_T recNumThr, uint8_T *fltNum, uint8_T *recNum, boolean_T *fitFlg);
+extern boolean_T DiagThrSystem2(boolean_T Enable, boolean_T precondition, uint16_T Input, uint16_T fltThr, uint16_T recThr, uint8_T fltNumThr, uint8_T recNumThr, uint8_T *fltNum, uint8_T *recNum, boolean_T *fitFlg);
 extern boolean_T JudgeTimeSystem(boolean_T Enable, boolean_T Input, uint16_T *N, uint16_T Thr);

+ 107 - 26
src/AppFunc.c

@@ -3,7 +3,7 @@
  * @Date         : 2021-10-14 09:27:15
  * @Version      : V3.0
  * @LastEditors  : ChenJie
- * @LastEditTime : 2021-10-22 15:15:32
+ * @LastEditTime : 2021-10-26 14:54:49
  * @Description  : 应用层函数定义区,UTF-8
  * @FilePath     : \PLAT\project\ec616_0h00\apps\qx_app\src\AppFunc.c
  */
@@ -540,13 +540,12 @@ void LEDDisplay(void)
 		}
 		else if (UartRecvFlag == 1) //电池接收到UART信息,且正确运行
 		{
-			if (battWorkState == 0x02) //充电模式下,如果只有“SOC低故障”,那么就不显示故障灯   zhengchao20210713 add
-			{
-				if ((((battWarningState >> 10) & 0x01) == 0x01) && ((battWarningState & 0xFFFFFBFF) == 0x00))
-					return;
-			}
-			if (getbit(sfmd_st_fltAct, 1) == 1 || AppNVMData.EOLState == 0) //电池存在故障,或者未完成下线检测
+			if (AppNVMData.EOLState == 0) //未完成下线检测,灭其余灯,闪红灯
 			{
+				NetSocDisplay(LED_SOC_0, LED_TURN_OFF);
+				NetSocDisplay(LED_SOC_1, LED_TURN_OFF);
+				NetSocDisplay(LED_SOC_2, LED_TURN_OFF);
+				NetSocDisplay(LED_SOC_3, LED_TURN_OFF);
 				if (ErrorLightTimer < (UINT8)(LEDFlashPeriod * DutyRatio))
 				{
 
@@ -559,17 +558,19 @@ void LEDDisplay(void)
 				}
 				else
 				{
-
 					FaultDisplay(LED_TURN_OFF);
 					ErrorLightTimer = 0;
 				}
+				return;
+			}
+			else if (getbit(sfmd_st_fltAct, 1) == 1) //通过下线检测,有故障亮红灯
+			{
+				FaultDisplay(LED_TURN_ON);
 			}
 			else
 			{
 				FaultDisplay(LED_TURN_OFF);
-				ErrorLightTimer = 0;
 			}
-
 			if (battWorkState == 0 || battWorkState == 1) //静置或放电状态
 			{
 				if (LedBattSoc <= 10)
@@ -1362,6 +1363,7 @@ static void setDefaultBcuDataInfo(void)
 	BcuDataInfo.sfmd_flg_mainCirClosFltE = 0;
 	BcuDataInfo.sfmd_flg_heatCirClosFltE = 0;
 	BcuDataInfo.sfmd_flg_heatCirOpenFltE = 0;
+	BcuDataInfo.sfmd_flg_heatRunFltE = 0;
 	return;
 }
 /**
@@ -2207,6 +2209,42 @@ void UDS_Service(CAN_Msg_Type *CanRxMsg)
 					UDSNegtiveAnswer(0x05, i, 0xEE);
 				}
 				break;
+			case 0x14: //clear the DTC information 14 FF FF FF 00 00 00 00
+				if (UDSDialogMode == 2)
+				{
+					if (UDSSubService[i] == 0xFF)
+					{
+						if (UDSSubServiceActionCode[i] == 0xFF)
+						{
+							if (CanRxMsg[i].Data[3] == 0xFF)
+							{
+								ihd_flg_DTCClear = 0x01;
+								posCode = 0xEEEE;
+								UDSPositiveAnswer(06, i, posCode);
+							}
+							else
+							{
+								negCode = (UDSSubServiceActionCode[i] << 8) | CanRxMsg[i].Data[3];
+								UDSNegtiveAnswer(6, i, negCode);
+							}
+						}
+						else
+						{
+							negCode = (UDSSubServiceActionCode[i] << 8) | CanRxMsg[i].Data[3];
+							UDSNegtiveAnswer(6, i, negCode);
+						}
+					}
+					else
+					{
+						negCode = (UDSSubServiceActionCode[i] << 8) | CanRxMsg[i].Data[3];
+						UDSNegtiveAnswer(6, i, negCode);
+					}
+				}
+				else
+				{
+					UDSNegtiveAnswer(0x05, i, 0xFF);
+				}
+				break;
 			case 0x22:
 				if (UDSDialogMode == 2)
 				{
@@ -2269,24 +2307,43 @@ void UDS_Service(CAN_Msg_Type *CanRxMsg)
 					}
 					else if (UDSSubService[i] == 0x0E) //read ram data  22 0E xx xx xx xx XX XX
 					{
+						// UINT16 size = CanRxMsg[i].Data[7] | (CanRxMsg[i].Data[6] << 8);
+						// UINT32 retData = 0xFFFFFFFF;
+						// if (size == 1)
+						// {
+						// 	UINT8 *addr = (UINT8 *)(CanRxMsg[i].Data[5] | (CanRxMsg[i].Data[4] << 8) | (CanRxMsg[i].Data[3] << 16) | (CanRxMsg[i].Data[2] << 24));
+						// 	retData = *(addr);
+						// }
+						// else if (size == 2)
+						// {
+						// 	UINT16 *addr = (UINT16 *)(CanRxMsg[i].Data[5] | (CanRxMsg[i].Data[4] << 8) | (CanRxMsg[i].Data[3] << 16) | (CanRxMsg[i].Data[2] << 24));
+						// 	retData = *(addr);
+						// }
+						// else if (size == 4)
+						// {
+						// 	UINT32 *addr = (UINT32 *)(CanRxMsg[i].Data[5] | (CanRxMsg[i].Data[4] << 8) | (CanRxMsg[i].Data[3] << 16) | (CanRxMsg[i].Data[2] << 24));
+						// 	retData = *(addr);
+						// }
+						// else if (size == 8)
+						// {
+						// 	//double
+						// 	UINT32 *addr = (UINT32 *)(CanRxMsg[i].Data[5] | (CanRxMsg[i].Data[4] << 8) | (CanRxMsg[i].Data[3] << 16) | (CanRxMsg[i].Data[2] << 24));
+						// 	retData = *(addr);
+						// 	UDSPositiveAnswer(8, i, retData); //
+						// 	UINT32 *addr1 = *(addr+4);
+						// 	retData = *(addr1);
+						// 	UDSPositiveAnswer(8, i, retData);
+						// }
+
+						// UDSPositiveAnswer(8, i, retData); // 08 78 22 0E xx xx xx xx
 						UINT16 size = CanRxMsg[i].Data[7] | (CanRxMsg[i].Data[6] << 8);
-						UINT32 retData = 0xFFFFFFFF;
-						if (size == 1)
-						{
-							UINT8 *addr = (UINT8 *)(CanRxMsg[i].Data[5] | (CanRxMsg[i].Data[4] << 8) | (CanRxMsg[i].Data[3] << 16) | (CanRxMsg[i].Data[2] << 24));
-							retData = *(addr);
-						}
-						else if (size == 2)
-						{
-							UINT16 *addr = (UINT16 *)(CanRxMsg[i].Data[5] | (CanRxMsg[i].Data[4] << 8) | (CanRxMsg[i].Data[3] << 16) | (CanRxMsg[i].Data[2] << 24));
-							retData = *(addr);
-						}
-						else if (size == 4)
+						UINT8 *addr = (UINT8 *)(CanRxMsg[i].Data[5] | (CanRxMsg[i].Data[4] << 8) | (CanRxMsg[i].Data[3] << 16) | (CanRxMsg[i].Data[2] << 24));
+						for (UINT8 j = 0; j < size; j++)
 						{
-							UINT32 *addr = (UINT32 *)(CanRxMsg[i].Data[5] | (CanRxMsg[i].Data[4] << 8) | (CanRxMsg[i].Data[3] << 16) | (CanRxMsg[i].Data[2] << 24));
-							retData = *(addr);
+							UINT32 ret = 0xFF;
+							ret = (j << 16) | (*(addr + j));
+							UDSPositiveAnswer(8, i, ret);
 						}
-						UDSPositiveAnswer(8, i, retData); // 08 78 22 0E xx xx xx xx
 					}
 					else
 					{
@@ -2380,7 +2437,7 @@ void UDS_Service(CAN_Msg_Type *CanRxMsg)
 					UDSNegtiveAnswer(0x05, i, 0xFF);
 				}
 				break;
-			case 0x31: //clear the flash service
+			case 0x31: //clear the flash service and control heat or relay
 				if (UDSDialogMode == 3)
 				{
 					if (UDSSubService[i] == 0x0F) //clear the fota flash
@@ -2398,6 +2455,30 @@ void UDS_Service(CAN_Msg_Type *CanRxMsg)
 							UDSNegtiveAnswer(0x06, i, UDSSubServiceActionCode[i] << 8 | 0xFF); //重点测试
 						}
 					}
+					else if (UDSSubService[i] == 0x10) //control the heater 31 10 00/01/02
+					{
+						if (UDSSubServiceActionCode[i] <= 0x02) //case 00/01/02
+						{
+							HeatForceControl = UDSSubServiceActionCode[i];
+							UDSPositiveAnswer(0x05, i, HeatForceControl);
+						}
+						else
+						{
+							UDSNegtiveAnswer(0x05, i, UDSSubServiceActionCode[i]);
+						}
+					}
+					else if (UDSSubService[i] == 0x11) //control the main relay  31 11 00/01/02
+					{
+						if (UDSSubServiceActionCode[i] <= 0x02) //case 00/01/02
+						{
+							RelayForceControl = UDSSubServiceActionCode[i];
+							UDSPositiveAnswer(0x05, i, RelayForceControl);
+						}
+						else
+						{
+							UDSNegtiveAnswer(0x05, i, UDSSubServiceActionCode[i]);
+						}
+					}
 					else
 					{
 						UDSNegtiveAnswer(0x05, i, 0xEE); //the subservice is not surpported

+ 3 - 2
src/AppSignal.c

@@ -3,7 +3,7 @@
  * @Date         : 2021-10-14 09:27:15
  * @Version      : V3.0
  * @LastEditors  : ChenJie
- * @LastEditTime : 2021-10-22 11:54:34
+ * @LastEditTime : 2021-10-26 16:07:27
  * @Description  : Global variable definition c file,此文件存放App使用到的全局变量
  * @FilePath     : \PLAT\project\ec616_0h00\apps\qx_app\src\AppSignal.c
  */
@@ -50,6 +50,7 @@ UINT8 packTemp = 0;                     //battery pack temprature   电池箱体
 UINT8 PadInterrupt = 0x00;              //每个bit代表一个中断标志
 UINT8 PosFlag = 0;                      //定位信息是否有效标志位
 UINT8 RelayForbiddenControl = 0x00;     //继电器禁止控制
+UINT8 RelayForceControl = 0x00;         //继电器强制控制
 UINT8 reservedSignal1 = 0;              //can信息保留信号1
 UINT8 reservedSignal2 = 0;              //can信息保留信号2
 UINT8 reservedSignal3 = 0;              //can信息保留信号3
@@ -104,4 +105,4 @@ AppAlgorithmData BcuDataInfo;
 
 AppSocketConnectionContext socContext = {-1, 0}; //网络连接状态
 
-process_app gProcess_app; //全局工作状态
+process_app gProcess_app; //全局工作状态

+ 4 - 29
src/AppTaskCan.c

@@ -111,35 +111,6 @@ static void CanTask()
 							msgFlag = 0;
 						}
 					}
-					else if (CanRxMsg[i].Id == 0x7A2)
-					{
-						if (CanRxMsg[i].Data[0] == 0x01)
-						{
-							AppDataInfo.appDataModify = TRUE;
-							AppDataInfo.RelayControl = TRUE;
-						}
-						else
-						{
-							AppDataInfo.appDataModify = TRUE;
-							AppDataInfo.RelayControl = FALSE;
-						}
-						if (CanRxMsg[i].Data[1] == 0x01)
-						{
-							HeatForceControl = 0x01;
-						}
-						else if (CanRxMsg[i].Data[1] == 0x02)
-						{
-							HeatForceControl = 0x02;
-						}
-						else
-						{
-							HeatForceControl = 0x00;
-						}
-						if (CanRxMsg[i].Data[2] == 0x01)
-						{
-							BMS_Fota_update_flag = true;
-						}
-					}
 				}
 				if (udsFlag == 1)
 				{
@@ -161,6 +132,10 @@ static void CanTask()
 				delayconuter = 0;
 				clrbit(PadInterrupt, 0);
 				PROC_CAN_STATE_SWITCH(PROCESS_CAN_STATE_IDLE);
+				if (RelayForceControl == 1)
+				{
+					RelayForceControl = 2;
+				}
 			}
 			break;
 		}

+ 2 - 2
src/AppTaskMain.c

@@ -3,7 +3,7 @@
  * @Date         : 2021-10-14 09:27:15
  * @Version      : V3.0
  * @LastEditors  : ChenJie
- * @LastEditTime : 2021-10-22 11:13:19
+ * @LastEditTime : 2021-10-26 16:07:52
  * @Description  : 主要负责:1.工作模式转换2.定时器定时3.定时保存运行数据4.异常状态重启
  * @FilePath     : \PLAT\project\ec616_0h00\apps\qx_app\src\AppTaskMain.c
  */
@@ -105,7 +105,7 @@ static void MainTask(void *arg)
                 PROC_MAIN_STATE_SWITCH(PROCESS_STATE_LISTEN);
                 break;
             }
-            if ((BMS_Fota_update_flag != FALSE) || (TCPWorkState != 0x00) || (BattWorkStateDelay != BATT_IDLE_SYM) || (PadInterrupt != 0x00))
+            if ((BMS_Fota_update_flag != FALSE) || (TCPWorkState != 0x00) || (BattWorkStateDelay != BATT_IDLE_SYM) || (battWorkState != BATT_IDLE_SYM) || (PadInterrupt != 0x00))
             {
                 xTimerReset(work_timer, 0);
             }

+ 20 - 10
src/AppTaskTcp.c

@@ -235,7 +235,7 @@ static void TcpDataInfoAssembleSend()
     UINT16 DataLen = 0;
     UINT8 BattSendFreq = 30;
     UINT8 GpsSendFreq = 30;
-
+    UINT8 DebugFeq = 10;
     UINT16 year;
     UINT8 month, day, hour, minute, sec;
     UTC8TimeType UTC8TimeTcp;
@@ -278,8 +278,6 @@ static void TcpDataInfoAssembleSend()
             clrbit(PadInterrupt, 4);
         }
     }
-    BattSendFreq = 1;
-    UINT8 DebugFeq = 10;
     DebugFeq = BattSendFreq;
     if (send_counter % BattSendFreq == 0 && send_counter != 0)
     {
@@ -570,20 +568,25 @@ static void TcpDataInfoAssembleSend()
         DebugMsgtoTcpType DebugMsgInfo;
         UINT16 BufferLen = 0;
         UINT8 rbuf[1000];
-        if (send_counter % (60 / DebugFeq) == 0)
+        static UINT8 Debugcounter = 0;
+        if (Debugcounter % 2 == 0)
         {
             sprintf((char *)rbuf, "A-%x,%d,%d,%x,%x,%x,,%d,%d",
                     battProtectState, AppDataInfo.RelayControl, chargerConnectState, PowerVoltage, BMSupdatestatus, PadInterrupt,
                     AppDataInfo.ExpiryTimeArray[1], AppDataInfo.ExpiryTimeArray[2]);
         }
-        else if (send_counter % DebugFeq == 0)
+        else
         {
             sprintf((char *)rbuf, "B-%d,%d,%d,%d,%d,%d,\
-                                %d,%d,%d,%d,%d,%d,%d,%f,%f",
+                                %d,%d,%d",
                     socd_pct_ahSoc, socd_pct_ekfSoc, socd_pct_estSoc, socd_pct_battSoc, socd_pct_bcuSoc, battSOC * 10,
-                    battI, maxCellVol, minCellVol, battCellU[0], battCellU[1], test_efkSocMin, test_efkSocMax, test_UpMin, test_UpMax);
+                    battI, maxCellVol, minCellVol);
+        }
+        Debugcounter++;
+        if (Debugcounter > 100)
+        {
+            Debugcounter = 0;
         }
-
         BufferLen = strlen(rbuf);
         SendBuffer = malloc(BufferLen + sizeof(DebugMsgInfo));
         memcpy(SendBuffer + sizeof(DebugMsgInfo) - 1, rbuf, BufferLen);
@@ -802,15 +805,22 @@ static void TcpDataInfoRecvHandle()
                     TcpCmdAnswer[30] = bcc_chk(TcpCmdAnswer, 30);
                     if (*(Ptr + 31) == 0x01) //0x01代表断开
                     {
+
                         AppDataInfo.appDataModify = TRUE;
-                        AppDataInfo.RelayControl = TRUE;
+                        if (RelayForceControl == 0)
+                        {
+                            AppDataInfo.RelayControl = TRUE;
+                        }
                         AppDataInfo.BattForceLock = TRUE;
                         tcpipConnectionSend(socContext.id, TcpCmdAnswer, 31, 0, 0, 0);
                     }
                     else if (*(Ptr + 31) == 0x00) //0x00代表关闭
                     {
                         AppDataInfo.appDataModify = TRUE;
-                        AppDataInfo.RelayControl = FALSE;
+                        if (RelayForceControl == 0)
+                        {
+                            AppDataInfo.RelayControl = FALSE;
+                        }
                         AppDataInfo.BattForceLock = FALSE;
                         tcpipConnectionSend(socContext.id, TcpCmdAnswer, 31, 0, 0, 0);
                     }

+ 20 - 4
src/AppTaskUart.c

@@ -2,7 +2,7 @@
  * @Author       : ChenJie
  * @Date         : 2021-10-14 09:27:15
  * @LastEditors  : ChenJie
- * @LastEditTime : 2021-10-22 14:26:30
+ * @LastEditTime : 2021-10-26 15:00:40
  * @Description  : file content
  * @FilePath     : \PLAT\project\ec616_0h00\apps\qx_app\src\AppTaskUart.c
  */
@@ -326,7 +326,7 @@ void Uart_Cmd_Control(QueueHandle_t UartWriteCmdHandle, UartBuffer UartAnswerDat
 		DisChargeForbiddenControl = 1;
 	}
 	//控制继电器断开
-	if (getbit(BcuFltAct, 3) == 0)
+	if (RelayForceControl == 0)
 	{
 		if (AppDataInfo.RelayControl == TRUE)
 		{
@@ -334,13 +334,29 @@ void Uart_Cmd_Control(QueueHandle_t UartWriteCmdHandle, UartBuffer UartAnswerDat
 		}
 		else if (AppDataInfo.RelayControl == FALSE)
 		{
-			RelayForbiddenControl = 0;
+			if (getbit(BcuFltAct, 3) == 0)
+			{
+				RelayForbiddenControl = 0;
+			}
+			else if (getbit(BcuFltAct, 3) == 1)
+			{
+				RelayForbiddenControl = 1;
+			}
 		}
 	}
-	else if (getbit(BcuFltAct, 3) == 1)
+	else if (RelayForceControl == 1) //close
+	{
+		RelayForbiddenControl = 0;
+		AppDataInfo.appDataModify = TRUE;
+		AppDataInfo.RelayControl = FALSE;
+	}
+	else if (RelayForceControl == 2) //open
 	{
 		RelayForbiddenControl = 1;
+		AppDataInfo.appDataModify = TRUE;
+		AppDataInfo.RelayControl = TRUE;
 	}
+	//控制命令发送
 	if (TimeCounter % 10 == 0 && BattHeaterSwitch(&HeatSwitch, HeatForceControl) == TRUE)
 	{
 		UartWriteData.WriteCmd = 0x02;

+ 23 - 10
src/BCU.c

@@ -11,6 +11,7 @@ static process_Bcu gProcess_Bcu_Task;
 void BCU(void)
 {
     uint16_T i;
+
     UINT32 locateTimeCounter = 0;
     osDelay(5000);
     PROC_BCU_STATE_SWITCH(PROCESS_STATE_INIT);
@@ -36,7 +37,9 @@ void BCU(void)
             sfmd_flg_mainCirClosFltEi = BcuDataInfo.sfmd_flg_mainCirClosFltE;
             sfmd_flg_heatCirClosFltEi = BcuDataInfo.sfmd_flg_heatCirClosFltE;
             sfmd_flg_heatCirOpenFltEi = BcuDataInfo.sfmd_flg_heatCirOpenFltE;
-            ihd_st_EOLState = AppNVMData.EOLState;
+			sfmd_flg_heatRunFltEi = BcuDataInfo.sfmd_flg_heatRunFltE;
+			ihd_st_EOLState = AppNVMData.EOLState;
+			
             PROC_BCU_STATE_SWITCH(PROCESS_STATE_WORK);
             break;
         }
@@ -46,9 +49,12 @@ void BCU(void)
             while (TRUE)
             {
                 //osDelay(100);
-                if (locateTimeCounter != TimeCounter)
+                //if (locateTimeCounter != TimeCounter)
+                if (TimeCounter%10==0)
                 {
-                    locateTimeCounter = TimeCounter;
+                    printf("TimeCounter:%d\n",TimeCounter);
+                    //locateTimeCounter = TimeCounter;
+			
                     if (gProcess_app == LISTEN)
                     {
                         PROC_BCU_STATE_SWITCH(PROCESS_STATE_SLEEP);
@@ -93,22 +99,27 @@ void BCU(void)
                     ihd_flg_disChrgModTLowFlt = ((battWarningState >> 22) & 0x01) == 1;
                     ihd_flg_chrgModTLowFlt = ((battWarningState >> 23) & 0x01) == 1;
                     ihd_flg_currOpenFlt = 0;
-                    ihd_st_chrgMosControl = ChargeForbiddenControl == 0;
-                    ihd_st_disChrgMosControl = DisChargeForbiddenControl == 0;
-                    ihd_st_relayControl = RelayForbiddenControl == 0;
-                    ihd_st_heatForceControl = HeatForceControl;
+					ihd_st_chrgMosControl    = ChargeForbiddenControl == 0;
+					ihd_st_disChrgMosControl = DisChargeForbiddenControl  == 0;
+				    ihd_st_relayControl      = RelayForbiddenControl  == 0;
+				    ihd_flg_DTCClear = ihd_flg_disChrgMosClosFlt;  /////
+
                     //=============================================================================
                     SFM();
                     TMS();
-                    SPM();
+					//CM();
 
+					
+                    SPM();
+			
                     //==============================shi shi cun chu=======
-                    if (socd_flg_EEsave == 1)
+                    if (socd_flg_EEsave == 1 || ihd_flg_DTCClear)
                     {
                         BCUEEDataSave();
+						ihd_flg_DTCClear = false;
                     }
                 }
-                osDelay(5);
+                osDelay(100);
             }
             break;
         }
@@ -144,6 +155,7 @@ void BCU_Init(void)
 {
     SFM_Init();
     TMS_Init();
+	//CM_Init();
     SPM_Init();
 }
 
@@ -177,5 +189,6 @@ void BCUEEDataSave(void)
     BcuDataInfo.sfmd_flg_mainCirClosFltE = sfmd_flg_mainCirClosFltEo;
     BcuDataInfo.sfmd_flg_heatCirClosFltE = sfmd_flg_heatCirClosFltEo;
     BcuDataInfo.sfmd_flg_heatCirOpenFltE = sfmd_flg_heatCirOpenFltEo;
+	BcuDataInfo.sfmd_flg_heatRunFltE = sfmd_flg_heatRunFltEo;
     BcuDataInfo.appDataModify = TRUE;
 }

+ 6 - 3
src/EmbeddedCoder_src/BCUDisp.c

@@ -73,7 +73,8 @@ boolean_T sfmd_flg_heatCirClosFltEi;              /*加热回路常闭故障读
 boolean_T sfmd_flg_heatCirClosFltEo;              /*加热回路常闭故障写入量 */  
 boolean_T sfmd_flg_heatCirOpenFltEi;              /*加热回路常开故障读取量 */  
 boolean_T sfmd_flg_heatCirOpenFltEo;              /*加热回路常开故障写入量 */  
-
+boolean_T sfmd_flg_heatRunFltEi;
+boolean_T sfmd_flg_heatRunFltEo;
 uint16_T socd_pct_ahSoc;                          /*安时SOC; */
 uint16_T socd_pct_estSoc;                         /*估算SOC;*/
 uint16_T socd_flg_EEsave;                         /*实时存储标志位;*/
@@ -104,7 +105,7 @@ uint16_T sohv_V_chrgStartStatEo[28];              /*充电开始时刻的单体
 
 uint8_T cmd_st_chrgMod;                           /* 充电模式  */
 uint8_T cmd_st_chrgSt;                            /* 充电状态  */
-uint16_T cmd_I_chrgCurrReq;                       /* 充电需求电流  */
+int16_T cmd_I_chrgCurrReq;                       /* 充电需求电流  */
 uint8_T cmd_idx_chrgEndReason;                    /* 充电结束原因  */
         
 uint16_T cand_Nr_cellNr;                          /*循环发送的单体编号; */
@@ -116,4 +117,6 @@ uint16_T cand_Q_totalCp;                          /*循环发送的单体累计
 uint16_T test_efkSocMin;
 uint16_T test_efkSocMax;
 real_T test_UpMin;
-real_T test_UpMax;
+real_T test_UpMax;
+uint16_T test_ekfSoc;
+uint16_T test_ekfSoc0;

+ 215 - 85
src/EmbeddedCoder_src/SFM.c

@@ -28,7 +28,7 @@ void SFM(void)
     static uint16_T SumT2;
     
     static uint8_T  Cntl;
-    static uint16_T CellUArry[3][28];
+    static uint16_T CellUArry[4][28];
     static uint8_T  ErrNr[28];
     static uint8_T  RecNr[28];
     static boolean_T sfmv_flg_cellUOpenFlt[28];
@@ -48,7 +48,6 @@ void SFM(void)
     boolean_T sfmd_flg_ACPlugTOpenFlt;
     static boolean_T sfmd_flg_heatPanT1OpenFlt;
     static boolean_T sfmd_flg_heatPanT2OpenFlt;
-    boolean_T sfmd_flg_heatPanTOpenFlt;
     boolean_T sfmd_flg_modTRationFlt;
     boolean_T sfmv_flg_modTRationFlt[6];
     
@@ -130,6 +129,18 @@ void SFM(void)
     boolean_T sfmd_flg_EEsaveFlt;
     static uint16_T socd_pct_bcuSoc_Delay;
     
+    static uint16_T noDisChrgCnt;
+    static int16_T sfmd_I_curr_Delay;
+    static boolean_T sfmd_flg_Udrop;
+    static boolean_T sfmd_flg_heatclear;
+    static boolean_T sfmd_flg_volFlt_keep;
+    static uint16_T CntA;
+    static uint16_T ModTStor[4][6];
+    static boolean_T sfmd_flg_Tup;
+    static boolean_T sfmd_flg_modTOpenFlt_keep;
+    static uint16_T CntB;
+    
+    
     boolean_T FltFlg[200];
     uint16_T  FltLevel[200];
     uint8_T   FltAct[200];
@@ -146,7 +157,7 @@ void SFM(void)
     {
         memset(&DiagThr,0,sizeof(DiagThr));
         memset(&DiagTime,0,sizeof(DiagTime));
-        Cntl = 0;
+        Cntl = 10;
         memset(heatT1Arr,0,sizeof(heatT1Arr));
         memset(heatT2Arr,0,sizeof(heatT2Arr));
         memset(ErrNr,0,sizeof(ErrNr));
@@ -190,6 +201,16 @@ void SFM(void)
         sfmd_flg_chrgCurrOverFlt = false;
         sfmd_flg_disChrgCurrOverFlt = false;
         
+        noDisChrgCnt = 0;
+        sfmd_I_curr_Delay = ihd_I_curr;
+        sfmd_flg_Udrop = false;
+        sfmd_flg_heatclear = false;
+        sfmd_flg_volFlt_keep = false;
+        CntA  = 10;
+        sfmd_flg_Tup = false;
+        sfmd_flg_modTOpenFlt_keep = false;
+        CntB = 0;;
+
         ihd_T_mosT_Delay = ihd_T_mosT;
         ihd_T_DCPlugT_Delay =ihd_T_DCPlugT;
         ihd_T_ACPlugT_Delay = ihd_T_ACPlugT;
@@ -207,6 +228,9 @@ void SFM(void)
         sfmd_flg_heatCirOpenFltEo = false;
         sfmd_flg_heatCirClosFltEi = false;
         sfmd_flg_heatCirClosFltEo = false;
+		sfmd_flg_heatRunFltEi = false;
+		sfmd_flg_heatRunFltEo = false;
+		
     }
     
     //=======================================================================================
@@ -236,13 +260,19 @@ void SFM(void)
     {
         sfmd_flg_HVILFlt = false;
     }
-    
+
+
+
+
+
+
+	
     //22 充电Mos失效故障
-    sfmd_flg_chrgMosClosFlt = JudgeTimeSystem(!sfmd_flg_interComFlt, ihd_flg_chrgMosClosFlt ,&DiagTime.N22 ,20);
+    sfmd_flg_chrgMosClosFlt = JudgeTimeSystem(!sfmd_flg_interComFlt, ihd_flg_chrgMosClosFlt ,&DiagTime.N22 ,2);
 
 	
     //24 放电Mos失效故障
-    sfmd_flg_disChrgMosClosFlt = JudgeTimeSystem(!sfmd_flg_interComFlt, ihd_flg_disChrgMosClosFlt ,&DiagTime.N24 ,20);
+    sfmd_flg_disChrgMosClosFlt = JudgeTimeSystem(!sfmd_flg_interComFlt, ihd_flg_disChrgMosClosFlt ,&DiagTime.N24 ,2);
     
     
     //
@@ -259,7 +289,7 @@ void SFM(void)
         }
         Time1Cntl ++;
         SumT1 = SumT1 + ihd_T_heatPanT1;
-        if(Time1Cntl >= 600)
+        if(Time1Cntl >= 60)
         {
             for(i = 0; i < 9;i++)
             {
@@ -283,7 +313,7 @@ void SFM(void)
         }
         Time2Cntl ++;
         SumT2 = SumT2 + ihd_T_heatPanT2;
-        if(Time2Cntl >= 600)
+        if(Time2Cntl >= 60)
         {
             for(i = 0; i < 9;i++)
             {
@@ -296,7 +326,7 @@ void SFM(void)
     }
 
 	//32 加热回路常闭故障
-    Enable1 = JudgeTimeSystem(1, tmsd_st_heatAct == 0,&DiagTime.N32, 6000);
+    Enable1 = JudgeTimeSystem(1, tmsd_st_heatAct == 0,&DiagTime.N32, 600);
     sfmd_flg_heatCirClosFltEo = ( ((int16_T)(heatT2Arr[9] - heatT2Arr[0]) > 5 || (int16_T)(heatT1Arr[9] - heatT1Arr[0]) > 5) && Enable1) || sfmd_flg_heatCirClosFltEo || sfmd_flg_heatCirClosFltEi;
 
 	//33 加热回路常开故障
@@ -306,16 +336,16 @@ void SFM(void)
     //34 主回路常闭故障   //(充电MOS及放电MOS,主继电器断开  使能)
     sfmd_I_curr = ihd_I_curr;
     sfmd_I_currAbs = (uint16_T) (sfmd_I_curr > 0 ? sfmd_I_curr : -sfmd_I_curr);
-    sfmd_flg_mainCirClosFltEo = JudgeTimeSystem(!ihd_st_chrgMosControl && !ihd_st_disChrgMosControl && !ihd_st_relayControl, sfmd_I_currAbs > 5,&DiagTime.N34, 50) || sfmd_flg_mainCirClosFltEo || sfmd_flg_mainCirClosFltEi ;
+    sfmd_flg_mainCirClosFltEo = JudgeTimeSystem(!ihd_st_chrgMosControl && !ihd_st_disChrgMosControl && !ihd_st_relayControl, sfmd_I_currAbs > 5,&DiagTime.N34, 5) || sfmd_flg_mainCirClosFltEo || sfmd_flg_mainCirClosFltEi ;
     
     
     //52 电压开路故障
     Cntl = Cntl + 1;
-    if(!sfmd_flg_interComFlt && Cntl > 9)
+    if(!sfmd_flg_interComFlt && Cntl >= 0)
     {
         Cntl = 0;
         // 矩阵更新
-        for(j = 0;j < 3 && FirstRun_SFM;j++)
+        for(j = 0;j < 4 && FirstRun_SFM;j++)
         {
             for(i = 0;i < cmnc_num_cellUNum;i++)
             {
@@ -323,7 +353,7 @@ void SFM(void)
             }
         }
         
-        for(j = 0;j < 2;j++)
+        for(j = 0;j < 3;j++)
         {
             for(i = 0;i < cmnc_num_cellUNum;i++)
             {
@@ -337,7 +367,7 @@ void SFM(void)
         // 故障判断
         for(i = 0;i < cmnc_num_cellUNum - 1;i++)
         {
-            if((int16_T)(CellUArry[2][i] - CellUArry[0][i]) < -50 && (int16_T)(CellUArry[2][i+1] - CellUArry[0][i+1]) > 50)
+            if((int16_T)(CellUArry[3][i] - CellUArry[1][i]) < -50 && (int16_T)(CellUArry[3][i+1] - CellUArry[1][i+1]) > 50)
             {
                 ErrNr[i] = ErrNr[i] + 1;
             }
@@ -345,7 +375,7 @@ void SFM(void)
             {
                 ErrNr[i] = 0;
             }
-            if ( ErrNr[i] >= 2|| ((int16_T)(CellUArry[2][i] - CellUArry[0][i]) < -1000 && (int16_T)(CellUArry[2][i+1] - CellUArry[0][i+1]) > 1000 ))
+            if ( ErrNr[i] >= 2|| ((int16_T)(CellUArry[3][i] - CellUArry[2][i]) < -1000 && (int16_T)(CellUArry[3][i+1] - CellUArry[2][i+1]) > 1000 ))
             {
                 sfmv_flg_cellUOpenFlt[i] = true;
                 ErrUFlg[i] = true;
@@ -355,7 +385,7 @@ void SFM(void)
             {
                 for(k = 0;k < i;k++)
                 {
-                    if((int16_T)(CellUArry[2][i-k] - CellUArry[1][i-k]) < -200)
+                    if((int16_T)(CellUArry[3][i-k] - CellUArry[2][i-k]) < -200)
                     {
                         sfmv_flg_cellUOpenFlt[i-k] = true;
                         ErrUFlg[i-k] = true;
@@ -363,6 +393,7 @@ void SFM(void)
                 }
             }
         }
+		
     }
     //
     if(!sfmd_flg_interComFlt)
@@ -387,7 +418,7 @@ void SFM(void)
                 }
             }
         }
-        if(sfmd_V_cellUMax - sfmd_V_cellUMin > 3000)
+        if(sfmd_V_cellUMax - sfmd_V_cellUMin > 5000)  // 2021 10.24
         {
             sfmd_V_cellUAvrg = (SumU - sfmd_V_cellUMax - sfmd_V_cellUMin)/(UNum - 2);
             for(i = 0;i < cmnc_num_cellUNum ;i++)
@@ -421,7 +452,7 @@ void SFM(void)
                 {
                     RecNr[i] = 0;
                 }
-                if( RecNr[i] > 20)
+                if( RecNr[i] >= 2)
                 {
                     sfmv_flg_cellUOpenFlt[i] = false;
                     ErrUFlg[i] = false;
@@ -462,7 +493,7 @@ void SFM(void)
         {
             modTOpenNr[i] = 0;
         }
-        if(modTOpenNr[i] >= 20)
+        if(modTOpenNr[i] >= 2)
         {
             sfmv_flg_modTOpenFlt[i] = true;
         }
@@ -475,16 +506,16 @@ void SFM(void)
     }
     
     //54 Mos温度开路故障
-    sfmd_flg_chrgMosTOpenFlt =  JudgeTimeSystem(!sfmd_flg_interComFlt, ihd_T_mosT == 10, &DiagTime.N54, 20);
+    sfmd_flg_chrgMosTOpenFlt =  JudgeTimeSystem(!sfmd_flg_interComFlt, ihd_T_mosT == 10, &DiagTime.N54, 2);
     
     //56 快充插头温度开路故障
-    sfmd_flg_DCPlugTOpenFlt  = JudgeTimeSystem(!sfmd_flg_interComFlt, ihd_T_DCPlugT == 0, &DiagTime.N56, 20);
+    sfmd_flg_DCPlugTOpenFlt  = JudgeTimeSystem(!sfmd_flg_interComFlt, ihd_T_DCPlugT == 0, &DiagTime.N56, 2);
     //57 慢充插头温度开路故障
-    sfmd_flg_ACPlugTOpenFlt  = JudgeTimeSystem(!sfmd_flg_interComFlt, ihd_T_ACPlugT == 0, &DiagTime.N57, 20);
+    sfmd_flg_ACPlugTOpenFlt  = JudgeTimeSystem(!sfmd_flg_interComFlt, ihd_T_ACPlugT == 0, &DiagTime.N57, 2);
     //58 加热板#1温度开路故障
-    sfmd_flg_heatPanT1OpenFlt = JudgeTimeSystem(!sfmd_flg_interComFlt, ihd_T_heatPanT1 == 0, &DiagTime.N58, 20);
+    sfmd_flg_heatPanT1OpenFlt = JudgeTimeSystem(!sfmd_flg_interComFlt, ihd_T_heatPanT1 == 0, &DiagTime.N58, 2);
     //59 加热板#2温度开路故障
-    sfmd_flg_heatPanT2OpenFlt = JudgeTimeSystem(!sfmd_flg_interComFlt, ihd_T_heatPanT2 == 0, &DiagTime.N59, 20);
+    sfmd_flg_heatPanT2OpenFlt = JudgeTimeSystem(!sfmd_flg_interComFlt, ihd_T_heatPanT2 == 0, &DiagTime.N59, 2);
     
     
     //61 模组温度合理性故障
@@ -504,7 +535,7 @@ void SFM(void)
             modTRationNr[i] = 0;
             modTArr[i] = ihv_T_modT[i];
         }
-        if(modTRationNr[i] >= 20)
+        if(modTRationNr[i] >= 2)
         {
             sfmv_flg_modTRationFlt[i] = true;
         }
@@ -523,7 +554,7 @@ void SFM(void)
     {
         ihd_T_mosT_Delay = ihd_T_mosT;
     }
-    sfmd_flg_chrgMosTRationFlt = JudgeTimeSystem(1, sfmd_flg_chrgMosTRationFltOnce, &DiagTime.N62, 20);
+    sfmd_flg_chrgMosTRationFlt = JudgeTimeSystem(1, sfmd_flg_chrgMosTRationFltOnce, &DiagTime.N62, 2);
     
     //64 快充插头温度合理性故障
     sfmd_flg_DCPlugTRationFltOnce = !sfmd_flg_interComFlt && !sfmd_flg_DCPlugTOpenFlt && ((int16_T)(ihd_T_DCPlugT - ihd_T_DCPlugT_Delay) < -10);
@@ -531,7 +562,7 @@ void SFM(void)
     {
         ihd_T_DCPlugT_Delay = ihd_T_DCPlugT;
     }
-    sfmd_flg_DCPlugTRationFlt = JudgeTimeSystem(1, sfmd_flg_DCPlugTRationFltOnce, &DiagTime.N64, 20);
+    sfmd_flg_DCPlugTRationFlt = JudgeTimeSystem(1, sfmd_flg_DCPlugTRationFltOnce, &DiagTime.N64, 2);
     
     //65 慢插头温度合理性故障
     sfmd_flg_ACPlugTRationFltOnce = !sfmd_flg_interComFlt && !sfmd_flg_ACPlugTOpenFlt && ((int16_T)(ihd_T_ACPlugT - ihd_T_ACPlugT_Delay) < -10);
@@ -539,7 +570,7 @@ void SFM(void)
     {
         ihd_T_ACPlugT_Delay = ihd_T_ACPlugT;
     }
-    sfmd_flg_ACPlugTRationFlt = JudgeTimeSystem(1, sfmd_flg_ACPlugTRationFltOnce, &DiagTime.N65, 20);
+    sfmd_flg_ACPlugTRationFlt = JudgeTimeSystem(1, sfmd_flg_ACPlugTRationFltOnce, &DiagTime.N65, 2);
     
     //66 加热板#1 温度合理性故障
     sfmd_flg_heatPanT1RationFltOnce = !sfmd_flg_interComFlt && !sfmd_flg_heatPanT1OpenFlt && ((int16_T)(ihd_T_heatPanT1 - ihd_T_heatPanT1_Delay) < -10);
@@ -547,7 +578,7 @@ void SFM(void)
     {
         ihd_T_heatPanT1_Delay = ihd_T_heatPanT1;
     }
-    sfmd_flg_heatPanT1RationFlt = JudgeTimeSystem(1, sfmd_flg_heatPanT1RationFltOnce, &DiagTime.N66, 20);
+    sfmd_flg_heatPanT1RationFlt = JudgeTimeSystem(1, sfmd_flg_heatPanT1RationFltOnce, &DiagTime.N66, 2);
     
     //67 加热板#2 温度合理性故障
     sfmd_flg_heatPanT2RationFltOnce = !sfmd_flg_interComFlt && !sfmd_flg_heatPanT2OpenFlt && ((int16_T)(ihd_T_heatPanT2 -ihd_T_heatPanT2_Delay) < -10);
@@ -555,7 +586,7 @@ void SFM(void)
     {
         ihd_T_heatPanT2_Delay = ihd_T_heatPanT2;
     }
-    sfmd_flg_heatPanT2RationFlt = JudgeTimeSystem(1, sfmd_flg_heatPanT2RationFltOnce, &DiagTime.N67, 20);
+    sfmd_flg_heatPanT2RationFlt = JudgeTimeSystem(1, sfmd_flg_heatPanT2RationFltOnce, &DiagTime.N67, 2);
     
     //68 模组温度全部不可用
     sfmd_flg_modTAllFlt = true;
@@ -607,121 +638,120 @@ void SFM(void)
     sfmd_flg_currOpenFlt = false;
     sfmd_I_curr =  ihd_I_curr;
     //81 单体过压故障2级
-    sfmd_flg_cellUOverFlt2 = DiagThrSystem1(1,!sfmd_flg_interComFlt,sfmd_V_cellUMax,sfmc_V_cellUOverThrFlt2,sfmc_V_cellUOverThrRec2,20,20,&DiagThr.fltNum81,&DiagThr.recNum81,&sfmd_flg_cellUOverFlt2);
+    sfmd_flg_cellUOverFlt2 = DiagThrSystem1(1,!sfmd_flg_interComFlt,sfmd_V_cellUMax,sfmc_V_cellUOverThrFlt2,sfmc_V_cellUOverThrRec2,2,2,&DiagThr.fltNum81,&DiagThr.recNum81,&sfmd_flg_cellUOverFlt2);
     //82 单体过压故障1级
-    sfmd_flg_cellUOverFlt1 = DiagThrSystem1(0,!sfmd_flg_interComFlt,sfmd_V_cellUMax,sfmc_V_cellUOverThrFlt1,sfmc_V_cellUOverThrRec1,20,20,&DiagThr.fltNum82,&DiagThr.recNum82,&sfmd_flg_cellUOverFlt1) && !sfmd_flg_cellUOverFlt2;
+    sfmd_flg_cellUOverFlt1 = DiagThrSystem1(0,!sfmd_flg_interComFlt,sfmd_V_cellUMax,sfmc_V_cellUOverThrFlt1,sfmc_V_cellUOverThrRec1,2,2,&DiagThr.fltNum82,&DiagThr.recNum82,&sfmd_flg_cellUOverFlt1) && !sfmd_flg_cellUOverFlt2;
     
     //83 单体欠压故障2级
-    sfmd_flg_cellULowFlt2 = DiagThrSystem2(1,!sfmd_flg_interComFlt,sfmd_V_cellUMin,sfmc_V_cellULowThrFlt2,sfmc_V_cellULowThrRec2,20,20,&DiagThr.fltNum83,&DiagThr.recNum83,&sfmd_flg_cellULowFlt2);
+    sfmd_flg_cellULowFlt2 = DiagThrSystem2(1,!sfmd_flg_interComFlt,sfmd_V_cellUMin,sfmc_V_cellULowThrFlt2,sfmc_V_cellULowThrRec2,2,2,&DiagThr.fltNum83,&DiagThr.recNum83,&sfmd_flg_cellULowFlt2);
     //84 单体欠压故障1级
-    sfmd_flg_cellULowFlt1 = DiagThrSystem2(0,!sfmd_flg_interComFlt,sfmd_V_cellUMin,sfmc_V_cellULowThrFlt1,sfmc_V_cellULowThrRec1,20,20,&DiagThr.fltNum84,&DiagThr.recNum84,&sfmd_flg_cellULowFlt1) && !sfmd_flg_cellULowFlt2;
+    sfmd_flg_cellULowFlt1 = DiagThrSystem2(0,!sfmd_flg_interComFlt,sfmd_V_cellUMin,sfmc_V_cellULowThrFlt1,sfmc_V_cellULowThrRec1,2,2,&DiagThr.fltNum84,&DiagThr.recNum84,&sfmd_flg_cellULowFlt1) && !sfmd_flg_cellULowFlt2;
     
     //85 压差过大2级
-    sfmd_flg_cellUDiffFlt2 = DiagThrSystem1(1,!sfmd_flg_interComFlt,sfmd_V_cellUMax - sfmd_V_cellUMin,sfmc_flg_cellUDiffThrFlt2,sfmc_flg_cellUDiffThrRec2,20,20,&DiagThr.fltNum85,&DiagThr.recNum85,&sfmd_flg_cellUDiffFlt2);
+    sfmd_flg_cellUDiffFlt2 = DiagThrSystem1(1,!sfmd_flg_interComFlt,sfmd_V_cellUMax - sfmd_V_cellUMin,sfmc_flg_cellUDiffThrFlt2,sfmc_flg_cellUDiffThrRec2,2,2,&DiagThr.fltNum85,&DiagThr.recNum85,&sfmd_flg_cellUDiffFlt2);
     //86 压差过大1级
-    sfmd_flg_cellUDiffFlt1 = DiagThrSystem1(0,!sfmd_flg_interComFlt,sfmd_V_cellUMax - sfmd_V_cellUMin,sfmc_flg_cellUDiffThrFlt1,sfmc_flg_cellUDiffThrRec1,20,20,&DiagThr.fltNum86,&DiagThr.recNum86,&sfmd_flg_cellUDiffFlt1) && !sfmd_flg_cellUDiffFlt2;
+    sfmd_flg_cellUDiffFlt1 = DiagThrSystem1(0,!sfmd_flg_interComFlt,sfmd_V_cellUMax - sfmd_V_cellUMin,sfmc_flg_cellUDiffThrFlt1,sfmc_flg_cellUDiffThrRec1,2,2,&DiagThr.fltNum86,&DiagThr.recNum86,&sfmd_flg_cellUDiffFlt1) && !sfmd_flg_cellUDiffFlt2;
     
     //87 总压过压2级
-    sfmd_flg_battUOverFlt2 = DiagThrSystem1(1,!sfmd_flg_interComFlt,sfmd_V_battU,sfmc_V_battUOverThrFlt2,sfmc_V_battUOverThrRec2,20,20,&DiagThr.fltNum87,&DiagThr.recNum87,&sfmd_flg_battUOverFlt2);
+    sfmd_flg_battUOverFlt2 = DiagThrSystem1(1,!sfmd_flg_interComFlt,sfmd_V_battU,sfmc_V_battUOverThrFlt2,sfmc_V_battUOverThrRec2,2,2,&DiagThr.fltNum87,&DiagThr.recNum87,&sfmd_flg_battUOverFlt2);
     //88 总压过压1级
-    sfmd_flg_battUOverFlt1 = DiagThrSystem1(0,!sfmd_flg_interComFlt,sfmd_V_battU,sfmc_V_battUOverThrFlt1,sfmc_V_battUOverThrRec1,20,20,&DiagThr.fltNum88,&DiagThr.recNum88,&sfmd_flg_battUOverFlt1) && !sfmd_flg_battUOverFlt2;
+    sfmd_flg_battUOverFlt1 = DiagThrSystem1(0,!sfmd_flg_interComFlt,sfmd_V_battU,sfmc_V_battUOverThrFlt1,sfmc_V_battUOverThrRec1,2,2,&DiagThr.fltNum88,&DiagThr.recNum88,&sfmd_flg_battUOverFlt1) && !sfmd_flg_battUOverFlt2;
     
     //89 总压欠压2级
-    sfmd_flg_battULowFlt2 = DiagThrSystem2(1,!sfmd_flg_interComFlt,sfmd_V_battU,sfmc_V_battULowThrFlt2,sfmc_V_battULowThrRec2,20,20,&DiagThr.fltNum89,&DiagThr.recNum89,&sfmd_flg_battULowFlt2);
+    sfmd_flg_battULowFlt2 = DiagThrSystem2(1,!sfmd_flg_interComFlt,sfmd_V_battU,sfmc_V_battULowThrFlt2,sfmc_V_battULowThrRec2,2,2,&DiagThr.fltNum89,&DiagThr.recNum89,&sfmd_flg_battULowFlt2);
     //90 总压欠压1级
-    sfmd_flg_battULowFlt1 = DiagThrSystem2(0,!sfmd_flg_interComFlt,sfmd_V_battU,sfmc_V_battULowThrFlt1,sfmc_V_battULowThrRec1,20,20,&DiagThr.fltNum90,&DiagThr.recNum90,&sfmd_flg_battULowFlt1) && !sfmd_flg_battULowFlt2;
+    sfmd_flg_battULowFlt1 = DiagThrSystem2(0,!sfmd_flg_interComFlt,sfmd_V_battU,sfmc_V_battULowThrFlt1,sfmc_V_battULowThrRec1,2,2,&DiagThr.fltNum90,&DiagThr.recNum90,&sfmd_flg_battULowFlt1) && !sfmd_flg_battULowFlt2;
     
     chrgFlg = ihd_st_workStat == 2;
     disChrgFlg = ihd_st_workStat != 2;
 	
     //97 模组充电温度过高2级故障
-    sfmd_flg_chrgModTOverFlt2 = DiagThrSystem1(1,!sfmd_flg_interComFlt&&chrgFlg && !sfmd_flg_modTAllFlt,sfmd_T_modTMax,sfmc_T_chrgModTOverThrFlt2,sfmc_T_chrgModTOverThrRec2,25,25,&DiagThr.fltNum97,&DiagThr.recNum97,&sfmd_flg_chrgModTOverFlt2);
+    sfmd_flg_chrgModTOverFlt2 = DiagThrSystem1(1,!sfmd_flg_interComFlt&&chrgFlg && !sfmd_flg_modTAllFlt,sfmd_T_modTMax,sfmc_T_chrgModTOverThrFlt2,sfmc_T_chrgModTOverThrRec2,3,3,&DiagThr.fltNum97,&DiagThr.recNum97,&sfmd_flg_chrgModTOverFlt2);
     //98 模组充电温度过高1级故障
-    sfmd_flg_chrgModTOverFlt1 = DiagThrSystem1(0,!sfmd_flg_interComFlt&&chrgFlg && !sfmd_flg_modTAllFlt,sfmd_T_modTMax,sfmc_T_chrgModTOverThrFlt1,sfmc_T_chrgModTOverThrRec1,25,25,&DiagThr.fltNum98,&DiagThr.recNum98,&sfmd_flg_chrgModTOverFlt1) && !sfmd_flg_chrgModTOverFlt2;
+    sfmd_flg_chrgModTOverFlt1 = DiagThrSystem1(0,!sfmd_flg_interComFlt&&chrgFlg && !sfmd_flg_modTAllFlt,sfmd_T_modTMax,sfmc_T_chrgModTOverThrFlt1,sfmc_T_chrgModTOverThrRec1,3,3,&DiagThr.fltNum98,&DiagThr.recNum98,&sfmd_flg_chrgModTOverFlt1) && !sfmd_flg_chrgModTOverFlt2;
     //99 模组充电温度过低2级故障
-    sfmd_flg_chrgModTLowFlt2 = DiagThrSystem2(0,!sfmd_flg_interComFlt&&chrgFlg && !sfmd_flg_modTAllFlt,sfmd_T_modTMin,sfmc_T_chrgModTLowThrFlt2,sfmc_T_chrgModTLowThrRec2,25,25,&DiagThr.fltNum99,&DiagThr.recNum99,&sfmd_flg_chrgModTLowFlt2);
+    sfmd_flg_chrgModTLowFlt2 = DiagThrSystem2(0,!sfmd_flg_interComFlt&&chrgFlg && !sfmd_flg_modTAllFlt,sfmd_T_modTMin,sfmc_T_chrgModTLowThrFlt2,sfmc_T_chrgModTLowThrRec2,3,3,&DiagThr.fltNum99,&DiagThr.recNum99,&sfmd_flg_chrgModTLowFlt2);
     //100 模组充电温度过低1级故障
-    sfmd_flg_chrgModTLowFlt1 = DiagThrSystem2(0,!sfmd_flg_interComFlt&&chrgFlg && !sfmd_flg_modTAllFlt,sfmd_T_modTMin,sfmc_T_chrgModTLowThrFlt1,sfmc_T_chrgModTLowThrRec1,25,25,&DiagThr.fltNum100,&DiagThr.recNum100,&sfmd_flg_chrgModTLowFlt1) && !sfmd_flg_chrgModTLowFlt2;
+    sfmd_flg_chrgModTLowFlt1 = DiagThrSystem2(0,!sfmd_flg_interComFlt&&chrgFlg && !sfmd_flg_modTAllFlt,sfmd_T_modTMin,sfmc_T_chrgModTLowThrFlt1,sfmc_T_chrgModTLowThrRec1,3,3,&DiagThr.fltNum100,&DiagThr.recNum100,&sfmd_flg_chrgModTLowFlt1) && !sfmd_flg_chrgModTLowFlt2;
     
     //101 模组放电温度过高2级故障
-    sfmd_flg_disChrgModTOverFlt2 = DiagThrSystem1(1,!sfmd_flg_interComFlt&&disChrgFlg && !sfmd_flg_modTAllFlt,sfmd_T_modTMax,sfmc_T_disChrgModTOverThrFlt2,sfmc_T_disChrgModTOverThrRec2,25,25,&DiagThr.fltNum101,&DiagThr.recNum101,&sfmd_flg_disChrgModTOverFlt2);
+    sfmd_flg_disChrgModTOverFlt2 = DiagThrSystem1(1,!sfmd_flg_interComFlt&&disChrgFlg && !sfmd_flg_modTAllFlt,sfmd_T_modTMax,sfmc_T_disChrgModTOverThrFlt2,sfmc_T_disChrgModTOverThrRec2,3,3,&DiagThr.fltNum101,&DiagThr.recNum101,&sfmd_flg_disChrgModTOverFlt2);
     //102 模组放电温度过高1级故障
-    sfmd_flg_disChrgModTOverFlt1 = DiagThrSystem1(0,!sfmd_flg_interComFlt&&disChrgFlg && !sfmd_flg_modTAllFlt,sfmd_T_modTMax,sfmc_T_disChrgModTOverThrFlt1,sfmc_T_disChrgModTOverThrRec1,25,25,&DiagThr.fltNum102,&DiagThr.recNum102,&sfmd_flg_disChrgModTOverFlt1) && !sfmd_flg_disChrgModTOverFlt2;
+    sfmd_flg_disChrgModTOverFlt1 = DiagThrSystem1(0,!sfmd_flg_interComFlt&&disChrgFlg && !sfmd_flg_modTAllFlt,sfmd_T_modTMax,sfmc_T_disChrgModTOverThrFlt1,sfmc_T_disChrgModTOverThrRec1,3,3,&DiagThr.fltNum102,&DiagThr.recNum102,&sfmd_flg_disChrgModTOverFlt1) && !sfmd_flg_disChrgModTOverFlt2;
     //103 模组放电温度过低2级故障
-    sfmd_flg_disChrgModTLowFlt2 = DiagThrSystem2(0,!sfmd_flg_interComFlt&&disChrgFlg && !sfmd_flg_modTAllFlt,sfmd_T_modTMin,sfmc_T_disChrgModTLowThrFlt2,sfmc_T_disChrgModTLowThrRec2,25,25,&DiagThr.fltNum103,&DiagThr.recNum103,&sfmd_flg_disChrgModTLowFlt2);
+    sfmd_flg_disChrgModTLowFlt2 = DiagThrSystem2(0,!sfmd_flg_interComFlt&&disChrgFlg && !sfmd_flg_modTAllFlt,sfmd_T_modTMin,sfmc_T_disChrgModTLowThrFlt2,sfmc_T_disChrgModTLowThrRec2,3,3,&DiagThr.fltNum103,&DiagThr.recNum103,&sfmd_flg_disChrgModTLowFlt2);
     //104 模组放电温度过低1级故障
-    sfmd_flg_disChrgModTLowFlt1 = DiagThrSystem2(0,!sfmd_flg_interComFlt&&disChrgFlg && !sfmd_flg_modTAllFlt,sfmd_T_modTMin,sfmc_T_disChrgModTLowThrFlt1,sfmc_T_disChrgModTLowThrRec1,25,25,&DiagThr.fltNum104,&DiagThr.recNum104,&sfmd_flg_disChrgModTLowFlt1) && !sfmd_flg_disChrgModTLowFlt2;
+    sfmd_flg_disChrgModTLowFlt1 = DiagThrSystem2(0,!sfmd_flg_interComFlt&&disChrgFlg && !sfmd_flg_modTAllFlt,sfmd_T_modTMin,sfmc_T_disChrgModTLowThrFlt1,sfmc_T_disChrgModTLowThrRec1,3,3,&DiagThr.fltNum104,&DiagThr.recNum104,&sfmd_flg_disChrgModTLowFlt1) && !sfmd_flg_disChrgModTLowFlt2;
     
     //
     //105 模组温差2级故障
-    sfmd_flg_modTDiffFlt2 = DiagThrSystem1(1,!sfmd_flg_interComFlt && !sfmd_flg_modTAllFlt,sfmd_T_modTMax - sfmd_T_modTMin,sfmc_T_modTDiffThrFlt2,sfmc_T_modTDiffThrRec2,25,25,&DiagThr.fltNum105,&DiagThr.recNum105,&sfmd_flg_modTDiffFlt2);
+    sfmd_flg_modTDiffFlt2 = DiagThrSystem1(1,!sfmd_flg_interComFlt && !sfmd_flg_modTAllFlt,sfmd_T_modTMax - sfmd_T_modTMin,sfmc_T_modTDiffThrFlt2,sfmc_T_modTDiffThrRec2,3,3,&DiagThr.fltNum105,&DiagThr.recNum105,&sfmd_flg_modTDiffFlt2);
     //106 模组温差1级故障
-    sfmd_flg_modTDiffFlt1 = DiagThrSystem1(0,!sfmd_flg_interComFlt && !sfmd_flg_modTAllFlt,sfmd_T_modTMax - sfmd_T_modTMin,sfmc_T_modTDiffThrFlt1,sfmc_T_modTDiffThrRec1,25,25,&DiagThr.fltNum106,&DiagThr.recNum106,&sfmd_flg_modTDiffFlt1) && !sfmd_flg_modTDiffFlt2;
+    sfmd_flg_modTDiffFlt1 = DiagThrSystem1(0,!sfmd_flg_interComFlt && !sfmd_flg_modTAllFlt,sfmd_T_modTMax - sfmd_T_modTMin,sfmc_T_modTDiffThrFlt1,sfmc_T_modTDiffThrRec1,3,3,&DiagThr.fltNum106,&DiagThr.recNum106,&sfmd_flg_modTDiffFlt1) && !sfmd_flg_modTDiffFlt2;
     
     
     //107 充电Mos温度过高2级故障
-    sfmd_flg_chrgMosTOverFlt2 = DiagThrSystem1(1,!sfmd_flg_interComFlt && chrgFlg && sfmd_flg_chrgMosTRationFlt && sfmd_flg_chrgMosTOpenFlt,ihd_T_mosT,sfmc_T_chrgMosTOverThrFlt2,sfmc_T_chrgMosTOverThrRec2,25,25,&DiagThr.fltNum107,&DiagThr.recNum107,&sfmd_flg_chrgMosTOverFlt2);
+    sfmd_flg_chrgMosTOverFlt2 = DiagThrSystem1(1,!sfmd_flg_interComFlt && chrgFlg && sfmd_flg_chrgMosTRationFlt && sfmd_flg_chrgMosTOpenFlt,ihd_T_mosT,sfmc_T_chrgMosTOverThrFlt2,sfmc_T_chrgMosTOverThrRec2,3,3,&DiagThr.fltNum107,&DiagThr.recNum107,&sfmd_flg_chrgMosTOverFlt2);
     //108 充电Mos温度过高1级故障
-    sfmd_flg_chrgMosTOverFlt1 = DiagThrSystem1(0,!sfmd_flg_interComFlt && chrgFlg && sfmd_flg_chrgMosTRationFlt && sfmd_flg_chrgMosTOpenFlt,ihd_T_mosT,sfmc_T_chrgMosTOverThrFlt1,sfmc_T_chrgMosTOverThrRec1,25,25,&DiagThr.fltNum108,&DiagThr.recNum108,&sfmd_flg_chrgMosTOverFlt1) && !sfmd_flg_chrgMosTOverFlt2;
+    sfmd_flg_chrgMosTOverFlt1 = DiagThrSystem1(0,!sfmd_flg_interComFlt && chrgFlg && sfmd_flg_chrgMosTRationFlt && sfmd_flg_chrgMosTOpenFlt,ihd_T_mosT,sfmc_T_chrgMosTOverThrFlt1,sfmc_T_chrgMosTOverThrRec1,3,3,&DiagThr.fltNum108,&DiagThr.recNum108,&sfmd_flg_chrgMosTOverFlt1) && !sfmd_flg_chrgMosTOverFlt2;
     //109 放电Mos温度过高2级故障
-    sfmd_flg_disChrgMosTOverFlt2 = DiagThrSystem1(1,!sfmd_flg_interComFlt && disChrgFlg && sfmd_flg_chrgMosTRationFlt && sfmd_flg_chrgMosTOpenFlt,ihd_T_mosT,sfmc_T_disChrgMosTOverThrFlt2,sfmc_T_disChrgMosTOverThrRec2,25,25,&DiagThr.fltNum109,&DiagThr.recNum109,&sfmd_flg_disChrgMosTOverFlt2);
+    sfmd_flg_disChrgMosTOverFlt2 = DiagThrSystem1(1,!sfmd_flg_interComFlt && disChrgFlg && sfmd_flg_chrgMosTRationFlt && sfmd_flg_chrgMosTOpenFlt,ihd_T_mosT,sfmc_T_disChrgMosTOverThrFlt2,sfmc_T_disChrgMosTOverThrRec2,3,3,&DiagThr.fltNum109,&DiagThr.recNum109,&sfmd_flg_disChrgMosTOverFlt2);
     //110 放电Mos温度过高1级故障
-    sfmd_flg_disChrgMosTOverFlt1 = DiagThrSystem1(0,!sfmd_flg_interComFlt && disChrgFlg && sfmd_flg_chrgMosTRationFlt && sfmd_flg_chrgMosTOpenFlt,ihd_T_mosT,sfmc_T_disChrgMosTOverThrFlt1,sfmc_T_disChrgMosTOverThrRec1,25,25,&DiagThr.fltNum110,&DiagThr.recNum110,&sfmd_flg_disChrgMosTOverFlt1) && !sfmd_flg_disChrgMosTOverFlt2;
+    sfmd_flg_disChrgMosTOverFlt1 = DiagThrSystem1(0,!sfmd_flg_interComFlt && disChrgFlg && sfmd_flg_chrgMosTRationFlt && sfmd_flg_chrgMosTOpenFlt,ihd_T_mosT,sfmc_T_disChrgMosTOverThrFlt1,sfmc_T_disChrgMosTOverThrRec1,3,3,&DiagThr.fltNum110,&DiagThr.recNum110,&sfmd_flg_disChrgMosTOverFlt1) && !sfmd_flg_disChrgMosTOverFlt2;
     
     
     //111 快充插头温度过高2级故障
-    sfmd_flg_DCPlugTOverFlt2 = DiagThrSystem1(1,!sfmd_flg_interComFlt && sfmd_flg_DCPlugTRationFlt && sfmd_flg_DCPlugTOpenFlt,ihd_T_DCPlugT,sfmc_T_DCPlugTOverThrFlt2,sfmc_T_DCPlugTOverThrRec2,25,25,&DiagThr.fltNum111,&DiagThr.recNum111,&sfmd_flg_DCPlugTOverFlt2);
+    sfmd_flg_DCPlugTOverFlt2 = DiagThrSystem1(1,!sfmd_flg_interComFlt && sfmd_flg_DCPlugTRationFlt && sfmd_flg_DCPlugTOpenFlt,ihd_T_DCPlugT,sfmc_T_DCPlugTOverThrFlt2,sfmc_T_DCPlugTOverThrRec2,3,3,&DiagThr.fltNum111,&DiagThr.recNum111,&sfmd_flg_DCPlugTOverFlt2);
     //112 快充插头温度过高1级故障
-    sfmd_flg_DCPlugTOverFlt1 = DiagThrSystem1(0,!sfmd_flg_interComFlt && sfmd_flg_DCPlugTRationFlt && sfmd_flg_DCPlugTOpenFlt,ihd_T_DCPlugT,sfmc_T_DCPlugTOverThrFlt1,sfmc_T_DCPlugTOverThrRec1,25,25,&DiagThr.fltNum112,&DiagThr.recNum112,&sfmd_flg_DCPlugTOverFlt1) && !sfmd_flg_DCPlugTOverFlt2;
+    sfmd_flg_DCPlugTOverFlt1 = DiagThrSystem1(0,!sfmd_flg_interComFlt && sfmd_flg_DCPlugTRationFlt && sfmd_flg_DCPlugTOpenFlt,ihd_T_DCPlugT,sfmc_T_DCPlugTOverThrFlt1,sfmc_T_DCPlugTOverThrRec1,3,3,&DiagThr.fltNum112,&DiagThr.recNum112,&sfmd_flg_DCPlugTOverFlt1) && !sfmd_flg_DCPlugTOverFlt2;
     //113 慢充插头温度过高2级故障
-    sfmd_flg_ACPlugTOverFlt2 = DiagThrSystem1(1,!sfmd_flg_interComFlt && sfmd_flg_ACPlugTRationFlt && sfmd_flg_ACPlugTOpenFlt,ihd_T_ACPlugT,sfmc_T_ACPlugTOverThrFlt2,sfmc_T_ACPlugTOverThrRec2,25,25,&DiagThr.fltNum113,&DiagThr.recNum113,&sfmd_flg_ACPlugTOverFlt2);
+    sfmd_flg_ACPlugTOverFlt2 = DiagThrSystem1(1,!sfmd_flg_interComFlt && sfmd_flg_ACPlugTRationFlt && sfmd_flg_ACPlugTOpenFlt,ihd_T_ACPlugT,sfmc_T_ACPlugTOverThrFlt2,sfmc_T_ACPlugTOverThrRec2,3,3,&DiagThr.fltNum113,&DiagThr.recNum113,&sfmd_flg_ACPlugTOverFlt2);
     //114 慢充插头温度过高1级故障
-    sfmd_flg_ACPlugTOverFlt1 = DiagThrSystem1(0,!sfmd_flg_interComFlt && sfmd_flg_ACPlugTRationFlt && sfmd_flg_ACPlugTOpenFlt,ihd_T_ACPlugT,sfmc_T_ACPlugTOverThrFlt1,sfmc_T_ACPlugTOverThrRec1,25,25,&DiagThr.fltNum114,&DiagThr.recNum114,&sfmd_flg_ACPlugTOverFlt1) && !sfmd_flg_ACPlugTOverFlt2;
+    sfmd_flg_ACPlugTOverFlt1 = DiagThrSystem1(0,!sfmd_flg_interComFlt && sfmd_flg_ACPlugTRationFlt && sfmd_flg_ACPlugTOpenFlt,ihd_T_ACPlugT,sfmc_T_ACPlugTOverThrFlt1,sfmc_T_ACPlugTOverThrRec1,3,3,&DiagThr.fltNum114,&DiagThr.recNum114,&sfmd_flg_ACPlugTOverFlt1) && !sfmd_flg_ACPlugTOverFlt2;
     
     //115 加热板温度过高2级故障
-    sfmd_flg_heatPanTOverFlt2_1 = DiagThrSystem1(1,!sfmd_flg_interComFlt && sfmd_flg_heatPanT1RationFlt && sfmd_flg_heatPanT1OpenFlt,ihd_T_heatPanT1,sfmc_T_heatPanTOverThrFlt2,sfmc_T_heatPanTOverThrRec2,25,25,&DiagThr.fltNum115_1,&DiagThr.recNum115_1,&sfmd_flg_heatPanTOverFlt2_1);
-    sfmd_flg_heatPanTOverFlt2_2 = DiagThrSystem1(1,!sfmd_flg_interComFlt && sfmd_flg_heatPanT2RationFlt && sfmd_flg_heatPanT2OpenFlt,ihd_T_heatPanT2,sfmc_T_heatPanTOverThrFlt2,sfmc_T_heatPanTOverThrRec2,25,25,&DiagThr.fltNum115_2,&DiagThr.recNum115_2,&sfmd_flg_heatPanTOverFlt2_2);
+    sfmd_flg_heatPanTOverFlt2_1 = DiagThrSystem1(1,!sfmd_flg_interComFlt && sfmd_flg_heatPanT1RationFlt && sfmd_flg_heatPanT1OpenFlt,ihd_T_heatPanT1,sfmc_T_heatPanTOverThrFlt2,sfmc_T_heatPanTOverThrRec2,3,3,&DiagThr.fltNum115_1,&DiagThr.recNum115_1,&sfmd_flg_heatPanTOverFlt2_1);
+    sfmd_flg_heatPanTOverFlt2_2 = DiagThrSystem1(1,!sfmd_flg_interComFlt && sfmd_flg_heatPanT2RationFlt && sfmd_flg_heatPanT2OpenFlt,ihd_T_heatPanT2,sfmc_T_heatPanTOverThrFlt2,sfmc_T_heatPanTOverThrRec2,3,3,&DiagThr.fltNum115_2,&DiagThr.recNum115_2,&sfmd_flg_heatPanTOverFlt2_2);
     sfmd_flg_heatPanTOverFlt2 = sfmd_flg_heatPanTOverFlt2_1 || sfmd_flg_heatPanTOverFlt2_2;
     //116 加热板温度过高1级故障
-    sfmd_flg_heatPanTOverFlt1_1 = DiagThrSystem1(0,!sfmd_flg_interComFlt && sfmd_flg_heatPanT1RationFlt && sfmd_flg_heatPanT1OpenFlt,ihd_T_heatPanT1,sfmc_T_heatPanTOverThrFlt1,sfmc_T_heatPanTOverThrRec1,25,25,&DiagThr.fltNum116_1,&DiagThr.recNum116_1,&sfmd_flg_heatPanTOverFlt1_1) && !sfmd_flg_heatPanTOverFlt2;
-    sfmd_flg_heatPanTOverFlt1_2 = DiagThrSystem1(0,!sfmd_flg_interComFlt && sfmd_flg_heatPanT2RationFlt && sfmd_flg_heatPanT2OpenFlt,ihd_T_heatPanT2,sfmc_T_heatPanTOverThrFlt1,sfmc_T_heatPanTOverThrRec1,25,25,&DiagThr.fltNum116_2,&DiagThr.recNum116_2,&sfmd_flg_heatPanTOverFlt1_2) && !sfmd_flg_heatPanTOverFlt2;
+    sfmd_flg_heatPanTOverFlt1_1 = DiagThrSystem1(0,!sfmd_flg_interComFlt && sfmd_flg_heatPanT1RationFlt && sfmd_flg_heatPanT1OpenFlt,ihd_T_heatPanT1,sfmc_T_heatPanTOverThrFlt1,sfmc_T_heatPanTOverThrRec1,3,3,&DiagThr.fltNum116_1,&DiagThr.recNum116_1,&sfmd_flg_heatPanTOverFlt1_1) && !sfmd_flg_heatPanTOverFlt2;
+    sfmd_flg_heatPanTOverFlt1_2 = DiagThrSystem1(0,!sfmd_flg_interComFlt && sfmd_flg_heatPanT2RationFlt && sfmd_flg_heatPanT2OpenFlt,ihd_T_heatPanT2,sfmc_T_heatPanTOverThrFlt1,sfmc_T_heatPanTOverThrRec1,3,3,&DiagThr.fltNum116_2,&DiagThr.recNum116_2,&sfmd_flg_heatPanTOverFlt1_2) && !sfmd_flg_heatPanTOverFlt2;
     sfmd_flg_heatPanTOverFlt1 = sfmd_flg_heatPanTOverFlt1_1 || sfmd_flg_heatPanTOverFlt1_2;
     
     sfmd_I_curr = ihd_I_curr;
     sfmd_I_currAbs = (uint16_T) (sfmd_I_curr > 0 ? sfmd_I_curr : - sfmd_I_curr);
     //131 充电电流过高
-    sfmd_flg_chrgCurrOverFlt = DiagThrSystem1(1,!sfmd_flg_interComFlt && chrgFlg && !sfmd_flg_currOpenFlt,sfmd_I_currAbs,sfmc_I_chrgCurrOverThr,sfmc_I_chrgCurrOverThr,20,20,&DiagThr.fltNum131,&DiagThr.recNum131,&sfmd_flg_chrgCurrOverFlt);
+    sfmd_flg_chrgCurrOverFlt = DiagThrSystem1(1,!sfmd_flg_interComFlt && chrgFlg && !sfmd_flg_currOpenFlt,sfmd_I_currAbs,sfmc_I_chrgCurrOverThr,sfmc_I_chrgCurrOverThr,2,2,&DiagThr.fltNum131,&DiagThr.recNum131,&sfmd_flg_chrgCurrOverFlt);
     //132 放电电流过高
-    sfmd_flg_disChrgCurrOverFlt = DiagThrSystem1(1,!sfmd_flg_interComFlt && disChrgFlg && !sfmd_flg_currOpenFlt,sfmd_I_currAbs,sfmc_I_disChrgCurrOverThr,sfmc_I_disChrgCurrOverThr ,20,20,&DiagThr.fltNum132,&DiagThr.recNum132,&sfmd_flg_disChrgCurrOverFlt);
-    
-   // printf("sfmd_flg_currOpenFlt:%d,ihd_st_workStat%d,sfmd_I_currAbs:%d,fltNum131:%d,fltNum132:%d,recNum131:%d,recNum132:%d\n",sfmd_flg_currOpenFlt,ihd_st_workStat,sfmd_I_currAbs,DiagThr.fltNum131,DiagThr.fltNum132,DiagThr.recNum131,DiagThr.recNum132);
+    sfmd_flg_disChrgCurrOverFlt = DiagThrSystem1(1,!sfmd_flg_interComFlt && disChrgFlg && !sfmd_flg_currOpenFlt,sfmd_I_currAbs,sfmc_I_disChrgCurrOverThr,sfmc_I_disChrgCurrOverThr ,2,2,&DiagThr.fltNum132,&DiagThr.recNum132,&sfmd_flg_disChrgCurrOverFlt);
+
     //151 充电过流故障不匹配
-    sfmd_flg_chrgCurrOverMisFlt = JudgeTimeSystem(!sfmd_flg_interComFlt,sfmd_flg_chrgCurrOverFlt != ihd_flg_chrgCurrOverFlt,&DiagTime.N151,20);
+    sfmd_flg_chrgCurrOverMisFlt = JudgeTimeSystem(!sfmd_flg_interComFlt,sfmd_flg_chrgCurrOverFlt != ihd_flg_chrgCurrOverFlt,&DiagTime.N151,2);
     //152 放电过流故障不匹配
-    sfmd_flg_disChrgCurrOverMisFlt = JudgeTimeSystem(!sfmd_flg_interComFlt,sfmd_flg_disChrgCurrOverFlt != ihd_flg_disChrgCurrOverFlt,&DiagTime.N152,20);
+    sfmd_flg_disChrgCurrOverMisFlt = JudgeTimeSystem(!sfmd_flg_interComFlt,sfmd_flg_disChrgCurrOverFlt != ihd_flg_disChrgCurrOverFlt,&DiagTime.N152,2);
     //153 总压欠压不匹配
-    sfmd_flg_battULowMisFlt = JudgeTimeSystem(!sfmd_flg_interComFlt, sfmd_flg_battULowFlt2 != ihd_flg_battULowFlt,&DiagTime.N153,20);
+    sfmd_flg_battULowMisFlt = JudgeTimeSystem(!sfmd_flg_interComFlt, sfmd_flg_battULowFlt2 != ihd_flg_battULowFlt,&DiagTime.N153,2);
     //154 总压过压不匹配
-    sfmd_flg_battUOverMisFlt = JudgeTimeSystem(!sfmd_flg_interComFlt, sfmd_flg_battUOverFlt2 != ihd_flg_battUOverFlt,&DiagTime.N154,20);
+    sfmd_flg_battUOverMisFlt = JudgeTimeSystem(!sfmd_flg_interComFlt, sfmd_flg_battUOverFlt2 != ihd_flg_battUOverFlt,&DiagTime.N154,2);
     
     //155 单体欠压故障不匹配
-    sfmd_flg_cellULowMisFlt = JudgeTimeSystem(!sfmd_flg_interComFlt, sfmd_flg_cellULowFlt2 != ihd_flg_cellULowFlt,&DiagTime.N155,20);
+    sfmd_flg_cellULowMisFlt = JudgeTimeSystem(!sfmd_flg_interComFlt, sfmd_flg_cellULowFlt2 != ihd_flg_cellULowFlt,&DiagTime.N155,2);
     //156 单体过压故障不匹配
-    sfmd_flg_cellUOverMisFlt = JudgeTimeSystem(!sfmd_flg_interComFlt, sfmd_flg_cellUOverFlt2 != ihd_flg_cellUOverFlt,&DiagTime.N156,20);
+    sfmd_flg_cellUOverMisFlt = JudgeTimeSystem(!sfmd_flg_interComFlt, sfmd_flg_cellUOverFlt2 != ihd_flg_cellUOverFlt,&DiagTime.N156,2);
     
     //157 充电模组过温故障不匹配
-    sfmd_flg_chrgModTOverMisFlt = JudgeTimeSystem(!sfmd_flg_interComFlt, sfmd_flg_chrgModTOverFlt2 != ihd_flg_chrgModTOverFlt,&DiagTime.N157,20);
+    sfmd_flg_chrgModTOverMisFlt = JudgeTimeSystem(!sfmd_flg_interComFlt, sfmd_flg_chrgModTOverFlt2 != ihd_flg_chrgModTOverFlt,&DiagTime.N157,2);
     //158 充电模组低温故障不匹配
-    sfmd_flg_chrgModTLowMisFlt = JudgeTimeSystem(0 && !sfmd_flg_interComFlt,sfmd_flg_chrgModTLowFlt2 != ihd_flg_chrgModTLowFlt,&DiagTime.N158,20);
+    sfmd_flg_chrgModTLowMisFlt = JudgeTimeSystem(0 && !sfmd_flg_interComFlt,sfmd_flg_chrgModTLowFlt2 != ihd_flg_chrgModTLowFlt,&DiagTime.N158,2);
     //159 放电模组过温故障不匹配
-    sfmd_flg_disChrgModTOverMisFlt = JudgeTimeSystem(!sfmd_flg_interComFlt,sfmd_flg_disChrgModTOverFlt2 != ihd_flg_disChrgModTOverFlt,&DiagTime.N159,20);
+    sfmd_flg_disChrgModTOverMisFlt = JudgeTimeSystem(!sfmd_flg_interComFlt,sfmd_flg_disChrgModTOverFlt2 != ihd_flg_disChrgModTOverFlt,&DiagTime.N159,2);
     //160 放电模组低温故障不匹配
-    sfmd_flg_disChrgModTLowMisFlt = JudgeTimeSystem(0 &&!sfmd_flg_interComFlt, sfmd_flg_disChrgModTLowFlt2 != ihd_flg_disChrgModTLowFlt,&DiagTime.N160,20);
+    sfmd_flg_disChrgModTLowMisFlt = JudgeTimeSystem(0 &&!sfmd_flg_interComFlt, sfmd_flg_disChrgModTLowFlt2 != ihd_flg_disChrgModTLowFlt,&DiagTime.N160,2);
     
     //161 充电Mos过温故障不匹配
-    sfmd_flg_chrgMosTOverMisFlt = JudgeTimeSystem(!sfmd_flg_interComFlt, sfmd_flg_chrgMosTOverFlt2 != ihd_flg_chrgMosTOverFlt,&DiagTime.N161,20);
+    sfmd_flg_chrgMosTOverMisFlt = JudgeTimeSystem(!sfmd_flg_interComFlt, sfmd_flg_chrgMosTOverFlt2 != ihd_flg_chrgMosTOverFlt,&DiagTime.N161,2);
     //162 放电Mos过温故障不匹配
-    sfmd_flg_disChrgMosTOverMisFlt = JudgeTimeSystem(!sfmd_flg_interComFlt, sfmd_flg_disChrgMosTOverFlt2 != ihd_flg_disChrgMosTOverFlt,&DiagTime.N162,20);
+    sfmd_flg_disChrgMosTOverMisFlt = JudgeTimeSystem(!sfmd_flg_interComFlt, sfmd_flg_disChrgMosTOverFlt2 != ihd_flg_disChrgMosTOverFlt,&DiagTime.N162,2);
     
     
     //163 soc不匹配
@@ -729,14 +759,114 @@ void SFM(void)
     //164 SOH 不匹配
     sfmd_flg_sohMisFlt = !FirstRun_SFM && (!sfmd_flg_interComFlt) && ( (int16_T) (sohd_pct_bcuSoh -ihd_pct_soh ) > 50  || (int16_T) (sohd_pct_bcuSoh -ihd_pct_soh ) <  -50);
     
-    
     //179 soc跳变
-    sfmd_flg_socJumpFlt = ((int16_T) (socd_pct_bcuSoc - socd_pct_bcuSoc_Delay) > 50 ||(int16_T) (socd_pct_bcuSoc - socd_pct_bcuSoc_Delay) < -50) && JudgeTimeSystem(1, 1 ,&DiagTime.N179,2);;
+    sfmd_flg_socJumpFlt = ((int16_T) (socd_pct_bcuSoc - socd_pct_bcuSoc_Delay) > 50 ||(int16_T) (socd_pct_bcuSoc - socd_pct_bcuSoc_Delay) < -50) && JudgeTimeSystem(1, 1 ,&DiagTime.N179,2);
     socd_pct_bcuSoc_Delay = socd_pct_bcuSoc;
     //180 EE失效
     sfmd_flg_EEsaveFlt = ihd_flg_EESaveFlt;
     
+   
+    
+    
+    // 21 热失控故障
+    if (sfmd_I_curr > -2  && (sfmd_I_curr_Delay - sfmd_I_curr) > -2 && (sfmd_I_curr_Delay - sfmd_I_curr) < 2)
+    {
+        noDisChrgCnt = (noDisChrgCnt + 1) > 200 ? 200 : (noDisChrgCnt + 1);
+    }
+    else
+    {
+       noDisChrgCnt = 0; 
+    }
+    sfmd_I_curr_Delay = sfmd_I_curr;
     
+    if (noDisChrgCnt > 60)
+    {
+        for(i = 0; i < cmnc_num_cellUNum;i++)
+        {
+            if((int16_T)(CellUArry[3][i] - CellUArry[0][i]) < -100)
+            {
+                sfmd_flg_Udrop = true;
+            }
+        }
+        if(sfmd_flg_heatclear)
+        {
+            sfmd_flg_Udrop = false;
+        }
+    }
+    ////
+    if(sfmd_flg_volFlt)
+    {
+        sfmd_flg_volFlt_keep = true;
+    }
+    if(sfmd_flg_heatclear)
+    {
+        sfmd_flg_volFlt_keep = false;
+    }
+    //
+    CntA = CntA + 1;
+    if(CntA >= 0)
+    {
+        CntA = 0;
+        for(j = 0;j < 4 && FirstRun_SFM;j++)
+        {
+            for(i = 0; i < cmnc_num_modTNum;i++)
+            {
+                ModTStor[j][i] = sfmv_T_modT[i];
+            }
+        }
+        for(j = 0;j < 3;j++)
+        {
+            for(i = 0; i < cmnc_num_modTNum;i++)
+            {
+                ModTStor[j][i] = ModTStor[j+1][i];
+            }
+        }
+        for(i = 0; i < cmnc_num_modTNum;i++)
+        {
+            ModTStor[j][i] = sfmv_T_modT[i];
+        }
+        for(i = 0; i < cmnc_num_modTNum;i++)
+        {
+            if( (int16_T)(ModTStor[3][i] - ModTStor[2][i]) > 2 && (int16_T)(ModTStor[2][i] - ModTStor[1][i]) > 2 && (int16_T)(ModTStor[1][i] - ModTStor[0][i]) > 2)
+            {
+                sfmd_flg_Tup = true;
+            }
+        }
+    }
+
+    if(sfmd_flg_heatclear)
+    {
+        sfmd_flg_Tup = false;
+    }
+    //
+    if(sfmd_flg_modTOpenFlt)
+    {
+        sfmd_flg_modTOpenFlt_keep = true;
+    }
+    if(sfmd_flg_heatclear)
+    {
+        sfmd_flg_modTOpenFlt_keep = false;
+    }
+    //////
+    if(sfmd_flg_Udrop || sfmd_flg_volFlt_keep || sfmd_flg_Tup || sfmd_flg_modTOpenFlt_keep)
+    {
+        CntB = (CntB + 1) > 200 ? 200 : (CntB + 1);
+    }
+    if((((sfmd_flg_Udrop && sfmd_flg_Tup) || (sfmd_flg_Udrop && sfmd_flg_modTOpenFlt_keep) || (sfmd_flg_volFlt_keep && sfmd_flg_Tup)) && CntB <= 180) || sfmd_flg_heatRunFltEi)
+    {
+        sfmd_flg_heatRunFltEo = true;
+    }
+    if(!sfmd_flg_heatRunFltEo && CntB > 180)       
+    {
+        sfmd_flg_heatclear = true;
+        CntB = 0;
+    }
+	else
+	{ 
+	    sfmd_flg_heatclear = false;
+	}
+    printf("%d   %d  %d   %d   %d  %d  %d\n",sfmd_flg_Udrop,sfmd_flg_volFlt_keep,sfmd_flg_Tup,sfmd_flg_modTOpenFlt_keep,CntB,sfmd_flg_heatclear,sfmd_flg_heatRunFltEo) ;   
+        
     
     //================================================================================================================================================================
     //================================================================================================================================================================
@@ -769,7 +899,7 @@ void SFM(void)
     FltFlg[18] = 0;                                  FltLevel[18] = 0;        FltAct[18] = 0;       //19 预留2
     FltFlg[19] = 0;                                  FltLevel[19] = 0;        FltAct[19] = 0;       //20 预留1
     
-    FltFlg[20] = 0;                                  FltLevel[20] = 0;        FltAct[20] = 0;       //21 热失控;
+    FltFlg[20] = sfmd_flg_heatRunFltEo;              FltLevel[20] = 5;        FltAct[20] = 255;     //21 热失控;
     FltFlg[21] = sfmd_flg_chrgMosClosFlt;            FltLevel[21] = 4;        FltAct[21] = 106;     //22充电MOS常闭故障
     FltFlg[22] = 0;                                  FltLevel[22] = 0;        FltAct[22] = 0;       //23充电MOS常开故障
     FltFlg[23] = sfmd_flg_disChrgMosClosFlt;         FltLevel[23] = 4;        FltAct[23] = 106;     //24 放电Mos常闭故障
@@ -1019,14 +1149,14 @@ void SFM(void)
         }
         sfmd_st_fltAct = sfmd_st_fltAct|FltActArr[i];
     }
-    /*
+    
     for(i=0;i < 20;i++)
     {
         printf("%d  ",sfmv_idx_fltCode[i]);
     }
     printf("\n");
     printf("sfmd_st_fltAct:%d,sfmd_st_fltLevel:%d\n\n",sfmd_st_fltAct,sfmd_st_fltLevel);
-    */
+    
     
     ///=====================================================================
     //======================================================================
@@ -1041,7 +1171,7 @@ void SFM(void)
 
 
 //===============================================================================
-boolean_T DiagThrSystem1(boolean_T Enable, boolean_T precondition, uint16_T Input,uint16_T fltThr,uint16_T recThr,uint16_T fltNumThr,uint16_T recNumThr,uint8_T *fltNum,uint8_T *recNum,boolean_T *fitFlg)
+boolean_T DiagThrSystem1(boolean_T Enable, boolean_T precondition, uint16_T Input,uint16_T fltThr,uint16_T recThr,uint8_T fltNumThr,uint8_T recNumThr,uint8_T *fltNum,uint8_T *recNum,boolean_T *fitFlg)
 {
     
     if(Enable && precondition && Input > fltThr)
@@ -1073,7 +1203,7 @@ boolean_T DiagThrSystem1(boolean_T Enable, boolean_T precondition, uint16_T Inpu
     return *fitFlg;
 }
 //=============================================================================
-boolean_T DiagThrSystem2(boolean_T Enable, boolean_T precondition, uint16_T Input,uint16_T fltThr,uint16_T recThr,uint16_T fltNumThr,uint16_T recNumThr,uint8_T *fltNum,uint8_T *recNum,boolean_T *fitFlg)
+boolean_T DiagThrSystem2(boolean_T Enable, boolean_T precondition, uint16_T Input,uint16_T fltThr,uint16_T recThr,uint8_T fltNumThr,uint8_T recNumThr,uint8_T *fltNum,uint8_T *recNum,boolean_T *fitFlg)
 {
     if(Enable && precondition && Input < fltThr)
     {