ソースを参照

平峰项目优化-故障发送

CHENJIE-PC\QiXiang_CHENJIE 3 年 前
コミット
07cd5153f2
6 ファイル変更98 行追加70 行削除
  1. 41 0
      src/AppFuncLib.c
  2. 2 0
      src/AppFuncLib.h
  3. 2 1
      src/AppGlobalVar.c
  4. 4 2
      src/AppGlobalVar.h
  5. 47 67
      src/AppTaskUart0.c
  6. 2 0
      src/AppTaskUart1.c

+ 41 - 0
src/AppFuncLib.c

@@ -15,6 +15,47 @@
  */
 
 #include "AppFuncLib.h"
+/**
+ * @brief : 获取故障码函数,从故障数组中获取故障码,并将之前的故障码向前移动
+ * @param {UINT16} *ErrorArray
+ * @param {UINT8} Errorlen
+ * @return {*}
+ */
+uint16 GetErrorNum(uint16 *ErrorArray, uint8 Errorlen)
+{
+	uint16 OutNum;
+	OutNum = *(ErrorArray);
+	for (uint8 i = 0; i < Errorlen - 1; i++)
+	{
+		*(ErrorArray + i) = *(ErrorArray + i + 1);
+		if (*(ErrorArray + i + 1) == 0)
+			break;
+	}
+	return OutNum;
+}
+uint8 PutErrorNum(uint16 *ErrorArray, uint8 Errorlen, uint16 ErrorNum)
+{
+	for (uint8 i = 0; i < Errorlen; i++)
+	{
+		if (*(ErrorArray + i) == 0)
+		{
+			*(ErrorArray + i) = ErrorNum;
+			return 0;
+		}
+		else
+		{
+			if (*(ErrorArray + i) == ErrorNum)
+			{
+				return 1;
+			}
+			else
+			{
+				continue;
+			}
+		}
+	}
+	return 2;
+}
 uint16 ATstrdel(char *str)
 {
     char *p = str;

+ 2 - 0
src/AppFuncLib.h

@@ -22,6 +22,8 @@
 #ifndef va_copy
 #define va_copy(dst, src) memcpy(&(dst), &(src), sizeof(va_list))
 #endif
+uint16 GetErrorNum(uint16 *ErrorArray, uint8 Errorlen);
+uint8 PutErrorNum(uint16 *ErrorArray, uint8 Errorlen, uint16 ErrorNum);
 uint16 ATstrdel(char *str);
 uint16 mstrlen(const char *s);
 int mstrncmp(const char *s1, const char *s2, int n);

+ 2 - 1
src/AppGlobalVar.c

@@ -49,7 +49,7 @@ uint32 bmsSwVersion = 0;
 uint16 battCellU[BMS_CELLNUM];	 //电池电压
 uint16 battI = 0;				 // BMS电流(tcp上传)
 uint16 battPackVol = 0;			 // bms电压
-uint16 ErrorTemp = 0x0000;		 // BMS故障代码
+
 uint16 maxCellVol = 0;			 //最大单体电压
 uint16 minCellVol = 0;			 //最小单体电压
 uint16 socd_pct_vcuSoc = 0;		 // soc(tcp上传,精度0.1)
@@ -75,6 +75,7 @@ uint8 battRelayState = 0;
 uint8 battConverState = 0;
 uint8 battSeparateEnable = 0;
 uint8 battSeparateEnableState = 0;
+uint16 ErrorArray[5] = {0};
 #endif
 /*以下变量均为App_CAN相关变量*/
 #ifdef APP_CAN_ENABLE

+ 4 - 2
src/AppGlobalVar.h

@@ -21,7 +21,8 @@
 
 #include "hal_adapter.h"
 // test Var
-#define defaultSn "GYTEST00000000001"
+//#define defaultSn "GYTEST00000000001"
+#define defaultSn "SPFPFL264S223H001"
 
 #define HWVERSION 0x0001
 #define BLSWVERSION 0x00000001
@@ -77,7 +78,7 @@ extern uint16 battI;                    // BMS
 extern uint16 bmsHwVersion;
 extern uint32 bmsSwVersion;
 extern uint16 battPackVol;              // bms电压
-extern uint16 ErrorTemp;                // BMS故障代码
+
 extern uint16 maxCellVol;               //最大单体电压
 extern uint16 minCellVol;               //最小单体电压
 extern uint16 socd_pct_vcuSoc;          // soc(tcp上传,精度0.1)
@@ -103,6 +104,7 @@ extern uint8 battRelayState ;
 extern uint8 battConverState ;
 extern uint8 battSeparateEnable ;
 extern uint8 battSeparateEnableState ;
+extern uint16 ErrorArray[5];
 #endif
 /*以下变量均为App_CAN相关变量*/
 #ifdef APP_CAN_ENABLE

+ 47 - 67
src/AppTaskUart0.c

@@ -20,6 +20,7 @@ void Uart0Task(void *pvParameters)
 	uint16 pReadLen = 0;
 	UartAnsType UartAnsData;
 	static uint8 writecounter = 0;
+	uint16 UartNoDataReadCounter = 0;
 	while (1)
 	{
 		switch (gProcess_Uart0_Task)
@@ -66,8 +67,13 @@ void Uart0Task(void *pvParameters)
 				if(CrcChkCal==CrcChkGet)
 				{
 					bmsCellInfoDecode(UartAnsData.DataPtr);
+					UartNoDataReadCounter = 0;
 				}
 			}
+			else
+			{
+				UartNoDataReadCounter++;
+			}
 			/*温度及其他状态信息读取(第二次读取)*/
 			pReadLen = 0;
 			RegAddrBegin = 0x03 + AppDataInfo.BattCellCount;
@@ -103,8 +109,23 @@ void Uart0Task(void *pvParameters)
 				if(CrcChkCal==CrcChkGet)
 				{
 					bmsOtherInfoDecode(UartAnsData.DataPtr);
+					UartNoDataReadCounter = 0;
 				}
 			}
+			else
+			{
+				UartNoDataReadCounter++;
+			}
+			//没有读到数据时的默认值
+			if(UartNoDataReadCounter>20)
+			{
+				memset(RX_Buffer[UART_LPUART0],0x00,sizeof(RX_Buffer[UART_LPUART0]));
+				memcpy((uint8 *)(&UartAnsData),RX_Buffer[UART_LPUART0],0x03);
+				UartAnsData.DataPtr = (uint8 *)(&RX_Buffer[UART_LPUART0][3]);
+				bmsCellInfoDecode(UartAnsData.DataPtr);
+				bmsOtherInfoDecode(UartAnsData.DataPtr);
+				PutErrorNum(ErrorArray, sizeof(ErrorArray)/2, 1);
+			}
 			PROC_UART0_STATE_SWITCH(PROCESS_UART_STATE_IDLE);
 			break;
 		}
@@ -177,7 +198,7 @@ bool bmsCellInfoDecode(uint8 *dataPtr) //
 	}
 	Batt_current = (dataPtr[(0x02 + BATT_CELL_VOL_NUM) * 2] << 8) | (dataPtr[(0x02 + BATT_CELL_VOL_NUM) * 2 + 1]);
 	//原始数据:充电为负,放电为正
-	if (battWorkState == 0x02) //充电过程
+	if (Batt_current < 0x8000) //充电过程
 	{
 		if (Batt_current > 0x8000) // 数据为负
 		{
@@ -258,73 +279,32 @@ bool bmsOtherInfoDecode(uint8 *dataPtr)//
 	battConverState = getbit(dataPtr[(0x09 + OtherInfoAddrOffset + TEMP_NUM) * 2 + 1],6);
 	battSeparateEnableState = getbit(dataPtr[(0x1B + OtherInfoAddrOffset + TEMP_NUM) * 2],7);
 	//故障状态映关系(先完成告警状态简单上传)
-	if(getbit(dataPtr[(0x03 + OtherInfoAddrOffset) * 2],0))//电芯电压过高切断告警
-	{
-		ErrorTemp = 81;
-	}
-	if(getbit(dataPtr[(0x03 + OtherInfoAddrOffset) * 2],1))//总压过高切断告警
-	{
-		ErrorTemp = 87;
-	}
-	if(getbit(dataPtr[(0x04 + OtherInfoAddrOffset) * 2 + 1],0))//电芯电压过低切断告警
-	{
-		ErrorTemp = 83;
-	}
-	if(getbit(dataPtr[(0x04 + OtherInfoAddrOffset) * 2 + 1],1))//总压过低切断告警
-	{
-		ErrorTemp = 89;
-	}
-	if(getbit(dataPtr[(0x04 + OtherInfoAddrOffset) * 2],4))//单节温度过高切断
-	{
-		ErrorTemp = 97;
-	}
-	if(getbit(dataPtr[(0x04 + OtherInfoAddrOffset) * 2],5))//单节温度过低切断
-	{
-		ErrorTemp = 99;
-	}
-	if(getbit(dataPtr[(0x05 + OtherInfoAddrOffset) * 2 + 1],1))//放电电流切断
+	uint8 ErrorArrayTemp[32] ={0};
+	uint8 ErrorArrayNumTemp[32]={81,87,83,89,97,99,132,131,134,84,90,82,88,135,136,98,100};
+	ErrorArrayTemp[0] = getbit(dataPtr[(0x03 + OtherInfoAddrOffset) * 2],0);//电芯电压过高切断告警-0-81
+	ErrorArrayTemp[1] = getbit(dataPtr[(0x03 + OtherInfoAddrOffset) * 2],1);//总压过高切断告警-1-87
+	ErrorArrayTemp[2] = getbit(dataPtr[(0x04 + OtherInfoAddrOffset) * 2 + 1],0);//电芯电压过低切断告警2-83
+	ErrorArrayTemp[3] = getbit(dataPtr[(0x04 + OtherInfoAddrOffset) * 2 + 1],1);//总压过低切断告警3-89
+	ErrorArrayTemp[4] = getbit(dataPtr[(0x04 + OtherInfoAddrOffset) * 2],4);//单节温度过高切断4-97
+	ErrorArrayTemp[5] = getbit(dataPtr[(0x04 + OtherInfoAddrOffset) * 2],5);//单节温度过低切断5-99
+	ErrorArrayTemp[6] = getbit(dataPtr[(0x05 + OtherInfoAddrOffset) * 2 + 1],1);//放电电流切断6-132
+	ErrorArrayTemp[7] = getbit(dataPtr[(0x05 + OtherInfoAddrOffset) * 2 + 1],2);//充电电流切断7-131
+	ErrorArrayTemp[8] = getbit(dataPtr[(0x05 + OtherInfoAddrOffset) * 2 + 1],3);//BTU连接告警8-134
+	ErrorArrayTemp[9] = getbit(dataPtr[(0x0A + OtherInfoAddrOffset + TEMP_NUM) * 2 + 1],0);//单节电压下限告警9-84
+	ErrorArrayTemp[10] = getbit(dataPtr[(0x0A + OtherInfoAddrOffset + TEMP_NUM) * 2 + 1],1);//组电压下限告警10-90
+	ErrorArrayTemp[11] = getbit(dataPtr[(0x0A + OtherInfoAddrOffset + TEMP_NUM) * 2 + 1],2);//单节电压上限告警11-82
+	ErrorArrayTemp[12] = getbit(dataPtr[(0x0A + OtherInfoAddrOffset + TEMP_NUM) * 2 + 1],3);//组单节电压上限告警12-88
+	ErrorArrayTemp[13] = getbit(dataPtr[(0x0A + OtherInfoAddrOffset + TEMP_NUM) * 2 + 1],4);//放电电流告警13-135
+	ErrorArrayTemp[14] = getbit(dataPtr[(0x0A + OtherInfoAddrOffset + TEMP_NUM) * 2 + 1],5);//充电电流告警14-136
+	ErrorArrayTemp[15] = getbit(dataPtr[(0x0A + OtherInfoAddrOffset + TEMP_NUM) * 2 + 1],6);//单节温度上限告警15-98
+	ErrorArrayTemp[16] = getbit(dataPtr[(0x0A + OtherInfoAddrOffset + TEMP_NUM) * 2 + 1],7);//单节温度下线告警16-100
+	for(uint8 i=0,j=0;(i<32&&j<5);i++)
 	{
-		ErrorTemp = 132;
-	}
-	if(getbit(dataPtr[(0x05 + OtherInfoAddrOffset) * 2 + 1],2))//充电电流切断
-	{
-		ErrorTemp = 131;
-	}
-	if(getbit(dataPtr[(0x05 + OtherInfoAddrOffset) * 2 + 1],3))//BTU连接告警
-	{
-		ErrorTemp = 134;
-	}
-	if(getbit(dataPtr[(0x0A + OtherInfoAddrOffset + TEMP_NUM) * 2 + 1],0))//单节电压下限告警
-	{
-		ErrorTemp = 84;
-	}
-	if(getbit(dataPtr[(0x0A + OtherInfoAddrOffset + TEMP_NUM) * 2 + 1],1))//组电压下限告警
-	{
-		ErrorTemp = 90;
-	}
-	if(getbit(dataPtr[(0x0A + OtherInfoAddrOffset + TEMP_NUM) * 2 + 1],2))//单节电压上限告警
-	{
-		ErrorTemp = 82;
-	}
-	if(getbit(dataPtr[(0x0A + OtherInfoAddrOffset + TEMP_NUM) * 2 + 1],3))//组单节电压上限告警
-	{
-		ErrorTemp = 88;
-	}
-	if(getbit(dataPtr[(0x0A + OtherInfoAddrOffset + TEMP_NUM) * 2 + 1],4))//放电电流告警
-	{
-		ErrorTemp = 135;
-	}
-	if(getbit(dataPtr[(0x0A + OtherInfoAddrOffset + TEMP_NUM) * 2 + 1],5))//充电电流告警
-	{
-		ErrorTemp = 136;
-	}
-	if(getbit(dataPtr[(0x0A + OtherInfoAddrOffset + TEMP_NUM) * 2 + 1],6))//单节温度上限告警
-	{
-		ErrorTemp = 98;
-	}
-	if(getbit(dataPtr[(0x0A + OtherInfoAddrOffset + TEMP_NUM) * 2 + 1],7))//单节温度下线告警
-	{
-		ErrorTemp = 100;
+		if(ErrorArrayTemp[i]==1)
+		{
+			PutErrorNum(ErrorArray, sizeof(ErrorArray)/2, ErrorArrayNumTemp[i]);
+			j++;
+		}
 	}
 	return true;
 }

+ 2 - 0
src/AppTaskUart1.c

@@ -815,6 +815,8 @@ void TcpDataEncode(uint32 *PtrSendAddr, uint16 *SendLen)
 #ifdef APP_UART0_ENABLE
 	case 0x80:
 	{
+		uint16 ErrorTemp;
+		ErrorTemp = GetErrorNum(ErrorArray,sizeof(ErrorArray)/2);
 		uint8 ProtocolHeaderLen = 25;																					  //电池信息协议头部加校验码长度,此长度不更改
 		uint8 ProtocolFixedLen = 60;																					  //电池信息协议固定总长度 如协议新增,需要更改此长度
 		uint16 ProtocolFluctedLen = AppDataInfo.BattCellCount * 2 + AppDataInfo.BattTempCount + BmsOtherTemp + OtherTemp; //电池信息协议变动长度