Browse Source

VCU和BCU 传输已完成

CHENJIE-PC\QiXiang_CHENJIE 3 years ago
parent
commit
9d0a7c20f1

+ 74 - 60
Global/Std_Types.h

@@ -1,63 +1,77 @@
+/*
+ * @Author       : ChenJie
+ * @Date         : 2021-11-24 14:01:24
+ * @Version      : V3.0
+ * @LastEditors  : ChenJie
+ * @LastEditTime : 2021-12-28 09:56:10
+ * @Description  : file content
+ * @FilePath     : \VehicleControl\VehicleControl\src\Global\Std_Types.h
+ */
 /********************************************************************************
-* 常州易控汽车电子股份有限公司
-* (c) Copyright 2009-2015 ECTEK
-* 保留所有权利
-********************************************************************************
-* 工程名称:全局定义
-* 文件名: Std_Types.h
-* 功能描述 : 基本类型定义及全局宏定义头文件
-* 引用记录:该文件被各个.h文件包含
-* 备注: 
-* 修订记录:
-*		日期		      版本		  作者		描述
-*   2009.02.22           00.01.00     方成     第一版
-*******************************************************************************/
+ * 常州易控汽车电子股份有限公司
+ * (c) Copyright 2009-2015 ECTEK
+ * 保留所有权利
+ ********************************************************************************
+ * 工程名称:全局定义
+ * 文件名: Std_Types.h
+ * 功能描述 : 基本类型定义及全局宏定义头文件
+ * 引用记录:该文件被各个.h文件包含
+ * 备注:
+ * 修订记录:
+ *		日期		      版本		  作者		描述
+ *   2009.02.22           00.01.00     方成     第一版
+ *******************************************************************************/
 
 #ifndef __TYPEDEF_H
-    #define __TYPEDEF_H
-
-
-    #include "SysConf.h"
-    
-    /*******************************************************************************************
-                                  基本变量类型定义
-    ********************************************************************************************/
-		typedef unsigned char boolean; 
-
-		typedef signed char sint8; 
-		typedef unsigned char uint8;
-		typedef signed short sint16; 
-		typedef unsigned short uint16; 
-		typedef signed long sint32;
-		typedef unsigned long uint32; 
-
-		typedef unsigned long uint8_least; 
-		typedef unsigned long uint16_least;
-		typedef unsigned long uint32_least; 
-
-		typedef signed long sint8_least; 
-		typedef signed long sint16_least;
-		typedef signed long sint32_least;
-
-		typedef float float32; 
-		typedef double float64; 
-		
-		#ifndef NULL
-			#define NULL    (0)
-		#endif
-		
-		#ifndef NULL_PTR
-            #define NULL_PTR ((void *)0)
-        #endif
-
-		#ifndef TRUE
-			#define TRUE 1
-		#endif
-
-		#ifndef FALSE
-			#define FALSE 0
-		#endif
-                     
- 
-
-#endif 
+#define __TYPEDEF_H
+
+#include "SysConf.h"
+
+/*******************************************************************************************
+							  基本变量类型定义
+********************************************************************************************/
+typedef unsigned char boolean;
+
+typedef signed char sint8;
+typedef unsigned char uint8;
+typedef signed short sint16;
+typedef unsigned short uint16;
+typedef signed long sint32;
+typedef unsigned long uint32;
+
+typedef unsigned long uint8_least;
+typedef unsigned long uint16_least;
+typedef unsigned long uint32_least;
+
+typedef signed long sint8_least;
+typedef signed long sint16_least;
+typedef signed long sint32_least;
+
+typedef float float32;
+typedef double float64;
+
+typedef unsigned char UINT8;
+typedef unsigned short UINT16;
+typedef unsigned long UINT32;
+typedef unsigned char BOOL;
+typedef signed char INT8;
+typedef signed short INT16;
+typedef signed long INT32;
+
+#ifndef NULL
+#define NULL (0)
+#endif
+
+#ifndef NULL_PTR
+#define NULL_PTR ((void *)0)
+#endif
+
+#ifndef TRUE
+#define TRUE 1
+#endif
+
+#ifndef FALSE
+#define FALSE 0
+#endif
+
+#endif

+ 27 - 16
Global/SysConf.h

@@ -1,21 +1,32 @@
+/*
+ * @Author       : ChenJie
+ * @Date         : 2021-11-24 14:01:24
+ * @Version      : V3.0
+ * @LastEditors  : ChenJie
+ * @LastEditTime : 2021-12-29 15:46:21
+ * @Description  : file content
+ * @FilePath     : \VehicleControl\VehicleControl\src\Global\SysConf.h
+ */
 /********************************************************************************
-* 常州易控汽车电子股份有限公司
-* (c) Copyright 2009-2015 ECTEK
-* 保留所有权利
-********************************************************************************
-* 工程名称:全局定义
-* 文件名: SysConf.h
-* 功能描述 : 系统配置头文件
-* 引用记录:该文件被各个.h文件包含
-* 备注: 
-* 修订记录:
-*		日期		      版本		  作者		描述
-*   2017.09.05   00.01.00    李中               第一版
-*******************************************************************************/
+ * 常州易控汽车电子股份有限公司
+ * (c) Copyright 2009-2015 ECTEK
+ * 保留所有权利
+ ********************************************************************************
+ * 工程名称:全局定义
+ * 文件名: SysConf.h
+ * 功能描述 : 系统配置头文件
+ * 引用记录:该文件被各个.h文件包含
+ * 备注:
+ * 修订记录:
+ *		日期		      版本		  作者		描述
+ *   2017.09.05   00.01.00    李中               第一版
+ *******************************************************************************/
 
 #ifndef __SYSCONF_H
-    #define __SYSCONF_H
-    
-    #define _SAMPLE_CODE_
+#define __SYSCONF_H
 
+#define _SAMPLE_CODE_
+
+//#define _APP_TEST_CODE
+#define _APP_RELEASE_CODE
 #endif

+ 406 - 391
HardwareLib/HardwareLib.h

@@ -1,398 +1,413 @@
 /********************************************************************************
-* 常州易控汽车电子股份有限公司
-* (c) Copyright 2009-2017 ECTEK
-* 保留所有权利
-********************************************************************************
-* 工程名称:整车控制器
-* 文件名: HardwareLib.h
-* 功能描述 : 底层硬件驱总库
-* 引用记录:该文件被GlobalDef.h包含
-* 备注: 
-* 修订记录:
-*		日期		      版本		  作者		描述
-*   2017.05.08  00.01.00     李中
-*******************************************************************************/
+ * 常州易控汽车电子股份有限公司
+ * (c) Copyright 2009-2017 ECTEK
+ * 保留所有权利
+ ********************************************************************************
+ * 工程名称:整车控制器
+ * 文件名: HardwareLib.h
+ * 功能描述 : 底层硬件驱总库
+ * 引用记录:该文件被GlobalDef.h包含
+ * 备注:
+ * 修订记录:
+ *		日期		      版本		  作者		描述
+ *   2017.05.08  00.01.00     李中
+ *******************************************************************************/
 
 #ifndef __HARDWARELIB_H
-    #define __HARDWARELIB_H
-
-
-    #include "Std_Types.h"
-    
-
-    /*******************************************************************************************
-                                 公用函数库
-    ********************************************************************************************/
-
-    //一维查表插值
-    uint16 Intpol_u16u16(uint16 * addrTablePUW,uint16 dataXUW); //1维查表插值,X,Y都是16位无符号整数
-    uint16 Intpol_s16u16(uint16 * addrTablePUW,sint16 dataXW); //1维查表插值,X是有符号整数,Y是无符号整数
-    sint16 Intpol_u16s16(uint16 * addrTablePUW,uint16 dataXUW);//1维查表插值,X是无符号整数,Y是有符号整数
-    sint16 Intpol_s16s16(uint16 * addrTablePUW,sint16 dataXW); //1维查表插值,X,Y都是16位有符号整数
-    uint32 Intpol_u16u32(uint16 * addrTablePUW, uint16 dataXUW); //1维查表插值,X都是16位无符号整数,Y是无符号32位整数
-    uint32 Intpol_u32u32(uint16 * addrTablePUW, uint32 dataXUI); //1维查表插值,X,Y都是32位无符号整数
-
-    //二维查表插值
-    uint16 Intpol_u16u16u16(uint16 * addrTablePUW,uint16 dataXUW,uint16 dataYUW); //2维查表插值,X,Y,Z都是16位无符号整数
-    sint16 Intpol_u16u16s16(uint16 * addrTablePUW,uint16 dataXUW,uint16 dataYUW);//2维查表插值,X,Y都是16位无符号,Z是有符号
-    uint16 Intpol_u16s16u16(uint16 * addrTablePUW,uint16 dataXUW,sint16 dataYW); //2维查表插值,X,Z都是16位无符号,Y是有符号
-    sint16 Intpol_s16u16s16(uint16 * addrTablePUW,sint16 dataXW,uint16 dataYUW); //2维查表插值,X,Z都是16位有符号,Y是无符号
-    uint32 Intpol_u16u16u32(uint16 * addrTablePUW,uint16 dataXUW,uint16 dataYUW); //2维查表插值,X,Y是无符号16位整数,Z是32位无符号整数
-
-    //PT1滤波
-    #define _COMLIB_FACTOR_PT1  1000
-
-    void ComLib_PT1U8(uint8 valRawUB,uint16 K,uint16 T1,uint8 * valLstUB);
-    void ComLib_PT1S8(sint8 valRawB,uint16 K,uint16 T1,sint8 * valLstB);
-    void ComLib_PT1U16(uint16 valRawUW,uint16 K,uint16 T1,uint16 * valLstUW);
-    void ComLib_PT1S16(sint16 valRawW,uint16 K,uint16 T1,sint16 * valLstW);
-    void ComLib_PT1U32(uint32 valRawUI,uint16 K,uint16 T1,uint32 * valLstUI);
-    void ComLib_PT1S32(sint32 valRawI,uint16 K,uint16 T1,sint32 * valLstI);
-
-    /*******************************************************************************************
-                                 底层驱动接口
-    ********************************************************************************************/      
-
-    typedef enum
+#define __HARDWARELIB_H
+
+#include "Std_Types.h"
+
+/*******************************************************************************************
+                             公用函数库
+********************************************************************************************/
+#define getbit(x, y) ((x) >> (y)&1) //获取x的第y位的数值
+#define setbit(x, y) x |= (1 << y)  // x的第y位置1
+#define clrbit(x, y) x &= ~(1 << y) // x的第y位置0
+
+//一维查表插值
+uint16 Intpol_u16u16(uint16 *addrTablePUW, uint16 dataXUW); // 1维查表插值,X,Y都是16位无符号整数
+uint16 Intpol_s16u16(uint16 *addrTablePUW, sint16 dataXW);  // 1维查表插值,X是有符号整数,Y是无符号整数
+sint16 Intpol_u16s16(uint16 *addrTablePUW, uint16 dataXUW); // 1维查表插值,X是无符号整数,Y是有符号整数
+sint16 Intpol_s16s16(uint16 *addrTablePUW, sint16 dataXW);  // 1维查表插值,X,Y都是16位有符号整数
+uint32 Intpol_u16u32(uint16 *addrTablePUW, uint16 dataXUW); // 1维查表插值,X都是16位无符号整数,Y是无符号32位整数
+uint32 Intpol_u32u32(uint16 *addrTablePUW, uint32 dataXUI); // 1维查表插值,X,Y都是32位无符号整数
+
+//二维查表插值
+uint16 Intpol_u16u16u16(uint16 *addrTablePUW, uint16 dataXUW, uint16 dataYUW); // 2维查表插值,X,Y,Z都是16位无符号整数
+sint16 Intpol_u16u16s16(uint16 *addrTablePUW, uint16 dataXUW, uint16 dataYUW); // 2维查表插值,X,Y都是16位无符号,Z是有符号
+uint16 Intpol_u16s16u16(uint16 *addrTablePUW, uint16 dataXUW, sint16 dataYW);  // 2维查表插值,X,Z都是16位无符号,Y是有符号
+sint16 Intpol_s16u16s16(uint16 *addrTablePUW, sint16 dataXW, uint16 dataYUW);  // 2维查表插值,X,Z都是16位有符号,Y是无符号
+uint32 Intpol_u16u16u32(uint16 *addrTablePUW, uint16 dataXUW, uint16 dataYUW); // 2维查表插值,X,Y是无符号16位整数,Z是32位无符号整数
+
+// PT1滤波
+#define _COMLIB_FACTOR_PT1 1000
+
+void ComLib_PT1U8(uint8 valRawUB, uint16 K, uint16 T1, uint8 *valLstUB);
+void ComLib_PT1S8(sint8 valRawB, uint16 K, uint16 T1, sint8 *valLstB);
+void ComLib_PT1U16(uint16 valRawUW, uint16 K, uint16 T1, uint16 *valLstUW);
+void ComLib_PT1S16(sint16 valRawW, uint16 K, uint16 T1, sint16 *valLstW);
+void ComLib_PT1U32(uint32 valRawUI, uint16 K, uint16 T1, uint32 *valLstUI);
+void ComLib_PT1S32(sint32 valRawI, uint16 K, uint16 T1, sint32 *valLstI);
+
+/*******************************************************************************************
+                             底层驱动接口
+********************************************************************************************/
+
+typedef enum
+{
+    DSM_DIAG_OPENLOAD = 0, /*开路*/
+    DSM_DIAG_SHORTCIRCUIT, /*短路*/
+    DSM_DIAG_SHORTTOGND,   /*短路到地*/
+    DSM_DIAG_SHORTTOPWR    /*短路到电源*/
+} DSM_idxDiagTypeE_TYPE;
+
+typedef enum
+{
+    DSM_STATUS_OK = 0x0,   /*无故障*/
+    DSM_STATUS_ERR = 0x1,  /*有故障*/
+    DSM_STATUS_NVA = 0xFF, /*故障状态未知或无效*/
+} DSM_stDiagE_TYPE;
+
+#define _PWM_DUTYCYCLE_FULL 10000U // 10000表示占空比为100.00%
+#define _PWM_DUTYCYCLE_FACTOR 100U
+
+#define _PWM_FREQ_FACTOR 10U //频率精度0.1Hz
+
+//模拟量输入********************************************************************************************
+#define _ATD_NUM_CHAN 24
+
+#define _ATD_INDEX_BAK1_CHAN 0      // BAK1信号,对应接插件X64
+#define _ATD_INDEX_BAK2_CHAN 1      // BAK2信号,对应接插件X26
+#define _ATD_INDEX_BAK3_CHAN 2      // BAK3信号,对应接插件X27
+#define _ATD_INDEX_BAK4_CHAN 3      // BAK4信号,对应接插件X35
+#define _ATD_INDEX_BAK5_CHAN 4      // BAK5信号,对应接插件X30
+#define _ATD_INDEX_BAK6_CHAN 5      // BAK6信号,对应接插件X31
+#define _ATD_INDEX_DI9_CHAN 6       // DI9信号,对应接插件X15
+#define _ATD_INDEX_DI8_CHAN 7       // DI8信号,对应接插件X11
+#define _ATD_INDEX_DI10_CHAN 8      // DI10信号,对应接插件X4
+#define _ATD_INDEX_BRAKE1_CHAN 10   //制动1,对应接插件X58
+#define _ATD_INDEX_ACCPED2_CHAN 11  //加速踏板2,对应接插件X63
+#define _ATD_INDEX_DI7_CHAN 12      // DI7信号,对应接插件X5
+#define _ATD_INDEX_DI1_CHAN 14      // DI1信号,对应接插件X10
+#define _ATD_INDEX_DI6_CHAN 15      // DI6信号,对应接插件X9
+#define _ATD_INDEX_BRAKE2_CHAN 16   //制动2,对应接插件X61
+#define _ATD_INDEX_ACCPED1_CHAN 17  //加速踏板1,对应接插件X62
+#define _ATD_INDEX_DI5_CHAN 19      // DI5信号,对应接插件X14
+#define _ATD_INDEX_DI4_CHAN 20      // DI4信号,对应接插件X13
+#define _ATD_INDEX_DI3_CHAN 21      // DI3信号,对应接插件X18
+#define _ATD_INDEX_DI2_CHAN 22      // DI2信号,对应接插件X17
+#define _ATD_INDEX_UBATTERY_CHAN 23 //蓄电池电压,内部连接
+                                    //模拟量输入重新定义(APP)
+#define _ATD_INDEX_AIRPRESSURE 17   //气压传感器,对应接插件XK62
+#define _ATD_INDEX_PLUGINTEMP1 2    //接插件温度1,对应接插件XK27
+#define _ATD_INDEX_PLUGINTEMP2 3    //接插件温度2,对应接插件XK35
+#define _ATD_INDEX_PLUGINTEMP3 4    //接插件温度3,对应接插件XK30
+#define _ATD_INDEX_PLUGINTEMP4 5    //接插件温度4,对应接插件XK31
+
+uint16 ATDDrv_GetChanResult(uint8 idxChanUB); //得到上述通道的电压值,电压值精度1/4095V/bit
+//********************************************************************************************
+
+//数字量输入********************************************************************************************
+#define _DIN_NUM_CHAN 16
+#define _DIN_NUM_ADCHAN 10 //前10路通过AD通道实现软件可配置上下拉
+
+#define _DIN_OPENLVL_LOW_STATE 0
+#define _DIN_OPENLVL_HIGH_STATE 1
+
+#define _DIN_INDEX_BAK1_CHAN 0     //开关1信号,对应接插件X10
+#define _DIN_INDEX_BAK2_CHAN 1     //开关2信号,对应接插件X17
+#define _DIN_INDEX_BAK3_CHAN 2     //开关3信号,对应接插件X18
+#define _DIN_INDEX_BAK4_CHAN 3     //开关4信号,对应接插件X13
+#define _DIN_INDEX_BAK5_CHAN 4     //开关5信号,对应接插件X14
+#define _DIN_INDEX_BAK6_CHAN 5     //开关6信号,对应接插件X9
+#define _DIN_INDEX_BAK7_CHAN 6     //开关7信号,对应接插件X5
+#define _DIN_INDEX_BAK8_CHAN 7     //开关8信号,对应接插件X11
+#define _DIN_INDEX_BAK9_CHAN 8     //开关9信号,对应接插件X15
+#define _DIN_INDEX_BAK10_CHAN 9    //开关10信号,对应接插件X4
+#define _DIN_INDEX_BAK11_CHAN 10   //开关11信号,对应接插件X7
+#define _DIN_INDEX_BAK12_CHAN 11   //开关12信号,对应接插件X6
+#define _DIN_INDEX_BAK13_CHAN 12   //开关13信号,对应接插件X3
+#define _DIN_INDEX_BAK14_CHAN 13   //开关14信号,对应接插件X19
+#define _DIN_INDEX_BAK15_CHAN 14   //开关15信号,对应接插件X22
+#define _DIN_INDEX_BAK16_CHAN 15   //开关16信号,对应接插件X23
+                                   //数字量输入重新定义(APP)
+#define _DIN_INDEX_UNLOCKSENSOR1 0 //对应接插件XK10,松开传感器1,需配置低有效
+#define _DIN_INDEX_UNLOCKSENSOR2 7 //对应接插件XK11,松开传感器2,需配置低有效
+#define _DIN_INDEX_UNLOCKSENSOR3 3 //对应接插件XK13,松开传感器3,需配置低有效
+#define _DIN_INDEX_UNLOCKSENSOR4 4 //对应接插件XK14,松开传感器4,需配置低有效
+
+#define _DIN_INDEX_LOCKSENSOR1 8  //对应接插件XK15,夹紧传感器1,需配置低有效
+#define _DIN_INDEX_LOCKSENSOR2 1  //对应接插件XK17,夹紧传感器2,需配置低有效
+#define _DIN_INDEX_LOCKSENSOR3 2  //对应接插件XK18,夹紧传感器3,需配置低有效
+#define _DIN_INDEX_LOCKSENSOR4 11 //对应接插件XK6,夹紧传感器4,需配置低有效
+
+#define _DIN_INDEX_READYSENSOR1 9 //对应接插件XK4,落座传感器1,需配置高有效
+#define _DIN_INDEX_READYSENSOR2 6 //对应接插件XK5,落座传感器2,需配置高有效
+#define _DIN_INDEX_PLUGHVLOCK 5   //对应接插件XK9,接插件互锁1,需配置高有效
+void DINDrv_SetChanThres(uint8 idxChanUB, uint8 stOpenLvlUB, uint16 uThresUW);
+uint8 DINDrv_GetChanState(uint8 idxChanUB); //得到上述通道开关状态
+//********************************************************************************************
+
+//数字量输出********************************************************************************************
+#define _DO_NUM_CHAN 1
+
+#define _DO_INDEX_CPCTL_CHAN 0 // CP采样回路下拉电阻控制
+
+void DODrv_SetChanState(uint8 idxChanUB, uint8 bLvlUB); // bLvlUB表示电平状态,0为低电平,1为高电平
+//********************************************************************************************
+
+//频率量采集********************************************************************************************
+#define _PULSEACQ_NUM_CHAN 2
+
+#define _PULSEACQ_INDEX_CP_CHAN 0   //充电头CP信号采集,对应接插件X21
+#define _PULSEACQ_INDEX_BAK2_CHAN 1 //频率信号1采集,对应接插件X39
+                                    //频率量采集重新定义(APP)
+#define _PULSEACQ_INDEX_HVLOCK2 1   //高压互锁的PWM采集,对应接插件XK39
+
+void PulseAcqDrv_GetChanFreq(uint8 idxChanUB, uint32 *fFreqUIP, uint16 *rDutyUWP);    //获取通道的频率信息,频率精度0.1Hz/bit,占空比精度0.01%/bit
+void PulseAcqDrv_GetChanDura(uint8 idxChanUB, uint32 *tiPeriodUIP, uint32 *tiPosUIP); //获取通道的时间信息,时间精度0.02us/bit
+//********************************************************************************************
+
+//模拟量输出********************************************************************************************
+#define _AO_NUM_CHAN 2
+
+#define _AO_INDEX_ACCPED1_CHAN 0 //模拟油门信号1,对应接插件X27
+#define _AO_INDEX_ACCPED2_CHAN 1 //模拟油门信号2,对应接插件X31
+
+void AODrv_Interface(uint8 idxChanUB, uint16 uSetpointUW); //输出模拟量,输入目标电压值,电压值精度1/4095V/bit
+//********************************************************************************************
+
+// PWM型信号输出及频率型低边驱动********************************************************************************************
+#define _PPWM_NUM_CHAN 12
+
+#define _PPWM_INDEX_FHBAK1_CHAN 0 //高边驱动1,对应接插件X36
+#define _PPWM_INDEX_FHBAK2_CHAN 1 //高边驱动2,对应接插件X32
+#define _PPWM_INDEX_FHBAK3_CHAN 2 //高边驱动3,对应接插件X28
+#define _PPWM_INDEX_FHBAK4_CHAN 3 //高边驱动4,对应接插件X24
+#define _PPWM_INDEX_FHBAK5_CHAN 4 //高边驱动5,对应接插件X20
+#define _PPWM_INDEX_FHBAK6_CHAN 5 //高边驱动6,对应接插件X16
+#define _PPWM_INDEX_FHBAK7_CHAN 6 //高边驱动7,对应接插件X12
+#define _PPWM_INDEX_FHBAK8_CHAN 7 //高边驱动8,对应接插件X8
+#define _PPWM_INDEX_FBAK1_CHAN 8  //频率低边驱动1,对应接插件X38
+#define _PPWM_INDEX_FBAK2_CHAN 9  //频率低边驱动2,对应接插件X40
+#define _PPWM_INDEX_FBAK3_CHAN 10 //频率低边驱动3,对应接插件X45
+#define _PPWM_INDEX_FBAK4_CHAN 11 //频率低边驱动4,对应接插件X46
+                                  //频率输出重新定义(APP)
+#define _PPWM_INDEX_HVLOCK2 8     //高压互锁PWM输出,对应接插件XK38
+//该函数须放在10ms任务中调用
+void PPWMDrv_Interface(uint8 idxChanUB, uint32 fSetUI, uint16 rSetUW); //输出上述通道的低边驱动频率及占空比,频率精度0.1Hz/bit,占空比精度0.01%/bit
+DSM_stDiagE_TYPE PPWMDrv_GetChanDiagInfo(uint8 idxChanUB, DSM_idxDiagTypeE_TYPE idxDiagTypeE);
+//********************************************************************************************
+
+//高低边驱动********************************************************************************************
+#define _PSWT_NUM_CHAN 17
+
+#define _PSWT_INDEX_HBAK1_CHAN 0      //高边驱动1,对应接插件X36
+#define _PSWT_INDEX_HBAK2_CHAN 1      //高边驱动2,对应接插件X32
+#define _PSWT_INDEX_HBAK3_CHAN 2      //高边驱动3,对应接插件X28
+#define _PSWT_INDEX_HBAK4_CHAN 3      //高边驱动4,对应接插件X24
+#define _PSWT_INDEX_HBAK5_CHAN 4      //高边驱动5,对应接插件X20
+#define _PSWT_INDEX_HBAK6_CHAN 5      //高边驱动6,对应接插件X16
+#define _PSWT_INDEX_HBAK7_CHAN 6      //高边驱动7,对应接插件X12
+#define _PSWT_INDEX_HBAK8_CHAN 7      //高边驱动8,对应接插件X8
+#define _PSWT_INDEX_LBAK1_CHAN 8      //低边驱动1,对应接插件X34
+#define _PSWT_INDEX_LBAK2_CHAN 9      //低边驱动2,对应接插件X44
+#define _PSWT_INDEX_LBAK3_CHAN 10     //低边驱动3,对应接插件X41
+#define _PSWT_INDEX_LBAK4_CHAN 11     //低边驱动4,对应接插件X43
+#define _PSWT_INDEX_LBAK5_CHAN 12     //低边驱动5,对应接插件X37
+#define _PSWT_INDEX_LBAK6_CHAN 13     //低边驱动6,对应接插件X42
+#define _PSWT_INDEX_LBAK7_CHAN 14     //低边驱动7,对应接插件X47
+#define _PSWT_INDEX_LBAK8_CHAN 15     //低边驱动8,对应接插件X48
+#define _PSWT_INDEX_MAINRELAY_CHAN 16 //功率电主继电器,对应接插件X33
+                                      //驱动重新定义(APP)
+#define _PSWT_INDEX_AIRCONTROL 0      //电磁阀控制,对应接插件XK36
+#define _PSWT_INDEX_EBCLEDCONTROL 1   //换电LED控制,对应接插件XK32
+#define _PSWT_INDEX_BLEPWRCONTROL 2   //蓝牙电源控制,对应接插件XK28
+//该函数须放在10ms任务中调用
+void PSwtDrv_Interface(uint8 idxChanUB, uint8 bOpenUB); //输出上述通道的低边驱动状态, bOpen=1时为打开, 否则为关闭
+DSM_stDiagE_TYPE PSwtDrv_GetChanDiagInfo(uint8 idxChanUB, DSM_idxDiagTypeE_TYPE idxDiagTypeE);
+//********************************************************************************************
+
+// CAN通讯接口********************************************************************************************
+#define _MCAN_NUM_CHAN 3
+/*
+ * CAN0具备32个收发缓存,带电源隔离
+ * CAN1具备64个收发缓存,带CAN唤醒
+ * CAN2具备32个收发缓存,其中MO24~31由底层CCP、UDS等协议占用
+ */
+
+#define _MCAN_DIR_RX 0
+#define _MCAN_DIR_TX 1
+
+#define _MCAN_IDE_STD 0
+#define _MCAN_IDE_EXT 1
+
+typedef enum
+{
+    MCAN_Status_ok = 0x00000000,
+    MCAN_Status_notInitialised = 0x00000001,
+    MCAN_Status_wrongParam = 0x00000002,
+    MCAN_Status_wrongPin = 0x00000004,
+    MCAN_Status_busHeavy = 0x00000008,
+    MCAN_Status_busOff = 0x00000010,
+    MCAN_Status_notSentBusy = 0x00000020,
+    MCAN_Status_receiveEmpty = 0x00000040,
+    MCAN_Status_messageLost = 0x00000080,
+    MCAN_Status_newData = 0x00000100,
+    MCAN_Status_newDataButOneLost = MCAN_Status_messageLost | MCAN_Status_newData
+} MCAN_stRetE_TYPE;
+
+typedef enum
+{
+    MCAN_NODEMODE_MO = 0,  // MO模式下,每个MO对应一个具体的报文
+    MCAN_NODEMODE_BUF = 1, // BUF模式,接收使用一个MO处理,其它MO成为发送缓存
+    MCAN_NODEMODE_UNKNOWN = 0xFF,
+} MCANDrv_idxNodeModeE_TYPE;
+
+typedef union
+{
+    uint32 U;
+    struct
     {
-        DSM_DIAG_OPENLOAD=0, /*开路*/
-        DSM_DIAG_SHORTCIRCUIT,  /*短路*/
-        DSM_DIAG_SHORTTOGND, /*短路到地*/
-        DSM_DIAG_SHORTTOPWR /*短路到电源*/
-    } DSM_idxDiagTypeE_TYPE;
-
-    typedef enum
-    {
-        DSM_STATUS_OK=0x0, /*无故障*/
-        DSM_STATUS_ERR=0x1, /*有故障*/
-        DSM_STATUS_NVA=0xFF, /*故障状态未知或无效*/
-    } DSM_stDiagE_TYPE;
-
-    #define _PWM_DUTYCYCLE_FULL 10000U  //10000表示占空比为100.00%
-    #define _PWM_DUTYCYCLE_FACTOR   100U
-
-    #define _PWM_FREQ_FACTOR 10U //频率精度0.1Hz
-
-
-    //模拟量输入
-    #define _ATD_NUM_CHAN 24
-    
-    #define _ATD_INDEX_BAK1_CHAN     0   //BAK1信号,对应接插件X64
-    #define _ATD_INDEX_BAK2_CHAN     1   //BAK2信号,对应接插件X26
-    #define _ATD_INDEX_BAK3_CHAN     2   //BAK3信号,对应接插件X27
-    #define _ATD_INDEX_BAK4_CHAN     3   //BAK4信号,对应接插件X35
-    #define _ATD_INDEX_BAK5_CHAN     4   //BAK5信号,对应接插件X30
-    #define _ATD_INDEX_BAK6_CHAN     5   //BAK6信号,对应接插件X31
-    #define _ATD_INDEX_DI9_CHAN      6   //DI9信号,对应接插件X15
-    #define _ATD_INDEX_DI8_CHAN      7   //DI8信号,对应接插件X11
-    #define _ATD_INDEX_DI10_CHAN     8   //DI10信号,对应接插件X4
-    #define _ATD_INDEX_BRAKE1_CHAN   10  //制动1,对应接插件X58
-    #define _ATD_INDEX_ACCPED2_CHAN  11  //加速踏板2,对应接插件X63
-    #define _ATD_INDEX_DI7_CHAN      12  //DI7信号,对应接插件X5
-    #define _ATD_INDEX_DI1_CHAN      14  //DI1信号,对应接插件X10
-    #define _ATD_INDEX_DI6_CHAN      15  //DI6信号,对应接插件X9
-    #define _ATD_INDEX_BRAKE2_CHAN   16  //制动2,对应接插件X61
-    #define _ATD_INDEX_ACCPED1_CHAN  17  //加速踏板1,对应接插件X62
-    #define _ATD_INDEX_DI5_CHAN      19  //DI5信号,对应接插件X14
-    #define _ATD_INDEX_DI4_CHAN      20  //DI4信号,对应接插件X13
-    #define _ATD_INDEX_DI3_CHAN      21  //DI3信号,对应接插件X18
-    #define _ATD_INDEX_DI2_CHAN      22  //DI2信号,对应接插件X17
-    #define _ATD_INDEX_UBATTERY_CHAN 23  //蓄电池电压,内部连接
-
-    uint16 ATDDrv_GetChanResult(uint8 idxChanUB); //得到上述通道的电压值,电压值精度1/4095V/bit
-    
-    
-    //数字量输入
-    #define _DIN_NUM_CHAN 16
-    #define _DIN_NUM_ADCHAN  10 //前10路通过AD通道实现软件可配置上下拉
-
-    #define _DIN_OPENLVL_LOW_STATE  0
-    #define _DIN_OPENLVL_HIGH_STATE 1
-
-    #define _DIN_INDEX_BAK1_CHAN    0   //开关1信号,对应接插件X10
-    #define _DIN_INDEX_BAK2_CHAN    1   //开关2信号,对应接插件X17
-    #define _DIN_INDEX_BAK3_CHAN    2   //开关3信号,对应接插件X18
-    #define _DIN_INDEX_BAK4_CHAN    3   //开关4信号,对应接插件X13
-    #define _DIN_INDEX_BAK5_CHAN    4   //开关5信号,对应接插件X14
-    #define _DIN_INDEX_BAK6_CHAN    5   //开关6信号,对应接插件X9
-    #define _DIN_INDEX_BAK7_CHAN    6   //开关7信号,对应接插件X5
-    #define _DIN_INDEX_BAK8_CHAN    7   //开关8信号,对应接插件X11
-    #define _DIN_INDEX_BAK9_CHAN    8   //开关9信号,对应接插件X15
-    #define _DIN_INDEX_BAK10_CHAN   9   //开关10信号,对应接插件X4
-    #define _DIN_INDEX_BAK11_CHAN   10  //开关11信号,对应接插件X7
-    #define _DIN_INDEX_BAK12_CHAN   11  //开关12信号,对应接插件X6
-    #define _DIN_INDEX_BAK13_CHAN   12  //开关13信号,对应接插件X3
-    #define _DIN_INDEX_BAK14_CHAN   13  //开关14信号,对应接插件X19
-    #define _DIN_INDEX_BAK15_CHAN   14  //开关15信号,对应接插件X22
-    #define _DIN_INDEX_BAK16_CHAN   15  //开关16信号,对应接插件X23
-    
-    void DINDrv_SetChanThres(uint8 idxChanUB, uint8 stOpenLvlUB, uint16 uThresUW);
-    uint8 DINDrv_GetChanState(uint8 idxChanUB); //得到上述通道开关状态
-    
-    
-    //数字量输出
-    #define _DO_NUM_CHAN  1
-
-    #define _DO_INDEX_CPCTL_CHAN    0 //CP采样回路下拉电阻控制
-
-    void DODrv_SetChanState(uint8 idxChanUB, uint8 bLvlUB); //bLvlUB表示电平状态,0为低电平,1为高电平
-
-
-    //频率量采集
-    #define _PULSEACQ_NUM_CHAN 2
-    
-    #define _PULSEACQ_INDEX_CP_CHAN     0 //充电头CP信号采集,对应接插件X21
-    #define _PULSEACQ_INDEX_BAK2_CHAN   1 //频率信号1采集,对应接插件X39
-    
-    void PulseAcqDrv_GetChanFreq(uint8 idxChanUB, uint32 *fFreqUIP, uint16 *rDutyUWP); //获取通道的频率信息,频率精度0.1Hz/bit,占空比精度0.01%/bit
-    void PulseAcqDrv_GetChanDura(uint8 idxChanUB, uint32 *tiPeriodUIP, uint32 *tiPosUIP); //获取通道的时间信息,时间精度0.02us/bit
-    
-
-    //模拟量输出
-    #define _AO_NUM_CHAN 2
-
-    #define _AO_INDEX_ACCPED1_CHAN  0 //模拟油门信号1,对应接插件X27
-    #define _AO_INDEX_ACCPED2_CHAN  1 //模拟油门信号2,对应接插件X31
-
-    void AODrv_Interface(uint8 idxChanUB,uint16 uSetpointUW); //输出模拟量,输入目标电压值,电压值精度1/4095V/bit
-
-
-    //PWM型信号输出及频率型低边驱动
-    #define _PPWM_NUM_CHAN 12
-
-	#define _PPWM_INDEX_FHBAK1_CHAN    0   //高边驱动1,对应接插件X36
-    #define _PPWM_INDEX_FHBAK2_CHAN    1   //高边驱动2,对应接插件X32
-    #define _PPWM_INDEX_FHBAK3_CHAN    2   //高边驱动3,对应接插件X28
-    #define _PPWM_INDEX_FHBAK4_CHAN    3   //高边驱动4,对应接插件X24
-    #define _PPWM_INDEX_FHBAK5_CHAN    4   //高边驱动5,对应接插件X20
-    #define _PPWM_INDEX_FHBAK6_CHAN    5   //高边驱动6,对应接插件X16
-    #define _PPWM_INDEX_FHBAK7_CHAN    6   //高边驱动7,对应接插件X12
-    #define _PPWM_INDEX_FHBAK8_CHAN    7   //高边驱动8,对应接插件X8
-    #define _PPWM_INDEX_FBAK1_CHAN     8   //频率低边驱动1,对应接插件X38
-    #define _PPWM_INDEX_FBAK2_CHAN     9   //频率低边驱动2,对应接插件X40
-    #define _PPWM_INDEX_FBAK3_CHAN     10  //频率低边驱动3,对应接插件X45
-    #define _PPWM_INDEX_FBAK4_CHAN     11  //频率低边驱动4,对应接插件X46
-    
-    //该函数须放在10ms任务中调用
-    void PPWMDrv_Interface(uint8 idxChanUB,uint32 fSetUI,uint16 rSetUW); //输出上述通道的低边驱动频率及占空比,频率精度0.1Hz/bit,占空比精度0.01%/bit
-    DSM_stDiagE_TYPE PPWMDrv_GetChanDiagInfo(uint8 idxChanUB,DSM_idxDiagTypeE_TYPE idxDiagTypeE);
-
-    //高低边驱动
-    #define _PSWT_NUM_CHAN 17
-
-    #define _PSWT_INDEX_HBAK1_CHAN    0    //高边驱动1,对应接插件X36
-    #define _PSWT_INDEX_HBAK2_CHAN    1    //高边驱动2,对应接插件X32
-    #define _PSWT_INDEX_HBAK3_CHAN    2    //高边驱动3,对应接插件X28
-    #define _PSWT_INDEX_HBAK4_CHAN    3    //高边驱动4,对应接插件X24
-    #define _PSWT_INDEX_HBAK5_CHAN    4    //高边驱动5,对应接插件X20
-    #define _PSWT_INDEX_HBAK6_CHAN    5    //高边驱动6,对应接插件X16
-    #define _PSWT_INDEX_HBAK7_CHAN    6    //高边驱动7,对应接插件X12
-    #define _PSWT_INDEX_HBAK8_CHAN    7    //高边驱动8,对应接插件X8
-	#define _PSWT_INDEX_LBAK1_CHAN    8    //低边驱动1,对应接插件X34
-    #define _PSWT_INDEX_LBAK2_CHAN    9    //低边驱动2,对应接插件X44
-    #define _PSWT_INDEX_LBAK3_CHAN    10   //低边驱动3,对应接插件X41
-    #define _PSWT_INDEX_LBAK4_CHAN    11   //低边驱动4,对应接插件X43
-    #define _PSWT_INDEX_LBAK5_CHAN    12   //低边驱动5,对应接插件X37
-    #define _PSWT_INDEX_LBAK6_CHAN    13   //低边驱动6,对应接插件X42
-    #define _PSWT_INDEX_LBAK7_CHAN    14   //低边驱动7,对应接插件X47
-    #define _PSWT_INDEX_LBAK8_CHAN    15   //低边驱动8,对应接插件X48
-    #define _PSWT_INDEX_MAINRELAY_CHAN 16  //功率电主继电器,对应接插件X33
-    
-    //该函数须放在10ms任务中调用
-    void PSwtDrv_Interface(uint8 idxChanUB,uint8 bOpenUB); //输出上述通道的低边驱动状态, bOpen=1时为打开, 否则为关闭
-    DSM_stDiagE_TYPE PSwtDrv_GetChanDiagInfo(uint8 idxChanUB,DSM_idxDiagTypeE_TYPE idxDiagTypeE);
-
-
-    //CAN通讯接口
-    #define _MCAN_NUM_CHAN     3
-    /*
-     * CAN0具备32个收发缓存,带电源隔离
-     * CAN1具备64个收发缓存,带CAN唤醒
-     * CAN2具备32个收发缓存,其中MO24~31由底层CCP、UDS等协议占用
-     */
-
-    #define _MCAN_DIR_RX    0
-    #define _MCAN_DIR_TX    1
-
-    #define _MCAN_IDE_STD    0
-    #define _MCAN_IDE_EXT    1
-
-    typedef enum
-    {
-        MCAN_Status_ok                = 0x00000000,
-        MCAN_Status_notInitialised    = 0x00000001,
-        MCAN_Status_wrongParam        = 0x00000002,
-        MCAN_Status_wrongPin          = 0x00000004,
-        MCAN_Status_busHeavy          = 0x00000008,
-        MCAN_Status_busOff            = 0x00000010,
-        MCAN_Status_notSentBusy       = 0x00000020,
-        MCAN_Status_receiveEmpty      = 0x00000040,
-        MCAN_Status_messageLost       = 0x00000080,
-        MCAN_Status_newData           = 0x00000100,
-        MCAN_Status_newDataButOneLost = MCAN_Status_messageLost | MCAN_Status_newData
-    } MCAN_stRetE_TYPE;
-
-    typedef enum
-    {
-        MCAN_NODEMODE_MO = 0,  //MO模式下,每个MO对应一个具体的报文
-        MCAN_NODEMODE_BUF = 1, //BUF模式,接收使用一个MO处理,其它MO成为发送缓存
-        MCAN_NODEMODE_UNKNOWN = 0xFF,
-    } MCANDrv_idxNodeModeE_TYPE;
-
-    typedef union
-    {
-        uint32 U;
-        struct
-        {
-            uint32 DLC       : 8; //数据长度
-            uint32 DIR       : 1; //0为接收,1为发送
-            uint32 IDE       : 1; //0为标准帧,1为扩展帧
-            uint32 Reserved  : 6;
-            uint32 CAN       : 8; //CAN通道号
-            uint32 MO        : 8; //MO序号
-        } B;
-    } MCANDrv_infoMsgParU_TYPE;
-
-    typedef struct 
-    {
-        MCANDrv_infoMsgParU_TYPE infoMsgParU;
-        uint32 infoMsgIDUI;
-    } MCANDrv_infoMsgConfS_TYPE;
-
-    typedef struct
-    {
-        MCANDrv_infoMsgConfS_TYPE infoConfS;
-        uint8  datMsgUBA[8];
-    } MCANDrv_infoMsgS_TYPE;
-
-    typedef void (*pFunc_TxMsgCallback)(void);
-    typedef void (*pFunc_RxMsgCallback)(MCANDrv_infoMsgS_TYPE infoMsgS);
-
-    /*CAN设置函数*/
-    uint8 MCANDrv_SetBaudrate(uint8 idxCANUB, uint32 baudrateUI);
-    uint8 MCANDrv_SetCANMode(uint8 idxCANUB, MCANDrv_idxNodeModeE_TYPE idxNodeModeE);
-    uint8 MCANDrv_SetMsgObj(const MCANDrv_infoMsgConfS_TYPE infoMsgConfS, void *pFunc);
-    uint8 MCANDrv_SetCallbackFunc(uint8 idxCANUB, const pFunc_RxMsgCallback pRxFunc, const pFunc_TxMsgCallback pTxFunc);
-    
-    /*CAN操作函数*/
-    MCAN_stRetE_TYPE MCANDrv_SendMsg(const MCANDrv_infoMsgS_TYPE infMsgS);
-
-    uint8 MCANDrv_CheckIfBusOff(uint8 idxCANUB); //返回1表示有busoff错误
-
-
-    /*EEPROM处理接口*/
-    extern uint8 EEPROMDrv_bSaveInstantUB;  //用于立即触发EEPROM的存储,置1后可查询其值为0时表示存储完成
-
-
-    /*******************************************************************************************
-                                 底层已处理物理量
-    ********************************************************************************************/
-    extern uint16 BattCD_uFltUW;  //蓄电池电压,1/100V/bit
-    extern uint16 BattCD_tPwrChipUW;//电源芯片温度
-    extern uint32 SysCon_tiRunHighResiUI;//系统运行时间
-
-    typedef union
+        uint32 DLC : 8; //数据长度
+        uint32 DIR : 1; // 0为接收,1为发送
+        uint32 IDE : 1; // 0为标准帧,1为扩展帧
+        uint32 Reserved : 6;
+        uint32 CAN : 8; // CAN通道号
+        uint32 MO : 8;  // MO序号
+    } B;
+} MCANDrv_infoMsgParU_TYPE;
+
+typedef struct
+{
+    MCANDrv_infoMsgParU_TYPE infoMsgParU;
+    uint32 infoMsgIDUI;
+} MCANDrv_infoMsgConfS_TYPE;
+
+typedef struct
+{
+    MCANDrv_infoMsgConfS_TYPE infoConfS;
+    uint8 datMsgUBA[8];
+} MCANDrv_infoMsgS_TYPE;
+
+typedef void (*pFunc_TxMsgCallback)(void);
+typedef void (*pFunc_RxMsgCallback)(MCANDrv_infoMsgS_TYPE infoMsgS);
+
+/*CAN设置函数*/
+uint8 MCANDrv_SetBaudrate(uint8 idxCANUB, uint32 baudrateUI);
+uint8 MCANDrv_SetCANMode(uint8 idxCANUB, MCANDrv_idxNodeModeE_TYPE idxNodeModeE);
+uint8 MCANDrv_SetMsgObj(const MCANDrv_infoMsgConfS_TYPE infoMsgConfS, void *pFunc);
+uint8 MCANDrv_SetCallbackFunc(uint8 idxCANUB, const pFunc_RxMsgCallback pRxFunc, const pFunc_TxMsgCallback pTxFunc);
+
+/*CAN操作函数*/
+MCAN_stRetE_TYPE MCANDrv_SendMsg(const MCANDrv_infoMsgS_TYPE infMsgS);
+
+uint8 MCANDrv_CheckIfBusOff(uint8 idxCANUB); //返回1表示有busoff错误
+//********************************************************************************************
+
+/*EEPROM处理接口*/
+extern uint8 EEPROMDrv_bSaveInstantUB; //用于立即触发EEPROM的存储,置1后可查询其值为0时表示存储完成
+
+/*******************************************************************************************
+                             底层已处理物理量
+********************************************************************************************/
+extern uint16 BattCD_uFltUW;          //蓄电池电压,1/100V/bit
+extern uint16 BattCD_tPwrChipUW;      //电源芯片温度
+extern uint32 SysCon_tiRunHighResiUI; //系统运行时间
+
+typedef union
+{
+    uint8 U;
+    struct
     {
-        uint8 U;
-        struct
-        {
-            uint8 bCAN      : 1;
-            uint8 bLogic    : 1;
-            uint8 bWkpSig1  : 1;
-            uint8 bWkpSig2  : 1;
-            uint8           : 4;
-        } B;
-    } BattCD_stWakeupU_TYPE;
-
-    extern BattCD_stWakeupU_TYPE BattCD_stWakeupU;
-    
-    extern uint8 HardwareDrv_bBootloaderReqUB; //进入Bootloader请求,当出现该请求时会将BattCD_stWakeupU清零,在进入Afterrun时,进行进入安全状态的操作
-
-    
-    /*******************************************************************************************
-                                整车控制状态
-    *******************************************************************************************/
-    extern uint32 SysCon_tiRunLowUI; //从上次复位到现在系统的运行时间,单位s
-
-
-    /*******************************************************************************************
-     * 故障管理模块接口
-     ******************************************************************************************/
-
-     /*******************************************************************************************
-                                   故障诊断
-    ********************************************************************************************/
-    #define _DSM_NUM_CONF_DFC_CHECKS 100  /*最大允许的故障号数*/
-    #define _DSM_NUM_CONF_DINH_FIDS 32   /*最大允许的故障禁止操作数*/
-    #define _DSM_NUM_CONF_DFES_ENTRIES 20  /*最大存储并向外报送的故障数*/
-    #define _DINH_NUM_DFC_FID_MAX 6   /*每个故障号最多可关联的故障禁止操作数*/
-
-
-    /*故障号定义DFC*/
-    /*********************************************************************************************/
-    /*样例代码*/
-    #ifdef _SAMPLE_CODE_
-
-    #define _DFC_INDEX_ACCPED_SIGHIGH 0 /*油门1信号ACCPED高*/
-    #define _DFC_INDEX_ACCPED_SIGLOW 1 /*油门1信号ACCPED低*/
-    #define _DFC_INDEX_ACCPED_SIGHNPL 2 /*油门信号ACCPED不合理*/
-    #define _DFC_INDEX_ACCPED2_SIGHIGH 3 /*油门2信号ACCPED高*/
-    #define _DFC_INDEX_ACCPED2_SIGLOW 4 /*油门2信号ACCPED低*/
-
-    #endif //_SAMPLE_CODE_
-    /*********************************************************************************************/
-
-
-    /*故障禁止操作定义FID*/
-    /*底层用FID*/
-    #define _DINH_INDEX_FID_DSM_WUC 0  /*故障诊断系统的暖机循环计数是否禁止*/
-    #define _DINH_INDEX_FID_DSM_TST 1  /*下线检测故障屏蔽功能是否使用*/
-
-    /*********************************************************************************************/
-    /*样例代码*/
-    #ifdef _SAMPLE_CODE_
-
-    #define _DINH_INDEX_FID_APP1 2 /*加速踏板1信号故障失效模式*/
-    #define _DINH_INDEX_FID_APP2 3 /*加速踏板2信号故障失效模式*/
-    #define _DINH_INDEX_FID_ACCPED_NPL 4 /*油门1和油门2 进行互捡*/
-
-    #endif //_SAMPLE_CODE_
-    /*********************************************************************************************/
-
-
-    extern uint8 DFES_numMilUB; /*点亮故障灯的Memory Entry数目*/
-    extern uint8 DFES_numSvsUB; /*点亮维修灯的Memory Entry数目*/
-    extern uint8 DFES_bMilOnUB; /*故障灯是否点亮*/
-    extern uint8 DFES_bMilBlinkUB; /*故障灯是否闪烁*/
-
-
-    /*向DFC报告故障状*/
-    /*使用举例:*/
-    /*DFC_ReportFaultLevel(_DFC_INDEX_FTS_SIGHIGH,_DDRC_MASK_ANA_FT_LV_OK);*/
-    /*DFC_ReportFaultLevel(_DFC_INDEX_FTS_SIGLOW,_DDRC_MASK_ANA_FT_LV_ERROR);*/
-    #define _DDRC_MASK_ANA_FT_LV_OK       0x0
-    #define _DDRC_MASK_ANA_FT_LV_ERROR    0xF
-
-    void DFC_ReportFaultLevel(uint16 idxDFCUW,uint8 stFaultLevelUB);
-
-
-    /*获取DFC的故障状态*/
-    /*返回值为0时,表示该DFC无故障;返回值为1时,表示该DFC故障*/
-    uint8 DFC_GetErrState(uint16 idxDFCUW);
-
-
-    /*获取DFC的故障累积状态*/
-    #define _DFC_INDEX_PRELIMINARILY_DEFECTIVE_STATUS 1
-    #define _DFC_INDEX_FINALLY_DEFECTIVE_STATUS 2
-    #define _DFC_INDEX_PRELIMINARILY_HEALED_STATUS 3
-    #define _DFC_INDEX_FINALLY_HEALED_STATUS 4
-
-    uint8 DFC_GetDebState(uint16 idxDFCUW);
-
-
-    /*获取FID的状态*/
-    /*返回值为0时,表示未触发该FID;为1时,表示触发了该FID*/
-    uint8 DINH_GetFIDState(uint8 idxFIDUB);
-
+        uint8 bCAN : 1;
+        uint8 bLogic : 1;
+        uint8 bWkpSig1 : 1;
+        uint8 bWkpSig2 : 1;
+        uint8 : 4;
+    } B;
+} BattCD_stWakeupU_TYPE;
+
+extern BattCD_stWakeupU_TYPE BattCD_stWakeupU;
+
+extern uint8 HardwareDrv_bBootloaderReqUB; //进入Bootloader请求,当出现该请求时会将BattCD_stWakeupU清零,在进入Afterrun时,进行进入安全状态的操作
+
+/*******************************************************************************************
+                            整车控制状态
+*******************************************************************************************/
+extern uint32 SysCon_tiRunLowUI; //从上次复位到现在系统的运行时间,单位s
+
+/*******************************************************************************************
+ * 故障管理模块接口
+ ******************************************************************************************/
+
+/*******************************************************************************************
+                              故障诊断
+********************************************************************************************/
+#define _DSM_NUM_CONF_DFC_CHECKS 100  /*最大允许的故障号数*/
+#define _DSM_NUM_CONF_DINH_FIDS 32    /*最大允许的故障禁止操作数*/
+#define _DSM_NUM_CONF_DFES_ENTRIES 20 /*最大存储并向外报送的故障数*/
+#define _DINH_NUM_DFC_FID_MAX 6       /*每个故障号最多可关联的故障禁止操作数*/
+
+/*故障号定义DFC*/
+/*********************************************************************************************/
+/*样例代码*/
+#ifdef _SAMPLE_CODE_
+
+#define _DFC_INDEX_ACCPED_SIGHIGH 0  /*油门1信号ACCPED高*/
+#define _DFC_INDEX_ACCPED_SIGLOW 1   /*油门1信号ACCPED低*/
+#define _DFC_INDEX_ACCPED_SIGHNPL 2  /*油门信号ACCPED不合理*/
+#define _DFC_INDEX_ACCPED2_SIGHIGH 3 /*油门2信号ACCPED高*/
+#define _DFC_INDEX_ACCPED2_SIGLOW 4  /*油门2信号ACCPED低*/
+
+#endif //_SAMPLE_CODE_
+/*********************************************************************************************/
+
+/*故障禁止操作定义FID*/
+/*底层用FID*/
+#define _DINH_INDEX_FID_DSM_WUC 0 /*故障诊断系统的暖机循环计数是否禁止*/
+#define _DINH_INDEX_FID_DSM_TST 1 /*下线检测故障屏蔽功能是否使用*/
+
+/*********************************************************************************************/
+/*样例代码*/
+#ifdef _SAMPLE_CODE_
+
+#define _DINH_INDEX_FID_APP1 2       /*加速踏板1信号故障失效模式*/
+#define _DINH_INDEX_FID_APP2 3       /*加速踏板2信号故障失效模式*/
+#define _DINH_INDEX_FID_ACCPED_NPL 4 /*油门1和油门2 进行互捡*/
+
+#endif //_SAMPLE_CODE_
+/*********************************************************************************************/
+
+extern uint8 DFES_numMilUB;    /*点亮故障灯的Memory Entry数目*/
+extern uint8 DFES_numSvsUB;    /*点亮维修灯的Memory Entry数目*/
+extern uint8 DFES_bMilOnUB;    /*故障灯是否点亮*/
+extern uint8 DFES_bMilBlinkUB; /*故障灯是否闪烁*/
+
+/*向DFC报告故障状*/
+/*使用举例:*/
+/*DFC_ReportFaultLevel(_DFC_INDEX_FTS_SIGHIGH,_DDRC_MASK_ANA_FT_LV_OK);*/
+/*DFC_ReportFaultLevel(_DFC_INDEX_FTS_SIGLOW,_DDRC_MASK_ANA_FT_LV_ERROR);*/
+#define _DDRC_MASK_ANA_FT_LV_OK 0x0
+#define _DDRC_MASK_ANA_FT_LV_ERROR 0xF
+
+void DFC_ReportFaultLevel(uint16 idxDFCUW, uint8 stFaultLevelUB);
+
+/*获取DFC的故障状态*/
+/*返回值为0时,表示该DFC无故障;返回值为1时,表示该DFC故障*/
+uint8 DFC_GetErrState(uint16 idxDFCUW);
+
+/*获取DFC的故障累积状态*/
+#define _DFC_INDEX_PRELIMINARILY_DEFECTIVE_STATUS 1
+#define _DFC_INDEX_FINALLY_DEFECTIVE_STATUS 2
+#define _DFC_INDEX_PRELIMINARILY_HEALED_STATUS 3
+#define _DFC_INDEX_FINALLY_HEALED_STATUS 4
+
+uint8 DFC_GetDebState(uint16 idxDFCUW);
+
+/*获取FID的状态*/
+/*返回值为0时,表示未触发该FID;为1时,表示触发了该FID*/
+uint8 DINH_GetFIDState(uint8 idxFIDUB);
 
 #endif

BIN
System/Vehicle/._VehCo.c


+ 236 - 0
System/Vehicle/AppFunc.c

@@ -0,0 +1,236 @@
+/*
+ * @Author       : ChenJie
+ * @Date         : 2021-12-15 10:40:06
+ * @Version      : V3.0
+ * @LastEditors  : ChenJie
+ * @LastEditTime : 2021-12-29 15:49:58
+ * @Description  : AppFunc
+ * @FilePath     : \VehicleControl\VehicleControl\src\System\Vehicle\AppFunc.c
+ */
+#include "string.h"
+#include "stdlib.h"
+#include "HardwareLib.h"
+#include "CanVar.h"
+#include "math.h"
+#include "AppFunc.h"
+#include "Std_Types.h"
+/**
+ * @brief : 互锁检测函数
+ * @param {*}
+ * @return {*}
+ */
+void GetHVLockState(void)
+{
+	UINT8 m_flg_HVlock1 = 0,m_flg_HVlock2 = 0;
+    // PWM输出,互锁1检测,频率100HZ,占空比30%
+    uint16 VehCo_fTestUI = 1000;
+    uint16 VehCo_rTestUW = 3000;
+    uint32 PwmFreAcq = 0;
+    uint16 PwmDutyAcq = 0;
+    PPWMDrv_Interface(_PPWM_INDEX_HVLOCK2, VehCo_fTestUI, VehCo_rTestUW);
+    PulseAcqDrv_GetChanFreq(_PULSEACQ_INDEX_HVLOCK2, &PwmFreAcq, &PwmDutyAcq);
+    if (abs(PwmFreAcq - VehCo_fTestUI) < 100 && abs(PwmDutyAcq - VehCo_rTestUW) < 500)
+    {
+    	m_flg_HVlock1 = 1;
+    }
+    else
+    {
+    	m_flg_HVlock1 = 0;
+    }
+    //互锁2检测,配置高有效,悬空为0则未接入,高电平为1则接入,
+    DINDrv_SetChanThres(_DIN_INDEX_PLUGHVLOCK, 0, 4095 * 3);
+    m_flg_HVlock2 = DINDrv_GetChanState(_DIN_INDEX_PLUGHVLOCK);
+}
+/**
+ * @brief : 数字量传感器信号检测函数
+ * @param {*}
+ * @return {*}
+ */
+void GetDIOState(void)
+{
+    uint8 temp[4];
+    //松开传感器检测,配置低有效,底层悬空为1,触发为0,应用层输出悬空为0,触发为1
+    memset(temp, 0x00, 4);
+    DINDrv_SetChanThres(_DIN_INDEX_UNLOCKSENSOR1, 1, 4095U);
+    DINDrv_SetChanThres(_DIN_INDEX_UNLOCKSENSOR2, 1, 4095U);
+    DINDrv_SetChanThres(_DIN_INDEX_UNLOCKSENSOR3, 1, 4095U);
+    DINDrv_SetChanThres(_DIN_INDEX_UNLOCKSENSOR4, 1, 4095U);
+    temp[0] = !DINDrv_GetChanState(_DIN_INDEX_UNLOCKSENSOR1);
+    temp[1] = !DINDrv_GetChanState(_DIN_INDEX_UNLOCKSENSOR2);
+    temp[2] = !DINDrv_GetChanState(_DIN_INDEX_UNLOCKSENSOR3);
+    temp[3] = !DINDrv_GetChanState(_DIN_INDEX_UNLOCKSENSOR4);
+    ebcd_st_unlockSensor = (getbit(temp[3], 0) << 3) | (getbit(temp[2], 0) << 2) | (getbit(temp[1], 0) << 1) | (getbit(temp[0], 0) << 0);
+
+    //夹紧传感器检测,配置低有效,底层悬空为1,触发为0,应用层输出悬空为0,触发为1
+    memset(temp, 0x00, 4);
+    DINDrv_SetChanThres(_DIN_INDEX_LOCKSENSOR1, 1, 4095U);
+    DINDrv_SetChanThres(_DIN_INDEX_LOCKSENSOR2, 1, 4095U);
+    DINDrv_SetChanThres(_DIN_INDEX_LOCKSENSOR3, 1, 4095U);
+    DINDrv_SetChanThres(_DIN_INDEX_LOCKSENSOR4, 1, 4095U);
+    temp[0] = !DINDrv_GetChanState(_DIN_INDEX_LOCKSENSOR1);
+    temp[1] = !DINDrv_GetChanState(_DIN_INDEX_LOCKSENSOR2);
+    temp[2] = !DINDrv_GetChanState(_DIN_INDEX_LOCKSENSOR3);
+    temp[3] = !DINDrv_GetChanState(_DIN_INDEX_LOCKSENSOR4);
+    ebcd_st_lockSensor = (getbit(temp[3], 0) << 3) | (getbit(temp[2], 0) << 2) | (getbit(temp[1], 0) << 1) | (getbit(temp[0], 0) << 0);
+
+    //落座传感器检测,配置高有效,悬空为0则未接入,高电平为1则接入
+    memset(temp, 0x00, 4);
+    DINDrv_SetChanThres(_DIN_INDEX_READYSENSOR1, 0, 4095 * 3);
+    DINDrv_SetChanThres(_DIN_INDEX_READYSENSOR2, 0, 4095 * 3);
+    temp[0] = DINDrv_GetChanState(_DIN_INDEX_READYSENSOR1);
+    temp[1] = DINDrv_GetChanState(_DIN_INDEX_READYSENSOR1);
+    ebcd_st_pedstSensor = (getbit(temp[1], 0) << 1) | (getbit(temp[0], 0) << 0);
+}
+
+/**
+ * @brief : 获取模拟量输入值,并进行转换
+ * @param {*}
+ * @return {*}
+ */
+void GetAIOValue(void)
+{
+    uint16 AirPressureTemp_Vol = 0;
+    uint16 PluginTemp1_Vol = 0;
+    uint32 PluginTemp1_R = 0;
+    uint16 PluginTemp2_Vol = 0;
+    uint32 PluginTemp2_R = 0;
+    uint16 PluginTemp3_Vol = 0;
+    uint32 PluginTemp3_R = 0;
+    uint16 PluginTemp4_Vol = 0;
+    uint32 PluginTemp4_R = 0;
+
+    AirPressureTemp_Vol = ATDDrv_GetChanResult(_ATD_INDEX_AIRPRESSURE);
+    /*气压数据转换*/
+    ebcd_P_airSensor = (uint16)(AirPressureTemp_Vol * 1000 / 4095.0);
+    /*温度采集获取*/
+    PluginTemp1_Vol = ATDDrv_GetChanResult(_ATD_INDEX_PLUGINTEMP1);
+    PluginTemp2_Vol = ATDDrv_GetChanResult(_ATD_INDEX_PLUGINTEMP2);
+    PluginTemp3_Vol = ATDDrv_GetChanResult(_ATD_INDEX_PLUGINTEMP3);
+    PluginTemp4_Vol = ATDDrv_GetChanResult(_ATD_INDEX_PLUGINTEMP4);
+    PluginTemp1_R = (uint32)((PluginTemp1_Vol / (5.0 * 4095 - PluginTemp1_Vol)) * 1000.0);
+    PluginTemp2_R = (uint32)((PluginTemp2_Vol / (5.0 * 4095 - PluginTemp2_Vol)) * 1000.0);
+    PluginTemp3_R = (uint32)((PluginTemp3_Vol / (5.0 * 4095 - PluginTemp3_Vol)) * 1000.0);
+    PluginTemp4_R = (uint32)((PluginTemp4_Vol / (5.0 * 4095 - PluginTemp4_Vol)) * 1000.0);
+    ebcd_T_plugin[0] = (uint8)Look1_u32u16(PluginTemp1_R, R_table, T_table, 240);
+    ebcd_T_plugin[1] = (uint8)Look1_u32u16(PluginTemp2_R, R_table, T_table, 240);
+    ebcd_T_plugin[2] = (uint8)Look1_u32u16(PluginTemp3_R, R_table, T_table, 240);
+    ebcd_T_plugin[3] = (uint8)Look1_u32u16(PluginTemp4_R, R_table, T_table, 240);
+}
+/**
+ * @brief : lookUp Table Fun
+ * @param {uint32} u0 x
+ * @param {uint32} bp0 x_table
+ * @param {uint16} table y_table
+ * @param {uint16} maxIndex
+ * @return {*}
+ */
+uint16 Look1_u32u16(uint32 u0, uint32 *bp0, uint16 *table, uint16 MaxLen)
+{
+    uint32 bpIdx = 0;
+    uint32 iLeft = 0;
+    uint32 iRght = 0;
+    uint16 y = 0;
+    uint32 yL_0d0 = 0;
+    uint32 yR_0d0 = 0;
+    uint32 maxIndex = MaxLen - 1;
+    if (u0 <= bp0[0U])
+    {
+        iLeft = 0U;
+        iRght = 0U;
+    }
+    else if (u0 < bp0[maxIndex])
+    {
+        //对折法寻找u0的位置
+        bpIdx = maxIndex >> 1U;
+        iLeft = 0U;
+        iRght = maxIndex;
+        while ((iRght - iLeft) > 1)
+        {
+            if (u0 < bp0[bpIdx])
+            {
+                iRght = bpIdx;
+            }
+            else
+            {
+                iLeft = bpIdx;
+            }
+            bpIdx = (iRght + iLeft) >> 1U;
+        }
+    }
+    else
+    {
+        iLeft = maxIndex;
+        iRght = maxIndex;
+    }
+    //找到位置以后计算插值
+    if (iLeft != iRght)
+    {
+        //线性插值
+        yR_0d0 = table[iLeft + 1U];
+        yL_0d0 = table[iLeft];
+        if (yR_0d0 >= yL_0d0)
+        {
+            y = (uint16)(((uint32)(u0 - bp0[iLeft]) * (yR_0d0 - yL_0d0)) / (bp0[iLeft + 1] - bp0[iLeft]) + yL_0d0);
+        }
+        else
+        {
+            y = (uint16)(yL_0d0 - ((uint32)(u0 - bp0[iLeft]) * (yL_0d0 - yR_0d0)) / (bp0[iLeft + 1] - bp0[iLeft]));
+        }
+    }
+    else
+    {
+        y = (uint16)table[iLeft];
+    }
+    return y;
+}
+#ifdef _APP_TEST_CODE
+void TestDeviceFun(void)
+{
+    uint8 ManuEnable = 0;
+    //控制算法
+    AccPedCD_Update();
+    AccPedCD_Monitor();
+
+    PulseAcqDrv_GetChanFreq(_PULSEACQ_INDEX_CP_CHAN, &VehCo_fInputUIA[0], &VehCo_rInputUWA[0]);
+
+    // DODrv_SetChanState(_DO_INDEX_CPCTL_CHAN,(uint8)VehCo_bTestCPCtrlUW_C);
+
+    uint16 DistenceBufferV[2] = {0, 0}, DistenceBufferR[2] = {0, 0};
+    //开关1采集
+    DINDrv_SetChanThres(_DIN_INDEX_BAK1_CHAN, 1, 4095U);
+    Switch1 = !DINDrv_GetChanState(_DIN_INDEX_BAK1_CHAN);
+    //手动控制采集
+    DINDrv_SetChanThres(_DIN_INDEX_BAK2_CHAN, 1, 4095U);
+    ManuEnable = !DINDrv_GetChanState(_DIN_INDEX_BAK2_CHAN);
+    //位移量采集
+    DistenceBufferV[0] = ATDDrv_GetChanResult(_ATD_INDEX_BAK3_CHAN);
+    DistenceBufferR[0] = (uint16)((DistenceBufferV[0] / (5.0 * 4095 - DistenceBufferV[0])) * 1000.0);
+    Distence1 = (uint16)((2132 - DistenceBufferR[0]) * (0.1219));
+    //压力采集
+    PressureValueBuffer = ATDDrv_GetChanResult(_ATD_INDEX_ACCPED1_CHAN);
+    PressureValue = (uint32)(PressureValueBuffer * 1000 / 4095.0);
+    //控制输出
+    VehCo_ctEEPTestUI += 10;
+    VehCo_ctEEPTestUB += 10;
+    if (VehCo_ctEEPTestUI >= 4 * 1000)
+    {
+        PSwtDrv_Interface(_PSWT_INDEX_HBAK1_CHAN, 1); //输出 解锁持续9-4s
+        ControlState = 1;                             //解锁
+    }
+    else
+    {
+        PSwtDrv_Interface(_PSWT_INDEX_HBAK1_CHAN, 0); //不输出
+        ControlState = 2;                             //锁定 4 秒
+    }
+    if (VehCo_ctEEPTestUI >= 9 * 1000)
+    {
+        Control_Times++;
+        VehCo_ctEEPTestUI = 0;
+    }
+    if (ManuEnable == 0)
+    {
+        Control_Times = 0;
+        VehCo_ctEEPTestUI = 0;
+    }
+}
+#endif

+ 26 - 0
System/Vehicle/AppFunc.h

@@ -0,0 +1,26 @@
+/*
+ * @Author       : ChenJie
+ * @Date         : 2021-12-15 10:42:35
+ * @Version      : V3.0
+ * @LastEditors  : ChenJie
+ * @LastEditTime : 2021-12-20 14:56:45
+ * @Description  :  AppFuncion.h
+ * @FilePath     : \VehicleControl\VehicleControl\src\System\Vehicle\AppFunc.h
+ */
+/*
+ * AppFuncion.h
+ *
+ *  Created on: 2021Äê12ÔÂ15ÈÕ
+ *      Author: QiXiang_CHENJIE
+ */
+
+#ifndef SYSTEM_VEHICLE_APPFUNCION_H_
+#define SYSTEM_VEHICLE_APPFUNCION_H_
+void GetHVLockState(void);
+void GetDIOState(void);
+void GetAIOValue(void);
+uint16 Look1_u32u16(uint32 u0, uint32 *bp0, uint16 *table, uint16 MaxLen);
+#ifdef _APP_TEST_CODE
+void TestDeviceFun(void);
+#endif
+#endif /* SYSTEM_VEHICLE_APPFUNCION_H_ */

+ 2529 - 0
System/Vehicle/Communication/BcuCanProtocolFunc.c

@@ -0,0 +1,2529 @@
+/*
+ * @Author       : ChenJie
+ * @Date         : 2021-12-22 17:09:09
+ * @Version      : V3.0
+ * @LastEditors  : ChenJie
+ * @LastEditTime : 2021-12-30 13:53:04
+ * @Description  : BcuCan鍗忚瑙f瀽鍙婄粍鍖呭彂閫�
+ * @FilePath     : \VehicleControl\VehicleControl\src\System\Vehicle\Communication\BcuCanProtocolFunc.c
+ */
+#include "BcuCanProtocolFunc.h"
+/**
+ * @brief :BcuCan瑙g爜鍑芥暟
+ * @param {UINT32} ID
+ * @param {UINT8} *rawData
+ * @return {*}
+ */
+void BcuDecodeFunction(UINT32 ID, UINT8 *rawData)
+{
+	switch (ID)
+	{
+	case 0x1801EFF4:
+		BMS13_ReqVIN = (UINT8)(((*(UINT8 *)(rawData + 0))) & 0xFF);
+		BcuRxFlag[0] = 0x01;
+		break;
+	case 0x1801FBF4:
+		BMS_Cell_Volt[0] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[1] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[2] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[3] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[1] = 0x01;
+		break;
+	case 0x1802FBF4:
+		BMS_Cell_Volt[4] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[5] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[6] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[7] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[2] = 0x01;
+		break;
+	case 0x1803FBF4:
+		BMS_Cell_Volt[8] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[9] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[10] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[11] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[3] = 0x01;
+		break;
+	case 0x1804FBF4:
+		BMS_Cell_Volt[12] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[13] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[14] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[15] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[4] = 0x01;
+		break;
+	case 0x1805FBF4:
+		BMS_Cell_Volt[16] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[17] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[18] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[19] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[5] = 0x01;
+		break;
+	case 0x1806FBF4:
+		BMS_Cell_Volt[20] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[21] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[22] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[23] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[6] = 0x01;
+		break;
+	case 0x1807FBF4:
+		BMS_Cell_Volt[24] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[25] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[26] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[27] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[7] = 0x01;
+		break;
+	case 0x1808FBF4:
+		BMS_Cell_Volt[28] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[29] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[30] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[31] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[8] = 0x01;
+		break;
+	case 0x1809FBF4:
+		BMS_Cell_Volt[32] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[33] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[34] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[35] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[9] = 0x01;
+		break;
+	case 0x180AFBF4:
+		BMS_Cell_Volt[36] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[37] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[38] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[39] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[10] = 0x01;
+		break;
+	case 0x180BFBF4:
+		BMS_Cell_Volt[40] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[41] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[42] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[43] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[11] = 0x01;
+		break;
+	case 0x180CFBF4:
+		BMS_Cell_Volt[44] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[45] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[46] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[47] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[12] = 0x01;
+		break;
+	case 0x180DFBF4:
+		BMS_Cell_Volt[48] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[49] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[50] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[51] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[13] = 0x01;
+		break;
+	case 0x180EFBF4:
+		BMS_Cell_Volt[52] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[53] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[54] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[55] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[14] = 0x01;
+		break;
+	case 0x180FFBF4:
+		BMS_Cell_Volt[56] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[57] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[58] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[59] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[15] = 0x01;
+		break;
+	case 0x1810FBF4:
+		BMS_Cell_Volt[60] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[61] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[62] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[63] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[16] = 0x01;
+		break;
+	case 0x1811FBF4:
+		BMS_Cell_Volt[64] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[65] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[66] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[67] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[17] = 0x01;
+		break;
+	case 0x1812FBF4:
+		BMS_Cell_Volt[68] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[69] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[70] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[71] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[18] = 0x01;
+		break;
+	case 0x1813FBF4:
+		BMS_Cell_Volt[72] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[73] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[74] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[75] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[19] = 0x01;
+		break;
+	case 0x1814FBF4:
+		BMS_Cell_Volt[76] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[77] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[78] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[79] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[20] = 0x01;
+		break;
+	case 0x1815FBF4:
+		BMS_Cell_Volt[80] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[81] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[82] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[83] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[21] = 0x01;
+		break;
+	case 0x1816FBF4:
+		BMS_Cell_Volt[84] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[85] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[86] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[87] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[22] = 0x01;
+		break;
+	case 0x1817FBF4:
+		BMS_Cell_Volt[88] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[89] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[90] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[91] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[23] = 0x01;
+		break;
+	case 0x1818FBF4:
+		BMS_Cell_Volt[92] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[93] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[94] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[95] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[24] = 0x01;
+		break;
+	case 0x1819FBF4:
+		BMS_Cell_Volt[96] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[97] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[98] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[99] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[25] = 0x01;
+		break;
+	case 0x181AFBF4:
+		BMS_Cell_Volt[100] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[101] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[102] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[103] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[26] = 0x01;
+		break;
+	case 0x181BFBF4:
+		BMS_Cell_Volt[104] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[105] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[106] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[107] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[27] = 0x01;
+		break;
+	case 0x181CFBF4:
+		BMS_Cell_Volt[108] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[109] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[110] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[111] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[28] = 0x01;
+		break;
+	case 0x181DFBF4:
+		BMS_Cell_Volt[112] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[113] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[114] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[115] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[29] = 0x01;
+		break;
+	case 0x181EFBF4:
+		BMS_Cell_Volt[116] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[117] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[118] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[119] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[30] = 0x01;
+		break;
+	case 0x181FFBF4:
+		BMS_Cell_Volt[120] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[121] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[122] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[123] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[31] = 0x01;
+		break;
+	case 0x1820FBF4:
+		BMS_Cell_Volt[124] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[125] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[126] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[127] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[32] = 0x01;
+		break;
+	case 0x1821FBF4:
+		BMS_Cell_Volt[128] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[129] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[130] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[131] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[33] = 0x01;
+		break;
+	case 0x1822FBF4:
+		BMS_Cell_Volt[132] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[133] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[134] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[135] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[34] = 0x01;
+		break;
+	case 0x1823FBF4:
+		BMS_Cell_Volt[136] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[137] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[138] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[139] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[35] = 0x01;
+		break;
+	case 0x1824FBF4:
+		BMS_Cell_Volt[140] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[141] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[142] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[143] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[36] = 0x01;
+		break;
+	case 0x1825FBF4:
+		BMS_Cell_Volt[144] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[145] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[146] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[147] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[37] = 0x01;
+		break;
+	case 0x1826FBF4:
+		BMS_Cell_Volt[148] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[149] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[150] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[151] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[38] = 0x01;
+		break;
+	case 0x1827FBF4:
+		BMS_Cell_Volt[152] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[153] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[154] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[155] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[39] = 0x01;
+		break;
+	case 0x1828FBF4:
+		BMS_Cell_Volt[156] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[157] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[158] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[159] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[40] = 0x01;
+		break;
+	case 0x1829FBF4:
+		BMS_Cell_Volt[160] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[161] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[162] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[163] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[41] = 0x01;
+		break;
+	case 0x182AFBF4:
+		BMS_Cell_Volt[164] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[165] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[166] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[167] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[42] = 0x01;
+		break;
+	case 0x182BFBF4:
+		BMS_Cell_Volt[168] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[169] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[170] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[171] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[43] = 0x01;
+		break;
+	case 0x182CFBF4:
+		BMS_Cell_Volt[172] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[173] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[174] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[175] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[44] = 0x01;
+		break;
+	case 0x182DFBF4:
+		BMS_Cell_Volt[176] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[177] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[178] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[179] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[45] = 0x01;
+		break;
+	case 0x182EFBF4:
+		BMS_Cell_Volt[180] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[181] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[182] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[183] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[46] = 0x01;
+		break;
+	case 0x182FFBF4:
+		BMS_Cell_Volt[184] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[185] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[186] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[187] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[47] = 0x01;
+		break;
+	case 0x1830FBF4:
+		BMS_Cell_Volt[188] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[189] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[190] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[191] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[48] = 0x01;
+		break;
+	case 0x1831FBF4:
+		BMS_Cell_Volt[192] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[193] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[194] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[195] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[49] = 0x01;
+		break;
+	case 0x1832FBF4:
+		BMS_Cell_Volt[196] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[197] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[198] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[199] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[50] = 0x01;
+		break;
+	case 0x1833FBF4:
+		BMS_Cell_Volt[200] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[201] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[202] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[203] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[51] = 0x01;
+		break;
+	case 0x1834FBF4:
+		BMS_Cell_Volt[204] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[205] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[206] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[207] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[52] = 0x01;
+		break;
+	case 0x1835FBF4:
+		BMS_Cell_Volt[208] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[209] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[210] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[211] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[53] = 0x01;
+		break;
+	case 0x1836FBF4:
+		BMS_Cell_Volt[212] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[213] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[214] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[215] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[54] = 0x01;
+		break;
+	case 0x1837FBF4:
+		BMS_Cell_Volt[216] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[217] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[218] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[219] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[55] = 0x01;
+		break;
+	case 0x1838FBF4:
+		BMS_Cell_Volt[220] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[221] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[222] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[223] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[56] = 0x01;
+		break;
+	case 0x1839FBF4:
+		BMS_Cell_Volt[224] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[225] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[226] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[227] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[57] = 0x01;
+		break;
+	case 0x183AFBF4:
+		BMS_Cell_Volt[228] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[229] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[230] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[231] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[58] = 0x01;
+		break;
+	case 0x183BFBF4:
+		BMS_Cell_Volt[232] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[233] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[234] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[235] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[59] = 0x01;
+		break;
+	case 0x183CFBF4:
+		BMS_Cell_Volt[236] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[237] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[238] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[239] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[60] = 0x01;
+		break;
+	case 0x183DFBF4:
+		BMS_Cell_Volt[240] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[241] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[242] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[243] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[61] = 0x01;
+		break;
+	case 0x183EFBF4:
+		BMS_Cell_Volt[244] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[245] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[246] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[247] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[62] = 0x01;
+		break;
+	case 0x183FFBF4:
+		BMS_Cell_Volt[248] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[249] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[250] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[251] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[63] = 0x01;
+		break;
+	case 0x1840FBF4:
+		BMS_Cell_Volt[252] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[253] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[254] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[255] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[64] = 0x01;
+		break;
+	case 0x1841FBF4:
+		BMS_Cell_Volt[256] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[257] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[258] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[259] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[65] = 0x01;
+		break;
+	case 0x1842FBF4:
+		BMS_Cell_Volt[260] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[261] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[262] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[263] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[66] = 0x01;
+		break;
+	case 0x1843FBF4:
+		BMS_Cell_Volt[264] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[265] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[266] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[267] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[67] = 0x01;
+		break;
+	case 0x1844FBF4:
+		BMS_Cell_Volt[268] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[269] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[270] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[271] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[68] = 0x01;
+		break;
+	case 0x1845FBF4:
+		BMS_Cell_Volt[272] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[273] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[274] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[275] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[69] = 0x01;
+		break;
+	case 0x1846FBF4:
+		BMS_Cell_Volt[276] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[277] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[278] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[279] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[70] = 0x01;
+		break;
+	case 0x1847FBF4:
+		BMS_Cell_Volt[280] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[281] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[282] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[283] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[71] = 0x01;
+		break;
+	case 0x1848FBF4:
+		BMS_Cell_Volt[284] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[285] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[286] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[287] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[72] = 0x01;
+		break;
+	case 0x1849FBF4:
+		BMS_Cell_Volt[288] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[289] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[290] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[291] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[73] = 0x01;
+		break;
+	case 0x184AFBF4:
+		BMS_Cell_Volt[292] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[293] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[294] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[295] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[74] = 0x01;
+		break;
+	case 0x184BFBF4:
+		BMS_Cell_Volt[296] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[297] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[298] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[299] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[75] = 0x01;
+		break;
+	case 0x184CFBF4:
+		BMS_Cell_Volt[300] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[301] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[302] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[303] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[76] = 0x01;
+		break;
+	case 0x184DFBF4:
+		BMS_Cell_Volt[304] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[305] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[306] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[307] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[77] = 0x01;
+		break;
+	case 0x184EFBF4:
+		BMS_Cell_Volt[308] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[309] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[310] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[311] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[78] = 0x01;
+		break;
+	case 0x184FFBF4:
+		BMS_Cell_Volt[312] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[313] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[314] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[315] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[79] = 0x01;
+		break;
+	case 0x1850FBF4:
+		BMS_Cell_Volt[316] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[317] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[318] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[319] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[80] = 0x01;
+		break;
+	case 0x1851FBF4:
+		BMS_Cell_Volt[320] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[321] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[322] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[323] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[81] = 0x01;
+		break;
+	case 0x1852FBF4:
+		BMS_Cell_Volt[324] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[325] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[326] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[327] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[82] = 0x01;
+		break;
+	case 0x1853FBF4:
+		BMS_Cell_Volt[328] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[329] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[330] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[331] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[83] = 0x01;
+		break;
+	case 0x1854FBF4:
+		BMS_Cell_Volt[332] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[333] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[334] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[335] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[84] = 0x01;
+		break;
+	case 0x1855FBF4:
+		BMS_Cell_Volt[336] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[337] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[338] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[339] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[85] = 0x01;
+		break;
+	case 0x1856FBF4:
+		BMS_Cell_Volt[340] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[341] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[342] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[343] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[86] = 0x01;
+		break;
+	case 0x1857FBF4:
+		BMS_Cell_Volt[344] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[345] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[346] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[347] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[87] = 0x01;
+		break;
+	case 0x1858FBF4:
+		BMS_Cell_Volt[348] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[349] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[350] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[351] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[88] = 0x01;
+		break;
+	case 0x1859FBF4:
+		BMS_Cell_Volt[352] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[353] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[354] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[355] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[89] = 0x01;
+		break;
+	case 0x185AFBF4:
+		BMS_Cell_Volt[356] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[357] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[358] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[359] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[90] = 0x01;
+		break;
+	case 0x185BFBF4:
+		BMS_Cell_Volt[360] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[361] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[362] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[363] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[91] = 0x01;
+		break;
+	case 0x185CFBF4:
+		BMS_Cell_Volt[364] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[365] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[366] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[367] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[92] = 0x01;
+		break;
+	case 0x185DFBF4:
+		BMS_Cell_Volt[368] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[369] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[370] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[371] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[93] = 0x01;
+		break;
+	case 0x185EFBF4:
+		BMS_Cell_Volt[372] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[373] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[374] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[375] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[94] = 0x01;
+		break;
+	case 0x185FFBF4:
+		BMS_Cell_Volt[376] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[377] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[378] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[379] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[95] = 0x01;
+		break;
+	case 0x1860FBF4:
+		BMS_Cell_Volt[380] = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_Cell_Volt[381] = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS_Cell_Volt[382] = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS_Cell_Volt[383] = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[96] = 0x01;
+		break;
+	case 0x1881EFF4:
+		BMS11_Fult1_DelTemp = (UINT8)(((*(UINT8 *)(rawData + 0)) >> 2) & 0x3);
+		BMS11_Fult1_OverTemp = (UINT8)(((*(UINT8 *)(rawData + 0)) >> 4) & 0x3);
+		BMS11_Fult1_PackOverHVolt = (UINT8)(((*(UINT8 *)(rawData + 0)) >> 6) & 0x3);
+		BMS11_Fult1_PackLowHVolt = (UINT8)(((*(UINT8 *)(rawData + 1))) & 0x3);
+		BMS11_Fult1_LowSOC = (UINT8)(((*(UINT8 *)(rawData + 1)) >> 2) & 0x3);
+		BMS11_Fult1_OverUcell = (UINT8)(((*(UINT8 *)(rawData + 1)) >> 4) & 0x3);
+		BMS11_Fult1_LowUcell = (UINT8)(((*(UINT8 *)(rawData + 1)) >> 6) & 0x3);
+		BMS11_Fult1_LowInsRes = (UINT8)(((*(UINT8 *)(rawData + 2))) & 0x3);
+		BMS11_Fult1_UcellUniformity = (UINT8)(((*(UINT8 *)(rawData + 2)) >> 2) & 0x3);
+		BMS11_Fult1_OverChg = (UINT8)(((*(UINT8 *)(rawData + 2)) >> 4) & 0x3);
+		BMS11_Fult1_OverSOC = (UINT8)(((*(UINT8 *)(rawData + 2)) >> 6) & 0x3);
+		BMS11_Fult1_SOCChangeFast = (UINT8)(((*(UINT8 *)(rawData + 3))) & 0x1);
+		BMS11_Fult1_BatSysNotMatch = (UINT8)(((*(UINT8 *)(rawData + 3)) >> 1) & 0x1);
+		BMS11_Fult1_HVILFault = (UINT8)(((*(UINT8 *)(rawData + 3)) >> 2) & 0x1);
+		BMS11_PackOutsideVolt = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BcuRxFlag[97] = 0x01;
+		break;
+	case 0x1882EFF4:
+		BMS12_Fult2_FaultNum = (UINT8)(((*(UINT8 *)(rawData + 0))) & 0xFF);
+		BMS12_Fult2_CellOverDischrg = (UINT8)(((*(UINT8 *)(rawData + 1))) & 0x1);
+		BMS12_Fult2_CellLowTemp = (UINT8)(((*(UINT8 *)(rawData + 1)) >> 1) & 0x1);
+		BMS12_Fult2_PackFireWarning = (UINT8)(((*(UINT8 *)(rawData + 1)) >> 2) & 0x1);
+		BMS12_Fult2_OverDischrgCurr = (UINT8)(((*(UINT8 *)(rawData + 1)) >> 3) & 0x3);
+		BMS12_Fult2_OverChrgCurrInTheDrive = (UINT8)(((*(UINT8 *)(rawData + 1)) >> 5) & 0x3);
+		BMS12_Fult2_CurrSensorErr = (UINT8)(((*(UINT8 *)(rawData + 1)) >> 7) & 0x1);
+		BMS12_Fult2_PowerSupplyErr = (UINT8)(((*(UINT8 *)(rawData + 2))) & 0x1);
+		BMS12_Fult2_TMSErr = (UINT8)(((*(UINT8 *)(rawData + 2)) >> 1) & 0x1);
+		BMS12_Fult2_HeatingFilmErr = (UINT8)(((*(UINT8 *)(rawData + 2)) >> 2) & 0x1);
+		BMS12_Fult2_PackSelfProtect = (UINT8)(((*(UINT8 *)(rawData + 2)) >> 3) & 0x1);
+		BMS12_Fult2_MainLoopPrechrgErr = (UINT8)(((*(UINT8 *)(rawData + 2)) >> 4) & 0x1);
+		BMS12_Fult2_AuxLoopPrechrgErr = (UINT8)(((*(UINT8 *)(rawData + 2)) >> 5) & 0x1);
+		BMS12_Fult2_ChrgInsLowErr = (UINT8)(((*(UINT8 *)(rawData + 2)) >> 6) & 0x1);
+		BMS12_Fult2_ACANLost = (UINT8)(((*(UINT8 *)(rawData + 2)) >> 7) & 0x1);
+		BMS12_Fult2_InnerCommunicationErr = (UINT8)(((*(UINT8 *)(rawData + 3))) & 0x1);
+		BMS12_Fult2_DCDCErr = (UINT8)(((*(UINT8 *)(rawData + 3)) >> 1) & 0x1);
+		BMS12_Fult2_BranchBreakErr = (UINT8)(((*(UINT8 *)(rawData + 3)) >> 2) & 0x1);
+		BMS12_Fult2_HeatRelayOpenErr = (UINT8)(((*(UINT8 *)(rawData + 3)) >> 3) & 0x1);
+		BMS12_Fult2_HeatRelayWeldErr = (UINT8)(((*(UINT8 *)(rawData + 3)) >> 4) & 0x1);
+		BMS12_Fult2_MainPosRelayOpenErr = (UINT8)(((*(UINT8 *)(rawData + 3)) >> 5) & 0x1);
+		BMS12_Fult2_MainPosRelayWeldErr = (UINT8)(((*(UINT8 *)(rawData + 3)) >> 6) & 0x1);
+		BMS12_Fult2_MainNegRelayOpenErr = (UINT8)(((*(UINT8 *)(rawData + 3)) >> 7) & 0x1);
+		BMS12_Fult2_MainNegRelayWeldErr = (UINT8)(((*(UINT8 *)(rawData + 4))) & 0x1);
+		BMS12_Fult2_DCChrgPos1RelayOpenErr = (UINT8)(((*(UINT8 *)(rawData + 4)) >> 1) & 0x1);
+		BMS12_Fult2_DCChrgPos1RelayWeldErr = (UINT8)(((*(UINT8 *)(rawData + 4)) >> 2) & 0x1);
+		BMS12_Fult2_DCChrgNeg1RelayOpenErr = (UINT8)(((*(UINT8 *)(rawData + 4)) >> 3) & 0x1);
+		BMS12_Fult2_DCChrgNeg1RelayWeldErr = (UINT8)(((*(UINT8 *)(rawData + 4)) >> 4) & 0x1);
+		BMS12_Fult2_DCChrgPos2RelayOpenErr = (UINT8)(((*(UINT8 *)(rawData + 4)) >> 5) & 0x1);
+		BMS12_Fult2_DCChrgPos2RelayWeldErr = (UINT8)(((*(UINT8 *)(rawData + 4)) >> 6) & 0x1);
+		BMS12_Fult2_DCChrgNeg2RelayOpenErr = (UINT8)(((*(UINT8 *)(rawData + 4)) >> 7) & 0x1);
+		BMS12_Fult2_DCChrgNeg2RelayWeldErr = (UINT8)(((*(UINT8 *)(rawData + 5))) & 0x1);
+		BMS12_Fult2_ChrgConnectErr = (UINT8)(((*(UINT8 *)(rawData + 6)) >> 1) & 0x1);
+		BMS12_ult2_OverDischrgCurrWhenInChrg = (UINT8)(((*(UINT8 *)(rawData + 6)) >> 2) & 0x1);
+		BMS12_Fult2_OverChrgCurrInTheChrg = (UINT8)(((*(UINT8 *)(rawData + 6)) >> 3) & 0x1);
+		BMS12_Fult2_ChrgNTCErr = (UINT8)(((*(UINT8 *)(rawData + 6)) >> 4) & 0x1);
+		BMS12_Fult2_ChrgNTCTempOver = (UINT8)(((*(UINT8 *)(rawData + 6)) >> 5) & 0x3);
+		BMS12_Fult2_ELockErr = (UINT8)(((*(UINT8 *)(rawData + 6)) >> 7) & 0x1);
+		BMS12_Fult2_FireDetectorEr = (UINT8)(((*(UINT8 *)(rawData + 7))) & 0x1);
+		BMS12_Fult2_ContiDischrgCurrOverLoad = (UINT8)(((*(UINT8 *)(rawData + 7)) >> 1) & 0x3);
+		BMS12_Fult2_SOCDifferErr = (UINT8)(((*(UINT8 *)(rawData + 7)) >> 3) & 0x1);
+		BMS12_Fult2_ContiChrgCurrOverLoad = (UINT8)(((*(UINT8 *)(rawData + 7)) >> 4) & 0x3);
+		BcuRxFlag[98] = 0x01;
+		break;
+	case 0x1883EFF4:
+		BMS1_MainPosRelaySt = (UINT8)(((*(UINT8 *)(rawData + 0))) & 0x3);
+		BMS1_MainNegRelaySt = (UINT8)(((*(UINT8 *)(rawData + 0)) >> 2) & 0x3);
+		BMS1_PreChgRelaySt = (UINT8)(((*(UINT8 *)(rawData + 0)) >> 4) & 0x3);
+		BMS1_DCChrgPos1RelaySt = (UINT8)(((*(UINT8 *)(rawData + 0)) >> 6) & 0x3);
+		BMS1_DCChrgNeg1RelaySt = (UINT8)(((*(UINT8 *)(rawData + 1))) & 0x3);
+		BMS1_DCChrgPos2RelaySt = (UINT8)(((*(UINT8 *)(rawData + 1)) >> 2) & 0x3);
+		BMS1_DCChrgNeg2RelaySt = (UINT8)(((*(UINT8 *)(rawData + 1)) >> 4) & 0x3);
+		BMS1_HeatPosRelaySt = (UINT8)(((*(UINT8 *)(rawData + 1)) >> 6) & 0x3);
+		BMS1_HeatNegRelaySt = (UINT8)(((*(UINT8 *)(rawData + 2))) & 0x3);
+		BMS1_SysSts = (UINT8)(((*(UINT8 *)(rawData + 2)) >> 2) & 0xF);
+		BMS1_Life = (UINT8)(((*(UINT8 *)(rawData + 3))) & 0xFF);
+		BMS1_BalanceStatus = (UINT8)(((*(UINT8 *)(rawData + 4)) >> 2) & 0x1);
+		BMS1_DCChrgConnectSt = (UINT8)(((*(UINT8 *)(rawData + 4)) >> 3) & 0x3);
+		BMS1_ChrgMode = (UINT8)(((*(UINT16 *)(rawData + 4)) >> 7) & 0x3);
+		BMS1_ChrgStatus = (UINT8)(((*(UINT8 *)(rawData + 5)) >> 1) & 0x3);
+		BMS1_HeatingStatus = (UINT8)(((*(UINT8 *)(rawData + 5)) >> 3) & 0x1);
+		BMS1_CoolingStatus = (UINT8)(((*(UINT8 *)(rawData + 5)) >> 4) & 0x3);
+		BMS1_RechrgCycels = (UINT32)(((*(UINT32 *)(rawData + 5)) >> 6) & 0x3FFFF);
+		BcuRxFlag[99] = 0x01;
+		break;
+	case 0x1884EFF4:
+		BMS2_SOC = (UINT8)(((*(UINT8 *)(rawData + 0))) & 0xFF);
+		BMS2_SOH = (UINT8)(((*(UINT8 *)(rawData + 1))) & 0xFF);
+		BMS2_PackCurrent = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS2_PackInsideVolt = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS2_FaultCode = (UINT8)(((*(UINT8 *)(rawData + 6))) & 0xFF);
+		BMS2_FaultLevel = (UINT8)(((*(UINT8 *)(rawData + 7))) & 0x3);
+		BMS2_RqHVPoerOff = (UINT8)(((*(UINT8 *)(rawData + 7)) >> 2) & 0x3);
+		BMS2_Life = (UINT8)(((*(UINT8 *)(rawData + 7)) >> 4) & 0xF);
+		BcuRxFlag[100] = 0x01;
+		break;
+	case 0x1885EFF4:
+		BMS4_PosIsolation = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS4_NegIsolation = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS4_SysInsRes = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS4_InsDetectorSt = (UINT8)(((*(UINT8 *)(rawData + 6))) & 0x1);
+		BcuRxFlag[101] = 0x01;
+		break;
+	case 0x1886EFF4:
+		BMS8_Max_Temp = (UINT8)(((*(UINT8 *)(rawData + 0))) & 0xFF);
+		BMS8_Min_Temp = (UINT8)(((*(UINT8 *)(rawData + 1))) & 0xFF);
+		BMS8_Avg_Temp = (UINT8)(((*(UINT8 *)(rawData + 2))) & 0xFF);
+		BMS8_MaxTempSysNr = (UINT8)(((*(UINT8 *)(rawData + 3))) & 0xFF);
+		BMS8_MaxTempNr = (UINT8)(((*(UINT8 *)(rawData + 4))) & 0xFF);
+		BMS8_MinTempSysNr = (UINT8)(((*(UINT8 *)(rawData + 5))) & 0xFF);
+		BMS8_MinTempNr = (UINT8)(((*(UINT8 *)(rawData + 6))) & 0xFF);
+		BcuRxFlag[102] = 0x01;
+		break;
+	case 0x1887EFF4:
+		BMS6_Max_Ucell = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS6_Min_Ucell = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS6_Avg_Ucell = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS6_SOE = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[103] = 0x01;
+		break;
+	case 0x1888EFF4:
+		BMS7_MaxUcellSysNr = (UINT8)(((*(UINT8 *)(rawData + 0))) & 0xFF);
+		BMS7_MaxUcellNr = (UINT16)(((*(UINT16 *)(rawData + 1))) & 0xFFFF);
+		BMS7_MinUcellSysNr = (UINT8)(((*(UINT8 *)(rawData + 3))) & 0xFF);
+		BMS7_MinUcellNr = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BcuRxFlag[104] = 0x01;
+		break;
+	case 0x1889EFF4:
+		BMS23_Gun1DCPosTemp = (UINT8)(((*(UINT8 *)(rawData + 0))) & 0xFF);
+		BMS23_Gun1DCNegTemp = (UINT8)(((*(UINT8 *)(rawData + 1))) & 0xFF);
+		BMS23_Gun2DCPosTemp = (UINT8)(((*(UINT8 *)(rawData + 2))) & 0xFF);
+		BMS23_Gun2DCNegTemp = (UINT8)(((*(UINT8 *)(rawData + 3))) & 0xFF);
+		BMS23_RemainChgTi = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[105] = 0x01;
+		break;
+	case 0x18A0FBF4:
+		BMS_Cell_TempN[0] = (UINT8)(((*(UINT8 *)(rawData + 0))) & 0xFF);
+		BMS_Cell_TempN[1] = (UINT8)(((*(UINT8 *)(rawData + 1))) & 0xFF);
+		BMS_Cell_TempN[2] = (UINT8)(((*(UINT8 *)(rawData + 2))) & 0xFF);
+		BMS_Cell_TempN[3] = (UINT8)(((*(UINT8 *)(rawData + 3))) & 0xFF);
+		BMS_Cell_TempN[4] = (UINT8)(((*(UINT8 *)(rawData + 4))) & 0xFF);
+		BMS_Cell_TempN[5] = (UINT8)(((*(UINT8 *)(rawData + 5))) & 0xFF);
+		BMS_Cell_TempN[6] = (UINT8)(((*(UINT8 *)(rawData + 6))) & 0xFF);
+		BMS_Cell_TempN[7] = (UINT8)(((*(UINT8 *)(rawData + 7))) & 0xFF);
+		BcuRxFlag[106] = 0x01;
+		break;
+	case 0x18A1FBF4:
+		BMS_Cell_TempN[8] = (UINT8)(((*(UINT8 *)(rawData + 0))) & 0xFF);
+		BMS_Cell_TempN[9] = (UINT8)(((*(UINT8 *)(rawData + 1))) & 0xFF);
+		BMS_Cell_TempN[10] = (UINT8)(((*(UINT8 *)(rawData + 2))) & 0xFF);
+		BMS_Cell_TempN[11] = (UINT8)(((*(UINT8 *)(rawData + 3))) & 0xFF);
+		BMS_Cell_TempN[12] = (UINT8)(((*(UINT8 *)(rawData + 4))) & 0xFF);
+		BMS_Cell_TempN[13] = (UINT8)(((*(UINT8 *)(rawData + 5))) & 0xFF);
+		BMS_Cell_TempN[14] = (UINT8)(((*(UINT8 *)(rawData + 6))) & 0xFF);
+		BMS_Cell_TempN[15] = (UINT8)(((*(UINT8 *)(rawData + 7))) & 0xFF);
+		BcuRxFlag[107] = 0x01;
+		break;
+	case 0x18A2FBF4:
+		BMS_Cell_TempN[16] = (UINT8)(((*(UINT8 *)(rawData + 0))) & 0xFF);
+		BMS_Cell_TempN[17] = (UINT8)(((*(UINT8 *)(rawData + 1))) & 0xFF);
+		BMS_Cell_TempN[18] = (UINT8)(((*(UINT8 *)(rawData + 2))) & 0xFF);
+		BMS_Cell_TempN[19] = (UINT8)(((*(UINT8 *)(rawData + 3))) & 0xFF);
+		BMS_Cell_TempN[20] = (UINT8)(((*(UINT8 *)(rawData + 4))) & 0xFF);
+		BMS_Cell_TempN[21] = (UINT8)(((*(UINT8 *)(rawData + 5))) & 0xFF);
+		BMS_Cell_TempN[22] = (UINT8)(((*(UINT8 *)(rawData + 6))) & 0xFF);
+		BMS_Cell_TempN[23] = (UINT8)(((*(UINT8 *)(rawData + 7))) & 0xFF);
+		BMS_Cell_TempN[24] = (UINT8)(((*(UINT8 *)(rawData + 0))) & 0xFF);
+		BMS_Cell_TempN[25] = (UINT8)(((*(UINT8 *)(rawData + 1))) & 0xFF);
+		BMS_Cell_TempN[26] = (UINT8)(((*(UINT8 *)(rawData + 2))) & 0xFF);
+		BMS_Cell_TempN[27] = (UINT8)(((*(UINT8 *)(rawData + 3))) & 0xFF);
+		BMS_Cell_TempN[28] = (UINT8)(((*(UINT8 *)(rawData + 4))) & 0xFF);
+		BMS_Cell_TempN[29] = (UINT8)(((*(UINT8 *)(rawData + 5))) & 0xFF);
+		BMS_Cell_TempN[30] = (UINT8)(((*(UINT8 *)(rawData + 6))) & 0xFF);
+		BMS_Cell_TempN[31] = (UINT8)(((*(UINT8 *)(rawData + 7))) & 0xFF);
+		BcuRxFlag[108] = 0x01;
+		break;
+	case 0x18A3FBF4:
+		BMS_Cell_TempN[32] = (UINT8)(((*(UINT8 *)(rawData + 0))) & 0xFF);
+		BMS_Cell_TempN[33] = (UINT8)(((*(UINT8 *)(rawData + 1))) & 0xFF);
+		BMS_Cell_TempN[34] = (UINT8)(((*(UINT8 *)(rawData + 2))) & 0xFF);
+		BMS_Cell_TempN[35] = (UINT8)(((*(UINT8 *)(rawData + 3))) & 0xFF);
+		BMS_Cell_TempN[36] = (UINT8)(((*(UINT8 *)(rawData + 4))) & 0xFF);
+		BMS_Cell_TempN[37] = (UINT8)(((*(UINT8 *)(rawData + 5))) & 0xFF);
+		BMS_Cell_TempN[38] = (UINT8)(((*(UINT8 *)(rawData + 6))) & 0xFF);
+		BMS_Cell_TempN[39] = (UINT8)(((*(UINT8 *)(rawData + 7))) & 0xFF);
+		BcuRxFlag[109] = 0x01;
+		break;
+	case 0x18A4FBF4:
+		BMS_Cell_TempN[40] = (UINT8)(((*(UINT8 *)(rawData + 0))) & 0xFF);
+		BMS_Cell_TempN[41] = (UINT8)(((*(UINT8 *)(rawData + 1))) & 0xFF);
+		BMS_Cell_TempN[42] = (UINT8)(((*(UINT8 *)(rawData + 2))) & 0xFF);
+		BMS_Cell_TempN[43] = (UINT8)(((*(UINT8 *)(rawData + 3))) & 0xFF);
+		BMS_Cell_TempN[44] = (UINT8)(((*(UINT8 *)(rawData + 4))) & 0xFF);
+		BMS_Cell_TempN[45] = (UINT8)(((*(UINT8 *)(rawData + 5))) & 0xFF);
+		BMS_Cell_TempN[46] = (UINT8)(((*(UINT8 *)(rawData + 6))) & 0xFF);
+		BMS_Cell_TempN[47] = (UINT8)(((*(UINT8 *)(rawData + 7))) & 0xFF);
+		BcuRxFlag[110] = 0x01;
+		break;
+	case 0x18A5FBF4:
+		BMS_Cell_TempN[48] = (UINT8)(((*(UINT8 *)(rawData + 0))) & 0xFF);
+		BMS_Cell_TempN[49] = (UINT8)(((*(UINT8 *)(rawData + 1))) & 0xFF);
+		BMS_Cell_TempN[50] = (UINT8)(((*(UINT8 *)(rawData + 2))) & 0xFF);
+		BMS_Cell_TempN[51] = (UINT8)(((*(UINT8 *)(rawData + 3))) & 0xFF);
+		BMS_Cell_TempN[52] = (UINT8)(((*(UINT8 *)(rawData + 4))) & 0xFF);
+		BMS_Cell_TempN[53] = (UINT8)(((*(UINT8 *)(rawData + 5))) & 0xFF);
+		BMS_Cell_TempN[54] = (UINT8)(((*(UINT8 *)(rawData + 6))) & 0xFF);
+		BMS_Cell_TempN[55] = (UINT8)(((*(UINT8 *)(rawData + 7))) & 0xFF);
+		BcuRxFlag[111] = 0x01;
+		break;
+	case 0x18A6FBF4:
+		BMS_Cell_TempN[56] = (UINT8)(((*(UINT8 *)(rawData + 0))) & 0xFF);
+		BMS_Cell_TempN[57] = (UINT8)(((*(UINT8 *)(rawData + 1))) & 0xFF);
+		BMS_Cell_TempN[58] = (UINT8)(((*(UINT8 *)(rawData + 2))) & 0xFF);
+		BMS_Cell_TempN[59] = (UINT8)(((*(UINT8 *)(rawData + 3))) & 0xFF);
+		BMS_Cell_TempN[60] = (UINT8)(((*(UINT8 *)(rawData + 4))) & 0xFF);
+		BMS_Cell_TempN[61] = (UINT8)(((*(UINT8 *)(rawData + 5))) & 0xFF);
+		BMS_Cell_TempN[62] = (UINT8)(((*(UINT8 *)(rawData + 6))) & 0xFF);
+		BMS_Cell_TempN[63] = (UINT8)(((*(UINT8 *)(rawData + 7))) & 0xFF);
+		BcuRxFlag[112] = 0x01;
+		break;
+	case 0x18E1EFF4:
+	{
+		UINT8 SN_FrameNo = 0, SN_SysCodeLength;
+		SN_FrameNo = (UINT8)(((*(UINT8 *)(rawData + 0))) & 0xFF);
+		SN_SysCodeLength = (UINT8)(((*(UINT8 *)(rawData + 1))) & 0xFF);
+		BMS_SN_SysCode[0 + 6 * (SN_FrameNo - 1)] = (UINT8)(((*(UINT8 *)(rawData + 2))) & 0xFF);
+		BMS_SN_SysCode[1 + 6 * (SN_FrameNo - 1)] = (UINT8)(((*(UINT8 *)(rawData + 3))) & 0xFF);
+		BMS_SN_SysCode[2 + 6 * (SN_FrameNo - 1)] = (UINT8)(((*(UINT8 *)(rawData + 4))) & 0xFF);
+		BMS_SN_SysCode[3 + 6 * (SN_FrameNo - 1)] = (UINT8)(((*(UINT8 *)(rawData + 5))) & 0xFF);
+		BMS_SN_SysCode[4 + 6 * (SN_FrameNo - 1)] = (UINT8)(((*(UINT8 *)(rawData + 6))) & 0xFF);
+		BMS_SN_SysCode[5 + 6 * (SN_FrameNo - 1)] = (UINT8)(((*(UINT8 *)(rawData + 7))) & 0xFF);
+		BcuRxFlag[113] = 0x01;
+		BCU_SnMsgFlag = BCU_SnMsgFlag | (1 << (SN_FrameNo - 1));
+		break;
+	}
+	case 0x18E2EFF4:
+		BMS21_RateCap = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS21_RateHVolt = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS21_RatePower = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS21_BattType = (UINT8)(((*(UINT8 *)(rawData + 6))) & 0xF);
+		BMS21_CoolType = (UINT8)(((*(UINT8 *)(rawData + 6)) >> 4) & 0x3);
+		BMS21_Manufacture = (UINT8)(((*(UINT16 *)(rawData + 6)) >> 6) & 0xF);
+		BMS21_ProtocolEditionH = (UINT8)(((*(UINT8 *)(rawData + 7)) >> 2) & 0x3);
+		BMS21_ProtocolEditionL = (UINT8)(((*(UINT8 *)(rawData + 7)) >> 4) & 0xF);
+		BcuRxFlag[114] = 0x01;
+		break;
+	case 0x18E3EFF4:
+		BMS9_TotCSCNum = (UINT8)(((*(UINT8 *)(rawData + 0))) & 0xFF);
+		BMS9_PackTotCellNum = (UINT16)(((*(UINT16 *)(rawData + 1))) & 0xFFFF);
+		BMS9_PackTotTempNum = (UINT8)(((*(UINT8 *)(rawData + 3))) & 0xFF);
+		BMS9_HVBranchNum = (UINT8)(((*(UINT8 *)(rawData + 4))) & 0xFF);
+		BMS9_SingleHVBranchCellNum = (UINT8)(((*(UINT8 *)(rawData + 5))) & 0xFF);
+		BMS9_BattSysNum = (UINT8)(((*(UINT8 *)(rawData + 6))) & 0xFF);
+		BMS9_BattSysSeqNum = (UINT8)(((*(UINT8 *)(rawData + 7))) & 0xFF);
+		BcuRxFlag[115] = 0x01;
+		break;
+	case 0x18E4EFF4:
+		BMS22_PackAvaiMaxVolt = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS22_PackAvaiMinVolt = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS22_AvaiMaxSOC = (UINT8)(((*(UINT8 *)(rawData + 4))) & 0xFF);
+		BMS22_AvaiMinSOC = (UINT8)(((*(UINT8 *)(rawData + 5))) & 0xFF);
+		BMS22_AvaiMaxTemp = (UINT8)(((*(UINT8 *)(rawData + 6))) & 0xFF);
+		BMS22_AvaiMinTemp = (UINT8)(((*(UINT8 *)(rawData + 7))) & 0xFF);
+		BcuRxFlag[116] = 0x01;
+		break;
+	case 0x18FEDAF4:
+		BMS_SoftwareVersion = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS_HardwareVersion = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BcuRxFlag[117] = 0x01;
+		break;
+	case 0x18FF23F4:
+		BMS3_MaxDischgPow = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS3_MaxChgPow = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS3_MaxInstantDischgPow = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS3_MaxiInstantChgPow = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[118] = 0x01;
+		break;
+	case 0x18FF24F4:
+		BMS10_SubSysEncodingLen = (UINT8)(((*(UINT8 *)(rawData + 1))) & 0xFF);
+		BMS10_SubSysIdx = (UINT8)(((*(UINT8 *)(rawData + 2))) & 0xFF);
+		BMS10_SubSysErrNum = (UINT8)(((*(UINT8 *)(rawData + 7))) & 0xFF);
+		BcuRxFlag[119] = 0x01;
+		break;
+	case 0x18FF25F4:
+		BMS5_DischgCurMaxAllw = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS5_ChrgCurMaxAllw = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS5_InstChrgCurMaxAllw = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS5_InstDischrgCurMaxAllw = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[120] = 0x01;
+		break;
+	case 0x18FF30F4:
+		BMS26_Bat_InstantConsume = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		BMS26_Bat_TotalConsume = (UINT16)(((*(UINT16 *)(rawData + 2))) & 0xFFFF);
+		BMS26_ChgReqVoltage = (UINT16)(((*(UINT16 *)(rawData + 4))) & 0xFFFF);
+		BMS26_ChgReqCurrent = (UINT16)(((*(UINT16 *)(rawData + 6))) & 0xFFFF);
+		BcuRxFlag[121] = 0x01;
+		break;
+	case 0x18FF45F4:
+		BMS28_ReqMode = (UINT8)(((((*(UINT8 *)(rawData + 0)) >> 0) & 0x3) * 1) + (0));
+		BMS28_HVCmd = (UINT8)(((((*(UINT8 *)(rawData + 0)) >> 2) & 0x3) * 1) + (0));
+		BMS28_ChgSts = (UINT8)(((((*(UINT8 *)(rawData + 0)) >> 4) & 0x3) * 1) + (0));
+		BMS28_HVRelaySts = (UINT8)(((((*(UINT8 *)(rawData + 0)) >> 6) & 0x3) * 1) + (0));
+		BMS28_HVVolt = (UINT16)((((((*(UINT16 *)(rawData + 1) >> 8) & 0xFF) | ((*(UINT16 *)(rawData + 1) << 8) & 0xFF00) >> 0) & 0xFFFF) * 1) + (0));
+		BMS28_SetTemp = (UINT8)(((((*(UINT8 *)(rawData + 4)) >> 0) & 0xFF) * 1) + (0));
+		BMS28_Life = (UINT8)(((((*(UINT8 *)(rawData + 6)) >> 0) & 0xFF) * 1) + (0));
+		BMS28_CRC = (UINT8)(((((*(UINT8 *)(rawData + 7)) >> 0) & 0xFF) * 1) + (0));
+		BcuRxFlag[122] = 0x01;
+		break;
+	case 0x18FFC13A:
+		TMS_WorkStatus = (UINT8)(((((*(UINT8 *)(rawData + 0)) >> 0) & 0x3) * 1) + (0));
+		TMS_HVRelayST = (UINT8)(((((*(UINT8 *)(rawData + 0)) >> 2) & 0x3) * 1) + (0));
+		TMS_OutletTemp = (UINT8)(((((*(UINT8 *)(rawData + 1)) >> 0) & 0xFF) * 1) + (0));
+		TMS_InletTemp = (UINT8)(((((*(UINT8 *)(rawData + 2)) >> 0) & 0xFF) * 1) + (0));
+		TMS_Version = (UINT8)(((((*(UINT8 *)(rawData + 3)) >> 0) & 0xFF) * 1) + (0));
+		TMS_ReqPow = (UINT16)((((((*(UINT16 *)(rawData + 5) >> 8) & 0xFF) | ((*(UINT16 *)(rawData + 5) << 8) & 0xFF00) >> 0) & 0xFFFF) * 1) + (0));
+		TMS_ErrCode = (UINT8)(((((*(UINT8 *)(rawData + 7)) >> 0) & 0x3F) * 1) + (0));
+		TMS_FaultLevel = (UINT8)(((((*(UINT8 *)(rawData + 7)) >> 6) & 0x3) * 1) + (0));
+		BcuRxFlag[123] = 0x01;
+		break;
+	case 0x18FFD4F4:
+		BMS14_TotalChargeAh = (UINT32)(((*(UINT32 *)(rawData + 0))) & 0xFFFFFFFF);
+		BMS14_TotalDischargeAh = (UINT32)(((*(UINT32 *)(rawData + 4))) & 0xFFFFFFFF);
+		BcuRxFlag[124] = 0x01;
+		break;
+	case 0x18FFD5F4:
+		BMS15_TotalChargeKwh = (UINT32)(((*(UINT32 *)(rawData + 0))) & 0xFFFFFFFF);
+		BMS15_TotalDischargeKwh = (UINT32)(((*(UINT32 *)(rawData + 4))) & 0xFFFFFFFF);
+		BcuRxFlag[125] = 0x01;
+		break;
+	case 0x18FFD6F4:
+		BMS16_TotalEneryECOChargeAh = (UINT32)(((*(UINT32 *)(rawData + 0))) & 0xFFFFFFFF);
+		BMS16_TotalEneryECOChargeKwh = (UINT32)(((*(UINT32 *)(rawData + 4))) & 0xFFFFFFFF);
+		BcuRxFlag[126] = 0x01;
+		break;
+	case 0x18FFD7F4:
+		BMS17_TotalStationChargeAh = (UINT32)(((*(UINT32 *)(rawData + 0))) & 0xFFFFFFFF);
+		BMS17_TotalStationChargeKwh = (UINT32)(((*(UINT32 *)(rawData + 4))) & 0xFFFFFFFF);
+		BcuRxFlag[127] = 0x01;
+		break;
+	case 0x18FFD8F4:
+		BMS18_TotalPoleChargeAh = (UINT32)(((*(UINT32 *)(rawData + 0))) & 0xFFFFFFFF);
+		BMS18_TotalPoleChargeKwh = (UINT32)(((*(UINT32 *)(rawData + 4))) & 0xFFFFFFFF);
+		BcuRxFlag[128] = 0x01;
+		break;
+	case 0x18FFD9F4:
+		BMS19_SingleChargeAh = (UINT32)(((*(UINT32 *)(rawData + 0))) & 0xFFFFFFFF);
+		BMS19_SingleChargeKwh = (UINT32)(((*(UINT32 *)(rawData + 4))) & 0xFFFFFFFF);
+		BcuRxFlag[129] = 0x01;
+		break;
+	default:
+		break;
+	}
+}
+/**
+ * @brief : BcuCan涓㈠抚璇婃柇
+ * @param {*}
+ * @return {*}
+ */
+void BcuRxDiagnose(void)
+{
+	static UINT32 TimeCounter = 0;//ms
+	TimeCounter = TimeCounter + 10; //
+	/*
+	Can涓㈠抚璇婃柇
+	*/
+	for (UINT8 i = 0; i < sizeof(BcuInTable) / 4; i++)
+	{
+		if (BcuRxFlag[i] == 1) // received msg, and clear the error conter
+		{
+			BcuRxErrorCounter[i] = 0;
+			BcuRxFlag[i] = 0;
+			continue;
+		}
+		if (BcuRxErrorCounter[i] < 3)
+		{
+			BcuRxShortError[i] = 0;
+			BcuRxLongError[i] = 0;
+		}
+		else if (BcuRxErrorCounter[i] >= 3 && BcuRxErrorCounter[i] < 13)
+		{
+			BcuRxShortError[i] = 1;
+			BcuRxLongError[i] = 0;
+		}
+		else if (BcuRxErrorCounter[i] >= 13)
+		{
+			BcuRxShortError[i] = 0;
+			BcuRxLongError[i] = 1;
+			BcuRxMsgSetInvalidValue(BcuInTable[i]);
+			BcuRxErrorCounter[i] = 0;
+		}
+		else if (BcuRxErrorCounter[i] == 0xFF)
+		{
+			BcuRxErrorCounter[i] = 0xFE;
+		}
+	}
+	/*
+	CAN涓㈠抚绱
+	*/
+	if (TimeCounter % 100 == 0) // period <=100ms
+	{
+		BcuRxErrorCounter[99]++; // can msg 0x1883EFF4
+		// if(BcuRxErrorCounter[99]>=13)
+		BcuRxErrorCounter[100]++; // can msg 0x1884EFF4
+		// if(BcuRxErrorCounter[100]>=13)
+		BcuRxErrorCounter[118]++; // can msg 0x18FF23F4
+		// if(BcuRxErrorCounter[118]>=13)
+		BcuRxErrorCounter[120]++; // can msg 0x18FF25F4
+								  // if(BcuRxErrorCounter[120]>=13)
+	}
+	if (TimeCounter % 200 == 0) // period ==200ms
+	{
+		BcuRxErrorCounter[103]++; // can msg 0x1887EFF4
+		// if(BcuRxErrorCounter[103]>=13)
+		// printf("can msg 0x%x lost,cycle time200ms\n",COMInTable[103]);
+		BcuRxErrorCounter[121]++; // can msg 0x18FF30F4
+								  // if(BcuRxErrorCounter[121]>=13)
+								  // printf("can msg 0x%x lost,cycle time200ms\n",COMInTable[121]);
+	}
+	if (TimeCounter % 500 == 0) // period ==500ms
+	{
+		BcuRxErrorCounter[0]++; // can msg 0x1801EFF4
+		// if(BcuRxErrorCounter[0]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[0]);
+		BcuRxErrorCounter[1]++; // can msg 0x1801FBF4
+		// if(BcuRxErrorCounter[1]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[1]);
+		BcuRxErrorCounter[2]++; // can msg 0x1802FBF4
+		// if(BcuRxErrorCounter[2]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[2]);
+		BcuRxErrorCounter[3]++; // can msg 0x1803FBF4
+		// if(BcuRxErrorCounter[3]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[3]);
+		BcuRxErrorCounter[4]++; // can msg 0x1804FBF4
+		// if(BcuRxErrorCounter[4]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[4]);
+		BcuRxErrorCounter[5]++; // can msg 0x1805FBF4
+		// if(BcuRxErrorCounter[5]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[5]);
+		BcuRxErrorCounter[6]++; // can msg 0x1806FBF4
+		// if(BcuRxErrorCounter[6]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[6]);
+		BcuRxErrorCounter[7]++; // can msg 0x1807FBF4
+		// if(BcuRxErrorCounter[7]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[7]);
+		BcuRxErrorCounter[8]++; // can msg 0x1808FBF4
+		// if(BcuRxErrorCounter[8]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[8]);
+		BcuRxErrorCounter[9]++; // can msg 0x1809FBF4
+		// if(BcuRxErrorCounter[9]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[9]);
+		BcuRxErrorCounter[10]++; // can msg 0x180AFBF4
+		// if(BcuRxErrorCounter[10]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[10]);
+		BcuRxErrorCounter[11]++; // can msg 0x180BFBF4
+		// if(BcuRxErrorCounter[11]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[11]);
+		BcuRxErrorCounter[12]++; // can msg 0x180CFBF4
+		// if(BcuRxErrorCounter[12]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[12]);
+		BcuRxErrorCounter[13]++; // can msg 0x180DFBF4
+		// if(BcuRxErrorCounter[13]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[13]);
+		BcuRxErrorCounter[14]++; // can msg 0x180EFBF4
+		// if(BcuRxErrorCounter[14]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[14]);
+		BcuRxErrorCounter[15]++; // can msg 0x180FFBF4
+		// if(BcuRxErrorCounter[15]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[15]);
+		BcuRxErrorCounter[16]++; // can msg 0x1810FBF4
+		// if(BcuRxErrorCounter[16]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[16]);
+		BcuRxErrorCounter[17]++; // can msg 0x1811FBF4
+		// if(BcuRxErrorCounter[17]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[17]);
+		BcuRxErrorCounter[18]++; // can msg 0x1812FBF4
+		// if(BcuRxErrorCounter[18]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[18]);
+		BcuRxErrorCounter[19]++; // can msg 0x1813FBF4
+		// if(BcuRxErrorCounter[19]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[19]);
+		BcuRxErrorCounter[20]++; // can msg 0x1814FBF4
+		// if(BcuRxErrorCounter[20]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[20]);
+		BcuRxErrorCounter[21]++; // can msg 0x1815FBF4
+		// if(BcuRxErrorCounter[21]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[21]);
+		BcuRxErrorCounter[22]++; // can msg 0x1816FBF4
+		// if(BcuRxErrorCounter[22]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[22]);
+		BcuRxErrorCounter[23]++; // can msg 0x1817FBF4
+		// if(BcuRxErrorCounter[23]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[23]);
+		BcuRxErrorCounter[24]++; // can msg 0x1818FBF4
+		// if(BcuRxErrorCounter[24]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[24]);
+		BcuRxErrorCounter[25]++; // can msg 0x1819FBF4
+		// if(BcuRxErrorCounter[25]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[25]);
+		BcuRxErrorCounter[26]++; // can msg 0x181AFBF4
+		// if(BcuRxErrorCounter[26]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[26]);
+		BcuRxErrorCounter[27]++; // can msg 0x181BFBF4
+		// if(BcuRxErrorCounter[27]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[27]);
+		BcuRxErrorCounter[28]++; // can msg 0x181CFBF4
+		// if(BcuRxErrorCounter[28]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[28]);
+		BcuRxErrorCounter[29]++; // can msg 0x181DFBF4
+		// if(BcuRxErrorCounter[29]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[29]);
+		BcuRxErrorCounter[30]++; // can msg 0x181EFBF4
+		// if(BcuRxErrorCounter[30]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[30]);
+		BcuRxErrorCounter[31]++; // can msg 0x181FFBF4
+		// if(BcuRxErrorCounter[31]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[31]);
+		BcuRxErrorCounter[32]++; // can msg 0x1820FBF4
+		// if(BcuRxErrorCounter[32]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[32]);
+		BcuRxErrorCounter[33]++; // can msg 0x1821FBF4
+		// if(BcuRxErrorCounter[33]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[33]);
+		BcuRxErrorCounter[34]++; // can msg 0x1822FBF4
+		// if(BcuRxErrorCounter[34]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[34]);
+		BcuRxErrorCounter[35]++; // can msg 0x1823FBF4
+		// if(BcuRxErrorCounter[35]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[35]);
+		BcuRxErrorCounter[36]++; // can msg 0x1824FBF4
+		// if(BcuRxErrorCounter[36]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[36]);
+		BcuRxErrorCounter[37]++; // can msg 0x1825FBF4
+		// if(BcuRxErrorCounter[37]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[37]);
+		BcuRxErrorCounter[38]++; // can msg 0x1826FBF4
+		// if(BcuRxErrorCounter[38]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[38]);
+		BcuRxErrorCounter[39]++; // can msg 0x1827FBF4
+		// if(BcuRxErrorCounter[39]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[39]);
+		BcuRxErrorCounter[40]++; // can msg 0x1828FBF4
+		// if(BcuRxErrorCounter[40]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[40]);
+		BcuRxErrorCounter[41]++; // can msg 0x1829FBF4
+		// if(BcuRxErrorCounter[41]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[41]);
+		BcuRxErrorCounter[42]++; // can msg 0x182AFBF4
+		// if(BcuRxErrorCounter[42]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[42]);
+		BcuRxErrorCounter[43]++; // can msg 0x182BFBF4
+		// if(BcuRxErrorCounter[43]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[43]);
+		BcuRxErrorCounter[44]++; // can msg 0x182CFBF4
+		// if(BcuRxErrorCounter[44]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[44]);
+		BcuRxErrorCounter[45]++; // can msg 0x182DFBF4
+		// if(BcuRxErrorCounter[45]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[45]);
+		BcuRxErrorCounter[46]++; // can msg 0x182EFBF4
+		// if(BcuRxErrorCounter[46]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[46]);
+		BcuRxErrorCounter[47]++; // can msg 0x182FFBF4
+		// if(BcuRxErrorCounter[47]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[47]);
+		BcuRxErrorCounter[48]++; // can msg 0x1830FBF4
+		// if(BcuRxErrorCounter[48]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[48]);
+		BcuRxErrorCounter[49]++; // can msg 0x1831FBF4
+		// if(BcuRxErrorCounter[49]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[49]);
+		BcuRxErrorCounter[50]++; // can msg 0x1832FBF4
+		// if(BcuRxErrorCounter[50]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[50]);
+		BcuRxErrorCounter[51]++; // can msg 0x1833FBF4
+		// if(BcuRxErrorCounter[51]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[51]);
+		BcuRxErrorCounter[52]++; // can msg 0x1834FBF4
+		// if(BcuRxErrorCounter[52]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[52]);
+		BcuRxErrorCounter[53]++; // can msg 0x1835FBF4
+		// if(BcuRxErrorCounter[53]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[53]);
+		BcuRxErrorCounter[54]++; // can msg 0x1836FBF4
+		// if(BcuRxErrorCounter[54]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[54]);
+		BcuRxErrorCounter[55]++; // can msg 0x1837FBF4
+		// if(BcuRxErrorCounter[55]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[55]);
+		BcuRxErrorCounter[56]++; // can msg 0x1838FBF4
+		// if(BcuRxErrorCounter[56]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[56]);
+		BcuRxErrorCounter[57]++; // can msg 0x1839FBF4
+		// if(BcuRxErrorCounter[57]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[57]);
+		BcuRxErrorCounter[58]++; // can msg 0x183AFBF4
+		// if(BcuRxErrorCounter[58]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[58]);
+		BcuRxErrorCounter[59]++; // can msg 0x183BFBF4
+		// if(BcuRxErrorCounter[59]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[59]);
+		BcuRxErrorCounter[60]++; // can msg 0x183CFBF4
+		// if(BcuRxErrorCounter[60]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[60]);
+		BcuRxErrorCounter[61]++; // can msg 0x183DFBF4
+		// if(BcuRxErrorCounter[61]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[61]);
+		BcuRxErrorCounter[62]++; // can msg 0x183EFBF4
+		// if(BcuRxErrorCounter[62]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[62]);
+		BcuRxErrorCounter[63]++; // can msg 0x183FFBF4
+		// if(BcuRxErrorCounter[63]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[63]);
+		BcuRxErrorCounter[64]++; // can msg 0x1840FBF4
+		// if(BcuRxErrorCounter[64]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[64]);
+		BcuRxErrorCounter[65]++; // can msg 0x1841FBF4
+		// if(BcuRxErrorCounter[65]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[65]);
+		BcuRxErrorCounter[66]++; // can msg 0x1842FBF4
+		// if(BcuRxErrorCounter[66]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[66]);
+		BcuRxErrorCounter[67]++; // can msg 0x1843FBF4
+		// if(BcuRxErrorCounter[67]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[67]);
+		BcuRxErrorCounter[68]++; // can msg 0x1844FBF4
+		// if(BcuRxErrorCounter[68]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[68]);
+		BcuRxErrorCounter[69]++; // can msg 0x1845FBF4
+		// if(BcuRxErrorCounter[69]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[69]);
+		BcuRxErrorCounter[70]++; // can msg 0x1846FBF4
+		// if(BcuRxErrorCounter[70]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[70]);
+		BcuRxErrorCounter[71]++; // can msg 0x1847FBF4
+		// if(BcuRxErrorCounter[71]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[71]);
+		BcuRxErrorCounter[72]++; // can msg 0x1848FBF4
+		// if(BcuRxErrorCounter[72]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[72]);
+		BcuRxErrorCounter[73]++; // can msg 0x1849FBF4
+		// if(BcuRxErrorCounter[73]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[73]);
+		BcuRxErrorCounter[74]++; // can msg 0x184AFBF4
+		// if(BcuRxErrorCounter[74]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[74]);
+		BcuRxErrorCounter[75]++; // can msg 0x184BFBF4
+		// if(BcuRxErrorCounter[75]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[75]);
+		BcuRxErrorCounter[76]++; // can msg 0x184CFBF4
+		// if(BcuRxErrorCounter[76]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[76]);
+		BcuRxErrorCounter[77]++; // can msg 0x184DFBF4
+		// if(BcuRxErrorCounter[77]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[77]);
+		BcuRxErrorCounter[78]++; // can msg 0x184EFBF4
+		// if(BcuRxErrorCounter[78]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[78]);
+		BcuRxErrorCounter[79]++; // can msg 0x184FFBF4
+		// if(BcuRxErrorCounter[79]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[79]);
+		BcuRxErrorCounter[80]++; // can msg 0x1850FBF4
+		// if(BcuRxErrorCounter[80]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[80]);
+		BcuRxErrorCounter[81]++; // can msg 0x1851FBF4
+		// if(BcuRxErrorCounter[81]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[81]);
+		BcuRxErrorCounter[82]++; // can msg 0x1852FBF4
+		// if(BcuRxErrorCounter[82]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[82]);
+		BcuRxErrorCounter[83]++; // can msg 0x1853FBF4
+		// if(BcuRxErrorCounter[83]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[83]);
+		BcuRxErrorCounter[84]++; // can msg 0x1854FBF4
+		// if(BcuRxErrorCounter[84]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[84]);
+		BcuRxErrorCounter[85]++; // can msg 0x1855FBF4
+		// if(BcuRxErrorCounter[85]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[85]);
+		BcuRxErrorCounter[86]++; // can msg 0x1856FBF4
+		// if(BcuRxErrorCounter[86]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[86]);
+		BcuRxErrorCounter[87]++; // can msg 0x1857FBF4
+		// if(BcuRxErrorCounter[87]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[87]);
+		BcuRxErrorCounter[88]++; // can msg 0x1858FBF4
+		// if(BcuRxErrorCounter[88]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[88]);
+		BcuRxErrorCounter[89]++; // can msg 0x1859FBF4
+		// if(BcuRxErrorCounter[89]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[89]);
+		BcuRxErrorCounter[90]++; // can msg 0x185AFBF4
+		// if(BcuRxErrorCounter[90]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[90]);
+		BcuRxErrorCounter[91]++; // can msg 0x185BFBF4
+		// if(BcuRxErrorCounter[91]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[91]);
+		BcuRxErrorCounter[92]++; // can msg 0x185CFBF4
+		// if(BcuRxErrorCounter[92]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[92]);
+		BcuRxErrorCounter[93]++; // can msg 0x185DFBF4
+		// if(BcuRxErrorCounter[93]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[93]);
+		BcuRxErrorCounter[94]++; // can msg 0x185EFBF4
+		// if(BcuRxErrorCounter[94]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[94]);
+		BcuRxErrorCounter[95]++; // can msg 0x185FFBF4
+		// if(BcuRxErrorCounter[95]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[95]);
+		BcuRxErrorCounter[96]++; // can msg 0x1860FBF4
+		// if(BcuRxErrorCounter[96]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[96]);
+		BcuRxErrorCounter[97]++; // can msg 0x1881EFF4
+		// if(BcuRxErrorCounter[97]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[97]);
+		BcuRxErrorCounter[98]++; // can msg 0x1882EFF4
+		// if(BcuRxErrorCounter[98]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[98]);
+		BcuRxErrorCounter[101]++; // can msg 0x1885EFF4
+		// if(BcuRxErrorCounter[101]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[101]);
+		BcuRxErrorCounter[102]++; // can msg 0x1886EFF4
+		// if(BcuRxErrorCounter[102]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[102]);
+		BcuRxErrorCounter[104]++; // can msg 0x1888EFF4
+		// if(BcuRxErrorCounter[104]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[104]);
+		BcuRxErrorCounter[105]++; // can msg 0x1889EFF4
+		// if(BcuRxErrorCounter[105]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[105]);
+		BcuRxErrorCounter[106]++; // can msg 0x18A0FBF4
+		// if(BcuRxErrorCounter[106]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[106]);
+		BcuRxErrorCounter[107]++; // can msg 0x18A1FBF4
+		// if(BcuRxErrorCounter[107]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[107]);
+		BcuRxErrorCounter[108]++; // can msg 0x18A2FBF4
+		// if(BcuRxErrorCounter[108]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[108]);
+		BcuRxErrorCounter[109]++; // can msg 0x18A3FBF4
+		// if(BcuRxErrorCounter[109]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[109]);
+		BcuRxErrorCounter[110]++; // can msg 0x18A4FBF4
+		// if(BcuRxErrorCounter[110]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[110]);
+		BcuRxErrorCounter[111]++; // can msg 0x18A5FBF4
+		// if(BcuRxErrorCounter[111]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[111]);
+		BcuRxErrorCounter[112]++; // can msg 0x18A6FBF4
+								  // if(BcuRxErrorCounter[112]>=13)
+								  // printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[112]);
+	}
+	if (TimeCounter % 1000 == 0) // period ==1000ms
+	{
+		BcuRxErrorCounter[113]++; // can msg 0x18E1EFF4
+		// if(BcuRxErrorCounter[113]>=13)
+		// printf("can msg 0x%x lost,cycle time1000ms\n",COMInTable[113]);
+		BcuRxErrorCounter[114]++; // can msg 0x18E2EFF4
+		// if(BcuRxErrorCounter[114]>=13)
+		// printf("can msg 0x%x lost,cycle time1000ms\n",COMInTable[114]);
+		BcuRxErrorCounter[115]++; // can msg 0x18E3EFF4
+		// if(BcuRxErrorCounter[115]>=13)
+		// printf("can msg 0x%x lost,cycle time1000ms\n",COMInTable[115]);
+		BcuRxErrorCounter[116]++; // can msg 0x18E4EFF4
+		// if(BcuRxErrorCounter[116]>=13)
+		// printf("can msg 0x%x lost,cycle time1000ms\n",COMInTable[116]);
+		BcuRxErrorCounter[117]++; // can msg 0x18FEDAF4
+		// if(BcuRxErrorCounter[117]>=13)
+		// printf("can msg 0x%x lost,cycle time1000ms\n",COMInTable[117]);
+		BcuRxErrorCounter[119]++; // can msg 0x18FF24F4
+		// if(BcuRxErrorCounter[119]>=13)
+		// printf("can msg 0x%x lost,cycle time1000ms\n",COMInTable[119]);
+		BcuRxErrorCounter[122]++; // can msg 0x18FF45F4
+		// if(BcuRxErrorCounter[122]>=13)
+		// printf("can msg 0x%x lost,cycle time1000ms\n",COMInTable[122]);
+		BcuRxErrorCounter[123]++; // can msg 0x18FFC13A
+		// if(BcuRxErrorCounter[123]>=13)
+		// printf("can msg 0x%x lost,cycle time1000ms\n",COMInTable[123]);
+		BcuRxErrorCounter[124]++; // can msg 0x18FFD4F4
+		// if(BcuRxErrorCounter[124]>=13)
+		// printf("can msg 0x%x lost,cycle time1000ms\n",COMInTable[124]);
+		BcuRxErrorCounter[125]++; // can msg 0x18FFD5F4
+		// if(BcuRxErrorCounter[125]>=13)
+		// printf("can msg 0x%x lost,cycle time1000ms\n",COMInTable[125]);
+		BcuRxErrorCounter[126]++; // can msg 0x18FFD6F4
+		// if(BcuRxErrorCounter[126]>=13)
+		// printf("can msg 0x%x lost,cycle time1000ms\n",COMInTable[126]);
+		BcuRxErrorCounter[127]++; // can msg 0x18FFD7F4
+		// if(BcuRxErrorCounter[127]>=13)
+		// printf("can msg 0x%x lost,cycle time1000ms\n",COMInTable[127]);
+		BcuRxErrorCounter[128]++; // can msg 0x18FFD8F4
+		// if(BcuRxErrorCounter[128]>=13)
+		// printf("can msg 0x%x lost,cycle time1000ms\n",COMInTable[128]);
+		BcuRxErrorCounter[129]++; // can msg 0x18FFD9F4
+								  // if(BcuRxErrorCounter[129]>=13)
+								  // printf("can msg 0x%x lost,cycle time1000ms\n",COMInTable[129]);
+	}
+	if (TimeCounter % 2000 == 0) // period ==2000ms
+	{
+	}
+	if (TimeCounter % 3000 == 0) // period ==3000ms
+	{
+	}
+	if (TimeCounter % 5000 == 0) // period ==5000ms
+	{
+	}
+}
+/**
+ * @brief :Bcu涓㈠抚鍒濆鍖栬祴鍊�
+ * @param {UINT32} ID
+ * @return {*}
+ */
+void BcuRxMsgSetInvalidValue(UINT32 ID)
+{
+	switch (ID)
+	{
+	case 0x1801EFF4:
+		BMS13_ReqVIN = 0xFF;
+		break;
+	case 0x1801FBF4:
+		BMS_Cell_Volt[0] = 0xFFFF;
+		BMS_Cell_Volt[1] = 0xFFFF;
+		BMS_Cell_Volt[2] = 0xFFFF;
+		BMS_Cell_Volt[3] = 0xFFFF;
+		break;
+	case 0x1802FBF4:
+		BMS_Cell_Volt[4] = 0xFFFF;
+		BMS_Cell_Volt[5] = 0xFFFF;
+		BMS_Cell_Volt[6] = 0xFFFF;
+		BMS_Cell_Volt[7] = 0xFFFF;
+		break;
+	case 0x1803FBF4:
+		BMS_Cell_Volt[8] = 0xFFFF;
+		BMS_Cell_Volt[9] = 0xFFFF;
+		BMS_Cell_Volt[10] = 0xFFFF;
+		BMS_Cell_Volt[11] = 0xFFFF;
+		break;
+	case 0x1804FBF4:
+		BMS_Cell_Volt[12] = 0xFFFF;
+		BMS_Cell_Volt[13] = 0xFFFF;
+		BMS_Cell_Volt[14] = 0xFFFF;
+		BMS_Cell_Volt[15] = 0xFFFF;
+		break;
+	case 0x1805FBF4:
+		BMS_Cell_Volt[16] = 0xFFFF;
+		BMS_Cell_Volt[17] = 0xFFFF;
+		BMS_Cell_Volt[18] = 0xFFFF;
+		BMS_Cell_Volt[19] = 0xFFFF;
+		break;
+	case 0x1806FBF4:
+		BMS_Cell_Volt[20] = 0xFFFF;
+		BMS_Cell_Volt[21] = 0xFFFF;
+		BMS_Cell_Volt[22] = 0xFFFF;
+		BMS_Cell_Volt[23] = 0xFFFF;
+		break;
+	case 0x1807FBF4:
+		BMS_Cell_Volt[24] = 0xFFFF;
+		BMS_Cell_Volt[25] = 0xFFFF;
+		BMS_Cell_Volt[26] = 0xFFFF;
+		BMS_Cell_Volt[27] = 0xFFFF;
+		break;
+	case 0x1808FBF4:
+		BMS_Cell_Volt[28] = 0xFFFF;
+		BMS_Cell_Volt[29] = 0xFFFF;
+		BMS_Cell_Volt[30] = 0xFFFF;
+		BMS_Cell_Volt[31] = 0xFFFF;
+		break;
+	case 0x1809FBF4:
+		BMS_Cell_Volt[32] = 0xFFFF;
+		BMS_Cell_Volt[33] = 0xFFFF;
+		BMS_Cell_Volt[34] = 0xFFFF;
+		BMS_Cell_Volt[35] = 0xFFFF;
+		break;
+	case 0x180AFBF4:
+		BMS_Cell_Volt[36] = 0xFFFF;
+		BMS_Cell_Volt[37] = 0xFFFF;
+		BMS_Cell_Volt[38] = 0xFFFF;
+		BMS_Cell_Volt[39] = 0xFFFF;
+		break;
+	case 0x180BFBF4:
+		BMS_Cell_Volt[40] = 0xFFFF;
+		BMS_Cell_Volt[41] = 0xFFFF;
+		BMS_Cell_Volt[42] = 0xFFFF;
+		BMS_Cell_Volt[43] = 0xFFFF;
+		break;
+	case 0x180CFBF4:
+		BMS_Cell_Volt[44] = 0xFFFF;
+		BMS_Cell_Volt[45] = 0xFFFF;
+		BMS_Cell_Volt[46] = 0xFFFF;
+		BMS_Cell_Volt[47] = 0xFFFF;
+		break;
+	case 0x180DFBF4:
+		BMS_Cell_Volt[48] = 0xFFFF;
+		BMS_Cell_Volt[49] = 0xFFFF;
+		BMS_Cell_Volt[50] = 0xFFFF;
+		BMS_Cell_Volt[51] = 0xFFFF;
+		break;
+	case 0x180EFBF4:
+		BMS_Cell_Volt[52] = 0xFFFF;
+		BMS_Cell_Volt[53] = 0xFFFF;
+		BMS_Cell_Volt[54] = 0xFFFF;
+		BMS_Cell_Volt[55] = 0xFFFF;
+		break;
+	case 0x180FFBF4:
+		BMS_Cell_Volt[56] = 0xFFFF;
+		BMS_Cell_Volt[57] = 0xFFFF;
+		BMS_Cell_Volt[58] = 0xFFFF;
+		BMS_Cell_Volt[59] = 0xFFFF;
+		break;
+	case 0x1810FBF4:
+		BMS_Cell_Volt[60] = 0xFFFF;
+		BMS_Cell_Volt[61] = 0xFFFF;
+		BMS_Cell_Volt[62] = 0xFFFF;
+		BMS_Cell_Volt[63] = 0xFFFF;
+		break;
+	case 0x1811FBF4:
+		BMS_Cell_Volt[64] = 0xFFFF;
+		BMS_Cell_Volt[65] = 0xFFFF;
+		BMS_Cell_Volt[66] = 0xFFFF;
+		BMS_Cell_Volt[67] = 0xFFFF;
+		break;
+	case 0x1812FBF4:
+		BMS_Cell_Volt[68] = 0xFFFF;
+		BMS_Cell_Volt[69] = 0xFFFF;
+		BMS_Cell_Volt[70] = 0xFFFF;
+		BMS_Cell_Volt[71] = 0xFFFF;
+		break;
+	case 0x1813FBF4:
+		BMS_Cell_Volt[72] = 0xFFFF;
+		BMS_Cell_Volt[73] = 0xFFFF;
+		BMS_Cell_Volt[74] = 0xFFFF;
+		BMS_Cell_Volt[75] = 0xFFFF;
+		break;
+	case 0x1814FBF4:
+		BMS_Cell_Volt[76] = 0xFFFF;
+		BMS_Cell_Volt[77] = 0xFFFF;
+		BMS_Cell_Volt[78] = 0xFFFF;
+		BMS_Cell_Volt[79] = 0xFFFF;
+		break;
+	case 0x1815FBF4:
+		BMS_Cell_Volt[80] = 0xFFFF;
+		BMS_Cell_Volt[81] = 0xFFFF;
+		BMS_Cell_Volt[82] = 0xFFFF;
+		BMS_Cell_Volt[83] = 0xFFFF;
+		break;
+	case 0x1816FBF4:
+		BMS_Cell_Volt[84] = 0xFFFF;
+		BMS_Cell_Volt[85] = 0xFFFF;
+		BMS_Cell_Volt[86] = 0xFFFF;
+		BMS_Cell_Volt[87] = 0xFFFF;
+		break;
+	case 0x1817FBF4:
+		BMS_Cell_Volt[88] = 0xFFFF;
+		BMS_Cell_Volt[89] = 0xFFFF;
+		BMS_Cell_Volt[90] = 0xFFFF;
+		BMS_Cell_Volt[91] = 0xFFFF;
+		break;
+	case 0x1818FBF4:
+		BMS_Cell_Volt[92] = 0xFFFF;
+		BMS_Cell_Volt[93] = 0xFFFF;
+		BMS_Cell_Volt[94] = 0xFFFF;
+		BMS_Cell_Volt[95] = 0xFFFF;
+		break;
+	case 0x1819FBF4:
+		BMS_Cell_Volt[96] = 0xFFFF;
+		BMS_Cell_Volt[97] = 0xFFFF;
+		BMS_Cell_Volt[98] = 0xFFFF;
+		BMS_Cell_Volt[99] = 0xFFFF;
+		break;
+	case 0x181AFBF4:
+		BMS_Cell_Volt[100] = 0xFFFF;
+		BMS_Cell_Volt[101] = 0xFFFF;
+		BMS_Cell_Volt[102] = 0xFFFF;
+		BMS_Cell_Volt[103] = 0xFFFF;
+		break;
+	case 0x181BFBF4:
+		BMS_Cell_Volt[104] = 0xFFFF;
+		BMS_Cell_Volt[105] = 0xFFFF;
+		BMS_Cell_Volt[106] = 0xFFFF;
+		BMS_Cell_Volt[107] = 0xFFFF;
+		break;
+	case 0x181CFBF4:
+		BMS_Cell_Volt[108] = 0xFFFF;
+		BMS_Cell_Volt[109] = 0xFFFF;
+		BMS_Cell_Volt[110] = 0xFFFF;
+		BMS_Cell_Volt[111] = 0xFFFF;
+		break;
+	case 0x181DFBF4:
+		BMS_Cell_Volt[112] = 0xFFFF;
+		BMS_Cell_Volt[113] = 0xFFFF;
+		BMS_Cell_Volt[114] = 0xFFFF;
+		BMS_Cell_Volt[115] = 0xFFFF;
+		break;
+	case 0x181EFBF4:
+		BMS_Cell_Volt[116] = 0xFFFF;
+		BMS_Cell_Volt[117] = 0xFFFF;
+		BMS_Cell_Volt[118] = 0xFFFF;
+		BMS_Cell_Volt[119] = 0xFFFF;
+		break;
+	case 0x181FFBF4:
+		BMS_Cell_Volt[120] = 0xFFFF;
+		BMS_Cell_Volt[121] = 0xFFFF;
+		BMS_Cell_Volt[122] = 0xFFFF;
+		BMS_Cell_Volt[123] = 0xFFFF;
+		break;
+	case 0x1820FBF4:
+		BMS_Cell_Volt[124] = 0xFFFF;
+		BMS_Cell_Volt[125] = 0xFFFF;
+		BMS_Cell_Volt[126] = 0xFFFF;
+		BMS_Cell_Volt[127] = 0xFFFF;
+		break;
+	case 0x1821FBF4:
+		BMS_Cell_Volt[128] = 0xFFFF;
+		BMS_Cell_Volt[129] = 0xFFFF;
+		BMS_Cell_Volt[130] = 0xFFFF;
+		BMS_Cell_Volt[131] = 0xFFFF;
+		break;
+	case 0x1822FBF4:
+		BMS_Cell_Volt[132] = 0xFFFF;
+		BMS_Cell_Volt[133] = 0xFFFF;
+		BMS_Cell_Volt[134] = 0xFFFF;
+		BMS_Cell_Volt[135] = 0xFFFF;
+		break;
+	case 0x1823FBF4:
+		BMS_Cell_Volt[136] = 0xFFFF;
+		BMS_Cell_Volt[137] = 0xFFFF;
+		BMS_Cell_Volt[138] = 0xFFFF;
+		BMS_Cell_Volt[139] = 0xFFFF;
+		break;
+	case 0x1824FBF4:
+		BMS_Cell_Volt[140] = 0xFFFF;
+		BMS_Cell_Volt[141] = 0xFFFF;
+		BMS_Cell_Volt[142] = 0xFFFF;
+		BMS_Cell_Volt[143] = 0xFFFF;
+		break;
+	case 0x1825FBF4:
+		BMS_Cell_Volt[144] = 0xFFFF;
+		BMS_Cell_Volt[145] = 0xFFFF;
+		BMS_Cell_Volt[146] = 0xFFFF;
+		BMS_Cell_Volt[147] = 0xFFFF;
+		break;
+	case 0x1826FBF4:
+		BMS_Cell_Volt[148] = 0xFFFF;
+		BMS_Cell_Volt[149] = 0xFFFF;
+		BMS_Cell_Volt[150] = 0xFFFF;
+		BMS_Cell_Volt[151] = 0xFFFF;
+		break;
+	case 0x1827FBF4:
+		BMS_Cell_Volt[152] = 0xFFFF;
+		BMS_Cell_Volt[153] = 0xFFFF;
+		BMS_Cell_Volt[154] = 0xFFFF;
+		BMS_Cell_Volt[155] = 0xFFFF;
+		break;
+	case 0x1828FBF4:
+		BMS_Cell_Volt[156] = 0xFFFF;
+		BMS_Cell_Volt[157] = 0xFFFF;
+		BMS_Cell_Volt[158] = 0xFFFF;
+		BMS_Cell_Volt[159] = 0xFFFF;
+		break;
+	case 0x1829FBF4:
+		BMS_Cell_Volt[160] = 0xFFFF;
+		BMS_Cell_Volt[161] = 0xFFFF;
+		BMS_Cell_Volt[162] = 0xFFFF;
+		BMS_Cell_Volt[163] = 0xFFFF;
+		break;
+	case 0x182AFBF4:
+		BMS_Cell_Volt[164] = 0xFFFF;
+		BMS_Cell_Volt[165] = 0xFFFF;
+		BMS_Cell_Volt[166] = 0xFFFF;
+		BMS_Cell_Volt[167] = 0xFFFF;
+		break;
+	case 0x182BFBF4:
+		BMS_Cell_Volt[168] = 0xFFFF;
+		BMS_Cell_Volt[169] = 0xFFFF;
+		BMS_Cell_Volt[170] = 0xFFFF;
+		BMS_Cell_Volt[171] = 0xFFFF;
+		break;
+	case 0x182CFBF4:
+		BMS_Cell_Volt[172] = 0xFFFF;
+		BMS_Cell_Volt[173] = 0xFFFF;
+		BMS_Cell_Volt[174] = 0xFFFF;
+		BMS_Cell_Volt[175] = 0xFFFF;
+		break;
+	case 0x182DFBF4:
+		BMS_Cell_Volt[176] = 0xFFFF;
+		BMS_Cell_Volt[177] = 0xFFFF;
+		BMS_Cell_Volt[178] = 0xFFFF;
+		BMS_Cell_Volt[179] = 0xFFFF;
+		break;
+	case 0x182EFBF4:
+		BMS_Cell_Volt[180] = 0xFFFF;
+		BMS_Cell_Volt[181] = 0xFFFF;
+		BMS_Cell_Volt[182] = 0xFFFF;
+		BMS_Cell_Volt[183] = 0xFFFF;
+		break;
+	case 0x182FFBF4:
+		BMS_Cell_Volt[184] = 0xFFFF;
+		BMS_Cell_Volt[185] = 0xFFFF;
+		BMS_Cell_Volt[186] = 0xFFFF;
+		BMS_Cell_Volt[187] = 0xFFFF;
+		break;
+	case 0x1830FBF4:
+		BMS_Cell_Volt[188] = 0xFFFF;
+		BMS_Cell_Volt[189] = 0xFFFF;
+		BMS_Cell_Volt[190] = 0xFFFF;
+		BMS_Cell_Volt[191] = 0xFFFF;
+		break;
+	case 0x1831FBF4:
+		BMS_Cell_Volt[192] = 0xFFFF;
+		BMS_Cell_Volt[193] = 0xFFFF;
+		BMS_Cell_Volt[194] = 0xFFFF;
+		BMS_Cell_Volt[195] = 0xFFFF;
+		break;
+	case 0x1832FBF4:
+		BMS_Cell_Volt[196] = 0xFFFF;
+		BMS_Cell_Volt[197] = 0xFFFF;
+		BMS_Cell_Volt[198] = 0xFFFF;
+		BMS_Cell_Volt[199] = 0xFFFF;
+		break;
+	case 0x1833FBF4:
+		BMS_Cell_Volt[200] = 0xFFFF;
+		BMS_Cell_Volt[201] = 0xFFFF;
+		BMS_Cell_Volt[202] = 0xFFFF;
+		BMS_Cell_Volt[203] = 0xFFFF;
+		break;
+	case 0x1834FBF4:
+		BMS_Cell_Volt[204] = 0xFFFF;
+		BMS_Cell_Volt[205] = 0xFFFF;
+		BMS_Cell_Volt[206] = 0xFFFF;
+		BMS_Cell_Volt[207] = 0xFFFF;
+		break;
+	case 0x1835FBF4:
+		BMS_Cell_Volt[208] = 0xFFFF;
+		BMS_Cell_Volt[209] = 0xFFFF;
+		BMS_Cell_Volt[210] = 0xFFFF;
+		BMS_Cell_Volt[211] = 0xFFFF;
+		break;
+	case 0x1836FBF4:
+		BMS_Cell_Volt[212] = 0xFFFF;
+		BMS_Cell_Volt[213] = 0xFFFF;
+		BMS_Cell_Volt[214] = 0xFFFF;
+		BMS_Cell_Volt[215] = 0xFFFF;
+		break;
+	case 0x1837FBF4:
+		BMS_Cell_Volt[216] = 0xFFFF;
+		BMS_Cell_Volt[217] = 0xFFFF;
+		BMS_Cell_Volt[218] = 0xFFFF;
+		BMS_Cell_Volt[219] = 0xFFFF;
+		break;
+	case 0x1838FBF4:
+		BMS_Cell_Volt[220] = 0xFFFF;
+		BMS_Cell_Volt[221] = 0xFFFF;
+		BMS_Cell_Volt[222] = 0xFFFF;
+		BMS_Cell_Volt[223] = 0xFFFF;
+		break;
+	case 0x1839FBF4:
+		BMS_Cell_Volt[224] = 0xFFFF;
+		BMS_Cell_Volt[225] = 0xFFFF;
+		BMS_Cell_Volt[226] = 0xFFFF;
+		BMS_Cell_Volt[227] = 0xFFFF;
+		break;
+	case 0x183AFBF4:
+		BMS_Cell_Volt[228] = 0xFFFF;
+		BMS_Cell_Volt[229] = 0xFFFF;
+		BMS_Cell_Volt[230] = 0xFFFF;
+		BMS_Cell_Volt[231] = 0xFFFF;
+		break;
+	case 0x183BFBF4:
+		BMS_Cell_Volt[232] = 0xFFFF;
+		BMS_Cell_Volt[233] = 0xFFFF;
+		BMS_Cell_Volt[234] = 0xFFFF;
+		BMS_Cell_Volt[235] = 0xFFFF;
+		break;
+	case 0x183CFBF4:
+		BMS_Cell_Volt[236] = 0xFFFF;
+		BMS_Cell_Volt[237] = 0xFFFF;
+		BMS_Cell_Volt[238] = 0xFFFF;
+		BMS_Cell_Volt[239] = 0xFFFF;
+		break;
+	case 0x183DFBF4:
+		BMS_Cell_Volt[240] = 0xFFFF;
+		BMS_Cell_Volt[241] = 0xFFFF;
+		BMS_Cell_Volt[242] = 0xFFFF;
+		BMS_Cell_Volt[243] = 0xFFFF;
+		break;
+	case 0x183EFBF4:
+		BMS_Cell_Volt[244] = 0xFFFF;
+		BMS_Cell_Volt[245] = 0xFFFF;
+		BMS_Cell_Volt[246] = 0xFFFF;
+		BMS_Cell_Volt[247] = 0xFFFF;
+		break;
+	case 0x183FFBF4:
+		BMS_Cell_Volt[248] = 0xFFFF;
+		BMS_Cell_Volt[249] = 0xFFFF;
+		BMS_Cell_Volt[250] = 0xFFFF;
+		BMS_Cell_Volt[251] = 0xFFFF;
+		break;
+	case 0x1840FBF4:
+		BMS_Cell_Volt[252] = 0xFFFF;
+		BMS_Cell_Volt[253] = 0xFFFF;
+		BMS_Cell_Volt[254] = 0xFFFF;
+		BMS_Cell_Volt[255] = 0xFFFF;
+		break;
+	case 0x1841FBF4:
+		BMS_Cell_Volt[256] = 0xFFFF;
+		BMS_Cell_Volt[257] = 0xFFFF;
+		BMS_Cell_Volt[258] = 0xFFFF;
+		BMS_Cell_Volt[259] = 0xFFFF;
+		break;
+	case 0x1842FBF4:
+		BMS_Cell_Volt[260] = 0xFFFF;
+		BMS_Cell_Volt[261] = 0xFFFF;
+		BMS_Cell_Volt[262] = 0xFFFF;
+		BMS_Cell_Volt[263] = 0xFFFF;
+		break;
+	case 0x1843FBF4:
+		BMS_Cell_Volt[264] = 0xFFFF;
+		BMS_Cell_Volt[265] = 0xFFFF;
+		BMS_Cell_Volt[266] = 0xFFFF;
+		BMS_Cell_Volt[267] = 0xFFFF;
+		break;
+	case 0x1844FBF4:
+		BMS_Cell_Volt[268] = 0xFFFF;
+		BMS_Cell_Volt[269] = 0xFFFF;
+		BMS_Cell_Volt[270] = 0xFFFF;
+		BMS_Cell_Volt[271] = 0xFFFF;
+		break;
+	case 0x1845FBF4:
+		BMS_Cell_Volt[272] = 0xFFFF;
+		BMS_Cell_Volt[273] = 0xFFFF;
+		BMS_Cell_Volt[274] = 0xFFFF;
+		BMS_Cell_Volt[275] = 0xFFFF;
+		break;
+	case 0x1846FBF4:
+		BMS_Cell_Volt[276] = 0xFFFF;
+		BMS_Cell_Volt[277] = 0xFFFF;
+		BMS_Cell_Volt[278] = 0xFFFF;
+		BMS_Cell_Volt[279] = 0xFFFF;
+		break;
+	case 0x1847FBF4:
+		BMS_Cell_Volt[280] = 0xFFFF;
+		BMS_Cell_Volt[281] = 0xFFFF;
+		BMS_Cell_Volt[282] = 0xFFFF;
+		BMS_Cell_Volt[283] = 0xFFFF;
+		break;
+	case 0x1848FBF4:
+		BMS_Cell_Volt[284] = 0xFFFF;
+		BMS_Cell_Volt[285] = 0xFFFF;
+		BMS_Cell_Volt[286] = 0xFFFF;
+		BMS_Cell_Volt[287] = 0xFFFF;
+		break;
+	case 0x1849FBF4:
+		BMS_Cell_Volt[288] = 0xFFFF;
+		BMS_Cell_Volt[289] = 0xFFFF;
+		BMS_Cell_Volt[290] = 0xFFFF;
+		BMS_Cell_Volt[291] = 0xFFFF;
+		break;
+	case 0x184AFBF4:
+		BMS_Cell_Volt[292] = 0xFFFF;
+		BMS_Cell_Volt[293] = 0xFFFF;
+		BMS_Cell_Volt[294] = 0xFFFF;
+		BMS_Cell_Volt[295] = 0xFFFF;
+		break;
+	case 0x184BFBF4:
+		BMS_Cell_Volt[296] = 0xFFFF;
+		BMS_Cell_Volt[297] = 0xFFFF;
+		BMS_Cell_Volt[298] = 0xFFFF;
+		BMS_Cell_Volt[299] = 0xFFFF;
+		break;
+	case 0x184CFBF4:
+		BMS_Cell_Volt[300] = 0xFFFF;
+		BMS_Cell_Volt[301] = 0xFFFF;
+		BMS_Cell_Volt[302] = 0xFFFF;
+		BMS_Cell_Volt[303] = 0xFFFF;
+		break;
+	case 0x184DFBF4:
+		BMS_Cell_Volt[304] = 0xFFFF;
+		BMS_Cell_Volt[305] = 0xFFFF;
+		BMS_Cell_Volt[306] = 0xFFFF;
+		BMS_Cell_Volt[307] = 0xFFFF;
+		break;
+	case 0x184EFBF4:
+		BMS_Cell_Volt[308] = 0xFFFF;
+		BMS_Cell_Volt[309] = 0xFFFF;
+		BMS_Cell_Volt[310] = 0xFFFF;
+		BMS_Cell_Volt[311] = 0xFFFF;
+		break;
+	case 0x184FFBF4:
+		BMS_Cell_Volt[312] = 0xFFFF;
+		BMS_Cell_Volt[313] = 0xFFFF;
+		BMS_Cell_Volt[314] = 0xFFFF;
+		BMS_Cell_Volt[315] = 0xFFFF;
+		break;
+	case 0x1850FBF4:
+		BMS_Cell_Volt[316] = 0xFFFF;
+		BMS_Cell_Volt[317] = 0xFFFF;
+		BMS_Cell_Volt[318] = 0xFFFF;
+		BMS_Cell_Volt[319] = 0xFFFF;
+		break;
+	case 0x1851FBF4:
+		BMS_Cell_Volt[320] = 0xFFFF;
+		BMS_Cell_Volt[321] = 0xFFFF;
+		BMS_Cell_Volt[322] = 0xFFFF;
+		BMS_Cell_Volt[323] = 0xFFFF;
+		break;
+	case 0x1852FBF4:
+		BMS_Cell_Volt[324] = 0xFFFF;
+		BMS_Cell_Volt[325] = 0xFFFF;
+		BMS_Cell_Volt[326] = 0xFFFF;
+		BMS_Cell_Volt[327] = 0xFFFF;
+		break;
+	case 0x1853FBF4:
+		BMS_Cell_Volt[328] = 0xFFFF;
+		BMS_Cell_Volt[329] = 0xFFFF;
+		BMS_Cell_Volt[330] = 0xFFFF;
+		BMS_Cell_Volt[331] = 0xFFFF;
+		break;
+	case 0x1854FBF4:
+		BMS_Cell_Volt[332] = 0xFFFF;
+		BMS_Cell_Volt[333] = 0xFFFF;
+		BMS_Cell_Volt[334] = 0xFFFF;
+		BMS_Cell_Volt[335] = 0xFFFF;
+		break;
+	case 0x1855FBF4:
+		BMS_Cell_Volt[336] = 0xFFFF;
+		BMS_Cell_Volt[337] = 0xFFFF;
+		BMS_Cell_Volt[338] = 0xFFFF;
+		BMS_Cell_Volt[339] = 0xFFFF;
+		break;
+	case 0x1856FBF4:
+		BMS_Cell_Volt[340] = 0xFFFF;
+		BMS_Cell_Volt[341] = 0xFFFF;
+		BMS_Cell_Volt[342] = 0xFFFF;
+		BMS_Cell_Volt[343] = 0xFFFF;
+		break;
+	case 0x1857FBF4:
+		BMS_Cell_Volt[344] = 0xFFFF;
+		BMS_Cell_Volt[345] = 0xFFFF;
+		BMS_Cell_Volt[346] = 0xFFFF;
+		BMS_Cell_Volt[347] = 0xFFFF;
+		break;
+	case 0x1858FBF4:
+		BMS_Cell_Volt[348] = 0xFFFF;
+		BMS_Cell_Volt[349] = 0xFFFF;
+		BMS_Cell_Volt[350] = 0xFFFF;
+		BMS_Cell_Volt[351] = 0xFFFF;
+		break;
+	case 0x1859FBF4:
+		BMS_Cell_Volt[352] = 0xFFFF;
+		BMS_Cell_Volt[353] = 0xFFFF;
+		BMS_Cell_Volt[354] = 0xFFFF;
+		BMS_Cell_Volt[355] = 0xFFFF;
+		break;
+	case 0x185AFBF4:
+		BMS_Cell_Volt[356] = 0xFFFF;
+		BMS_Cell_Volt[357] = 0xFFFF;
+		BMS_Cell_Volt[358] = 0xFFFF;
+		BMS_Cell_Volt[359] = 0xFFFF;
+		break;
+	case 0x185BFBF4:
+		BMS_Cell_Volt[360] = 0xFFFF;
+		BMS_Cell_Volt[361] = 0xFFFF;
+		BMS_Cell_Volt[362] = 0xFFFF;
+		BMS_Cell_Volt[363] = 0xFFFF;
+		break;
+	case 0x185CFBF4:
+		BMS_Cell_Volt[364] = 0xFFFF;
+		BMS_Cell_Volt[365] = 0xFFFF;
+		BMS_Cell_Volt[366] = 0xFFFF;
+		BMS_Cell_Volt[367] = 0xFFFF;
+		break;
+	case 0x185DFBF4:
+		BMS_Cell_Volt[368] = 0xFFFF;
+		BMS_Cell_Volt[369] = 0xFFFF;
+		BMS_Cell_Volt[370] = 0xFFFF;
+		BMS_Cell_Volt[371] = 0xFFFF;
+		break;
+	case 0x185EFBF4:
+		BMS_Cell_Volt[372] = 0xFFFF;
+		BMS_Cell_Volt[373] = 0xFFFF;
+		BMS_Cell_Volt[374] = 0xFFFF;
+		BMS_Cell_Volt[375] = 0xFFFF;
+		break;
+	case 0x185FFBF4:
+		BMS_Cell_Volt[376] = 0xFFFF;
+		BMS_Cell_Volt[377] = 0xFFFF;
+		BMS_Cell_Volt[378] = 0xFFFF;
+		BMS_Cell_Volt[379] = 0xFFFF;
+		break;
+	case 0x1860FBF4:
+		BMS_Cell_Volt[380] = 0xFFFF;
+		BMS_Cell_Volt[381] = 0xFFFF;
+		BMS_Cell_Volt[382] = 0xFFFF;
+		BMS_Cell_Volt[383] = 0xFFFF;
+		break;
+	case 0x1881EFF4:
+		BMS11_Fult1_DelTemp = 0xFF;
+		BMS11_Fult1_OverTemp = 0xFF;
+		BMS11_Fult1_PackOverHVolt = 0xFF;
+		BMS11_Fult1_PackLowHVolt = 0xFF;
+		BMS11_Fult1_LowSOC = 0xFF;
+		BMS11_Fult1_OverUcell = 0xFF;
+		BMS11_Fult1_LowUcell = 0xFF;
+		BMS11_Fult1_LowInsRes = 0xFF;
+		BMS11_Fult1_UcellUniformity = 0xFF;
+		BMS11_Fult1_OverChg = 0xFF;
+		BMS11_Fult1_OverSOC = 0xFF;
+		BMS11_Fult1_SOCChangeFast = 0xFF;
+		BMS11_Fult1_BatSysNotMatch = 0xFF;
+		BMS11_Fult1_HVILFault = 0xFF;
+		BMS11_PackOutsideVolt = 0xFFFF;
+		break;
+	case 0x1882EFF4:
+		BMS12_Fult2_FaultNum = 0xFF;
+		BMS12_Fult2_CellOverDischrg = 0xFF;
+		BMS12_Fult2_CellLowTemp = 0xFF;
+		BMS12_Fult2_PackFireWarning = 0xFF;
+		BMS12_Fult2_OverDischrgCurr = 0xFF;
+		BMS12_Fult2_OverChrgCurrInTheDrive = 0xFF;
+		BMS12_Fult2_CurrSensorErr = 0xFF;
+		BMS12_Fult2_PowerSupplyErr = 0xFF;
+		BMS12_Fult2_TMSErr = 0xFF;
+		BMS12_Fult2_HeatingFilmErr = 0xFF;
+		BMS12_Fult2_PackSelfProtect = 0xFF;
+		BMS12_Fult2_MainLoopPrechrgErr = 0xFF;
+		BMS12_Fult2_AuxLoopPrechrgErr = 0xFF;
+		BMS12_Fult2_ChrgInsLowErr = 0xFF;
+		BMS12_Fult2_ACANLost = 0xFF;
+		BMS12_Fult2_InnerCommunicationErr = 0xFF;
+		BMS12_Fult2_DCDCErr = 0xFF;
+		BMS12_Fult2_BranchBreakErr = 0xFF;
+		BMS12_Fult2_HeatRelayOpenErr = 0xFF;
+		BMS12_Fult2_HeatRelayWeldErr = 0xFF;
+		BMS12_Fult2_MainPosRelayOpenErr = 0xFF;
+		BMS12_Fult2_MainPosRelayWeldErr = 0xFF;
+		BMS12_Fult2_MainNegRelayOpenErr = 0xFF;
+		BMS12_Fult2_MainNegRelayWeldErr = 0xFF;
+		BMS12_Fult2_DCChrgPos1RelayOpenErr = 0xFF;
+		BMS12_Fult2_DCChrgPos1RelayWeldErr = 0xFF;
+		BMS12_Fult2_DCChrgNeg1RelayOpenErr = 0xFF;
+		BMS12_Fult2_DCChrgNeg1RelayWeldErr = 0xFF;
+		BMS12_Fult2_DCChrgPos2RelayOpenErr = 0xFF;
+		BMS12_Fult2_DCChrgPos2RelayWeldErr = 0xFF;
+		BMS12_Fult2_DCChrgNeg2RelayOpenErr = 0xFF;
+		BMS12_Fult2_DCChrgNeg2RelayWeldErr = 0xFF;
+		BMS12_Fult2_ChrgConnectErr = 0xFF;
+		BMS12_ult2_OverDischrgCurrWhenInChrg = 0xFF;
+		BMS12_Fult2_OverChrgCurrInTheChrg = 0xFF;
+		BMS12_Fult2_ChrgNTCErr = 0xFF;
+		BMS12_Fult2_ChrgNTCTempOver = 0xFF;
+		BMS12_Fult2_ELockErr = 0xFF;
+		BMS12_Fult2_FireDetectorEr = 0xFF;
+		BMS12_Fult2_ContiDischrgCurrOverLoad = 0xFF;
+		BMS12_Fult2_SOCDifferErr = 0xFF;
+		BMS12_Fult2_ContiChrgCurrOverLoad = 0xFF;
+		break;
+	case 0x1883EFF4:
+		BMS1_MainPosRelaySt = 0xFF;
+		BMS1_MainNegRelaySt = 0xFF;
+		BMS1_PreChgRelaySt = 0xFF;
+		BMS1_DCChrgPos1RelaySt = 0xFF;
+		BMS1_DCChrgNeg1RelaySt = 0xFF;
+		BMS1_DCChrgPos2RelaySt = 0xFF;
+		BMS1_DCChrgNeg2RelaySt = 0xFF;
+		BMS1_HeatPosRelaySt = 0xFF;
+		BMS1_HeatNegRelaySt = 0xFF;
+		BMS1_SysSts = 0xFF;
+		BMS1_Life = 0xFF;
+		BMS1_BalanceStatus = 0xFF;
+		BMS1_DCChrgConnectSt = 0xFF;
+		BMS1_ChrgMode = 0xFF;
+		BMS1_ChrgStatus = 0xFF;
+		BMS1_HeatingStatus = 0xFF;
+		BMS1_CoolingStatus = 0xFF;
+		BMS1_RechrgCycels = 0xFFFFFFFF;
+		break;
+	case 0x1884EFF4:
+		BMS2_SOC = 0xFF;
+		BMS2_SOH = 0xFF;
+		BMS2_PackCurrent = 0xFFFF;
+		BMS2_PackInsideVolt = 0xFFFF;
+		BMS2_FaultCode = 0xFF;
+		BMS2_FaultLevel = 0xFF;
+		BMS2_RqHVPoerOff = 0xFF;
+		BMS2_Life = 0xFF;
+		break;
+	case 0x1885EFF4:
+		BMS4_PosIsolation = 0xFFFF;
+		BMS4_NegIsolation = 0xFFFF;
+		BMS4_SysInsRes = 0xFFFF;
+		BMS4_InsDetectorSt = 0xFF;
+		break;
+	case 0x1886EFF4:
+		BMS8_Max_Temp = 0xFF;
+		BMS8_Min_Temp = 0xFF;
+		BMS8_Avg_Temp = 0xFF;
+		BMS8_MaxTempSysNr = 0xFF;
+		BMS8_MaxTempNr = 0xFF;
+		BMS8_MinTempSysNr = 0xFF;
+		BMS8_MinTempNr = 0xFF;
+		break;
+	case 0x1887EFF4:
+		BMS6_Max_Ucell = 0xFFFF;
+		BMS6_Min_Ucell = 0xFFFF;
+		BMS6_Avg_Ucell = 0xFFFF;
+		BMS6_SOE = 0xFFFF;
+		break;
+	case 0x1888EFF4:
+		BMS7_MaxUcellSysNr = 0xFF;
+		BMS7_MaxUcellNr = 0xFFFF;
+		BMS7_MinUcellSysNr = 0xFF;
+		BMS7_MinUcellNr = 0xFFFF;
+		break;
+	case 0x1889EFF4:
+		BMS23_Gun1DCPosTemp = 0xFF;
+		BMS23_Gun1DCNegTemp = 0xFF;
+		BMS23_Gun2DCPosTemp = 0xFF;
+		BMS23_Gun2DCNegTemp = 0xFF;
+		BMS23_RemainChgTi = 0xFFFF;
+		break;
+	case 0x18A0FBF4:
+		BMS_Cell_TempN[0] = 0xFF;
+		BMS_Cell_TempN[1] = 0xFF;
+		BMS_Cell_TempN[2] = 0xFF;
+		BMS_Cell_TempN[3] = 0xFF;
+		BMS_Cell_TempN[4] = 0xFF;
+		BMS_Cell_TempN[5] = 0xFF;
+		BMS_Cell_TempN[6] = 0xFF;
+		BMS_Cell_TempN[7] = 0xFF;
+		break;
+	case 0x18A1FBF4:
+		BMS_Cell_TempN[8] = 0xFF;
+		BMS_Cell_TempN[9] = 0xFF;
+		BMS_Cell_TempN[10] = 0xFF;
+		BMS_Cell_TempN[11] = 0xFF;
+		BMS_Cell_TempN[12] = 0xFF;
+		BMS_Cell_TempN[13] = 0xFF;
+		BMS_Cell_TempN[14] = 0xFF;
+		BMS_Cell_TempN[15] = 0xFF;
+		break;
+	case 0x18A2FBF4:
+		BMS_Cell_TempN[16] = 0xFF;
+		BMS_Cell_TempN[17] = 0xFF;
+		BMS_Cell_TempN[18] = 0xFF;
+		BMS_Cell_TempN[19] = 0xFF;
+		BMS_Cell_TempN[20] = 0xFF;
+		BMS_Cell_TempN[21] = 0xFF;
+		BMS_Cell_TempN[22] = 0xFF;
+		BMS_Cell_TempN[23] = 0xFF;
+		BMS_Cell_TempN[24] = 0xFF;
+		BMS_Cell_TempN[25] = 0xFF;
+		BMS_Cell_TempN[26] = 0xFF;
+		BMS_Cell_TempN[27] = 0xFF;
+		BMS_Cell_TempN[28] = 0xFF;
+		BMS_Cell_TempN[29] = 0xFF;
+		BMS_Cell_TempN[30] = 0xFF;
+		BMS_Cell_TempN[31] = 0xFF;
+		break;
+	case 0x18A3FBF4:
+		BMS_Cell_TempN[32] = 0xFF;
+		BMS_Cell_TempN[33] = 0xFF;
+		BMS_Cell_TempN[34] = 0xFF;
+		BMS_Cell_TempN[35] = 0xFF;
+		BMS_Cell_TempN[36] = 0xFF;
+		BMS_Cell_TempN[37] = 0xFF;
+		BMS_Cell_TempN[38] = 0xFF;
+		BMS_Cell_TempN[39] = 0xFF;
+		break;
+	case 0x18A4FBF4:
+		BMS_Cell_TempN[40] = 0xFF;
+		BMS_Cell_TempN[41] = 0xFF;
+		BMS_Cell_TempN[42] = 0xFF;
+		BMS_Cell_TempN[43] = 0xFF;
+		BMS_Cell_TempN[44] = 0xFF;
+		BMS_Cell_TempN[45] = 0xFF;
+		BMS_Cell_TempN[46] = 0xFF;
+		BMS_Cell_TempN[47] = 0xFF;
+		break;
+	case 0x18A5FBF4:
+		BMS_Cell_TempN[48] = 0xFF;
+		BMS_Cell_TempN[49] = 0xFF;
+		BMS_Cell_TempN[50] = 0xFF;
+		BMS_Cell_TempN[51] = 0xFF;
+		BMS_Cell_TempN[52] = 0xFF;
+		BMS_Cell_TempN[53] = 0xFF;
+		BMS_Cell_TempN[54] = 0xFF;
+		BMS_Cell_TempN[55] = 0xFF;
+		break;
+	case 0x18A6FBF4:
+		BMS_Cell_TempN[56] = 0xFF;
+		BMS_Cell_TempN[57] = 0xFF;
+		BMS_Cell_TempN[58] = 0xFF;
+		BMS_Cell_TempN[59] = 0xFF;
+		BMS_Cell_TempN[60] = 0xFF;
+		BMS_Cell_TempN[61] = 0xFF;
+		BMS_Cell_TempN[62] = 0xFF;
+		BMS_Cell_TempN[63] = 0xFF;
+		break;
+	case 0x18E1EFF4:
+		break;
+	case 0x18E2EFF4:
+		BMS21_RateCap = 0xFFFF;
+		BMS21_RateHVolt = 0xFFFF;
+		BMS21_RatePower = 0xFFFF;
+		BMS21_BattType = 0xFF;
+		BMS21_CoolType = 0xFF;
+		BMS21_Manufacture = 0xFF;
+		BMS21_ProtocolEditionH = 0xFF;
+		BMS21_ProtocolEditionL = 0xFF;
+		break;
+	case 0x18E3EFF4:
+		BMS9_TotCSCNum = 0xFF;
+		BMS9_PackTotCellNum = 0xFFFF;
+		BMS9_PackTotTempNum = 0xFF;
+		BMS9_HVBranchNum = 0xFF;
+		BMS9_SingleHVBranchCellNum = 0xFF;
+		BMS9_BattSysNum = 0xFF;
+		BMS9_BattSysSeqNum = 0xFF;
+		break;
+	case 0x18E4EFF4:
+		BMS22_PackAvaiMaxVolt = 0xFFFF;
+		BMS22_PackAvaiMinVolt = 0xFFFF;
+		BMS22_AvaiMaxSOC = 0xFF;
+		BMS22_AvaiMinSOC = 0xFF;
+		BMS22_AvaiMaxTemp = 0xFF;
+		BMS22_AvaiMinTemp = 0xFF;
+		break;
+	case 0x18FEDAF4:
+		BMS_SoftwareVersion = 0xFFFF;
+		BMS_HardwareVersion = 0xFFFF;
+		break;
+	case 0x18FF23F4:
+		BMS3_MaxDischgPow = 0xFFFF;
+		BMS3_MaxChgPow = 0xFFFF;
+		BMS3_MaxInstantDischgPow = 0xFFFF;
+		BMS3_MaxiInstantChgPow = 0xFFFF;
+		break;
+	case 0x18FF24F4:
+		BMS10_SubSysEncodingLen = 0xFF;
+		BMS10_SubSysIdx = 0xFF;
+		BMS10_SubSysErrNum = 0xFF;
+		break;
+	case 0x18FF25F4:
+		BMS5_DischgCurMaxAllw = 0xFFFF;
+		BMS5_ChrgCurMaxAllw = 0xFFFF;
+		BMS5_InstChrgCurMaxAllw = 0xFFFF;
+		BMS5_InstDischrgCurMaxAllw = 0xFFFF;
+		break;
+	case 0x18FF30F4:
+		BMS26_Bat_InstantConsume = 0xFFFF;
+		BMS26_Bat_TotalConsume = 0xFFFF;
+		BMS26_ChgReqVoltage = 0xFFFF;
+		BMS26_ChgReqCurrent = 0xFFFF;
+		break;
+	case 0x18FF45F4:
+		BMS28_ReqMode = 0xFF;
+		BMS28_HVCmd = 0xFF;
+		BMS28_ChgSts = 0xFF;
+		BMS28_HVRelaySts = 0xFF;
+		BMS28_HVVolt = 0xFFFF;
+		BMS28_SetTemp = 0xFF;
+		BMS28_Life = 0xFF;
+		BMS28_CRC = 0xFF;
+		break;
+	case 0x18FFC13A:
+		TMS_WorkStatus = 0xFF;
+		TMS_HVRelayST = 0xFF;
+		TMS_OutletTemp = 0xFF;
+		TMS_InletTemp = 0xFF;
+		TMS_Version = 0xFF;
+		TMS_ReqPow = 0xFFFF;
+		TMS_ErrCode = 0xFF;
+		TMS_FaultLevel = 0xFF;
+		break;
+	case 0x18FFD4F4:
+		BMS14_TotalChargeAh = 0xFFFFFFFF;
+		BMS14_TotalDischargeAh = 0xFFFFFFFF;
+		break;
+	case 0x18FFD5F4:
+		BMS15_TotalChargeKwh = 0xFFFFFFFF;
+		BMS15_TotalDischargeKwh = 0xFFFFFFFF;
+		break;
+	case 0x18FFD6F4:
+		BMS16_TotalEneryECOChargeAh = 0xFFFFFFFF;
+		BMS16_TotalEneryECOChargeKwh = 0xFFFFFFFF;
+		break;
+	case 0x18FFD7F4:
+		BMS17_TotalStationChargeAh = 0xFFFFFFFF;
+		BMS17_TotalStationChargeKwh = 0xFFFFFFFF;
+		break;
+	case 0x18FFD8F4:
+		BMS18_TotalPoleChargeAh = 0xFFFFFFFF;
+		BMS18_TotalPoleChargeKwh = 0xFFFFFFFF;
+		break;
+	case 0x18FFD9F4:
+		BMS19_SingleChargeAh = 0xFFFFFFFF;
+		BMS19_SingleChargeKwh = 0xFFFFFFFF;
+		break;
+	default:
+		break;
+	}
+}
+
+/**
+ * @brief : Bcu缂栫爜鍑芥暟
+ * @param {UINT32} ID
+ * @param {UINT8} *rawData
+ * @return {*}
+ */
+void BcuEncodeFunction(UINT32 ID, UINT8 *rawData)
+{
+	switch (ID)
+	{
+	case 0x1802F4EF:
+		// VCU_Life = ;
+		VCU_ReqHV = VCU_HvOnOff; // C
+		VCU_DCDCSts = 0x03;		 // VCU涓嶅彂锛屾棤鏁�
+		VCU_DCACSts = 0x03;		 // VCU涓嶅彂锛屾棤鏁�
+		VCU_DCAPSts = 0x03;		 // VCU涓嶅彂锛屾棤鏁�
+		// VCU_VehicleSpeed  //淇″彿瀛樺湪锛岄噸澶嶄娇鐢�
+		VCU_PosRlySts = VCU_MainPosRlySts; // C TBD
+		VCU_PosRlyErrSts = 0x03;
+		VCU_PTCRlSts = 0x03;
+		VCU_PTCRlErrSts = 0x03;
+		VCU_StopChgCmd = 0x03;
+		VCU_HVInterlock = 0x03;
+		VCU_AssistRlySts = 0x03;
+		VCU_AssistRlyErrSts = 0x03;
+		VCU_ACRlySts = 0x03;
+		VCU_ACRlyErrSts = 0x03;
+		*(UINT8 *)(rawData + 0) = *(UINT8 *)(rawData + 0) | ((VCU_Life << 0) & 0xFF);
+		*(UINT8 *)(rawData + 1) = *(UINT8 *)(rawData + 1) | ((VCU_ReqHV << 0) & 0xFF);
+		*(UINT8 *)(rawData + 1) = *(UINT8 *)(rawData + 1) | ((VCU_DCDCSts << 2) & 0xFF);
+		*(UINT8 *)(rawData + 1) = *(UINT8 *)(rawData + 1) | ((VCU_DCACSts << 4) & 0xFF);
+		*(UINT8 *)(rawData + 1) = *(UINT8 *)(rawData + 1) | ((VCU_DCAPSts << 6) & 0xFF);
+		*(UINT8 *)(rawData + 2) = *(UINT8 *)(rawData + 2) | ((VCU_VehicleSpeed << 0) & 0xFF);
+		*(UINT8 *)(rawData + 3) = *(UINT8 *)(rawData + 3) | ((VCU_PosRlySts << 0) & 0xFF);
+		*(UINT8 *)(rawData + 3) = *(UINT8 *)(rawData + 3) | ((VCU_PosRlyErrSts << 2) & 0xFF);
+		*(UINT8 *)(rawData + 3) = *(UINT8 *)(rawData + 3) | ((VCU_PTCRlSts << 4) & 0xFF);
+		*(UINT8 *)(rawData + 3) = *(UINT8 *)(rawData + 3) | ((VCU_PTCRlErrSts << 6) & 0xFF);
+		*(UINT8 *)(rawData + 4) = *(UINT8 *)(rawData + 4) | ((VCU_StopChgCmd << 0) & 0xFF);
+		*(UINT8 *)(rawData + 4) = *(UINT8 *)(rawData + 4) | ((VCU_HVInterlock << 2) & 0xFF);
+		*(UINT8 *)(rawData + 5) = *(UINT8 *)(rawData + 5) | ((VCU_AssistRlySts << 4) & 0xFF);
+		*(UINT8 *)(rawData + 5) = *(UINT8 *)(rawData + 5) | ((VCU_AssistRlyErrSts << 6) & 0xFF);
+		*(UINT8 *)(rawData + 6) = *(UINT8 *)(rawData + 6) | ((VCU_ACRlySts << 0) & 0xFF);
+		*(UINT8 *)(rawData + 6) = *(UINT8 *)(rawData + 6) | ((VCU_ACRlyErrSts << 2) & 0xFF);
+		break;
+	case 0x1803F4EF:
+		ISO_WorkStatus = 0x0F;
+		ISO_FaultLevel = 0x0F;
+		ISO_PosResis = 0xFFFF;
+		ISO_NegResis = 0xFFFF;
+		*(UINT8 *)(rawData + 0) = *(UINT8 *)(rawData + 0) | ((ISO_WorkStatus << 0) & 0xFF);
+		*(UINT8 *)(rawData + 0) = *(UINT8 *)(rawData + 0) | ((ISO_FaultLevel << 4) & 0xFF);
+		*(UINT8 *)(rawData + 1) = ISO_PosResis;
+		*(UINT8 *)(rawData + 2) = ISO_PosResis>>8;
+		*(UINT8 *)(rawData + 3) = ISO_NegResis;
+		*(UINT8 *)(rawData + 4) = ISO_NegResis>>8;
+		break;
+	case 0x18E1F4EF:
+		if (EBC_VinMsgFlag == 0x07)
+		{
+			*(UINT8 *)(rawData + 0) = *(UINT8 *)(rawData + 0) | (((VIN_FrameNo + 1) << 0) & 0xFF); // VIN_FrameNo = 1,2,3;
+			for (UINT8 i = 0; i < 7; i++)
+			{
+				if ((i + 7 * (VIN_FrameNo)) < sizeof(VCU_VIN))
+				{
+					*(UINT8 *)(rawData + i + 1) = (VCU_VIN[i + 7 * (VIN_FrameNo)] << 0) & 0xFF;
+				}
+				else
+				{
+					*(UINT8 *)(rawData + i + 1) = 0x00;
+					VIN_FrameNo = 0;
+				}
+			}
+			VIN_FrameNo++;
+		}
+		break;
+	case 0x18FF11F1:
+	{
+		static UINT8 Life = 0;
+		Life = Life + 1;
+		EBC_State = ebcd_st_ebcWork;
+		EBC_ForbidHVOn = ebcd_flg_forbidHVOn;
+		EBC_RequestHVOff = ebcb_flg_reqHvOff;
+		EBC_ChgFaultFlag = 0x03;
+		EBC_LockupFaultFlag = ebcd_flg_LockErr;
+		EBC_ChgCnctOverTemp = 0x01;
+		EBC_DischgHIVLFlag = ebcd_flg_dChrgLockErr;
+		EBC_ChargeHIVLFlag = ebcd_flg_chrgLockErr;
+		EBC_DChgCnctOverTemp = ebcd_flg_dChgCnctOverTemp;
+		EBC_FaultLevel = ebcd_Nr_errMax;
+		EBC_FaultCode = ebcd_Num_faultCode;
+		EBC_ChargingStatus = ebcd_st_chargingMod;
+		EBC_ActiveHeatReq = 0x03;
+		EBC_AirPressure = ebcd_P_airSensor;
+		*(UINT8 *)(rawData + 0) = *(UINT8 *)(rawData + 0) | ((EBC_State << 0) & 0xFF);
+		*(UINT8 *)(rawData + 1) = *(UINT8 *)(rawData + 1) | ((EBC_ForbidHVOn << 0) & 0xFF);
+		*(UINT8 *)(rawData + 1) = *(UINT8 *)(rawData + 1) | ((EBC_RequestHVOff << 1) & 0xFF);
+		*(UINT8 *)(rawData + 1) = *(UINT8 *)(rawData + 1) | ((EBC_ChgFaultFlag << 2) & 0xFF);
+		*(UINT8 *)(rawData + 1) = *(UINT8 *)(rawData + 1) | ((EBC_LockupFaultFlag << 3) & 0xFF);
+		*(UINT8 *)(rawData + 1) = *(UINT8 *)(rawData + 1) | ((EBC_ChgCnctOverTemp << 4) & 0xFF);
+		*(UINT8 *)(rawData + 1) = *(UINT8 *)(rawData + 1) | ((EBC_DischgHIVLFlag << 5) & 0xFF);
+		*(UINT8 *)(rawData + 1) = *(UINT8 *)(rawData + 1) | ((EBC_ChargeHIVLFlag << 6) & 0xFF);
+		*(UINT8 *)(rawData + 1) = *(UINT8 *)(rawData + 1) | ((EBC_DChgCnctOverTemp << 7) & 0xFF);
+		*(UINT8 *)(rawData + 2) = *(UINT8 *)(rawData + 2) | ((EBC_FaultLevel << 0) & 0xFF);
+		*(UINT8 *)(rawData + 3) = *(UINT8 *)(rawData + 3) | ((EBC_FaultCode << 0) & 0xFF);
+		*(UINT8 *)(rawData + 5) = *(UINT8 *)(rawData + 5) | ((EBC_ChargingStatus << 0) & 0xFF);
+		*(UINT8 *)(rawData + 5) = *(UINT8 *)(rawData + 5) | ((EBC_ActiveHeatReq << 2) & 0xFF);
+		*(UINT8 *)(rawData + 6) = *(UINT8 *)(rawData + 6) | ((EBC_AirPressure << 0) & 0xFF);
+		*(UINT8 *)(rawData + 7) = *(UINT8 *)(rawData + 7) | ((Life << 0) & 0xFF);
+		break;
+	}
+	case 0x18FF12F1:
+		EBC_DchgPos1Temp = ebcd_T_plugin[0];
+		EBC_DchgNeg1Temp = ebcd_T_plugin[1];
+		EBC_DchgPos2Temp = ebcd_T_plugin[2];
+		EBC_DchgNeg2Temp = ebcd_T_plugin[3];
+		EBC_ChgPos1Temp = 0xFF; //淇濈暀鍊硷紝瀹氫箟涓烘棤鏁�
+		EBC_ChgNeg1Temp = 0xFF; //淇濈暀鍊硷紝瀹氫箟涓烘棤鏁�
+		EBC_ChgPos2Temp = 0xFF; //淇濈暀鍊硷紝瀹氫箟涓烘棤鏁�
+		EBC_ChgNeg2Temp = 0xFF; //淇濈暀鍊硷紝瀹氫箟涓烘棤鏁�
+		*(UINT8 *)(rawData + 0) = *(UINT8 *)(rawData + 0) | ((EBC_ChgPos1Temp << 0) & 0xFF);
+		*(UINT8 *)(rawData + 1) = *(UINT8 *)(rawData + 1) | ((EBC_ChgNeg1Temp << 0) & 0xFF);
+		*(UINT8 *)(rawData + 2) = *(UINT8 *)(rawData + 2) | ((EBC_ChgPos2Temp << 0) & 0xFF);
+		*(UINT8 *)(rawData + 3) = *(UINT8 *)(rawData + 3) | ((EBC_ChgNeg2Temp << 0) & 0xFF);
+		*(UINT8 *)(rawData + 4) = *(UINT8 *)(rawData + 4) | ((EBC_DchgPos1Temp << 0) & 0xFF);
+		*(UINT8 *)(rawData + 5) = *(UINT8 *)(rawData + 5) | ((EBC_DchgNeg1Temp << 0) & 0xFF);
+		*(UINT8 *)(rawData + 6) = *(UINT8 *)(rawData + 6) | ((EBC_DchgPos2Temp << 0) & 0xFF);
+		*(UINT8 *)(rawData + 7) = *(UINT8 *)(rawData + 7) | ((EBC_DchgNeg2Temp << 0) & 0xFF);
+		break;
+	default:
+		break;
+	}
+}

+ 15 - 0
System/Vehicle/Communication/BcuCanProtocolFunc.h

@@ -0,0 +1,15 @@
+/*
+ * @Author       : ChenJie
+ * @Date         : 2021-12-22 17:09:09
+ * @Version      : V3.0
+ * @LastEditors  : ChenJie
+ * @LastEditTime : 2021-12-27 16:10:50
+ * @Description  : file content
+ * @FilePath     : \VehicleControl\VehicleControl\src\System\Vehicle\Communication\BcuCanProtocolFunc.h
+ */
+#include "CanVar.h"
+void BcuDecodeFunction(UINT32 ID, UINT8 *rawData);
+void BcuRxDiagnose(void);
+void BcuRxMsgSetInvalidValue(UINT32 ID);
+//组码函数
+void BcuEncodeFunction(UINT32 ID, UINT8 *rawData);

+ 742 - 0
System/Vehicle/Communication/BleCanProtocolFunc.c

@@ -0,0 +1,742 @@
+/*
+ * @Author       : ChenJie
+ * @Date         : 2021-12-20 14:47:39
+ * @Version      : V3.0
+ * @LastEditors  : ChenJie
+ * @LastEditTime : 2021-12-29 16:33:32
+ * @Description  : file content
+ * @FilePath     : \VehicleControl\VehicleControl\src\System\Vehicle\Communication\BleCanProtocolFunc.c
+ */
+/*
+ * CanProtocol.c
+ * can协议转换
+ *  Created on: 2021年12月20日
+ *      Author: QiXiang_CHENJIE
+ */
+#include "BleCanProtocolFunc.h"
+#include "HardwareLib.h"
+/**
+ * @brief : EBC对ble的命令应答,AT指令,EBC(0x1CEE000X)->BLE(0x1CEF0000X)
+ * @param {uint8} CmdIdx
+ * @return {*}
+ */
+void Can2ProtocolCode(uint8 CmdIdx)
+{
+    uint8 BlePwrControl;       //蓝牙电源开关控制  FF-关闭,0A-打开
+    uint8 BlePwrControl_Flag;  //蓝牙电源开关控制使能  00-不控制,01-控制
+    uint8 BleRoleControl;      //蓝牙主从控制  01-主机,02-从机
+    uint8 BleRoleControl_Flag; //蓝牙主从控制使能  00-不控制,01-控制
+    uint8 BleName[8];
+    uint32 InnerCanID;
+    uint8 Data[8];
+    uint8 DataIdx;
+    uint8 Byte0Num;
+    // CmdIdx EBC对BLE命令列表
+    switch (CmdIdx)
+    {
+    case 0x00: // ebc->ble数据传输通道
+    {
+        Can2DataCode(DataIdx, Byte0Num);
+        InnerCanID = 0x1CEE0000;
+        break;
+    }
+    case 0x01: //查询BLE软件版本
+    {
+        Data[0] = 0x01;
+        Data[1] = 0x00;
+        Data[2] = 0x00;
+        Data[3] = 0x00;
+        Data[4] = 0x00;
+        Data[5] = 0x00;
+        Data[6] = 0x00;
+        Data[7] = 0x00;
+        InnerCanID = 0x1CEE0001;
+        break;
+    }
+    case 0x02: //查询BLE连接状态
+    {
+        Data[0] = 0x01;
+        Data[1] = 0x00;
+        Data[2] = 0x00;
+        Data[3] = 0x00;
+        Data[4] = 0x00;
+        Data[5] = 0x00;
+        Data[6] = 0x00;
+        Data[7] = 0x00;
+        InnerCanID = 0x1CEE0002;
+        break;
+    }
+    case 0x03: //让BLE断开连接
+    {
+        Data[0] = 0x02;
+        Data[1] = 0x00;
+        Data[2] = 0x00;
+        Data[3] = 0x00;
+        Data[4] = 0x00;
+        Data[5] = 0x00;
+        Data[6] = 0x00;
+        Data[7] = 0x00;
+        InnerCanID = 0x1CEE0003;
+        break;
+    }
+    case 0x04: //改无线设备名称 名称为ASCII码值
+    {
+        Data[0] = BleName[0];
+        Data[1] = BleName[1];
+        Data[2] = BleName[2];
+        Data[3] = BleName[3];
+        Data[4] = BleName[4];
+        Data[5] = BleName[5];
+        Data[6] = BleName[6];
+        Data[7] = BleName[7];
+        InnerCanID = 0x1CEE0004;
+        break;
+    }
+    case 0x05: // BLE设备蓝牙开关查询及控制,默认为查询
+    {
+        if (BlePwrControl_Flag)
+        {
+            Data[0] = 0x02;
+            Data[1] = BlePwrControl;
+        }
+        else
+        {
+            Data[0] = 0x01;
+            Data[1] = 0x00;
+        }
+        Data[2] = 0x00;
+        Data[3] = 0x00;
+        Data[4] = 0x00;
+        Data[5] = 0x00;
+        Data[6] = 0x00;
+        Data[7] = 0x00;
+        InnerCanID = 0x1CEE0005;
+        break;
+    }
+    case 0x06: // BLE 主从机切换及查询,默认为查询
+    {
+        if (BleRoleControl_Flag)
+        {
+            Data[0] = 0x02;
+            Data[1] = BleRoleControl;
+        }
+        else
+        {
+            Data[0] = 0x01;
+            Data[1] = 0x00;
+        }
+        Data[2] = 0x00;
+        Data[3] = 0x00;
+        Data[4] = 0x00;
+        Data[5] = 0x00;
+        Data[6] = 0x00;
+        Data[7] = 0x00;
+        InnerCanID = 0x1CEE0006;
+        break;
+    }
+    default:
+        break;
+    }
+}
+/**
+ * @brief : ebc对ble的数据应答,Ebc data ->Ble data
+ * @param {*}
+ * @return {*}
+ */
+void Can2DataCode(uint8 DataIdx, uint8 Byte0Num)
+{
+    uint8 Data[8];
+    switch (DataIdx)
+    {
+    case 0x01: //主机数据类型1的应答
+    {
+        Data[0] = 0x11;
+        Data[1] = ebcd_st_ebcWork;
+        Data[2] = ebcd_st_ebcConnect;
+        Data[3] = ebcd_st_ebcLockWork;
+        Data[4] = 0x00;
+        Data[5] = 0x00;
+        Data[6] = 0x00;
+        Data[7] = 0x00;
+        break;
+    }
+    case 0x02: //主机数据类型2的应答 共7条
+    {
+        switch (Byte0Num)
+        {
+        case 0x21:
+        {
+            vcud_st_keyOn = 0;        // TBD
+            bcud_st_bcuTmsLiquid = 0; // TBD
+            Data[0] = Byte0Num;
+            Data[1] = ebcd_st_unlockSensor;
+            Data[2] = ebcd_st_lockSensor;
+            Data[3] = vcud_st_keyOn;
+            Data[4] = ebcd_P_airSensor;
+            Data[5] = bcud_st_bcuTmsLiquid;
+            Data[6] = ebcd_flg_pluginLockSig;
+            Data[7] = 0x00;
+            break;
+        }
+        case 0x22:
+        {
+            Data[0] = Byte0Num;
+            Data[1] = 0x00;
+            Data[2] = 0x00;
+            Data[3] = 0x00;
+            Data[4] = 0x00;
+            Data[5] = ebcd_st_pedstSensor;
+            Data[6] = ebcd_st_pluginLockSig;
+            Data[7] = 0x00;
+            break;
+        }
+        case 0x23:
+        {
+            Data[0] = Byte0Num;
+            Data[1] = ebcd_st_unlockSucJug;
+            Data[2] = ebcd_st_lockSucJug;
+            Data[3] = 0x00;
+            Data[4] = 0x00;
+            Data[5] = 0x00;
+            Data[6] = 0x00;
+            Data[7] = 0x00;
+            break;
+        }
+        case 0x24:
+        {
+            Data[0] = Byte0Num;
+            Data[1] = 0x00;
+            Data[2] = 0x00;
+            Data[3] = 0x00;
+            Data[4] = 0x00;
+            Data[5] = ebcd_st_pedstSucJug;
+            Data[6] = ebcd_flg_swapAdmit;
+            Data[7] = 0x00;
+            break;
+        }
+        case 0x25:
+        {
+            Data[0] = Byte0Num;
+            Data[1] = ebcd_st_ebcWork;
+            Data[2] = ebcd_st_ebcConnect;
+            Data[3] = ebcd_st_ebcLockWork;
+            Data[4] = ebcd_Nr_errMax;
+            Data[5] = ebcd_Num_err1;
+            Data[6] = ebcd_Num_err2;
+            Data[7] = 0x00;
+            break;
+        }
+        case 0x26:
+        {
+            Data[0] = Byte0Num;
+            Data[1] = (ebcd_Nr_swapBatt >> 8) & 0xFF;
+            Data[2] = ebcd_Nr_swapBatt & 0xFF;
+            Data[3] = (ebcd_Nr_swapSucBatt >> 8) & 0xFF;
+            Data[4] = ebcd_Nr_swapSucBatt;
+            Data[5] = 0x00;
+            Data[6] = 0x00;
+            Data[7] = 0x00;
+            break;
+        }
+        case 0x27:
+        {
+            Data[0] = Byte0Num;
+            Data[1] = ebcd_st_errTable1;
+            Data[2] = ebcd_st_errTable2;
+            Data[3] = ebcd_st_errTable3;
+            Data[4] = 0x00;
+            Data[5] = 0x00;
+            Data[6] = 0x00;
+            Data[7] = 0x00;
+            break;
+        }
+        default:
+            break;
+        }
+        break;
+    }
+    case 0x03: //主机数据类型3的应答 共5条
+    {
+        vcud_st_handbrake = HandbrakeSts;
+        vcud_st_footbrake = (BrakePedal > 0);
+        vcud_st_gear = GearPos;
+        vcud_st_vcuComun = (VCU_Life != 0xFF);
+        vcud_st_carStart = VehSts;
+        vcud_st_Steer = 0x00; // TBD
+        vcud_M_accDrv = VCU_TotalDistance * 10;
+        if (EBC_VinMsgFlag == 0x07)
+        {
+            memcpy(vcuv_Num_vin, VCU_VIN, 17);
+        }
+        switch (Byte0Num)
+        {
+        case 0x31:
+        {
+            Data[0] = Byte0Num;
+            Data[1] = vcud_st_handbrake;
+            Data[2] = vcud_st_footbrake;
+            Data[3] = vcud_st_gear;
+            Data[4] = vcud_st_vcuComun;
+            Data[5] = vcud_st_carStart;
+            Data[6] = vcud_st_Steer;
+            Data[7] = 0x00;
+            break;
+        }
+        case 0x32:
+        {
+            Data[0] = Byte0Num;
+            Data[1] = vcuv_Num_vin[0];
+            Data[2] = vcuv_Num_vin[1];
+            Data[3] = vcuv_Num_vin[2];
+            Data[4] = vcuv_Num_vin[3];
+            Data[5] = vcuv_Num_vin[4];
+            Data[6] = vcuv_Num_vin[5];
+            Data[7] = 0x00;
+            break;
+        }
+        case 0x33:
+        {
+            Data[0] = Byte0Num;
+            Data[1] = vcuv_Num_vin[6];
+            Data[2] = vcuv_Num_vin[7];
+            Data[3] = vcuv_Num_vin[8];
+            Data[4] = vcuv_Num_vin[9];
+            Data[5] = vcuv_Num_vin[10];
+            Data[6] = vcuv_Num_vin[11];
+            Data[7] = 0x00;
+            break;
+        }
+        case 0x34:
+        {
+            Data[0] = Byte0Num;
+            Data[1] = vcuv_Num_vin[12];
+            Data[2] = vcuv_Num_vin[13];
+            Data[3] = vcuv_Num_vin[14];
+            Data[4] = vcuv_Num_vin[15];
+            Data[5] = vcuv_Num_vin[16];
+            Data[6] = 0x00;
+            Data[7] = 0x00;
+            break;
+        }
+        case 0x35:
+        {
+            Data[0] = Byte0Num;
+            Data[1] = (vcud_M_accDrv >> 24) & 0xFF;
+            Data[2] = (vcud_M_accDrv >> 16) & 0xFF;
+            Data[3] = (vcud_M_accDrv >> 8) & 0xFF;
+            Data[4] = (vcud_M_accDrv)&0xFF;
+            Data[5] = vcud_P_airSensorForward;
+            Data[6] = vcud_P_airSensorBack;
+            Data[7] = 0x00;
+            break;
+        }
+        default:
+            break;
+        }
+        break;
+    }
+    case 0x04: //主机数据类型4的应答 共16条
+    {
+        bcud_st_bcuComun = (BMS1_Life != 0xFF);
+        bcud_pct_bcuSoh = BMS2_SOH;
+
+        bcud_V_battU = BMS2_PackInsideVolt;
+        if (BMS1_SysSts == 2)
+        {
+            bcud_st_hvWork = 0;
+        }
+        else if (BMS1_SysSts == 0 || BMS1_SysSts == 1)
+        {
+            bcud_st_hvWork = 1;
+        }
+        else if (BMS1_SysSts == 3)
+        {
+            bcud_st_hvWork = 2;
+        }
+        else
+        {
+            bcud_st_hvWork = 3;
+        }
+        bcud_st_bcuMainRelay = BMS1_MainPosRelaySt;
+        bcud_pct_soc = (UINT16)(BMS2_SOC * 4);
+        memcpy(bcuv_Num_battSn, BMS_SN_SysCode, sizeof(BMS_SN_SysCode));
+        bcud_Q_snglChrg = BMS19_SingleChargeAh;
+        bcud_E_snglChrg = BMS19_SingleChargeKwh;
+        bcud_Q_accRecovry = BMS16_TotalEneryECOChargeAh;
+        bcud_E_accRecovry = BMS16_TotalEneryECOChargeKwh;
+        bcud_Q_accSwapBatt = BMS17_TotalStationChargeAh;
+        bcud_E_accSwapBatt = BMS17_TotalStationChargeKwh;
+        bcud_Q_accPlugInChrg = BMS18_TotalPoleChargeAh;
+        bcud_E_accPlugInChrg = BMS18_TotalPoleChargeKwh;
+        bcud_Q_accDischrg = BMS14_TotalDischargeAh;
+        bcud_E_accDischrg = BMS14_TotalDischargeAh;
+        bcud_Q_accChrg = BMS18_TotalPoleChargeAh;
+        bcud_E_accChrg = BMS15_TotalChargeKwh;
+        switch (Byte0Num)
+        {
+        case 0x40:
+        {
+            Data[0] = Byte0Num;
+            Data[1] = (bcud_E_accPlugInChrg >> 24) & 0xFF;
+            Data[2] = (bcud_E_accPlugInChrg >> 16) & 0xFF;
+            Data[3] = (bcud_E_accPlugInChrg >> 8) & 0xFF;
+            Data[4] = (bcud_E_accPlugInChrg)&0xFF;
+            Data[5] = 0x00;
+            Data[6] = 0x00;
+            Data[7] = 0x00;
+            break;
+        }
+        case 0x41:
+        {
+            Data[0] = Byte0Num;
+            Data[1] = (bcud_Q_accChrg >> 24) & 0xFF;
+            Data[2] = (bcud_Q_accChrg >> 16) & 0xFF;
+            Data[3] = (bcud_Q_accChrg >> 8) & 0xFF;
+            Data[4] = (bcud_Q_accChrg)&0xFF;
+            Data[5] = bcud_st_bcuComun;
+            Data[6] = bcud_st_hvWork;
+            Data[7] = 0x00;
+            break;
+        }
+        case 0x42:
+        {
+            Data[0] = Byte0Num;
+            Data[1] = (bcud_Q_accDischrg >> 24) & 0xFF;
+            Data[2] = (bcud_Q_accDischrg >> 16) & 0xFF;
+            Data[3] = (bcud_Q_accDischrg >> 8) & 0xFF;
+            Data[4] = (bcud_Q_accDischrg)&0xFF;
+            Data[5] = bcud_st_bcuMainRelay;
+            Data[6] = bcud_pct_bcuSoh;
+            Data[7] = 0x00;
+            break;
+        }
+        case 0x43:
+        {
+            Data[0] = Byte0Num;
+            Data[1] = (bcud_E_accChrg >> 24) & 0xFF;
+            Data[2] = (bcud_E_accChrg >> 16) & 0xFF;
+            Data[3] = (bcud_E_accChrg >> 8) & 0xFF;
+            Data[4] = (bcud_E_accChrg)&0xFF;
+            Data[5] = (bcud_V_battU >> 8) & 0xFF;
+            Data[6] = (bcud_V_battU)&0xFF;
+            Data[7] = 0x00;
+            break;
+        }
+        case 0x44:
+        {
+            Data[0] = Byte0Num;
+            Data[1] = (bcud_E_accDischrg >> 24) & 0xFF;
+            Data[2] = (bcud_E_accDischrg >> 16) & 0xFF;
+            Data[3] = (bcud_E_accDischrg >> 8) & 0xFF;
+            Data[4] = (bcud_E_accDischrg)&0xFF;
+            Data[5] = (bcud_pct_soc >> 8) & 0xFF;
+            Data[6] = (bcud_pct_soc)&0xFF;
+            Data[7] = 0x00;
+            break;
+        }
+        case 0x45:
+        {
+            Data[0] = Byte0Num;
+            Data[1] = bcuv_Num_battSn[0];
+            Data[2] = bcuv_Num_battSn[1];
+            Data[3] = bcuv_Num_battSn[2];
+            Data[4] = bcuv_Num_battSn[3];
+            Data[5] = bcuv_Num_battSn[4];
+            Data[6] = bcuv_Num_battSn[5];
+            Data[7] = 0x00;
+            break;
+        }
+        case 0x46:
+        {
+            Data[0] = Byte0Num;
+            Data[1] = bcuv_Num_battSn[6];
+            Data[2] = bcuv_Num_battSn[7];
+            Data[3] = bcuv_Num_battSn[8];
+            Data[4] = bcuv_Num_battSn[9];
+            Data[5] = bcuv_Num_battSn[10];
+            Data[6] = bcuv_Num_battSn[11];
+            Data[7] = 0x00;
+            break;
+        }
+        case 0x47:
+        {
+            Data[0] = Byte0Num;
+            Data[1] = bcuv_Num_battSn[12];
+            Data[2] = bcuv_Num_battSn[13];
+            Data[3] = bcuv_Num_battSn[14];
+            Data[4] = bcuv_Num_battSn[15];
+            Data[5] = bcuv_Num_battSn[16];
+            Data[6] = bcuv_Num_battSn[17];
+            Data[7] = 0x00;
+            break;
+        }
+        case 0x48:
+        {
+            Data[0] = Byte0Num;
+            Data[1] = bcuv_Num_battSn[18];
+            Data[2] = bcuv_Num_battSn[19];
+            Data[3] = bcuv_Num_battSn[20];
+            Data[4] = bcuv_Num_battSn[21];
+            Data[5] = bcuv_Num_battSn[22];
+            Data[6] = bcuv_Num_battSn[23];
+            Data[7] = 0x00;
+            break;
+        }
+        case 0x49:
+        {
+            Data[0] = Byte0Num;
+            Data[1] = bcuv_Num_battSn[24];
+            Data[2] = bcuv_Num_battSn[25];
+            Data[3] = bcuv_Num_battSn[26];
+            Data[4] = bcuv_Num_battSn[27];
+            Data[5] = bcuv_Num_battSn[28];
+            Data[6] = bcuv_Num_battSn[29];
+            Data[7] = 0x00;
+            break;
+        }
+        case 0x4A:
+        {
+            Data[0] = Byte0Num;
+            Data[1] = bcuv_Num_battSn[30];
+            Data[2] = bcuv_Num_battSn[31];
+            Data[3] = 0x00;
+            Data[4] = 0x00;
+            Data[5] = 0x00;
+            Data[6] = 0x00;
+            Data[7] = 0x00;
+            break;
+        }
+        case 0x4B:
+        {
+            Data[0] = Byte0Num;
+            Data[1] = (bcud_Q_snglChrg >> 8) & 0xFF;
+            Data[2] = (bcud_Q_snglChrg)&0xFF;
+            Data[3] = (bcud_Q_accRecovry >> 24) & 0xFF;
+            Data[4] = (bcud_Q_accRecovry >> 16) & 0xFF;
+            Data[5] = (bcud_Q_accRecovry >> 8) & 0xFF;
+            Data[6] = (bcud_Q_accRecovry)&0xFF;
+            Data[7] = 0x00;
+            break;
+        }
+        case 0x4C:
+        {
+            Data[0] = Byte0Num;
+            Data[1] = (bcud_Q_accSwapBatt >> 24) & 0xFF;
+            Data[2] = (bcud_Q_accSwapBatt >> 16) & 0xFF;
+            Data[3] = (bcud_Q_accSwapBatt >> 8) & 0xFF;
+            Data[4] = (bcud_Q_accSwapBatt)&0xFF;
+            Data[5] = 0x00;
+            Data[6] = 0x00;
+            Data[7] = 0x00;
+            break;
+        }
+        case 0x4D:
+        {
+            Data[0] = Byte0Num;
+            Data[1] = (bcud_E_snglChrg >> 8) & 0xFF;
+            Data[2] = (bcud_E_snglChrg)&0xFF;
+            Data[3] = (bcud_E_accRecovry >> 24) & 0xFF;
+            Data[4] = (bcud_E_accRecovry >> 16) & 0xFF;
+            Data[5] = (bcud_E_accRecovry >> 8) & 0xFF;
+            Data[6] = (bcud_E_accRecovry)&0xFF;
+            Data[7] = 0x00;
+            break;
+        }
+        case 0x4E:
+        {
+            Data[0] = Byte0Num;
+            Data[1] = (bcud_E_accSwapBatt >> 24) & 0xFF;
+            Data[2] = (bcud_E_accSwapBatt >> 16) & 0xFF;
+            Data[3] = (bcud_E_accSwapBatt >> 8) & 0xFF;
+            Data[4] = (bcud_E_accSwapBatt)&0xFF;
+            Data[5] = 0x00;
+            Data[6] = 0x00;
+            Data[7] = 0x00;
+            break;
+        }
+        case 0x4F:
+        {
+            Data[0] = Byte0Num;
+            Data[1] = (bcud_Q_accPlugInChrg >> 24) & 0xFF;
+            Data[2] = (bcud_Q_accPlugInChrg >> 16) & 0xFF;
+            Data[3] = (bcud_Q_accPlugInChrg >> 8) & 0xFF;
+            Data[4] = (bcud_Q_accPlugInChrg)&0xFF;
+            Data[5] = 0x00;
+            Data[6] = 0x00;
+            Data[7] = 0x00;
+            break;
+        }
+        default:
+            break;
+        }
+    }
+    case 0x05:
+    {
+        Data[0] = 0x51;
+        Data[1] = 0x00;
+        Data[2] = 0x00;
+        Data[3] = 0x00;
+        Data[4] = 0x00;
+        Data[5] = 0x00;
+        Data[6] = 0x00;
+        Data[7] = 0x00;
+    }
+    default:
+        break;
+    }
+}
+
+/**
+ * @brief : Ebc通过Can2接受到的协议解码
+ * @param {uint8} CmdIdx
+ * @return {*}
+ */
+void Can2ProtocolDecode(uint8 CmdIdx)
+{
+    uint32 Can2ID;
+    uint8 Data[8];
+    switch (Can2ID)
+    {
+    case 0x0000:
+    {
+        Can2DataDecode();
+        bled_flg_bleConn = 1;
+        break;
+    }
+    case 0x0001:
+    {
+        bled_Nr_softVer = (Data[0] << 24) | (Data[1] << 16) | (Data[2] << 8) | (Data[3]);
+        break;
+    }
+    case 0x0002:
+    {
+        if (Data[0] != 0xFF)
+        {
+            bled_flg_bleConn = 1;
+        }
+        else
+        {
+            bled_flg_bleConn = 0;
+        }
+        break;
+    }
+    default:
+        break;
+    }
+}
+/**
+ * @brief : Ebc通过can2接收到的数据解码,Ble->Ebc
+ * @param {*}
+ * @return {*}
+ */
+void Can2DataDecode(void)
+{
+    uint8 Data[8];
+    uint8 CmdIndex = Data[0];
+    switch (CmdIndex)
+    {
+    case 0x01: //心跳数据,为了维持通讯
+    {
+        bled_flg_Heart = 1;
+        break;
+    }
+    case 0x02: //获取换电控制器信息
+    {
+        bled_flg_getEbcData = 1;
+        break;
+    }
+    case 0x03: //获得车辆信息
+    {
+        bled_flg_getVcuData = 1;
+        break;
+    }
+    case 0x04: //获取电池信息
+    {
+        bled_flg_getBmsData = 1;
+        break;
+    }
+    case 0x05: //握手
+    {
+        bled_flg_handShake = 1;
+        break;
+    }
+    case 0x06: //解锁
+    {
+        bled_flg_unlockCmd = Data[1];
+        break;
+    }
+    case 0x07: //锁紧
+    {
+        bled_flg_lockCmd = Data[1];
+        break;
+    }
+    case 0x08: //完成换电
+    {
+        bled_flg_swapBattDone = 1;
+        break;
+    }
+    case 0x09: //强制解锁,强制上升
+    {
+        bled_flg_unlockCmdForce = Data[1];
+        bled_flg_topAscendCmdForce = Data[2];
+        break;
+    }
+    case 0x0A: //强制锁紧,强制下降
+    {
+        bled_flg_lockCmdForce = Data[1];
+        bled_flg_topDescendCmdForce = Data[2];
+        break;
+    }
+    case 0x0B: //回到行车状态
+    {
+        bled_flg_backToDrv = 1;
+        break;
+    }
+    case 0x0C: //顶板举升
+    {
+        bled_flg_topAscendCmd = Data[1];
+        break;
+    }
+    case 0x0D: //顶板下降
+    {
+        bled_flg_topDescendCmd = Data[1];
+        break;
+    }
+    case 0x0E: //换电开始自动解锁
+    {
+        bled_flg_autoUnlock = 1;
+        break;
+    }
+    case 0x0F: //换电完成自动锁紧
+    {
+        bled_flg_autoLock = 1;
+        break;
+    }
+    case 0x10: //除尘开始
+    {
+        bled_flg_openDustReCmd = 1;
+        break;
+    }
+    case 0x11: //除尘关闭
+    {
+        bled_flg_closeDustReCmd = 1;
+        break;
+    }
+    case 0x12: //切换到无线通信状态
+    {
+        break;
+    }
+    case 0x13: //进入换电状态
+    {
+        bled_flg_toSwapMod = 1;
+        break;
+    }
+    case 0x14: //急停指令
+    {
+        bled_flg_safeStopCmd = 1;
+        break;
+    }
+    default:
+        break;
+    }
+}

+ 24 - 0
System/Vehicle/Communication/BleCanProtocolFunc.h

@@ -0,0 +1,24 @@
+/*
+ * @Author       : ChenJie
+ * @Date         : 2021-12-20 14:48:17
+ * @Version      : V3.0
+ * @LastEditors  : ChenJie
+ * @LastEditTime : 2021-12-27 16:11:07
+ * @Description  : 应用层can协议转换
+ * @FilePath     : \VehicleControl\VehicleControl\src\System\Vehicle\Communication\BleCanProtocolFunc.h
+ */
+/*
+ * CanProtocol.h
+ *can协议转换
+ *  Created on: 2021年12月20日
+ *      Author: QiXiang_CHENJIE
+ */
+#include "Std_Types.h"
+#include "CanVar.h"
+#ifndef SYSTEM_VEHICLE_CANPROTOCOL_H_
+#define SYSTEM_VEHICLE_CANPROTOCOL_H_
+void Can2ProtocolCode(uint8 CmdIdx);
+void Can2ProtocolDecode(uint8 CmdIdx);
+void Can2DataCode(uint8 DataIdx, uint8 Byte0Num);
+void Can2DataDecode(void);
+#endif /* SYSTEM_VEHICLE_CANPROTOCOL_H_ */

+ 210 - 142
System/Vehicle/Communication/CANNet.c

@@ -1,76 +1,69 @@
 /********************************************************************************
-* 常州易控汽车电子股份有限公司
-* (c) Copyright 2009-2015 ECTEK
-* 保留所有权利
-********************************************************************************
-* 工程名称:整车管理
-* 文件名: CANNet.c
-* 功能描述 : CAN总线管理
-* 引用记录:
-* 备注: 
-* 修订记录:
-*		日期		      版本		  作者		描述
-*   2011.07.14          00.01.00      李中     第一版                                           
-*******************************************************************************/
+ * 常州易控汽车电子股份有限公司
+ * (c) Copyright 2009-2015 ECTEK
+ * 保留所有权利
+ ********************************************************************************
+ * 工程名称:整车管理
+ * 文件名: CANNet.c
+ * 功能描述 : CAN总线管理
+ * 引用记录:
+ * 备注:
+ * 修订记录:
+ *		日期		      版本		  作者		描述
+ *   2011.07.14          00.01.00      李中     第一版
+ *******************************************************************************/
 
 #include "HardwareLib.h"
 #include "CANNet.h"
 #include "AccPedCD.h"
 
-
 MCANDrv_infoMsgConfS_TYPE CANNet_infoMsgTxConfSA[3];
-
+MCAN_stRetE_TYPE CAN1Result;
 uint16 CANNet_idxSchedUB;
-
 MCANDrv_infoMsgConfS_TYPE CANNet_InfoRxMsgConfSA[128];
 uint8 CANNet_datRxMsgBufM[128][9];
-
-uint32 CanRecvTest = 0;
-uint32 CanRecvTestDelay = 0;
-
-
 void CANNet_Init(void)
 {
-    /*示例代码*/
-
-    /*各个CAN节点初始化*/
-    MCANDrv_SetBaudrate(_CAN_INDEX_CAN0, 250000);
-    MCANDrv_SetCANMode(_CAN_INDEX_CAN0, MCAN_NODEMODE_BUF);
-    MCANDrv_SetCallbackFunc(_CAN_INDEX_CAN0, (pFunc_RxMsgCallback)CANNet_RecvMsgCAN0, NULL_PTR);
-
-    MCANDrv_SetBaudrate(_CAN_INDEX_CAN1, 250000);
-    MCANDrv_SetCANMode(_CAN_INDEX_CAN1, MCAN_NODEMODE_BUF);
-    MCANDrv_SetCallbackFunc(_CAN_INDEX_CAN1, (pFunc_RxMsgCallback)CANNet_RecvMsgCAN1, NULL_PTR);
-
-    /*第2路CAN用于CCP、UDS协议,由底层配置*/
-
-    /*接收报文初始化*/
-//    CANNet_InfoRxMsgConfSA[0].infoMsgIDUI = 0x1F000023UL;
-//    CANNet_InfoRxMsgConfSA[0].infoMsgParU.B.CAN = 0;
-//    CANNet_InfoRxMsgConfSA[0].infoMsgParU.B.MO = 0;
-//    CANNet_InfoRxMsgConfSA[0].infoMsgParU.B.DIR = _MCAN_DIR_RX;
-//    CANNet_InfoRxMsgConfSA[0].infoMsgParU.B.DLC = 8;
-//    CANNet_InfoRxMsgConfSA[0].infoMsgParU.B.IDE = _MCAN_IDE_EXT;
-//    MCANDrv_SetMsgObj(CANNet_InfoRxMsgConfSA[0], CANNet_RecvMsgCAN0);
-
-    /*发送报文初始化*/
-    CANNet_infoMsgTxConfSA[0].infoMsgIDUI = 0x1F000024UL;
-    CANNet_infoMsgTxConfSA[0].infoMsgParU.B.CAN = 0;
-    CANNet_infoMsgTxConfSA[0].infoMsgParU.B.MO = 0;
-    CANNet_infoMsgTxConfSA[0].infoMsgParU.B.DIR = _MCAN_DIR_TX;
-    CANNet_infoMsgTxConfSA[0].infoMsgParU.B.DLC = 8;
-    CANNet_infoMsgTxConfSA[0].infoMsgParU.B.IDE = _MCAN_IDE_EXT;
-    //MCANDrv_SetMsgObj(CANNet_infoMsgTxConfSA[0], NULL_PTR);
-
-    CANNet_infoMsgTxConfSA[1].infoMsgIDUI = 0x1F000025UL;
-    CANNet_infoMsgTxConfSA[1].infoMsgParU.B.CAN = 1;
-    CANNet_infoMsgTxConfSA[1].infoMsgParU.B.MO = 1;
-    CANNet_infoMsgTxConfSA[1].infoMsgParU.B.DIR = _MCAN_DIR_TX;
-    CANNet_infoMsgTxConfSA[1].infoMsgParU.B.DLC = 8;
-    CANNet_infoMsgTxConfSA[1].infoMsgParU.B.IDE = _MCAN_IDE_EXT;
-    //MCANDrv_SetMsgObj(CANNet_infoMsgTxConfSA[1], NULL_PTR);
-
-    CANNet_infoMsgTxConfSA[2].infoMsgIDUI = 0x1F000026UL;
+	/*示例代码*/
+
+	/*各个CAN节点初始化*/
+	MCANDrv_SetBaudrate(_CAN_INDEX_CAN0, 250000);
+	MCANDrv_SetCANMode(_CAN_INDEX_CAN0, MCAN_NODEMODE_BUF);
+	MCANDrv_SetCallbackFunc(_CAN_INDEX_CAN0, (pFunc_RxMsgCallback)CANNet_RecvMsgCAN0, NULL_PTR);
+
+	MCANDrv_SetBaudrate(_CAN_INDEX_CAN1, 250000);
+	MCANDrv_SetCANMode(_CAN_INDEX_CAN1, MCAN_NODEMODE_BUF);
+	MCANDrv_SetCallbackFunc(_CAN_INDEX_CAN1, (pFunc_RxMsgCallback)CANNet_RecvMsgCAN1, NULL_PTR);
+
+	/*第2路CAN用于CCP、UDS协议,由底层配置*/
+
+	/*接收报文初始化*/
+	//    CANNet_InfoRxMsgConfSA[0].infoMsgIDUI = 0x1F000023UL;
+	//    CANNet_InfoRxMsgConfSA[0].infoMsgParU.B.CAN = 0;
+	//    CANNet_InfoRxMsgConfSA[0].infoMsgParU.B.MO = 0;
+	//    CANNet_InfoRxMsgConfSA[0].infoMsgParU.B.DIR = _MCAN_DIR_RX;
+	//    CANNet_InfoRxMsgConfSA[0].infoMsgParU.B.DLC = 8;
+	//    CANNet_InfoRxMsgConfSA[0].infoMsgParU.B.IDE = _MCAN_IDE_EXT;
+	//    MCANDrv_SetMsgObj(CANNet_InfoRxMsgConfSA[0], CANNet_RecvMsgCAN0);
+
+	/*发送报文初始化*/
+	CANNet_infoMsgTxConfSA[0].infoMsgIDUI = 0x1F000024UL;
+	CANNet_infoMsgTxConfSA[0].infoMsgParU.B.CAN = 0;
+	CANNet_infoMsgTxConfSA[0].infoMsgParU.B.MO = 0;
+	CANNet_infoMsgTxConfSA[0].infoMsgParU.B.DIR = _MCAN_DIR_TX;
+	CANNet_infoMsgTxConfSA[0].infoMsgParU.B.DLC = 8;
+	CANNet_infoMsgTxConfSA[0].infoMsgParU.B.IDE = _MCAN_IDE_EXT;
+	// MCANDrv_SetMsgObj(CANNet_infoMsgTxConfSA[0], NULL_PTR);
+
+	CANNet_infoMsgTxConfSA[1].infoMsgIDUI = 0x1F000025UL;
+	CANNet_infoMsgTxConfSA[1].infoMsgParU.B.CAN = 1;
+	CANNet_infoMsgTxConfSA[1].infoMsgParU.B.MO = 1;
+	CANNet_infoMsgTxConfSA[1].infoMsgParU.B.DIR = _MCAN_DIR_TX;
+	CANNet_infoMsgTxConfSA[1].infoMsgParU.B.DLC = 8;
+	CANNet_infoMsgTxConfSA[1].infoMsgParU.B.IDE = _MCAN_IDE_EXT;
+	// MCANDrv_SetMsgObj(CANNet_infoMsgTxConfSA[1], NULL_PTR);
+
+	CANNet_infoMsgTxConfSA[2].infoMsgIDUI = 0x1F000026UL;
 	CANNet_infoMsgTxConfSA[2].infoMsgParU.B.CAN = 2;
 	CANNet_infoMsgTxConfSA[2].infoMsgParU.B.MO = 2;
 	CANNet_infoMsgTxConfSA[2].infoMsgParU.B.DIR = _MCAN_DIR_TX;
@@ -78,95 +71,170 @@ void CANNet_Init(void)
 	CANNet_infoMsgTxConfSA[2].infoMsgParU.B.IDE = _MCAN_IDE_EXT;
 }
 
-//CAN0接收消息处理函数
+// CAN0接收消息处理函数 VCU
 void CANNet_RecvMsgCAN0(MCANDrv_infoMsgS_TYPE infoMsgS)
 {
-    //CAN接收样例
-    uint8 idxIncUB,idxByteUB;
-
-    for(idxIncUB=0;idxIncUB<128;idxIncUB++)
-    {
-        if(infoMsgS.infoConfS.infoMsgIDUI == CANNet_InfoRxMsgConfSA[idxIncUB].infoMsgIDUI)
-        {
-            for(idxByteUB=0;idxByteUB<8;idxByteUB++)
-            {
-                CANNet_datRxMsgBufM[idxIncUB][idxByteUB]=infoMsgS.datMsgUBA[idxByteUB];
-            }
-
-            CANNet_datRxMsgBufM[idxIncUB][8]++;
-        }
-    }
-    CanRecvTestDelay = SysCon_tiRunHighResiUI;
-    CanRecvTest  = CanRecvTestDelay - CanRecvTest;
+// CAN接收样例
+//	uint8 idxIncUB, idxByteUB;
+//	for (idxIncUB = 0; idxIncUB < 128; idxIncUB++)
+//	{
+//		if (infoMsgS.infoConfS.infoMsgIDUI == CANNet_InfoRxMsgConfSA[idxIncUB].infoMsgIDUI)
+//		{
+//			for (idxByteUB = 0; idxByteUB < 8; idxByteUB++)
+//			{
+//				CANNet_datRxMsgBufM[idxIncUB][idxByteUB] = infoMsgS.datMsgUBA[idxByteUB];
+//			}
+//			CANNet_datRxMsgBufM[idxIncUB][8]++;
+//		}
+//	}
+	VcuDecodeFunction(infoMsgS.infoConfS.infoMsgIDUI,infoMsgS.datMsgUBA);
 }
-//CAN1接收消息处理函数
+// CAN1接收消息处理函数
 void CANNet_RecvMsgCAN1(MCANDrv_infoMsgS_TYPE infoMsgS)
 {
-    //CAN接收样例
-    uint8 idxIncUB,idxByteUB;
-
-    for(idxIncUB=0;idxIncUB<128;idxIncUB++)
-    {
-        if(infoMsgS.infoConfS.infoMsgIDUI == CANNet_InfoRxMsgConfSA[idxIncUB].infoMsgIDUI)
-        {
-            for(idxByteUB=0;idxByteUB<8;idxByteUB++)
-            {
-                CANNet_datRxMsgBufM[idxIncUB][idxByteUB]=infoMsgS.datMsgUBA[idxByteUB];
-            }
-
-            CANNet_datRxMsgBufM[idxIncUB][8]++;
-        }
-    }
+	// CAN接收样例
+//	uint8 idxIncUB, idxByteUB;
+//	for (idxIncUB = 0; idxIncUB < 128; idxIncUB++)
+//	{
+//		if (infoMsgS.infoConfS.infoMsgIDUI == CANNet_InfoRxMsgConfSA[idxIncUB].infoMsgIDUI)
+//		{
+//			for (idxByteUB = 0; idxByteUB < 8; idxByteUB++)
+//			{
+//				CANNet_datRxMsgBufM[idxIncUB][idxByteUB] = infoMsgS.datMsgUBA[idxByteUB];
+//			}
+//
+//			CANNet_datRxMsgBufM[idxIncUB][8]++;
+//		}
+//	}
+	BcuDecodeFunction(infoMsgS.infoConfS.infoMsgIDUI,infoMsgS.datMsgUBA);
 }
+//
 //发送消息管理
-void CANNet_Manage1ms(void)
+void CAN0Net_Manage1ms(void)
 {
-    MCANDrv_infoMsgS_TYPE infoMsgS;
-    
-    switch(CANNet_idxSchedUB)
-    {
-        case 0:
-        	CANNet_infoMsgTxConfSA[2].infoMsgIDUI = 0x7F0;
-        	infoMsgS.infoConfS = CANNet_infoMsgTxConfSA[2];
-			infoMsgS.datMsgUBA[0] = (uint8)(PressureValue>>24);
-			infoMsgS.datMsgUBA[1] = (uint8)(PressureValue>>16);
-			infoMsgS.datMsgUBA[2] = (uint8)(PressureValue)>>8;
-			infoMsgS.datMsgUBA[3] = (uint8)(PressureValue);
-			infoMsgS.datMsgUBA[4] = (uint8)(Distence1>>8);
-			infoMsgS.datMsgUBA[5] = (uint8)(Distence1);
-			infoMsgS.datMsgUBA[6] = (uint8)(Distence2>>8);
-			infoMsgS.datMsgUBA[7] = (uint8)(Distence2);
+	static UINT32 Can0TimerCounter = 0;
+	static UINT8 VcuIDIdx = 0;
+	MCANDrv_infoMsgS_TYPE infoMsgS;
+	static BOOL ChkFlg = FALSE;
+	//sizeof(Ebc2VcuOutTable)/8
+	if(Can0TimerCounter%100==0)
+	{
+		if(Can0TimerCounter%(Ebc2VcuOutTable[VcuIDIdx][1])==0)
+		{
+			CANNet_infoMsgTxConfSA[0].infoMsgIDUI = Ebc2VcuOutTable[VcuIDIdx][0];
+			infoMsgS.infoConfS = CANNet_infoMsgTxConfSA[0];
+			memset(infoMsgS.datMsgUBA,0x00,8);
+			VcuEncodeFunction(Ebc2VcuOutTable[VcuIDIdx][0],&(infoMsgS.datMsgUBA[0]));
 			MCANDrv_SendMsg(infoMsgS);
-            break;
-        case 1:
-        	CANNet_infoMsgTxConfSA[2].infoMsgIDUI = 0x7F1;
-        	infoMsgS.infoConfS = CANNet_infoMsgTxConfSA[2];
-			infoMsgS.datMsgUBA[0] = (uint8)(Switch1);
-			infoMsgS.datMsgUBA[1] = (uint8)(Switch2);
-			infoMsgS.datMsgUBA[2] = 0xFF;
-			infoMsgS.datMsgUBA[3] = 0xFF;
-			infoMsgS.datMsgUBA[4] = 0xFF;
-			infoMsgS.datMsgUBA[5] = 0xFF;
-			infoMsgS.datMsgUBA[6] = 0xFF;
-			infoMsgS.datMsgUBA[7] = 0xFF;
-			MCANDrv_SendMsg(infoMsgS);
-            break;
-        case 2:
-        	CANNet_infoMsgTxConfSA[2].infoMsgIDUI = 0x7F2;
-        	infoMsgS.infoConfS = CANNet_infoMsgTxConfSA[2];
-			infoMsgS.datMsgUBA[0] = ControlState;
-			infoMsgS.datMsgUBA[1] = 0xFF;
-			infoMsgS.datMsgUBA[2] = 0xFF;
-			infoMsgS.datMsgUBA[3] = 0xFF;
-			infoMsgS.datMsgUBA[4] = (uint8)(Control_Times>>24);
-			infoMsgS.datMsgUBA[5] = (uint8)(Control_Times>>16);
-			infoMsgS.datMsgUBA[6] = (uint8)(Control_Times>>8);
-			infoMsgS.datMsgUBA[7] = (uint8)(Control_Times);
+		}
+		VcuIDIdx++;
+		ChkFlg = FALSE;
+	}
+	if(VcuIDIdx>=(sizeof(Ebc2VcuOutTable)/8))
+	{
+		VcuIDIdx = 0;
+		ChkFlg = TRUE;
+	}
+	if(ChkFlg)
+	{
+		Can0TimerCounter = Can0TimerCounter + 1;
+	}
+}
+void CAN1Net_Manage1ms(void)
+{
+	static UINT32 Can1TimerCounter = 0;
+	static UINT8 BcuIDIdx = 0;
+	static BOOL BcuChkFlg = FALSE;
+	MCANDrv_infoMsgS_TYPE infoMsgS;
+	if(Can1TimerCounter%100==0)
+	{
+		if(Can1TimerCounter%(Ebc2BcuOutTable[BcuIDIdx][1])==0)
+		{
+			CANNet_infoMsgTxConfSA[1].infoMsgIDUI = Ebc2BcuOutTable[BcuIDIdx][0];
+			infoMsgS.infoConfS = CANNet_infoMsgTxConfSA[1];
+			memset(infoMsgS.datMsgUBA,0x00,8);
+			BcuEncodeFunction(Ebc2BcuOutTable[BcuIDIdx][0],&(infoMsgS.datMsgUBA[0]));
+			CAN1Result = MCANDrv_SendMsg(infoMsgS);
+
+			CANNet_infoMsgTxConfSA[2].infoMsgIDUI = 0x7F0;
+			infoMsgS.infoConfS = CANNet_infoMsgTxConfSA[2];
+			infoMsgS.datMsgUBA[0] = (uint8)(CAN1Result >> 24);
+			infoMsgS.datMsgUBA[1] = (uint8)(CAN1Result >> 16);
+			infoMsgS.datMsgUBA[2] = (uint8)(CAN1Result >> 8);
+			infoMsgS.datMsgUBA[3] = (uint8)(CAN1Result >> 0);
+			infoMsgS.datMsgUBA[4] = (uint8)(Can1TimerCounter >> 24);
+			infoMsgS.datMsgUBA[5] = (uint8)(Can1TimerCounter >> 16);
+			infoMsgS.datMsgUBA[6] = (uint8)(Can1TimerCounter >> 8);
+			infoMsgS.datMsgUBA[7] = (uint8)(Can1TimerCounter);
 			MCANDrv_SendMsg(infoMsgS);
-			break;
-        default:
-            break;
-    }
-    
-    CANNet_idxSchedUB=(uint16)((CANNet_idxSchedUB+1)%100); //100ms一个完整循环
+		}
+		BcuIDIdx++;
+		BcuChkFlg = FALSE;
+	}
+	if(BcuIDIdx>=(sizeof(Ebc2BcuOutTable)/8))
+	{
+		BcuIDIdx = 0;
+		BcuChkFlg = TRUE;
+	}
+	if(BcuChkFlg)
+	{
+		Can1TimerCounter = Can1TimerCounter +1;
+	}
+}
+void CAN2Net_Manage1ms(void)
+{
+	static UINT32 Can2TimerCounter = 0;
+	MCANDrv_infoMsgS_TYPE infoMsgS;
+	if(Can2TimerCounter%100==0)
+	{
+	}
+	Can2TimerCounter = Can2TimerCounter +1;
+#ifdef _APP_TEST_CODE
+	switch (CANNet_idxSchedUB)
+	{
+	case 0:
+		CANNet_infoMsgTxConfSA[2].infoMsgIDUI = 0x7F0;
+		infoMsgS.infoConfS = CANNet_infoMsgTxConfSA[2];
+		infoMsgS.datMsgUBA[0] = (uint8)(PressureValue >> 24);
+		infoMsgS.datMsgUBA[1] = (uint8)(PressureValue >> 16);
+		infoMsgS.datMsgUBA[2] = (uint8)(PressureValue >> 8);
+		infoMsgS.datMsgUBA[3] = (uint8)(PressureValue >> 0);
+		infoMsgS.datMsgUBA[4] = (uint8)(Distence1 >> 8);
+		infoMsgS.datMsgUBA[5] = (uint8)(Distence1);
+		infoMsgS.datMsgUBA[6] = (uint8)(Distence2 >> 8);
+		infoMsgS.datMsgUBA[7] = (uint8)(Distence2);
+		MCANDrv_SendMsg(infoMsgS);
+		break;
+	case 1:
+		CANNet_infoMsgTxConfSA[2].infoMsgIDUI = 0x7F1;
+		infoMsgS.infoConfS = CANNet_infoMsgTxConfSA[2];
+		infoMsgS.datMsgUBA[0] = (uint8)(Switch1);
+		infoMsgS.datMsgUBA[1] = (uint8)(Switch2);
+		infoMsgS.datMsgUBA[2] = 0xFF;
+		infoMsgS.datMsgUBA[3] = 0xFF;
+		infoMsgS.datMsgUBA[4] = (uint8)(PressureValue >> 24);
+		infoMsgS.datMsgUBA[5] = (uint8)(PressureValue >> 16);
+		infoMsgS.datMsgUBA[6] = (uint8)(PressureValue >> 8);
+		infoMsgS.datMsgUBA[7] = (uint8)(PressureValue >> 0);
+		MCANDrv_SendMsg(infoMsgS);
+		break;
+	case 2:
+		CANNet_infoMsgTxConfSA[2].infoMsgIDUI = 0x7F2;
+		infoMsgS.infoConfS = CANNet_infoMsgTxConfSA[2];
+		infoMsgS.datMsgUBA[0] = ControlState;
+		infoMsgS.datMsgUBA[1] = 0xFF;
+		infoMsgS.datMsgUBA[2] = 0xFF;
+		infoMsgS.datMsgUBA[3] = 0xFF;
+		infoMsgS.datMsgUBA[4] = (uint8)(Control_Times >> 24);
+		infoMsgS.datMsgUBA[5] = (uint8)(Control_Times >> 16);
+		infoMsgS.datMsgUBA[6] = (uint8)(Control_Times >> 8);
+		infoMsgS.datMsgUBA[7] = (uint8)(Control_Times);
+		MCANDrv_SendMsg(infoMsgS);
+		break;
+	default:
+		break;
+	}
+
+	CANNet_idxSchedUB = (uint16)((CANNet_idxSchedUB + 1) % 100); // 100ms一个完整循环
+#endif
 }

+ 7 - 15
System/Vehicle/Communication/CANNet.h

@@ -15,10 +15,12 @@
 
 #ifndef __CANNET_H
     #define __CANNET_H
-
+	#include "CanVar.h"
+	#include "VcuCanProtocolFunc.h"
+	#include "BcuCanProtocolFunc.h"
     #include "Std_Types.h"
     #include "HardwareLib.h"
-    
+
     #define _CAN_INDEX_CAN0     0
     #define _CAN_INDEX_CAN1     1
     #define _CAN_INDEX_CAN2     2
@@ -31,17 +33,7 @@
     void CANNet_RecvMsgCAN1(MCANDrv_infoMsgS_TYPE infoMsgS);
     
     //·¢ËÍÏûÏ¢¹ÜÀí
-    void CANNet_Manage1ms(void);
-    
-    
-    extern uint16 CANNet_rAccPedUW;
-    extern uint32 PressureValue;
-    extern uint16 Distence1;
-    extern uint16 Distence2;
-    extern uint8	Switch1;
-    extern uint8	Switch2;
-    extern uint8	ControlState;
-    extern uint32 Control_Times;
-
-
+    void CAN0Net_Manage1ms(void);
+    void CAN1Net_Manage1ms(void);
+    void CAN2Net_Manage1ms(void);
 #endif

+ 778 - 0
System/Vehicle/Communication/CanVar.c

@@ -0,0 +1,778 @@
+/*
+ * CanVar.c
+ *
+ *  Created on: 2021年12月27日
+ *  编码
+ *      Author: QiXiang_CHENJIE
+ */
+#include "CanVar.h"
+UINT32 BcuInTable[130] = {
+	0x1801EFF4,
+	0x1801FBF4,
+	0x1802FBF4,
+	0x1803FBF4,
+	0x1804FBF4,
+	0x1805FBF4,
+	0x1806FBF4,
+	0x1807FBF4,
+	0x1808FBF4,
+	0x1809FBF4,
+	0x180AFBF4,
+	0x180BFBF4,
+	0x180CFBF4,
+	0x180DFBF4,
+	0x180EFBF4,
+	0x180FFBF4,
+	0x1810FBF4,
+	0x1811FBF4,
+	0x1812FBF4,
+	0x1813FBF4,
+	0x1814FBF4,
+	0x1815FBF4,
+	0x1816FBF4,
+	0x1817FBF4,
+	0x1818FBF4,
+	0x1819FBF4,
+	0x181AFBF4,
+	0x181BFBF4,
+	0x181CFBF4,
+	0x181DFBF4,
+	0x181EFBF4,
+	0x181FFBF4,
+	0x1820FBF4,
+	0x1821FBF4,
+	0x1822FBF4,
+	0x1823FBF4,
+	0x1824FBF4,
+	0x1825FBF4,
+	0x1826FBF4,
+	0x1827FBF4,
+	0x1828FBF4,
+	0x1829FBF4,
+	0x182AFBF4,
+	0x182BFBF4,
+	0x182CFBF4,
+	0x182DFBF4,
+	0x182EFBF4,
+	0x182FFBF4,
+	0x1830FBF4,
+	0x1831FBF4,
+	0x1832FBF4,
+	0x1833FBF4,
+	0x1834FBF4,
+	0x1835FBF4,
+	0x1836FBF4,
+	0x1837FBF4,
+	0x1838FBF4,
+	0x1839FBF4,
+	0x183AFBF4,
+	0x183BFBF4,
+	0x183CFBF4,
+	0x183DFBF4,
+	0x183EFBF4,
+	0x183FFBF4,
+	0x1840FBF4,
+	0x1841FBF4,
+	0x1842FBF4,
+	0x1843FBF4,
+	0x1844FBF4,
+	0x1845FBF4,
+	0x1846FBF4,
+	0x1847FBF4,
+	0x1848FBF4,
+	0x1849FBF4,
+	0x184AFBF4,
+	0x184BFBF4,
+	0x184CFBF4,
+	0x184DFBF4,
+	0x184EFBF4,
+	0x184FFBF4,
+	0x1850FBF4,
+	0x1851FBF4,
+	0x1852FBF4,
+	0x1853FBF4,
+	0x1854FBF4,
+	0x1855FBF4,
+	0x1856FBF4,
+	0x1857FBF4,
+	0x1858FBF4,
+	0x1859FBF4,
+	0x185AFBF4,
+	0x185BFBF4,
+	0x185CFBF4,
+	0x185DFBF4,
+	0x185EFBF4,
+	0x185FFBF4,
+	0x1860FBF4,
+	0x1881EFF4,
+	0x1882EFF4,
+	0x1883EFF4,
+	0x1884EFF4,
+	0x1885EFF4,
+	0x1886EFF4,
+	0x1887EFF4,
+	0x1888EFF4,
+	0x1889EFF4,
+	0x18A0FBF4,
+	0x18A1FBF4,
+	0x18A2FBF4,
+	0x18A3FBF4,
+	0x18A4FBF4,
+	0x18A5FBF4,
+	0x18A6FBF4,
+	0x18E1EFF4,
+	0x18E2EFF4,
+	0x18E3EFF4,
+	0x18E4EFF4,
+	0x18FEDAF4,
+	0x18FF23F4,
+	0x18FF24F4,
+	0x18FF25F4,
+	0x18FF30F4,
+	0x18FF45F4,
+	0x18FFC13A,
+	0x18FFD4F4,
+	0x18FFD5F4,
+	0x18FFD6F4,
+	0x18FFD7F4,
+	0x18FFD8F4,
+	0x18FFD9F4,
+};
+BOOL BcuRxShortError[130];
+BOOL BcuRxLongError[130];
+UINT8 BcuRxErrorCounter[130];
+UINT8 BcuRxFlag[130];
+/************************************************************
+ *BCU->Ebc解码变量存放区
+ ************************************************************/
+UINT8 BMS13_ReqVIN = 0x00;						   // BMS请求VIN码标志,0-无请求 1-请求,精度_1,偏移量_0,单位_
+UINT8 BMS11_Fult1_DelTemp = 0x00;				   //电芯温差异常报警,0-正常  1-1级 轻微故障 2-2级 较严重故障 3-3级 最严重故障,精度_1,偏移量_0,单位_
+UINT8 BMS11_Fult1_OverTemp = 0x00;				   //电芯温度过高报警,0-正常  1-1级 轻微故障 2-2级 较严重故障 3-3级 最严重故障,精度_1,偏移量_0,单位_
+UINT8 BMS11_Fult1_PackOverHVolt = 0x00;			   // PACK过压报警,0-正常  1-1级 轻微故障 2-2级 较严重故障 3-3级 最严重故障,精度_1,偏移量_0,单位_
+UINT8 BMS11_Fult1_PackLowHVolt = 0x00;			   // PACK欠压报警,0-正常  1-1级 轻微故障 2-2级 较严重故障 3-4级 最严重故障,精度_1,偏移量_0,单位_
+UINT8 BMS11_Fult1_LowSOC = 0x00;				   // SOC过低报警,0-正常  1-1级 轻微故障 2-2级 较严重故障 3-5级 最严重故障,精度_1,偏移量_0,单位_
+UINT8 BMS11_Fult1_OverUcell = 0x00;				   //单体电压过高报警,0-正常  1-1级 轻微故障 2-2级 较严重故障 3-6级 最严重故障,精度_1,偏移量_0,单位_
+UINT8 BMS11_Fult1_LowUcell = 0x00;				   //单体电压欠压报警,0-正常  1-1级 轻微故障 2-2级 较严重故障 3-7级 最严重故障,精度_1,偏移量_0,单位_
+UINT8 BMS11_Fult1_LowInsRes = 0x00;				   //绝缘报警,0-正常  1-1级 轻微故障 2-2级 较严重故障 3-8级 最严重故障,精度_1,偏移量_0,单位_
+UINT8 BMS11_Fult1_UcellUniformity = 0x00;		   //电池一致性差报警,0-正常  1-1级 轻微故障 2-2级 较严重故障 3-9级 最严重故障,精度_1,偏移量_0,单位_
+UINT8 BMS11_Fult1_OverChg = 0x00;				   //车载储能装置过充报警,0-正常  1-1级 轻微故障 2-2级 较严重故障 3-10级 最严重故障,精度_1,偏移量_0,单位_
+UINT8 BMS11_Fult1_OverSOC = 0x00;				   // SOC过高报警,0-正常  1-1级 轻微故障 2-2级 较严重故障 3-11级 最严重故障,精度_1,偏移量_0,单位_
+UINT8 BMS11_Fult1_SOCChangeFast = 0x00;			   // SOC跳变报警,0-正常  1-故障,精度_1,偏移量_0,单位_
+UINT8 BMS11_Fult1_BatSysNotMatch = 0x00;		   //可充电储能系统不匹配报警,0-正常  1-故障,精度_1,偏移量_0,单位_
+UINT8 BMS11_Fult1_HVILFault = 0x00;				   //高压互锁报警,0-正常  1-故障,精度_1,偏移量_0,单位_
+UINT8 BMS12_Fult2_FaultNum = 0x00;				   // BMS当前发生的故障总数目(包括GB32960中规定的故障数目) 精度_1,偏移量_0,单位_
+UINT8 BMS12_Fult2_CellOverDischrg = 0x00;		   //电芯过放故障,0-正常  1-故障,精度_1,偏移量_0,单位_
+UINT8 BMS12_Fult2_CellLowTemp = 0x00;			   //电芯低温报警,0-正常  1-故障,精度_1,偏移量_0,单位_
+UINT8 BMS12_Fult2_PackFireWarning = 0x00;		   //电池包火灾报警,0-正常  1-故障,精度_1,偏移量_0,单位_
+UINT8 BMS12_Fult2_OverDischrgCurr = 0x00;		   //放电电流超限报警,0-正常  1-1级 轻微故障 2-2级 较严重故障 3-11级 最严重故障,精度_1,偏移量_0,单位_
+UINT8 BMS12_Fult2_OverChrgCurrInTheDrive = 0x00;   //回充电流超限报警,0-正常  1-1级 轻微故障 2-2级 较严重故障 3-11级 最严重故障,精度_1,偏移量_0,单位_
+UINT8 BMS12_Fult2_CurrSensorErr = 0x00;			   //电流传感器故障,0-正常  1-故障,精度_1,偏移量_0,单位_
+UINT8 BMS12_Fult2_PowerSupplyErr = 0x00;		   // BMS低压供电电压异常报警,0-正常  1-故障,精度_1,偏移量_0,单位_
+UINT8 BMS12_Fult2_TMSErr = 0x00;				   //热管理机组故障,0-正常  1-故障,精度_1,偏移量_0,单位_
+UINT8 BMS12_Fult2_HeatingFilmErr = 0x00;		   //加热膜加热回路故障,0-正常  1-故障,精度_1,偏移量_0,单位_
+UINT8 BMS12_Fult2_PackSelfProtect = 0x00;		   //电池包自保护故障,0-正常  1-故障,精度_1,偏移量_0,单位_
+UINT8 BMS12_Fult2_MainLoopPrechrgErr = 0x00;	   //主回路预充或预检故障,0-正常  1-故障,精度_1,偏移量_0,单位_
+UINT8 BMS12_Fult2_AuxLoopPrechrgErr = 0x00;		   //辅件回路预充或预检故障,0-正常  1-故障,精度_1,偏移量_0,单位_
+UINT8 BMS12_Fult2_ChrgInsLowErr = 0x00;			   //充电绝缘阻值低,0-正常  1-故障,精度_1,偏移量_0,单位_
+UINT8 BMS12_Fult2_ACANLost = 0x00;				   // ACAN通讯故障,0-正常  1-故障,精度_1,偏移量_0,单位_
+UINT8 BMS12_Fult2_InnerCommunicationErr = 0x00;	   // BMS内部通信故障,0-正常  1-故障,精度_1,偏移量_0,单位_
+UINT8 BMS12_Fult2_DCDCErr = 0x00;				   // BMS-DC-DC故障,0-正常  1-故障,精度_1,偏移量_0,单位_
+UINT8 BMS12_Fult2_BranchBreakErr = 0x00;		   //支路断路故障报警,0-正常  1-故障,精度_1,偏移量_0,单位_
+UINT8 BMS12_Fult2_HeatRelayOpenErr = 0x00;		   //加热膜或TMS接触器故障无法闭合报警,0-正常  1-故障,精度_1,偏移量_0,单位_
+UINT8 BMS12_Fult2_HeatRelayWeldErr = 0x00;		   //加热膜或TMS接触器故障无法断开报警,0-正常  1-故障,精度_1,偏移量_0,单位_
+UINT8 BMS12_Fult2_MainPosRelayOpenErr = 0x00;	   //主正接触器无法闭合故障报警,0-正常  1-故障,精度_1,偏移量_0,单位_
+UINT8 BMS12_Fult2_MainPosRelayWeldErr = 0x00;	   //主正接触器无法断开故障报警,0-正常  1-故障,精度_1,偏移量_0,单位_
+UINT8 BMS12_Fult2_MainNegRelayOpenErr = 0x00;	   //主负接触器无法闭合故障报警,0-正常  1-故障,精度_1,偏移量_0,单位_
+UINT8 BMS12_Fult2_MainNegRelayWeldErr = 0x00;	   //主负接触器无法断开故障报警,0-正常  1-故障,精度_1,偏移量_0,单位_
+UINT8 BMS12_Fult2_DCChrgPos1RelayOpenErr = 0x00;   //直流充电A正接触器无法闭合故障报警,0-正常  1-故障,精度_1,偏移量_0,单位_
+UINT8 BMS12_Fult2_DCChrgPos1RelayWeldErr = 0x00;   //直流充电A正接触器无法断开故障报警,0-正常  1-故障,精度_1,偏移量_0,单位_
+UINT8 BMS12_Fult2_DCChrgNeg1RelayOpenErr = 0x00;   //直流充电A负接触器无法闭合故障报警,0-正常  1-故障,精度_1,偏移量_0,单位_
+UINT8 BMS12_Fult2_DCChrgNeg1RelayWeldErr = 0x00;   //直流充电A负接触器无法断开故障报警,0-正常  1-故障,精度_1,偏移量_0,单位_
+UINT8 BMS12_Fult2_DCChrgPos2RelayOpenErr = 0x00;   //直流充电B正接触器无法闭合故障报警,0-正常  1-故障,精度_1,偏移量_0,单位_
+UINT8 BMS12_Fult2_DCChrgPos2RelayWeldErr = 0x00;   //直流充电B正接触器无法断开故障报警,0-正常  1-故障,精度_1,偏移量_0,单位_
+UINT8 BMS12_Fult2_DCChrgNeg2RelayOpenErr = 0x00;   //直流充电B负接触器无法闭合故障报警,0-正常  1-故障,精度_1,偏移量_0,单位_
+UINT8 BMS12_Fult2_DCChrgNeg2RelayWeldErr = 0x00;   //直流充电B负接触器无法断开故障报警,0-正常  1-故障,精度_1,偏移量_0,单位_
+UINT8 BMS12_Fult2_ChrgConnectErr = 0x00;		   //插枪连接信号异常,0-正常  1-故障,精度_1,偏移量_0,单位_
+UINT8 BMS12_ult2_OverDischrgCurrWhenInChrg = 0x00; //充电时放电电流过大,0-正常  1-故障,精度_1,偏移量_0,单位_
+UINT8 BMS12_Fult2_OverChrgCurrInTheChrg = 0x00;	   //充电电流超限报警,0-正常  1-故障,精度_1,偏移量_0,单位_
+UINT8 BMS12_Fult2_ChrgNTCErr = 0x00;			   //充电插座NTC故障,0-正常  1-故障,精度_1,偏移量_0,单位_
+UINT8 BMS12_Fult2_ChrgNTCTempOver = 0x00;		   //充电插座过温报警,0-正常  1-1级 轻微故障 2-2级 较严重故障 3-3级 最严重故障,精度_1,偏移量_0,单位_
+UINT8 BMS12_Fult2_ELockErr = 0x00;				   //电子锁故障,0-正常  1-故障,精度_1,偏移量_0,单位_
+UINT8 BMS12_Fult2_FireDetectorEr = 0x00;		   //火警探测器故障,0-正常  1-故障,精度_1,偏移量_0,单位_
+UINT8 BMS12_Fult2_ContiDischrgCurrOverLoad = 0x00; //持续回充过流故障,0-正常  1-1级 轻微故障 2-2级 较严重故障 3-11级 最严重故障,精度_1,偏移量_0,单位_
+UINT8 BMS12_Fult2_SOCDifferErr = 0x00;			   // SOC差异过大,0-正常  1-故障,精度_1,偏移量_0,单位_
+UINT8 BMS12_Fult2_ContiChrgCurrOverLoad = 0x00;	   //持续放电过流故障,0-正常  1-1级 轻微故障 2-2级 较严重故障 3-11级 最严重故障,精度_1,偏移量_0,单位_
+UINT8 BMS1_MainPosRelaySt = 0x00;				   //主正继电器状态,0-预留 1-断开 2-吸合  ,精度_1,偏移量_0,单位_
+UINT8 BMS1_MainNegRelaySt = 0x00;				   //主负继电器状态,0-预留 1-断开 2-吸合  ,精度_1,偏移量_0,单位_
+UINT8 BMS1_PreChgRelaySt = 0x00;				   //预充继电器状态,0-预留 1-断开 2-吸合  ,精度_1,偏移量_0,单位_
+UINT8 BMS1_DCChrgPos1RelaySt = 0x00;			   //直流充正继电器1状态,0-预留 1-断开 2-吸合  ,精度_1,偏移量_0,单位_
+UINT8 BMS1_DCChrgNeg1RelaySt = 0x00;			   //直流充负继电器1状态,0-预留 1-断开 2-吸合  ,精度_1,偏移量_0,单位_
+UINT8 BMS1_DCChrgPos2RelaySt = 0x00;			   //直流充正继电器2状态,0-预留 1-断开 2-吸合  ,精度_1,偏移量_0,单位_
+UINT8 BMS1_DCChrgNeg2RelaySt = 0x00;			   //直流充负继电器2状态,0-预留 1-断开 2-吸合  ,精度_1,偏移量_0,单位_
+UINT8 BMS1_HeatPosRelaySt = 0x00;				   //加热正继电器状态,0-预留 1-断开 2-吸合  ,精度_1,偏移量_0,单位_
+UINT8 BMS1_HeatNegRelaySt = 0x00;				   //加热负继电器状态,0-预留 1-断开 2-吸合  ,精度_1,偏移量_0,单位_
+UINT8 BMS1_SysSts = 0x00;						   //电池管理系统工作状态,0-初始化 1-自检完成允许上电 2-运行状态 3-高压切断 4-故障状态,精度_1,偏移量_0,单位_
+UINT8 BMS1_Life = 0x00;							   // BMS生命信号 精度_1,偏移量_1,单位_
+UINT8 BMS1_BalanceStatus = 0x00;				   // BMS当前均衡状态,0-未均衡 1-均衡中,精度_1,偏移量_0,单位_
+UINT8 BMS1_DCChrgConnectSt = 0x00;				   //直流充电枪连接状态,0-未连接 1-单枪连接 2-双枪连接 3-无效,精度_1,偏移量_0,单位_
+UINT8 BMS1_ChrgMode = 0x00;						   // BMS当前充电模式,0-未充电 1-直流充电 2-交流充电 3-其他充电模式,精度_1,偏移量_0,单位_
+UINT8 BMS1_ChrgStatus = 0x00;					   //充电状态,0-未充电 1-充电中 2-充电已完成 3-充电错误故障,精度_1,偏移量_0,单位_
+UINT8 BMS1_HeatingStatus = 0x00;				   //当前加热状态,0-未加热 1-加热中,精度_1,偏移量_0,单位_
+UINT8 BMS1_CoolingStatus = 0x00;				   //当前冷却状态,0-未冷却 1-冷却中,精度_1,偏移量_0,单位_
+UINT8 BMS2_SOC = 0x00;							   //电池包SOC 精度_0.4,偏移量_0,单位_
+UINT8 BMS2_SOH = 0x00;							   //电池包SOH 精度_0.4,偏移量_0,单位_
+UINT8 BMS2_FaultCode = 0x00;					   //故障码,见BMS_ErrCode,精度_1,偏移量_0,单位_
+UINT8 BMS2_FaultLevel = 0x00;					   //当前最高故障等级,0-正常 1-1级 轻微故障 2-2级 较严重故障 3-3级 最严重故障,精度_1,偏移量_0,单位_
+UINT8 BMS2_RqHVPoerOff = 0x00;					   // BMS下高压请求,0-无效 1-请求下高压 2-不请求下高压 3-无效,精度_1,偏移量_0,单位_
+UINT8 BMS2_Life = 0x00;							   // BMS生命信号 精度_1,偏移量_0,单位_
+UINT8 BMS4_InsDetectorSt = 0x00;				   // BMS绝缘检测状态,0-停止检测  1-激活检测,精度_1,偏移量_0,单位_
+UINT8 BMS8_Max_Temp = 0x00;						   //单体最高温度 精度_1,偏移量_-40,单位_℃
+UINT8 BMS8_Min_Temp = 0x00;						   //单体最低温度 精度_1,偏移量_-40,单位_℃
+UINT8 BMS8_Avg_Temp = 0x00;						   //单体平均温度 精度_1,偏移量_-40,单位_℃
+UINT8 BMS8_MaxTempSysNr = 0x00;					   //最高温度子系统号 精度_1,偏移量_0,单位_
+UINT8 BMS8_MaxTempNr = 0x00;					   //最高温度探针单体代号 精度_1,偏移量_0,单位_
+UINT8 BMS8_MinTempSysNr = 0x00;					   //最低温度子系统号 精度_1,偏移量_0,单位_
+UINT8 BMS8_MinTempNr = 0x00;					   //最低温度探针子系统代号 精度_1,偏移量_0,单位_
+UINT8 BMS7_MaxUcellSysNr = 0x00;				   //最高电压电池子系统号 精度_1,偏移量_0,单位_
+UINT8 BMS7_MinUcellSysNr = 0x00;				   //最低电压电池子系统号 精度_1,偏移量_0,单位_
+UINT8 BMS23_Gun1DCPosTemp = 0x00;				   // A枪DC+温度传感器温度 精度_1,偏移量_-40,单位_℃
+UINT8 BMS23_Gun1DCNegTemp = 0x00;				   // A枪DC-温度传感器温度 精度_1,偏移量_-40,单位_℃
+UINT8 BMS23_Gun2DCPosTemp = 0x00;				   // B枪DC+温度传感器温度 精度_1,偏移量_-40,单位_℃
+UINT8 BMS23_Gun2DCNegTemp = 0x00;				   // B枪DC-温度传感器温度 精度_1,偏移量_-40,单位_℃
+UINT8 BMS_Cell_TempN[64] = {0x00};				   //电池温度编号
+UINT8 BMS_SN_SysCode[24] = {0x00};				   //电池SN
+UINT8 BMS21_BattType = 0x00;					   //电池类型,1 -铅酸电池 2 -镍氢电池 3 -磷酸铁锂电池  4 -锰酸锂电池 5 -钴酸锂电池 6 -三元材料电池  7 -聚合物锂离子电池 8 -钛酸锂电池  9-超级电容 15-其他车载储能装置,精度_1,偏移量_0,单位_
+UINT8 BMS21_CoolType = 0x00;					   //电池冷却方式,0-其他冷却方式 1-自然冷却 2-风扇冷却 3-水冷却,精度_1,偏移量_0,单位_
+UINT8 BMS21_Manufacture = 0x00;					   //电池厂家,1-CATL 2-LS 3-MGL 4-SAMSUN 5-LG 6-GXGK 7-SUNWODA 8-Others,精度_1,偏移量_0,单位_
+UINT8 BMS21_ProtocolEditionH = 0x00;			   //通讯协议版本高位(例 - 版本为3 .1,则此处发3) 精度_1,偏移量_0,单位_
+UINT8 BMS21_ProtocolEditionL = 0x00;			   //通讯协议版本低位(例 - 版本为3 .1,则此处发1) 精度_1,偏移量_0,单位_
+UINT8 BMS9_TotCSCNum = 0x00;					   //电池系统中CSC总的数目 精度_1,偏移量_0,单位_
+UINT8 BMS9_PackTotTempNum = 0x00;				   // PACK中电芯温度点(探针)的总数目 精度_1,偏移量_0,单位_
+UINT8 BMS9_HVBranchNum = 0x00;					   //电池系统高压支路数 精度_1,偏移量_0,单位_
+UINT8 BMS9_SingleHVBranchCellNum = 0x00;		   //电池系统单支路电芯数 精度_1,偏移量_0,单位_
+UINT8 BMS9_BattSysNum = 0x00;					   //可充电储能系统数目(EV默认1,满足GB32960要求) 精度_1,偏移量_0,单位_
+UINT8 BMS9_BattSysSeqNum = 0x00;				   //可充电储能系统序号(EV默认1,满足GB32960要求) 精度_1,偏移量_0,单位_
+UINT8 BMS22_AvaiMaxSOC = 0x00;					   // PACK可用最高SOC(根据技术协议) 精度_0.4,偏移量_0,单位_
+UINT8 BMS22_AvaiMinSOC = 0x00;					   // PACK可用最低SOC(根据技术协议) 精度_0.4,偏移量_0,单位_
+UINT8 BMS22_AvaiMaxTemp = 0x00;					   // PACK可用温度上限(根据技术协议) 精度_1,偏移量_-40,单位_℃
+UINT8 BMS22_AvaiMinTemp = 0x00;					   // PACK可用温度下限(根据技术协议) 精度_1,偏移量_-40,单位_℃
+UINT8 BMS10_SubSysEncodingLen = 0x00;			   //可充电储能系统编码长度 精度_1,偏移量_0,单位_
+UINT8 BMS10_SubSysIdx = 0x00;					   //可充电储能系统编码 精度_1,偏移量_0,单位_
+UINT8 BMS10_SubSysErrNum = 0x00;				   //可充电储能装置故障总数 精度_1,偏移量_0,单位_
+UINT8 BMS28_ReqMode = 0x00;						   // BMS请求设定模式,0-关机模式 1-制冷模式 2-制热模式 3-自循环模式,精度_1,偏移量_0,单位_
+UINT8 BMS28_HVCmd = 0x00;						   //高压请求,0-请求上高压 1-请求下高压,精度_1,偏移量_0,单位_
+UINT8 BMS28_ChgSts = 0x00;						   //充电状态,0-非充电 1-充电,精度_1,偏移量_0,单位_
+UINT8 BMS28_HVRelaySts = 0x00;					   // BMS高压继电器状态,0-断开状态 1-闭合状态,精度_1,偏移量_0,单位_
+UINT8 BMS28_SetTemp = 0x00;						   //设定温度 精度_1,偏移量_-40,单位_
+UINT8 BMS28_Life = 0x00;						   // BMS生命帧 精度_1,偏移量_0,单位_
+UINT8 BMS28_CRC = 0x00;							   // CRC校验值 精度_1,偏移量_0,单位_
+UINT8 TMS_WorkStatus = 0x00;					   // TMS工作状态,0-关机模式 1-制冷模式 2-制热模式 3-自循环模式,精度_1,偏移量_0,单位_
+UINT8 TMS_HVRelayST = 0x00;						   // TMS高压继电器状态,0-断开状态 1-闭合状态,精度_1,偏移量_0,单位_
+UINT8 TMS_OutletTemp = 0x00;					   //出水温度(机组到电池) 精度_1,偏移量_-40,单位_
+UINT8 TMS_InletTemp = 0x00;						   //回水温度(电池到机组) 精度_1,偏移量_-40,单位_
+UINT8 TMS_Version = 0x00;						   // TMS软件版本 精度_0.1,偏移量_0,单位_
+UINT8 TMS_ErrCode = 0x00;						   // TMS故障码,见附件,精度_1,偏移量_0,单位_
+UINT8 TMS_FaultLevel = 0x00;					   // TMS故障码等级,0-无效 1-1级故障 2-2级故障 3-3级故障,精度_1,偏移量_0,单位_
+UINT8 BCU_SnMsgFlag = 0x00;						   // SN码收全标志位
+UINT16 BMS_Cell_Volt[384] = {0x00};				   //电芯电压
+UINT16 BMS11_PackOutsideVolt = 0x00;			   //电池包外侧电压 精度_0.1,偏移量_0,单位_V
+UINT16 BMS2_PackCurrent = 0x00;					   //电池包总电流,充电为负值,放电为正值 精度_0.1,偏移量_-1000,单位_A
+UINT16 BMS2_PackInsideVolt = 0x00;				   //电池包内侧电压 精度_0.1,偏移量_0,单位_V
+UINT16 BMS4_PosIsolation = 0x00;				   //母线正对车体绝缘电阻 精度_1,偏移量_0,单位_KΩ
+UINT16 BMS4_NegIsolation = 0x00;				   //母线负对车体绝缘电阻 精度_1,偏移量_0,单位_KΩ
+UINT16 BMS4_SysInsRes = 0x00;					   //系统绝缘电阻 精度_1,偏移量_0,单位_KΩ
+UINT16 BMS6_Max_Ucell = 0x00;					   //单体最高电压值 精度_0.001,偏移量_0,单位_V
+UINT16 BMS6_Min_Ucell = 0x00;					   //单体最低电压值 精度_0.001,偏移量_0,单位_V
+UINT16 BMS6_Avg_Ucell = 0x00;					   //电体电压平均值 精度_0.001,偏移量_0,单位_V
+UINT16 BMS6_SOE = 0x00;							   //剩余电量电量(SOE) 精度_0.01,偏移量_0,单位_Kwh
+UINT16 BMS7_MaxUcellNr = 0x00;					   //最高电压电池单体代号 精度_1,偏移量_0,单位_
+UINT16 BMS7_MinUcellNr = 0x00;					   //最低电压电池单体代号 精度_1,偏移量_0,单位_
+UINT16 BMS23_RemainChgTi = 0x00;				   //剩余充电时间 精度_1,偏移量_0,单位_min
+UINT16 BMS21_RateCap = 0x00;					   //电池包额定容量 精度_0.1,偏移量_0,单位_Ah
+UINT16 BMS21_RateHVolt = 0x00;					   //电池包额定电压 精度_0.1,偏移量_0,单位_V
+UINT16 BMS21_RatePower = 0x00;					   //电池包额定总能量 精度_0.1,偏移量_0,单位_kWh
+UINT16 BMS9_PackTotCellNum = 0x00;				   // PACK中单体电芯的总数目 精度_1,偏移量_0,单位_
+UINT16 BMS22_PackAvaiMaxVolt = 0x00;			   // PACK可用电压上限(根据技术协议) 精度_0.1,偏移量_0,单位_V
+UINT16 BMS22_PackAvaiMinVolt = 0x00;			   // PACK可用电压下限(根据技术协议) 精度_0.1,偏移量_0,单位_V
+UINT16 BMS_SoftwareVersion = 0x00;				   //软件版本 精度_0.1,偏移量_0,单位_
+UINT16 BMS_HardwareVersion = 0x00;				   //硬件版本 精度_0.1,偏移量_0,单位_
+UINT16 BMS3_MaxDischgPow = 0x00;				   //最大允许放电功率 精度_0.1,偏移量_0,单位_Kw
+UINT16 BMS3_MaxChgPow = 0x00;					   //最大允许充电功率 精度_0.1,偏移量_0,单位_Kw
+UINT16 BMS3_MaxInstantDischgPow = 0x00;			   //最大允许瞬时放电功率 精度_0.1,偏移量_0,单位_Kw
+UINT16 BMS3_MaxiInstantChgPow = 0x00;			   //最大允许瞬时充电功率 精度_0.1,偏移量_0,单位_Kw
+UINT16 BMS5_DischgCurMaxAllw = 0x00;			   //电池最大允许放电电流 精度_0.1,偏移量_-1000,单位_A
+UINT16 BMS5_ChrgCurMaxAllw = 0x00;				   //电池最大允许充电电流 精度_0.1,偏移量_-1000,单位_A
+UINT16 BMS5_InstChrgCurMaxAllw = 0x00;			   //动力电池允许最大瞬时充电电流 精度_0.1,偏移量_-1000,单位_A
+UINT16 BMS5_InstDischrgCurMaxAllw = 0x00;		   //电池允许最大瞬时放电电流 精度_0.1,偏移量_-1000,单位_A
+UINT16 BMS26_Bat_InstantConsume = 0x00;			   //动力电池瞬时能耗 精度_0.1,偏移量_0,单位_Wh
+UINT16 BMS26_Bat_TotalConsume = 0x00;			   //动力电池总能量能耗 精度_0.1,偏移量_0,单位_Wh
+UINT16 BMS26_ChgReqVoltage = 0x00;				   //充电所需电压 精度_0.1,偏移量_0,单位_V
+UINT16 BMS26_ChgReqCurrent = 0x00;				   //充电所需电流 精度_0.1,偏移量_-1000,单位_A
+UINT16 BMS28_HVVolt = 0x00;						   // BMS当前电压 精度_1,偏移量_0,单位_
+UINT16 TMS_ReqPow = 0x00;						   // TMS需求功率 精度_0.1,偏移量_0,单位_Kw
+UINT32 BMS1_RechrgCycels = 0x00;				   //充电次数 精度_1,偏移量_0,单位_
+UINT32 BMS14_TotalChargeAh = 0x00;				   //累积充入Ah 数 精度_0.1,偏移量_0,单位_Ah
+UINT32 BMS14_TotalDischargeAh = 0x00;			   //累积放出Ah 数 精度_0.1,偏移量_0,单位_Ah
+UINT32 BMS15_TotalChargeKwh = 0x00;				   //累计充入kWh 数 精度_0.1,偏移量_0,单位_KWh
+UINT32 BMS15_TotalDischargeKwh = 0x00;			   //累计放出kWh 数 精度_0.1,偏移量_0,单位_KWh
+UINT32 BMS16_TotalEneryECOChargeAh = 0x00;		   //累计动能回馈充入Ah 数 精度_0.1,偏移量_0,单位_Ah
+UINT32 BMS16_TotalEneryECOChargeKwh = 0x00;		   //累计动能回馈充入kWh 数 精度_0.1,偏移量_0,单位_KWh
+UINT32 BMS17_TotalStationChargeAh = 0x00;		   //累计换电站充入Ah 数 精度_0.1,偏移量_0,单位_Ah
+UINT32 BMS17_TotalStationChargeKwh = 0x00;		   //累计换电站充入kWh 数 精度_0.1,偏移量_0,单位_KWh
+UINT32 BMS18_TotalPoleChargeAh = 0x00;			   //累计插枪充电充入Ah 数 精度_0.1,偏移量_0,单位_Ah
+UINT32 BMS18_TotalPoleChargeKwh = 0x00;			   //累计插枪充电充入kWh 数 精度_0.1,偏移量_0,单位_KWh
+UINT32 BMS19_SingleChargeAh = 0x00;				   //单次充电Ah 数 精度_0.1,偏移量_0,单位_Ah
+UINT32 BMS19_SingleChargeKwh = 0x00;			   //单次充电kWh 数 精度_0.1,偏移量_0,单位_KWh
+/*************************************************************
+ *Ebc->Bcu组码变量存放区
+ ************************************************************/
+UINT32 Ebc2BcuOutTable[5][2] = {
+	{0x1802F4EF,100},
+	{0x1803F4EF,100},
+	{0x18E1F4EF,1000},
+	{0x18FF11F1,100},
+	{0x18FF12F1,100},
+};
+// UINT8 VCU_Life = 0x00;			   // VCU生命信号,精度_1,偏移_0,单位_
+
+UINT8 VCU_ReqHV = 0x00;	  //整车发给BMS的主回路上下高压指令,1 _PowerOn   2_PowerOff,精度_1,偏移_0,单位_
+UINT8 VCU_DCDCSts = 0x00; // DCDC 状态,1_停止(断开)2_运行中,精度_1,偏移_0,单位_
+UINT8 VCU_DCACSts = 0x00; //电动油泵状态,1_停止(断开)2_运行中,精度_1,偏移_0,单位_
+UINT8 VCU_DCAPSts = 0x00; //电动空压机状态,1_停止(断开)2_运行中,精度_1,偏移_0,单位_
+// UINT8 VCU_VehicleSpeed = 0x00;	   //车速,精度_1,偏移_0,单位_km/h
+UINT8 VCU_PosRlySts = 0x00;		   //整车端主正继电器状态,1_断开   2_闭合,精度_1,偏移_0,单位_
+UINT8 VCU_PosRlyErrSts = 0x00;	   //整车端主正继电器故障状态,0_正常 1_粘连 2 无法吸合,精度_1,偏移_0,单位_
+UINT8 VCU_PTCRlSts = 0x00;		   // PTC 继电器状态,1_断开   2_闭合,精度_1,偏移_0,单位_
+UINT8 VCU_PTCRlErrSts = 0x00;	   // PTC 继电器故障状态,0_正常 1_粘连" 2 无法吸合,精度_1,偏移_0,单位_
+UINT8 VCU_StopChgCmd = 0x00;	   //停止充电指令,1_未激活  2_激活,精度_1,偏移_0,单位_
+UINT8 VCU_HVInterlock = 0x00;	   //高压互锁故障,0_正常 1_故障,精度_1,偏移_0,单位_
+UINT8 VCU_AssistRlySts = 0x00;	   //辅助接触器状态,1_断开   2_闭合,精度_1,偏移_0,单位_
+UINT8 VCU_AssistRlyErrSts = 0x00;  //辅助接触器故障状态,0_正常 1_粘连" 2 无法吸合,精度_1,偏移_0,单位_
+UINT8 VCU_ACRlySts = 0x00;		   //空调压缩机接触器状态,1_断开   2_闭合,精度_1,偏移_0,单位_
+UINT8 VCU_ACRlyErrSts = 0x00;	   //空调压缩机接触器故障状态,0_正常 1_粘连" 2 无法吸合,精度_1,偏移_0,单位_
+UINT8 ISO_WorkStatus = 0x00;	   //绝缘检测仪工作状态,0_安全检查 1_ 工作  2_ 停止工作 3_设备故障,精度_1,偏移_0,单位_
+UINT8 ISO_FaultLevel = 0x00;	   //绝缘故障等级,0_无故障 1_1级故障 2_2级故障 3_3级故障 ,精度_1,偏移_0,单位_
+UINT16 ISO_PosResis = 0x00;		   //正极绝缘值,精度_1,偏移_0,单位_
+UINT16 ISO_NegResis = 0x00;		   //负极绝缘值,精度_1,偏移_0,单位_
+UINT8 VIN_FrameNo = 0;			   // VIN帧序号
+UINT8 EBC_State = 0x00;			   //换电控制器状态,0_行车状态 1_通讯状态 2_换电状态,精度_1,偏移_0,单位_
+UINT8 EBC_ForbidHVOn = 0x00;	   //禁止高压上电,0_允许高压上电 1_禁止高压上电,精度_1,偏移_0,单位_
+UINT8 EBC_RequestHVOff = 0x00;	   //请求高压下电,0_无效 1_请求高压下电,精度_1,偏移_0,单位_
+UINT8 EBC_ChgFaultFlag = 0x00;	   //充电故障标志,0_无故障 1_有故障,精度_2,偏移_0,单位_
+UINT8 EBC_LockupFaultFlag = 0x00;  //锁止机构故障标志,0_异常 1_正常,精度_1,偏移_0,单位_
+UINT8 EBC_ChgCnctOverTemp = 0x00;  //充电连接器过温故障标志,0_异常 1_正常,精度_1,偏移_0,单位_
+UINT8 EBC_DischgHIVLFlag = 0x00;   //放电互锁故障标志,0_异常 1_正常,精度_1,偏移_0,单位_
+UINT8 EBC_ChargeHIVLFlag = 0x00;   //充电互锁故障标志,0_异常 1_正常,精度_1,偏移_0,单位_
+UINT8 EBC_DChgCnctOverTemp = 0x00; //放电连接器过温故障标志,0_异常 1_正常,精度_1,偏移_0,单位_
+UINT8 EBC_FaultLevel = 0x00;	   //故障等级,0_无效 1_1级故障 2_2级故障 3_3级故障,精度_1,偏移_0,单位_
+UINT8 EBC_FaultCode = 0x00;		   //故障码,见附件,精度_1,偏移_0,单位_
+UINT8 EBC_ChargingStatus = 0x00;   //充电标志位,1_车载插枪充入 2_换电站充入,精度_1,偏移_0,单位_
+UINT8 EBC_ActiveHeatReq = 0x00;	   //主动预热请求,0_无主动预热请求 1_请求主动预热 2~3预留,精度_1,偏移_0,单位_
+UINT8 EBC_AirPressure = 0x00;	   //气压值,精度_0.01,偏移_0,单位_Mpa
+// UINT8 EBC_Life = 0x00;			   // LIFE 信号,精度_1,偏移_0,单位_
+//  UINT8 EBC_ChgPos1Temp = 0x00;	   //充电正1温度(保留),精度_1,偏移_-40,单位_℃
+//  UINT8 EBC_ChgNeg1Temp = 0x00;	   //充电负1温度(保留),精度_1,偏移_-40,单位_℃
+//  UINT8 EBC_ChgPos2Temp = 0x00;	   //充电正2温度(保留),精度_1,偏移_-40,单位_℃
+//  UINT8 EBC_ChgNeg2Temp = 0x00;	   //充电负2温度(保留),精度_1,偏移_-40,单位_℃
+//  UINT8 EBC_DchgPos1Temp = 0x00;	   //放电正1温度,精度_1,偏移_-40,单位_℃
+//  UINT8 EBC_DchgNeg1Temp = 0x00;	   //放电负1温度,精度_1,偏移_-40,单位_℃
+//  UINT8 EBC_DchgPos2Temp = 0x00;	   //放电正2温度,精度_1,偏移_-40,单位_℃
+//  UINT8 EBC_DchgNeg2Temp = 0x00;	   //放电负2温度,精度_1,偏移_-40,单位_℃
+/*************************************************************
+ *Vcu->Ebc组码变量存放区
+ ************************************************************/
+UINT8 EBC_VinMsgFlag = 0x00; // EBC收全VIN标志位
+UINT32 VcuInTable[8] = {
+	0x1802F3D0,
+	0x18E1F3D0,
+	0x18FEDA17,
+	0x18FF15F6,
+	0x18FF43A8,
+	0x18FF44A8,
+	0x18FF4617,
+	0x18FF48A8,
+};
+UINT8 VcuRxFlag[8] = {0};
+BOOL VcuRxShortError[8] = {0};
+BOOL VcuRxLongError[8] = {0};
+UINT8 VcuRxErrorCount[8] = {0};
+UINT8 Checksum = 0x00;			   //(No)最后7个字节checksum,Byte0=Byte1 XOR Byte2 XOR Byte3 XOR Byte4 XOR Byte5 XOR Byte6 XOR Byte7,精度_1,偏移_0
+UINT8 VCU_Life = 0x00;			   // VCU生命信号,0~14循环,15_信号无效,精度_1,偏移_0
+UINT8 VCU_HvOnOff = 0x00;		   //高压上下电指令,0_预留;1_高压上电;2_高压下电;3_无效;,精度_1,偏移_0
+UINT8 VCU_AuxOnOff = 0x00;		   //(No)附件高压上下电指令(保留),0_预留;1_高压上电;2_高压下电;3_无效;,精度_1,偏移_0
+UINT8 VCU_VehicleSpeed = 0x00;	   //车速,有效值 0~255,单位 km/h,范围(0~255) km/h,偏移量 0,比例因子 1km/h/bit,精度_1,偏移_0
+UINT8 VCU_HeatOnOff = 0x00;		   //加热开启关闭指令(保留),0_预留;1_加热开启;2_加热关断;3_无效;,精度_1,偏移_0
+UINT8 VCU_MainPosRlySts = 0x00;	   //主正继电器状态(如继电器状态由整车检测)(保留),0_预留;1_开启;2_闭合;3_无效;,精度_1,偏移_0
+UINT8 VCU_MainNegRlySts = 0x00;	   //主负继电器状态(如继电器状态由整车检测)(保留),0_预留;1_开启;2_闭合;3_无效;,精度_1,偏移_0
+UINT8 VCU_PreChgRlySts = 0x00;	   //预充继电器状态(如继电器状态由整车检测)(保留),0_预留;1_开启;2_闭合;3_无效;,精度_1,偏移_0
+UINT8 VCU_AuxRlySts = 0x00;		   //附件继电器状态(如继电器状态由整车检测)(保留),0_预留;1_开启;2_闭合;3_无效;,精度_1,偏移_0
+UINT8 VCU_MainMotRlySts = 0x00;	   //主电机接触器状态(保留),0_预留;1_开启;2_闭合;3_无效;,精度_1,偏移_0
+UINT8 VCU_MainMotRlyErrSts = 0x00; //主电机接触器故障(保留),0_预留;1_开启;2_闭合;3_无效;,精度_1,偏移_0
+UINT8 VCU_Assist1RlySts = 0x00;	   //辅件1接触器状态(保留),0_预留;1_开启;2_闭合;3_无效;,精度_1,偏移_0
+UINT8 VCU_Assist1RlyErrSts = 0x00; //辅件1接触器故障(保留),0_预留;1_开启;2_闭合;3_无效;,精度_1,偏移_0
+UINT8 VCU_Assist2RlySts = 0x00;	   //辅件2接触器状态(保留),0_预留;1_开启;2_闭合;3_无效;,精度_1,偏移_0
+UINT8 VCU_Assist2RlyErrSts = 0x00; //辅件2接触器故障(保留),0_预留;1_开启;2_闭合;3_无效;,精度_1,偏移_0
+UINT8 VCU_Assist3RlySts = 0x00;	   //辅件3接触器状态(保留),0_预留;1_开启;2_闭合;3_无效;,精度_1,偏移_0
+UINT8 VCU_Assist3RlyErrSts = 0x00; //辅件3接触器故障(保留),0_预留;1_开启;2_闭合;3_无效;,精度_1,偏移_0
+UINT8 VCU_Assist4RlySts = 0x00;	   //辅件4接触器状态(保留),0_预留;1_开启;2_闭合;3_无效;,精度_1,偏移_0
+UINT8 VCU_Assist4RlyErrSts = 0x00; //辅件4接触器故障(保留),0_预留;1_开启;2_闭合;3_无效;,精度_1,偏移_0
+UINT8 VCU_VIN[17] = {0x00};
+UINT8 DrvMotPosRySts = 0x00;	 //驱动电机主正继电器状态,0_断开;1_闭合;2_粘连;,精度_1,偏移_0
+UINT8 VehSts = 0x00;			 //车辆状态,1_启动 2_熄火,精度_1,偏移_0
+UINT8 BrakePedal = 0x00;		 //制动开度 精度_0.005,偏移_0
+UINT8 HandbrakeSts = 0x00;		 //手刹信号,0_未拉手刹1_已拉手刹,其它值无效,精度_1,偏移_0
+UINT8 GearPos = 0x00;			 //档位,最小值__-1,最大值 14 ,0x0F表示无效,_-1 代表倒档 R;0 代表空挡 N;大于 0 代表前进档 D;,精度_1,偏移_0
+UINT16 VehSpd = 0x00;			 //车速 精度_0.00390625,偏移_0
+UINT32 VCU_TotalDistance = 0x00; //累计行驶里程,0~16777215,精度_1,偏移_0
+/*************************************************************
+ *Ebc->Vcu组码变量存放区
+ ************************************************************/
+UINT32 Ebc2VcuOutTable[25][2] = {
+	{0x1801D0F3,100},
+	{0x1801D8F3,1000},
+	{0x1880D0F3,100},
+	{0x1881D0F3,100},
+	{0x1882D0F3,100},
+	{0x1883D0F3,100},
+	{0x1884D0F3,100},
+	{0x1885D0F3,100},
+	{0x1886D0F3,100},
+	{0x1887D0F3,1000},
+	{0x18C1D0F3,100},
+	{0x18C2D0F3,200},
+	{0x18E1D0F3,1000},
+	{0x18E2D0F3,1000},
+	{0x18E3D0F3,1000},
+	{0x18E4D0F3,1000},
+	{0x18E5D0F3,100},
+	{0x18E6D0F3,100},
+	{0x18F1D0F3,1000},
+	{0x18F2D0F3,1000},
+	{0x18F3D0F3,1000},
+	{0x18FEF8A7,100},
+	{0x18FF45F4,1000},
+	{0x18FFC13A,1000},
+	{0x18FFF8A7,100},
+};
+UINT8 ReqVIN = 0x00;					   //是否请求VIN码,0_预留;1_请求VIN;2_不请求VIN;3_无效;,精度_1,_偏移_0,单位_
+UINT8 ReqHVOff = 0x00;					   //是否请求下高压,0_预留;1_请求下高压;2_不请求下高压;3_无效;,精度_1,_偏移_0,单位_
+UINT8 ChgSysNum = 0x00;					   //可充电装置系统序号(BMS是整车中可充电装置系统中的第几个, 需要整车告知),1,精度_1,_偏移_0,单位_
+UINT8 Fult2_MainPosRelayWeldErr = 0x00;	   //主正继电器粘连故障,0_正常; 1_故障,精度_1,_偏移_0,单位_
+UINT8 Fult2_MainNegRelayWeldErr = 0x00;	   //主负继电器粘连故障,0_正常; 1_故障,精度_1,_偏移_0,单位_
+UINT8 Fult2_DCChgPos1RelayWeldErr = 0x00;  //充正1继电器粘连故障,0_正常; 1_故障,精度_1,_偏移_0,单位_
+UINT8 Fult2_DCChgNeg1RelayWeldErr = 0x00;  //充负1继电器粘连故障,0_正常; 1_故障,精度_1,_偏移_0,单位_
+UINT8 Fult2_DCChgPos2RelayWeldErr = 0x00;  //充正2继电器粘连故障,0_正常; 1_故障,精度_1,_偏移_0,单位_
+UINT8 Fult2_DCChgNeg2RelayWeldErr = 0x00;  //充负2继电器粘连故障,0_正常; 1_故障,精度_1,_偏移_0,单位_
+UINT8 HeatPosRelayWeldErr = 0x00;		   //加热正继电器粘连故障,0_正常; 1_故障,精度_1,_偏移_0,单位_
+UINT8 HeatNegRelayWeldErr = 0x00;		   //加热负继电器粘连故障,0_正常; 1_故障,精度_1,_偏移_0,单位_
+UINT8 MainPosRelaySt = 0x00;			   //主正继电器状态(如继电器状态由BMS检测),0_预留;1_开启;2_闭合;3_无效;,精度_1,_偏移_0,单位_
+UINT8 MainNegRelaySt = 0x00;			   //主负继电器状态(如继电器状态由BMS检测),0_预留;1_开启;2_闭合;3_无效;,精度_1,_偏移_0,单位_
+UINT8 PreChgRelaySt = 0x00;				   //预充继电器状态,0_预留;1_开启;2_闭合;3_无效;,精度_1,_偏移_0,单位_
+UINT8 DCChrgPos1RelaySt = 0x00;			   //直流充正继电器1状态,0_预留;1_开启;2_闭合;3_无效;,精度_1,_偏移_0,单位_
+UINT8 DCChrgNeg1RelaySt = 0x00;			   //直流充负继电器1状态,0_预留;1_开启;2_闭合;3_无效;,精度_1,_偏移_0,单位_
+UINT8 DCChrgPos2RelaySt = 0x00;			   //直流充正继电器2状态,0_预留;1_开启;2_闭合;3_无效;,精度_1,_偏移_0,单位_
+UINT8 DCChrgNeg2RelaySt = 0x00;			   //直流充负继电器2状态,0_预留;1_开启;2_闭合;3_无效;,精度_1,_偏移_0,单位_
+UINT8 AuxRelayWeldErr = 0x00;			   //附件继电器粘连故障(保留),0_正常; 1_故障,精度_1,_偏移_0,单位_
+UINT8 Fult2_BranchBreakErr = 0x00;		   //支路断路故障,0_正常; 1_故障,精度_1,_偏移_0,单位_
+UINT8 Fult2_OverChrgCurrInTheDrive = 0x00; //回充电流超限报警,0_正常  1_1级 轻微故障 2_2级 较严重故障 3_3级 最严重故障,精度_1,_偏移_0,单位_
+UINT8 Fult2_MainPosRelayOpenErr = 0x00;	   //主正继电器无法闭合报警,0_正常; 1_故障,精度_1,_偏移_0,单位_
+UINT8 Fult2_MainNegRelayOpenErr = 0x00;	   //主负继电器无法闭合报警,0_正常; 1_故障,精度_1,_偏移_0,单位_
+UINT8 Fult2_DCChgPos1RelayOpenErr = 0x00;  //直流充电正1继电器无法闭合报警,0_正常; 1_故障,精度_1,_偏移_0,单位_
+UINT8 Fult2_DCChgPos2RelayOpenErr = 0x00;  //直流充电正2继电器无法闭合报警,0_正常; 1_故障,精度_1,_偏移_0,单位_
+UINT8 Fult2_DCChgNeg1RelayOpenErr = 0x00;  //直流充电负1继电器无法闭合报警,0_正常; 1_故障,精度_1,_偏移_0,单位_
+UINT8 Fult2_DCChgNeg2RelayOpenErr = 0x00;  //直流充电负2继电器无法闭合报警,0_正常; 1_故障,精度_1,_偏移_0,单位_
+UINT8 Fult2_HeatRelayWeldErr = 0x00;	   //加热膜或TMS接触器无法断开报警,0_正常; 1_故障,精度_1,_偏移_0,单位_
+UINT8 Fult2_HeatRelayOpenErr = 0x00;	   //加热膜或TMS接触器无法闭合报警,0_正常; 1_故障,精度_1,_偏移_0,单位_
+UINT8 Fult2_TMSErr = 0x00;				   //热管理系统故障,0_正常; 1_故障,精度_1,_偏移_0,单位_
+UINT8 Fult2_PowerSupplyErr = 0x00;		   // BMS 24V供电异常报警,0_正常; 1_故障,精度_1,_偏移_0,单位_
+UINT8 Fult2_PackSelfProtect = 0x00;		   //电池包自保护报警,0_正常; 1_故障,精度_1,_偏移_0,单位_
+UINT8 Fult2_ChrgNTCTempOver = 0x00;		   //充电插座过温报警,0_正常 1_1级 轻微故障 2_2级 较严重故障 3_3级 最严重故障,精度_1,_偏移_0,单位_
+UINT8 BattSysNum = 0x00;				   //可充电储能子系统总数(保留),,精度_1,_偏移_0,单位_
+UINT8 BatSysFaultCode = 0x00;			   //电池系统故障码,详见附表电池系统故障码列表,精度_1,_偏移_0,单位_
+UINT8 ST1_CheckSum = 0x00;				   // B2V_ST1的CheckSum,Byte0=Byte1 XOR Byte2 XOR Byte3 XOR Byte4 XOR Byte5 XOR Byte6 XOR Byte7,精度_1,_偏移_0,单位_
+UINT8 ST1_Life = 0x00;					   // B2V_ST1的生命信号,0~14循环,15_信号无效,精度_1,_偏移_0,单位_
+UINT8 BMS_SysSts = 0x00;				   // BMS当前状态,0_预留;1_高压上电;2_高压下电;3_无效;,精度_1,_偏移_0,单位_
+UINT8 AssisRelaySts = 0x00;				   //附件继电器状态,0_开启;1_闭合;,精度_1,_偏移_0,单位_
+UINT8 BlanceSts = 0x00;					   // BMS当前均衡状态,0_未开启均衡;1_开启均衡;,精度_1,_偏移_0,单位_
+UINT8 DCChrgConnectSt = 0x00;			   //直流充电枪连接状态,0_未连接 1_连接,精度_1,_偏移_0,单位_
+UINT8 ChrgMode = 0x00;					   // BMS当前充电模式,0_预留 1_直流充电 2_交流充电 3_其他充电,精度_1,_偏移_0,单位_
+UINT8 ChrgStatus = 0x00;				   //充电状态,0_可以充电 1_正在充电 2_充电结束 3_充电故障,精度_1,_偏移_0,单位_
+UINT8 FaultLevel = 0x00;				   //当前最高故障等级,0_正常 1_1级 轻微故障 2_2级 较严重故障 3_3级 最严重故障,精度_1,_偏移_0,单位_
+UINT8 Fult1_DelTemp = 0x00;				   //电芯温差异常报警,0_无故障; 1_1级 轻微故障; 2_2级 较严重故障 3_3级 最严重故障,精度_1,_偏移_0,单位_
+UINT8 Fult1_OverTemp = 0x00;			   //电芯温度过高报警,0_无故障; 1_1级 轻微故障; 2_2级 较严重故障 3_3级 最严重故障,精度_1,_偏移_0,单位_
+UINT8 Fult1_PackOverHVolt = 0x00;		   // PACK过压报警,0_无故障; 1_1级 轻微故障; 2_2级 较严重故障 3_3级 最严重故障,精度_1,_偏移_0,单位_
+UINT8 Fult1_PackLowHVolt = 0x00;		   // PACK欠压报警,0_无故障; 1_1级 轻微故障; 2_2级 较严重故障 3_3级 最严重故障,精度_1,_偏移_0,单位_
+UINT8 Fult1_LowSOC = 0x00;				   // SOC过低报警,0_无故障; 1_1级 轻微故障; 2_2级 较严重故障 3_3级 最严重故障,精度_1,_偏移_0,单位_
+UINT8 Fult1_OverUcell = 0x00;			   //单体电压过高报警,0_无故障; 1_1级 轻微故障; 2_2级 较严重故障 3_3级 最严重故障,精度_1,_偏移_0,单位_
+UINT8 Fult1_LowUcell = 0x00;			   //单体电压欠压报警,0_无故障; 1_1级 轻微故障; 2_2级 较严重故障 3_3级 最严重故障,精度_1,_偏移_0,单位_
+UINT8 Fult1_LowInsRes = 0x00;			   //绝缘报警,0_无故障; 1_1级 轻微故障; 2_2级 较严重故障 3_3级 最严重故障,精度_1,_偏移_0,单位_
+UINT8 Fult1_UcellUniformity = 0x00;		   //单体压差过大,0_无故障; 1_1级 轻微故障; 2_2级 较严重故障 3_3级 最严重故障,精度_1,_偏移_0,单位_
+UINT8 Fult2_CellLowTemp = 0x00;			   //电芯低温报警,0_无故障; 1_1级 轻微故障; 2_2级 较严重故障 3_3级 最严重故障,精度_1,_偏移_0,单位_
+UINT8 Fult2_OverDischrgCurr = 0x00;		   //放电电流超限报警,0_无故障; 1_1级 轻微故障; 2_2级 较严重故障 3_3级 最严重故障,精度_1,_偏移_0,单位_
+UINT8 Fult2_OverChrgCurrInTheChrg = 0x00;  //充电电流超限报警,0_无故障; 1_1级 轻微故障; 2_2级 较严重故障 3_3级 最严重故障,精度_1,_偏移_0,单位_
+UINT8 Fult_BranchVolUniformity = 0x00;	   //支路压差过大报警(存在并联支路的系统),0_无故障; 1_1级 轻微故障; 2_2级 较严重故障 3_3级 最严重故障,精度_1,_偏移_0,单位_
+UINT8 Fult_BMSHardware = 0x00;			   // BMS硬件故障,0_无故障; 1_1级 轻微故障; 2_2级 较严重故障 3_3级 最严重故障,精度_1,_偏移_0,单位_
+UINT8 Fult1_OverSOC = 0x00;				   // SOC过高报警,0_正常; 1_故障,精度_1,_偏移_0,单位_
+UINT8 Fult1_SOCChangeFast = 0x00;		   // SOC跳变报警,0_正常; 1_故障,精度_1,_偏移_0,单位_
+UINT8 Fult2_InnerCommunicationErr = 0x00;  // BMS内部通信故障,0_正常; 1_故障,精度_1,_偏移_0,单位_
+UINT8 Fult1_BatSysNotMatch = 0x00;		   //可充电储能系统不匹配报警,0_正常; 1_故障,精度_1,_偏移_0,单位_
+UINT8 Fult1_HVILFault = 0x00;			   //高压互锁报警,0_正常; 1_故障,精度_1,_偏移_0,单位_
+UINT8 Fult2_FireDetectorEr = 0x00;		   //火警探测器故障,0_正常; 1_故障,精度_1,_偏移_0,单位_
+UINT8 Fult2_PackFireWarning = 0x00;		   //电池包火灾报警,0_正常; 1_故障,精度_1,_偏移_0,单位_
+UINT8 Fult2_FaultNum = 0x00;			   // BMS当前发生的故障总数目(包括GB32960中规定的故障数目),,精度_1,_偏移_0,单位_
+UINT8 SOC = 0x00;						   //电池包SOC,,精度_0.4,_偏移_0,单位_
+UINT8 SOH = 0x00;						   //电池包SOH,,精度_0.4,_偏移_0,单位_
+UINT8 Max_Temp = 0x00;					   //单体最高温度,,精度_1,_偏移_-50,单位_℃
+UINT8 Min_Temp = 0x00;					   //单体最低温度,,精度_1,_偏移_-50,单位_℃
+UINT8 Avg_Temp = 0x00;					   //单体平均温度,,精度_1,_偏移_-50,单位_℃
+UINT8 MaxTempSysNr = 0x00;				   //最高温度子系统(CSC)号,范围(1~255),精度_1,_偏移_0,单位_
+UINT8 MaxTempNr = 0x00;					   //最高温度探针单体代号,范围(1~255),精度_1,_偏移_0,单位_
+UINT8 MinTempSysNr = 0x00;				   //最低温度子系统(CSC)号,范围(1~255),精度_1,_偏移_0,单位_
+UINT8 MinTempNr = 0x00;					   //最低温度探针子系统代号,范围(1~255),精度_1,_偏移_0,单位_
+UINT8 MaxUcellSysNr = 0x00;				   //最高电压电池子系统号,范围(1~255),精度_1,_偏移_0,单位_
+UINT8 MaxUcellNr = 0x00;				   //最高电压电池单体代号,范围(1~255),精度_1,_偏移_0,单位_
+UINT8 MinUcellSysNr = 0x00;				   //最低电压电池子系统号,范围(1~255),精度_1,_偏移_0,单位_
+UINT8 MinUcellNr = 0x00;				   //最低电压电池单体代号,范围(1~255),精度_1,_偏移_0,单位_
+UINT8 Gun1DCNegTemp = 0x00;				   //充电口1负温感值,,精度_1,_偏移_-40,单位_℃
+UINT8 Gun1DCPosTemp = 0x00;				   //充电口1正温感值,,精度_1,_偏移_-40,单位_℃
+UINT8 Gun2DCNegTemp = 0x00;				   //充电口2负温感值,,精度_1,_偏移_-40,单位_℃
+UINT8 Gun2DCPosTemp = 0x00;				   //充电口2正温感值,,精度_1,_偏移_-40,单位_℃
+UINT8 HeatPosRelaySt = 0x00;			   //加热正继电器状态,0_断开;1_闭合;2_粘连;3_无效;,精度_1,_偏移_0,单位_
+UINT8 HeatNegRelaySt = 0x00;			   //加热负继电器状态,0_断开;1_闭合;2_粘连;3_无效;,精度_1,_偏移_0,单位_
+UINT8 UcellFrameNum = 0x00;				   //单体电压帧序号,有效值1~255,精度_1,_偏移_0,单位_
+UINT8 UcellCSCNum = 0x00;				   //子系统编号CSC,有效值1~255,精度_1,_偏移_0,单位_
+UINT8 TempFrameNum = 0x00;				   //温度帧序号,有效值1~255,精度_1,_偏移_0,单位_
+UINT8 TempCSCNum = 0x00;				   //子系统编号CSC,有效值1~255,精度_1,_偏移_0,单位_
+UINT8 CurCSC_TempN = 0x00;				   //当前CSC下的第N个探针的温度,255 "Invalid" 0xFF 无效 有效值 0~254,单位 ℃,范围(-50~204)℃,,精度_1,_偏移_-50,单位_℃
+UINT8 CurCSC_TempN1 = 0x00;				   //当前CSC下的第N1个探针的温度,255 "Invalid" 0xFF 无效 有效值 0~254,单位 ℃,范围(-50~204)℃,,精度_1,_偏移_-50,单位_℃
+UINT8 CurCSC_TempN2 = 0x00;				   //当前CSC下的第N2个探针的温度,255 "Invalid" 0xFF 无效 有效值 0~254,单位 ℃,范围(-50~204)℃,,精度_1,_偏移_-50,单位_℃
+UINT8 CurCSC_TempN3 = 0x00;				   //当前CSC下的第N3个探针的温度,255 "Invalid" 0xFF 无效 有效值 0~254,单位 ℃,范围(-50~204)℃,,精度_1,_偏移_-50,单位_℃
+UINT8 CurCSC_TempN4 = 0x00;				   //当前CSC下的第N4个探针的温度,255 "Invalid" 0xFF 无效 有效值 0~254,单位 ℃,范围(-50~204)℃,,精度_1,_偏移_-50,单位_℃
+UINT8 CurCSC_TempN5 = 0x00;				   //当前CSC下的第N5个探针的温度,255 "Invalid" 0xFF 无效 有效值 0~254,单位 ℃,范围(-50~204)℃,,精度_1,_偏移_-50,单位_℃
+UINT8 BattType = 0x00;					   //电池类型,1_铅酸电池; 2_镍氢电池; 3_磷酸铁锂电池; 4_锰酸锂电池; 5_钴酸锂电池; 6_三元材料电池; 7_聚合物锂离子电池; 8_钛酸锂电池; 9_超级电容; 10~13_保留; 14_燃料电池;15_保留,精度_1,_偏移_0,单位_
+UINT8 CoolType = 0x00;					   //电池冷却方式,0_其他冷却方式 1_自然冷却 2_风扇冷却 3_水冷却,精度_1,_偏移_0,单位_
+UINT8 TotCSCNum = 0x00;					   //电池系统中CSC总的数目,,精度_1,_偏移_0,单位_
+UINT8 CellVoltPlat = 0x00;				   //单体平台电压(非实时变化的值),有效值0~5V;  255 "Signal Invalid" 0xFF 无效,精度_0.1,_偏移_0,单位_V
+UINT8 MinAvlCellVolt = 0x00;			   //单体可用最低电压(非实时变化的值),有效值0~5V;  255 "Signal Invalid" 0xFF 无效,精度_0.1,_偏移_0,单位_V
+UINT8 MaxAvlCellVolt = 0x00;			   //单体可用最高电压(非实时变化的值),有效值0~5V;  255 "Signal Invalid" 0xFF 无效,精度_0.1,_偏移_0,单位_V
+UINT8 EBC_DchgPos1Temp = 0x00;			   //放电正1温度,,精度_1,偏移_-40,单位_℃
+UINT8 EBC_DchgNeg1Temp = 0x00;			   //放电负1温度,,精度_1,偏移_-40,单位_℃
+UINT8 EBC_DchgPos2Temp = 0x00;			   //放电正2温度,,精度_1,偏移_-40,单位_℃
+UINT8 EBC_DchgNeg2Temp = 0x00;			   //放电负2温度,,精度_1,偏移_-40,单位_℃
+UINT8 EBC_ChgPos1Temp = 0x00;			   //充电正1温度(保留),,精度_1,偏移_-40,单位_℃
+UINT8 EBC_ChgNeg1Temp = 0x00;			   //充电负1温度(保留),,精度_1,偏移_-40,单位_℃
+UINT8 EBC_ChgPos2Temp = 0x00;			   //充电正2温度(保留),,精度_1,偏移_-40,单位_℃
+UINT8 EBC_ChgNeg2Temp = 0x00;			   //充电负2温度(保留),,精度_1,偏移_-40,单位_℃
+UINT8 ReqMode = 0x00;					   // BMS请求设定模式,0_关机模式 1_制冷模式 2_制热模式 3_自循环模式,精度_1,_偏移_0,单位_
+UINT8 HVCmd = 0x00;						   //高压请求,0_请求上高压 1_请求下高压,精度_1,_偏移_0,单位_
+UINT8 ChgSts = 0x00;					   //充电状态,0_非充电 1_充电,精度_1,_偏移_0,单位_
+UINT8 HVRelaySts = 0x00;				   // BMS高压继电器状态,0_断开状态; 1_闭合状态; 2~3_无效,精度_1,_偏移_0,单位_
+UINT8 SetTemp = 0x00;					   //设定温度,,精度_1,_偏移_-40,单位_
+UINT8 Bms_Life = 0x00;					   // BMS生命帧,,精度_1,_偏移_0,单位_
+UINT8 CRC = 0x00;						   // CRC校验值,,精度_1,_偏移_0,单位_
+// UINT8 TMS_WorkStatus = 0x00;			   // TMS工作状态,0_关机模式 1_制冷模式 2_制热模式 3_自循环模式,精度_1,_偏移_0,单位_
+// UINT8 TMS_HVRelayST = 0x00;				   // TMS高压继电器状态,0_断开状态; 1_闭合状态; 2~3_无效,精度_1,_偏移_0,单位_
+// UINT8 TMS_OutletTemp = 0x00;			   //出水温度(机组到电池),255_无效,精度_1,_偏移_-40,单位_
+// UINT8 TMS_InletTemp = 0x00;				   //回水温度(电池到机组),255_无效,精度_1,_偏移_-40,单位_
+// UINT8 TMS_ErrCode = 0x00;				   // TMS故障码,0_无故障; 出现 1 种以上循环发送,精度_1,_偏移_0,单位_
+// UINT8 TMS_FaultLevel = 0x00;			   // TMS故障码等级,0_无效 1_1级故障 2_2级故障 3_3级故障,精度_1,_偏移_0,单位_
+// UINT8 EBC_Life = 0x00;					   // LIFE 信号,0~255循环计数,每次+1,精度_1,偏移_0,单位_
+UINT8 EBC_LockupSts = 0x00;			 //锁止销反馈状态,0_锁止故障(未解锁和未上锁同时出现) 1_解锁成功 2_上锁成功其他状态无效,精度_1,偏移_0,单位_
+UINT8 EBC_ConnectorSts = 0x00;		 //换电连接器状态(充电回路&放电回路同时闭合代表闭合,有一路断开则为断开),0_未连接 1_连接 其他状态无效,精度_1,偏移_0,单位_
+UINT8 EBC_DischgConnectorSts = 0x00; //放电回路换电连接器状态(保留),0_未连接 1_连接 其他状态无效,精度_1,偏移_0,单位_
+UINT8 EBC_ChgConnectorSts = 0x00;	 //充电回路换电连接器状态(保留),0_未连接 1_连接 其他状态无效,精度_1,偏移_0,单位_
+//UINT8 EBC_FaultLevel = 0x00;		 //换电系统故障等级,0_无故障 1_1级故障 2_2级故障 3_3级故障,精度_1,偏移_0,单位_
+//UINT8 EBC_FaultCode = 0x00;			 //换电系统故障码,见附件,精度_1,偏移_0,单位_
+// UINT16 BMS_SoftwareVersion = 0x00;  //软件版本号_RyyyBzzz(R为软件版本、B为测试版本、正式版本不带B)  ,yyy_ 0~254,精度1,255_无效,不显示; zzz_ 0~254,精度1,255_无效,不显示;,精度_1,_偏移_0,单位_
+// UINT16 BMS_HardwareVersion = 0x00;  //硬件版本号_VyyyBzzz(V为硬件版本、B为测试版本、正式版本不带B)  ,xxx_ 0~254,精度1,255_无效,不显示; zzz_ 0~254,精度1,255_无效,不显示 ,精度_1,_偏移_0,单位_
+UINT16 PackCurrent = 0x00;			 //电池包总电流,充电为负值,放电为正值,,精度_0.1,_偏移_-1000,单位_A
+UINT16 InstChrgCurMaxAllw = 0x00;	 //动力电池允许最大瞬时充电电流,,精度_0.1,_偏移_-1000,单位_A
+UINT16 InstDischrgCurMaxAllw = 0x00; //电池允许最大瞬时放电电流,,精度_0.1,_偏移_-1000,单位_A
+UINT16 PosIsolation = 0x00;			 //母线正对车体绝缘电阻,,精度_1,_偏移_0,单位_KΩ
+UINT16 NegIsolation = 0x00;			 //母线负对车体绝缘电阻,,精度_1,_偏移_0,单位_KΩ
+UINT16 PackInsideVolt = 0x00;		 //电池包内侧电压,,精度_0.1,_偏移_0,单位_V
+UINT16 PackOutsideVolt = 0x00;		 //电池包外侧电压,,精度_0.1,_偏移_0,单位_V
+UINT16 Max_Ucell = 0x00;			 //单体最高电压值,,精度_0.001,_偏移_0,单位_V
+UINT16 Avg_Ucell = 0x00;			 //电体电压平均值,,精度_0.001,_偏移_0,单位_V
+UINT16 Min_Ucell = 0x00;			 //单体最低电压值,,精度_0.001,_偏移_0,单位_V
+UINT16 ChrgCurMaxAllw = 0x00;		 //电池最大允许充电电流,,精度_0.1,_偏移_0,单位_A
+// UINT16 CurCSC_UCellN = 0x00;		 //当前CSC下的第N个电芯的电压,65535 "Invalid" 0xFFFF 无效 有效值 0~65534,范围(0~65.534)V,精度_0.001,_偏移_0,单位_V
+// UINT16 CurCSC_UCellN1 = 0x00;		 //当前CSC下的第N1个电芯的电压,65535 "Invalid" 0xFFFF 无效 有效值 0~65534,范围(0~65.534)V,精度_0.001,_偏移_0,单位_V
+// UINT16 CurCSC_UCellN2 = 0x00;		 //当前CSC下的第N2个电芯的电压,65535 "Invalid" 0xFFFF 无效 有效值 0~65534,范围(0~65.534)V,精度_0.001,_偏移_0,单位_V
+
+UINT16 Pack_RateCap = 0x00;	   //电池包额定容量,有效值 0~65534,65535 "Signal Invalid" 无效,精度_1,_偏移_0,单位_Ah
+UINT16 Pack_RateHVolt = 0x00;  //电池包额定电压,有效值 0~6553.4,65535 "Signal Invalid" 无效,精度_0.1,_偏移_0,单位_V
+UINT16 Pack_RatePower = 0x00;  //电池包额定总能量,有效值 0~6553.4,65535 "Signal Invalid" 无效,精度_0.1,_偏移_0,单位_kWh
+UINT16 PackTotCellNum = 0x00;  // PACK中单体电芯的总数目,,精度_1,_偏移_0,单位_
+UINT16 PackTotTempNum = 0x00;  // PACK中电芯温度点(探针)的总数目,,精度_1,_偏移_0,单位_
+UINT16 SingleChargeKwh = 0x00; //单次充电kWh 数,,精度_0.1,_偏移_0,单位_KWh
+UINT16 HVVolt = 0x00;		   // BMS当前电压,,精度_1,_偏移_0,单位_
+// UINT16 TMS_ReqPow = 0x00;			  // TMS需求功率,65535_无效,精度_0.1,_偏移_0,单位_Kw
+UINT32 TotalChargeKwh = 0x00;		  //累计充入kWh 数,,精度_0.1,_偏移_0,单位_KWh
+UINT32 TotalDischargeKwh = 0x00;	  //累计放出kWh 数,,精度_0.1,_偏移_0,单位_KWh
+UINT32 TotalEneryECOChargeKwh = 0x00; //累计动能回馈充入kWh 数,,精度_0.1,_偏移_0,单位_KWh
+UINT32 TotalStationChargeKwh = 0x00;  //累计换电站充入kWh 数,,精度_0.1,_偏移_0,单位_KWh
+UINT32 TotalPoleChargeKwh = 0x00;	  //累计插枪充电充入kWh 数,,精度_0.1,_偏移_0,单位_KWh
+
+/*************************************************************
+ *Ebc->Ble组码变量以及Ebc应用层变量存放区
+ ************************************************************/
+uint8 g_c_BlePwr = 0;
+uint8 g_c_AirPwr = 0;
+uint8 g_c_LedPwr = 0;
+uint16 bcud_E_snglChrg;		 //单次充电能量,精度0.1kwh
+uint16 ebcd_Nr_swapBatt;	 //换电次数
+uint16 ebcd_Nr_swapSucBatt;	 //换电成功次数
+uint16 bcud_pct_soc;		 //电池SOC,精度0.1
+uint16 bcud_Q_snglChrg;		 //单次充电容量,精度0.1Ah
+uint16 bcud_V_battU;		 //电池电压 精度0.1V
+uint32 bcud_E_accChrg;		 //累计充电能量,精度0.1kwh
+uint32 bcud_E_accDischrg;	 //累计放电能量,精度0.1kwh
+uint32 bcud_E_accPlugInChrg; //累计插枪充电能量,精度0.1kwh
+uint32 bcud_E_accRecovry;	 //累计回收能量,精度0.1kwh
+uint32 bcud_E_accSwapBatt;	 //累计换电站能量,精度0.1kwh
+uint32 bcud_Q_accChrg;		 //累计充电容量,精度0.1ah
+uint32 bcud_Q_accDischrg;	 //累计放电容量,精度0.1ah
+uint32 bcud_Q_accPlugInChrg; //累计插枪充电容量,精度0.1ah
+uint32 bcud_Q_accRecovry;	 //累计回收容量,精度0.1ah
+uint32 bcud_Q_accSwapBatt;	 //累计换电站容量,精度0.1ah
+uint32 vcud_M_accDrv;		 //累计行驶里程,精度0.1km
+uint8 bcud_pct_bcuSoh;		 //电池Soh,精度0.4%
+uint8 bcud_st_bcuComun;		 //电池通讯状态,0-通信中断,1-通信正常
+uint8 bcud_st_bcuMainRelay;	 //主继电器信号,0-保留 1-断开,2-关闭 3-异常
+uint8 bcud_st_bcuTmsLiquid;	 //热管理液位状态,1-液位正常,0-液位过低
+uint8 bcud_st_hvWork;		 //电池高压状态,0-高压开启 1-预充,2-高压关断,3-高压上电故障
+uint8 bcuv_Num_battSn[32];	 //电池SN号码
+// uint8 ebcd_flg_pluginLockSig; //互锁接插件信号状态,1-触发,0-无触发
+// uint8 ebcd_flg_swapAdmit;	  //允许换电判断:0-不允许,1-允许
+// uint8 ebcd_Num_err1;		  //故障码1
+// uint8 ebcd_Num_err2;		  //故障码2
+// uint8 ebcd_st_ebcConnect;	  // Ebc通讯模式,0-无线蓝牙,1-有线连接 ,默认0
+// uint8 ebcd_st_ebcLockWork;	  // Ebc解锁模式,0-单步模式,1-自动模式
+// uint8 ebcd_st_errTable1;	  //故障表1,bit0-气压异常,bit1-液位异常,bit2-Flash读取异常
+// uint8 ebcd_st_errTable2;	  //故障表2,bit0-互锁异常,bit1-整车CAN异常,bit2-电池CAN异常,bit3-锁钩异常,bit4-升降机异常,bit5-电池位置异常
+// uint8 ebcd_st_errTable3;	  //故障表3,bit0-放电互锁异常,bit1-充电互锁异常,bit2-整车高压互锁异常
+// uint8 ebcd_st_lockSensor;	  //锁紧传感器信号:bit0-bit3:传感器0-3的状态每,bit:1-触发,0-不触发
+// uint8 ebcd_st_lockSucJug;	  //锁紧完成判断:0-完全未锁紧,1-完全锁紧,2-未完全锁紧"
+// uint8 ebcd_st_pedstSensor;	  //底座落座传感器:bit0-bit1:传感器0-1的状态,每bit:1-触发,0-无触发
+// uint8 ebcd_st_pedstSucJug;	  //电池底座到位判断:0-完全未到位,1-完全到位,2-未完全到位
+// uint8 ebcd_st_pluginLockSig;  //互锁接插件信号具体状态,1-触发,0-无触发
+// uint8 ebcd_st_unlockSensor;	  //解锁传感器信号:bit0-bit3:传感器0-3的状态每,bit:1-触发,0-不触发
+// uint8 ebcd_st_unlockSucJug;	  //解锁完成判断:0-完全未解锁,1-完全解锁,2-未完全解锁
+// uint8 ebcd_P_airSensor;				   //压力传感器气压值:单位Mpa,精度0.01Mpa
+uint8 vcud_P_airSensorBack;			   //后桥气压值,单位Mpa,精度0.01Mpa
+uint8 vcud_P_airSensorForward;		   //前桥气压值,单位Mpa,精度0.01Mpa
+uint8 vcud_st_carStart;				   //整车启动状态,0001-车辆启动状态,0010-熄火,0011-其他状态,1111-无效
+uint8 vcud_st_footbrake;			   //脚刹信号,0-无效,1-有效
+uint8 vcud_st_gear;					   //档位信号,FF-倒挡(R),0-空挡(N),X-前进档(DX)X取1-12
+uint8 vcud_st_handbrake;			   //手刹信号,0-无效,1-有效
+uint8 vcud_st_keyOn;				   //钥匙信号,1-上电,0-下电
+uint8 vcud_st_Steer;				   //方向盘信号,bit0-左侧转向灯,bit1-右侧转向灯,每bit 0-OFF,1-ON
+uint8 vcud_st_vcuComun;				   // vcu通讯状态,0-通信中断,1-通信正常
+uint8 vcuv_Num_vin[17];				   // VIN码
+uint8 bled_flg_lockCmd = 0;			   //锁钩电磁阀锁紧命令,1-有效,0-无效
+uint8 bled_flg_unlockCmd = 0;		   //锁钩电磁阀解锁命令,1-有效,0-无效
+uint8 bled_flg_lockCmdForce = 0;	   //锁钩电磁阀锁紧强制命令,1-有效,0-无效
+uint8 bled_flg_unlockCmdForce = 0;	   //锁钩电磁阀解锁强制命令,1-有效,0-无效
+uint8 bled_flg_topAscendCmd = 0;	   //顶板上升命令,1-有效,0-无效
+uint8 bled_flg_topDescendCmd = 0;	   //顶板下降命令,1-有效,0-无效
+uint8 bled_flg_topAscendCmdForce = 0;  //顶板强制上升命令,1-有效,0-无效
+uint8 bled_flg_topDescendCmdForce = 0; //顶板强制下降命令,1-有效,0-无效
+uint8 bled_flg_openDustReCmd = 0;	   //除尘打开指令,1-有效,0-无效
+uint8 bled_flg_closeDustReCmd = 0;	   //除尘关闭指令,1-有效,0-无效
+uint8 bled_flg_Heart = 0;			   //心跳维持指令
+uint8 bled_flg_getEbcData = 0;		   //获取ebc数据指令
+uint8 bled_flg_getVcuData = 0;		   //获取vcu数据指令
+uint8 bled_flg_getBmsData = 0;		   //获取bms数据指令
+uint8 bled_flg_handShake = 0;		   //握手指令
+uint8 bled_flg_swapBattDone = 0;	   //换电完成指令
+uint8 bled_flg_backToDrv = 0;		   //回到行驶状态指令
+uint8 bled_flg_autoLock = 0;		   //自动锁定指令
+uint8 bled_flg_autoUnlock = 0;		   //自动解锁指令
+uint8 bled_flg_toSwapMod = 0;		   //换到换电状态
+uint8 bled_flg_safeStopCmd = 0;		   //急停指令
+uint32 bled_Nr_softVer = 0;			   // BLE软件版本
+uint8 bled_flg_role = 0;			   // ble的主从模式 01-主,02-从
+uint8 bled_flg_bleConn = 0;			   // ble蓝牙连接状态
+uint8 bled_flg_bleDisconn = 0;		   // ble蓝牙断开状态
+/*
+ebc应用层变量
+*/
+uint8 ebcd_P_airSensor = 0;
+uint8 ebcd_T_plugin[4] = {0};		 //四个接插件温度
+uint8 ebcd_flg_forbidHVOn = 0;		 //禁止高压上电
+uint8 ebcb_flg_reqHvOff = 0;		 //请求高压下电
+uint8 ebcd_flg_LockErr = 0;			 //锁紧机构故障状态,0-异常,1-正常
+uint8 ebcd_flg_dChrgLockErr = 0;	 //放电互锁故障状态
+uint8 ebcd_flg_chrgLockErr = 0;		 //充电互锁故障状态
+uint8 ebcd_flg_dChgCnctOverTemp = 0; //放电连接器过温标志
+uint8 ebcd_st_ebcWork = 0;			 // Ebc当前状态 0-行车,1-通讯,2-换电
+uint8 ebcd_Nr_errMax;				 //故障等级:当前故障最大等级
+uint8 ebcd_Num_faultCode;			 // ebc故障码,未定义
+uint8 ebcd_st_chargingMod;			 //充电模式,1-车载充电,2-换电站充电
+uint8 ebdc_st_lockUpState = 0;		 //锁止机构状态,0-故障,1-解锁成功,2-上锁成功
+uint8 ebdc_st_ConnecState = 0;		 //换电连接器状态(充电回路&放电回路同时闭合代表闭合,有一路断开则为断开),0_未连接 1_连接
+uint8 ebcd_flg_pluginLockSig;		 //互锁接插件信号状态,1-触发,0-无触发
+uint8 ebcd_flg_swapAdmit;			 //允许换电判断:0-不允许,1-允许
+uint8 ebcd_Num_err1;				 //故障码1
+uint8 ebcd_Num_err2;				 //故障码2
+uint8 ebcd_st_ebcConnect;			 // Ebc通讯模式,0-无线蓝牙,1-有线连接 ,默认0
+uint8 ebcd_st_ebcLockWork;			 // Ebc解锁模式,0-单步模式,1-自动模式
+uint8 ebcd_st_errTable1;			 //故障表1,bit0-气压异常,bit1-液位异常,bit2-Flash读取异常
+uint8 ebcd_st_errTable2;			 //故障表2,bit0-互锁异常,bit1-整车CAN异常,bit2-电池CAN异常,bit3-锁钩异常,bit4-升降机异常,bit5-电池位置异常
+uint8 ebcd_st_errTable3;			 //故障表3,bit0-放电互锁异常,bit1-充电互锁异常,bit2-整车高压互锁异常
+uint8 ebcd_st_lockSensor;			 //锁紧传感器信号:bit0-bit3:传感器0-3的状态每,bit:1-触发,0-不触发
+uint8 ebcd_st_lockSucJug;			 //锁紧完成判断:0-完全未锁紧,1-完全锁紧,2-未完全锁紧"
+uint8 ebcd_st_pedstSensor;			 //底座落座传感器:bit0-bit1:传感器0-1的状态,每bit:1-触发,0-无触发
+uint8 ebcd_st_pedstSucJug;			 //电池底座到位判断:0-完全未到位,1-完全到位,2-未完全到位
+uint8 ebcd_st_pluginLockSig;		 //互锁接插件信号具体状态,1-触发,0-无触发
+uint8 ebcd_st_unlockSensor;			 //解锁传感器信号:bit0-bit3:传感器0-3的状态每,bit:1-触发,0-不触发
+uint8 ebcd_st_unlockSucJug;			 //解锁完成判断:0-完全未解锁,1-完全解锁,2-未完全解锁
+
+#define APPLAYERVER_START_SEC_VAR
+#include "MemMap.h"
+const uint16 T_table[240] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,
+							 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65,
+							 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,
+							 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126,
+							 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154,
+							 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182,
+							 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210,
+							 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239};
+const uint32 R_table[240] = {202269, 191063, 180554, 170694, 161438, 152746, 144580, 136905, 129687, 122898, 116508, 110493, 104827, 99488, 94455, 89710,
+							 85233, 81008, 77019, 73252, 69693, 66329, 63148, 60140, 57293, 54599, 52049, 49633, 47343, 45174, 43117, 41166, 39315, 37558,
+							 35891, 34307, 32802, 31373, 30014, 28722, 27493, 26324, 25211, 24152, 23144, 22183, 21268, 20395, 19564, 18771, 18015, 17293, 16604,
+							 15947, 15319, 14720, 14147, 13600, 13077, 12577, 12098, 11641, 11203, 10784, 10383, 10000, 9632, 9280, 8942,
+							 8619, 8309, 8012, 7727, 7454, 7191, 6940, 6698, 6466, 6244, 6030, 5825, 5627, 5438, 5255, 5080, 4911, 4749, 4593,
+							 4443, 4299, 4160, 4026, 3898, 3773, 3654, 3539, 3428, 3321, 3218, 3119, 3023, 2931, 2841, 2755, 2672, 2592, 2515,
+							 2441, 2369, 2299, 2232, 2167, 2104, 2044, 1985, 1928, 1874, 1821, 1769, 1720, 1672, 1626, 1581, 1537, 1495, 1455,
+							 1415, 1377, 1340, 1305, 1270, 1236, 1204, 1172, 1142, 1112, 1083, 1056, 1029, 1002, 977, 952, 928, 905, 883, 861,
+							 839, 819, 799, 779, 760, 742, 724, 707, 690, 674, 658, 642, 627, 613, 599, 585, 571, 558, 546, 533, 521, 509, 498, 487,
+							 476, 466, 455, 445, 436, 426, 417, 408, 399, 391, 382, 374, 366, 359, 351, 344, 337, 330, 323, 316, 310, 304, 298, 292,
+							 286, 280, 274, 269, 264, 259, 254, 249, 244, 239, 234, 230, 226, 221, 217, 213, 209, 205, 201, 198, 194, 190, 187, 183,
+							 180, 177, 174, 171, 168, 165, 162, 159, 156, 153, 151, 148, 145, 143, 141, 138, 136, 133, 131, 129, 127, 125};
+#define APPLAYERVER_STOP_SEC_VAR
+#include "MemMap.h"
+/*************************************************************
+ *测试变量存放区
+ ************************************************************/
+uint32 PressureValue = 0;
+uint16 Distence1 = 0;
+uint16 Distence2 = 0;
+uint8 Switch1 = 0;
+uint8 Switch2 = 0;
+uint8 ControlState = 0;
+uint32 PressureValueBuffer = 0;
+uint32 VehCo_fInputUIA[2];
+uint16 VehCo_rInputUWA[2];
+uint16 VehCo_uADChanUWA[_ATD_NUM_CHAN];
+uint8 VehCo_bDINChanUBA[_DIN_NUM_CHAN];
+float32 VehCo_uBattF;
+uint16 VehCo_uAccPedUW;
+#define EEPDATA_START_SEC_VAR
+#include "MemMap.h"
+uint32 VehCo_ctEEPTestUB = 0;
+uint32 VehCo_ctEEPTestUI = 0; //在定义时给EEPROM里的变量赋初值
+uint32 Control_Times = 0;
+#define EEPDATA_STOP_SEC_VAR
+#include "MemMap.h"

+ 583 - 0
System/Vehicle/Communication/CanVar.h

@@ -0,0 +1,583 @@
+/*
+ * @Author       : ChenJie
+ * @Date         : 2021-12-27 11:21:08
+ * @Version      : V3.0
+ * @LastEditors  : ChenJie
+ * @LastEditTime : 2021-12-30 13:59:24
+ * @Description  : file content
+ * @FilePath     : \VehicleControl\VehicleControl\src\System\Vehicle\Communication\CanVar.h
+ */
+/*
+ * CanVar.h
+ *
+ *  Created on: 2021年12月27日
+ *  编码
+ *      Author: QiXiang_CHENJIE
+ */
+
+#ifndef SYSTEM_VEHICLE_COMMUNICATION_CANVAR_H_
+#define SYSTEM_VEHICLE_COMMUNICATION_CANVAR_H_
+#include "Std_Types.h"
+#include "HardwareLib.h"
+/************************************************************
+ *BCU->Ebc解码变量存放区
+ ************************************************************/
+extern UINT32 BcuInTable[130];
+extern BOOL BcuRxShortError[130];
+extern BOOL BcuRxLongError[130];
+extern UINT8 BcuRxErrorCounter[130];
+extern UINT8 BcuRxFlag[130];
+extern UINT8 BMS13_ReqVIN;
+extern UINT8 BMS11_Fult1_DelTemp;
+extern UINT8 BMS11_Fult1_OverTemp;
+extern UINT8 BMS11_Fult1_PackOverHVolt;
+extern UINT8 BMS11_Fult1_PackLowHVolt;
+extern UINT8 BMS11_Fult1_LowSOC;
+extern UINT8 BMS11_Fult1_OverUcell;
+extern UINT8 BMS11_Fult1_LowUcell;
+extern UINT8 BMS11_Fult1_LowInsRes;
+extern UINT8 BMS11_Fult1_UcellUniformity;
+extern UINT8 BMS11_Fult1_OverChg;
+extern UINT8 BMS11_Fult1_OverSOC;
+extern UINT8 BMS11_Fult1_SOCChangeFast;
+extern UINT8 BMS11_Fult1_BatSysNotMatch;
+extern UINT8 BMS11_Fult1_HVILFault;
+extern UINT8 BMS12_Fult2_FaultNum;
+extern UINT8 BMS12_Fult2_CellOverDischrg;
+extern UINT8 BMS12_Fult2_CellLowTemp;
+extern UINT8 BMS12_Fult2_PackFireWarning;
+extern UINT8 BMS12_Fult2_OverDischrgCurr;
+extern UINT8 BMS12_Fult2_OverChrgCurrInTheDrive;
+extern UINT8 BMS12_Fult2_CurrSensorErr;
+extern UINT8 BMS12_Fult2_PowerSupplyErr;
+extern UINT8 BMS12_Fult2_TMSErr;
+extern UINT8 BMS12_Fult2_HeatingFilmErr;
+extern UINT8 BMS12_Fult2_PackSelfProtect;
+extern UINT8 BMS12_Fult2_MainLoopPrechrgErr;
+extern UINT8 BMS12_Fult2_AuxLoopPrechrgErr;
+extern UINT8 BMS12_Fult2_ChrgInsLowErr;
+extern UINT8 BMS12_Fult2_ACANLost;
+extern UINT8 BMS12_Fult2_InnerCommunicationErr;
+extern UINT8 BMS12_Fult2_DCDCErr;
+extern UINT8 BMS12_Fult2_BranchBreakErr;
+extern UINT8 BMS12_Fult2_HeatRelayOpenErr;
+extern UINT8 BMS12_Fult2_HeatRelayWeldErr;
+extern UINT8 BMS12_Fult2_MainPosRelayOpenErr;
+extern UINT8 BMS12_Fult2_MainPosRelayWeldErr;
+extern UINT8 BMS12_Fult2_MainNegRelayOpenErr;
+extern UINT8 BMS12_Fult2_MainNegRelayWeldErr;
+extern UINT8 BMS12_Fult2_DCChrgPos1RelayOpenErr;
+extern UINT8 BMS12_Fult2_DCChrgPos1RelayWeldErr;
+extern UINT8 BMS12_Fult2_DCChrgNeg1RelayOpenErr;
+extern UINT8 BMS12_Fult2_DCChrgNeg1RelayWeldErr;
+extern UINT8 BMS12_Fult2_DCChrgPos2RelayOpenErr;
+extern UINT8 BMS12_Fult2_DCChrgPos2RelayWeldErr;
+extern UINT8 BMS12_Fult2_DCChrgNeg2RelayOpenErr;
+extern UINT8 BMS12_Fult2_DCChrgNeg2RelayWeldErr;
+extern UINT8 BMS12_Fult2_ChrgConnectErr;
+extern UINT8 BMS12_ult2_OverDischrgCurrWhenInChrg;
+extern UINT8 BMS12_Fult2_OverChrgCurrInTheChrg;
+extern UINT8 BMS12_Fult2_ChrgNTCErr;
+extern UINT8 BMS12_Fult2_ChrgNTCTempOver;
+extern UINT8 BMS12_Fult2_ELockErr;
+extern UINT8 BMS12_Fult2_FireDetectorEr;
+extern UINT8 BMS12_Fult2_ContiDischrgCurrOverLoad;
+extern UINT8 BMS12_Fult2_SOCDifferErr;
+extern UINT8 BMS12_Fult2_ContiChrgCurrOverLoad;
+extern UINT8 BMS1_MainPosRelaySt;
+extern UINT8 BMS1_MainNegRelaySt;
+extern UINT8 BMS1_PreChgRelaySt;
+extern UINT8 BMS1_DCChrgPos1RelaySt;
+extern UINT8 BMS1_DCChrgNeg1RelaySt;
+extern UINT8 BMS1_DCChrgPos2RelaySt;
+extern UINT8 BMS1_DCChrgNeg2RelaySt;
+extern UINT8 BMS1_HeatPosRelaySt;
+extern UINT8 BMS1_HeatNegRelaySt;
+extern UINT8 BMS1_SysSts;
+extern UINT8 BMS1_Life;
+extern UINT8 BMS1_BalanceStatus;
+extern UINT8 BMS1_DCChrgConnectSt;
+extern UINT8 BMS1_ChrgMode;
+extern UINT8 BMS1_ChrgStatus;
+extern UINT8 BMS1_HeatingStatus;
+extern UINT8 BMS1_CoolingStatus;
+extern UINT8 BMS2_SOC;
+extern UINT8 BMS2_SOH;
+extern UINT8 BMS2_FaultCode;
+extern UINT8 BMS2_FaultLevel;
+extern UINT8 BMS2_RqHVPoerOff;
+extern UINT8 BMS2_Life;
+extern UINT8 BMS4_InsDetectorSt;
+extern UINT8 BMS8_Max_Temp;
+extern UINT8 BMS8_Min_Temp;
+extern UINT8 BMS8_Avg_Temp;
+extern UINT8 BMS8_MaxTempSysNr;
+extern UINT8 BMS8_MaxTempNr;
+extern UINT8 BMS8_MinTempSysNr;
+extern UINT8 BMS8_MinTempNr;
+extern UINT8 BMS7_MaxUcellSysNr;
+extern UINT8 BMS7_MinUcellSysNr;
+extern UINT8 BMS23_Gun1DCPosTemp;
+extern UINT8 BMS23_Gun1DCNegTemp;
+extern UINT8 BMS23_Gun2DCPosTemp;
+extern UINT8 BMS23_Gun2DCNegTemp;
+extern UINT8 BMS_Cell_TempN[64];
+extern UINT8 BMS_SN_SysCode[24];
+extern UINT8 BMS21_BattType;
+extern UINT8 BMS21_CoolType;
+extern UINT8 BMS21_Manufacture;
+extern UINT8 BMS21_ProtocolEditionH;
+extern UINT8 BMS21_ProtocolEditionL;
+extern UINT8 BMS9_TotCSCNum;
+extern UINT8 BMS9_PackTotTempNum;
+extern UINT8 BMS9_HVBranchNum;
+extern UINT8 BMS9_SingleHVBranchCellNum;
+extern UINT8 BMS9_BattSysNum;
+extern UINT8 BMS9_BattSysSeqNum;
+extern UINT8 BMS22_AvaiMaxSOC;
+extern UINT8 BMS22_AvaiMinSOC;
+extern UINT8 BMS22_AvaiMaxTemp;
+extern UINT8 BMS22_AvaiMinTemp;
+extern UINT8 BMS10_SubSysEncodingLen;
+extern UINT8 BMS10_SubSysIdx;
+extern UINT8 BMS10_SubSysErrNum;
+extern UINT8 BMS28_ReqMode;
+extern UINT8 BMS28_HVCmd;
+extern UINT8 BMS28_ChgSts;
+extern UINT8 BMS28_HVRelaySts;
+extern UINT8 BMS28_SetTemp;
+extern UINT8 BMS28_Life;
+extern UINT8 BMS28_CRC;
+extern UINT8 TMS_WorkStatus;
+extern UINT8 TMS_HVRelayST;
+extern UINT8 TMS_OutletTemp;
+extern UINT8 TMS_InletTemp;
+extern UINT8 TMS_Version;
+extern UINT8 TMS_ErrCode;
+extern UINT8 TMS_FaultLevel;
+extern UINT8 BCU_SnMsgFlag;
+extern UINT16 BMS_Cell_Volt[384];
+extern UINT16 BMS11_PackOutsideVolt;
+extern UINT16 BMS2_PackCurrent;
+extern UINT16 BMS2_PackInsideVolt;
+extern UINT16 BMS4_PosIsolation;
+extern UINT16 BMS4_NegIsolation;
+extern UINT16 BMS4_SysInsRes;
+extern UINT16 BMS6_Max_Ucell;
+extern UINT16 BMS6_Min_Ucell;
+extern UINT16 BMS6_Avg_Ucell;
+extern UINT16 BMS6_SOE;
+extern UINT16 BMS7_MaxUcellNr;
+extern UINT16 BMS7_MinUcellNr;
+extern UINT16 BMS23_RemainChgTi;
+extern UINT16 BMS21_RateCap;
+extern UINT16 BMS21_RateHVolt;
+extern UINT16 BMS21_RatePower;
+extern UINT16 BMS9_PackTotCellNum;
+extern UINT16 BMS22_PackAvaiMaxVolt;
+extern UINT16 BMS22_PackAvaiMinVolt;
+extern UINT16 BMS_SoftwareVersion;
+extern UINT16 BMS_HardwareVersion;
+extern UINT16 BMS3_MaxDischgPow;
+extern UINT16 BMS3_MaxChgPow;
+extern UINT16 BMS3_MaxInstantDischgPow;
+extern UINT16 BMS3_MaxiInstantChgPow;
+extern UINT16 BMS5_DischgCurMaxAllw;
+extern UINT16 BMS5_ChrgCurMaxAllw;
+extern UINT16 BMS5_InstChrgCurMaxAllw;
+extern UINT16 BMS5_InstDischrgCurMaxAllw;
+extern UINT16 BMS26_Bat_InstantConsume;
+extern UINT16 BMS26_Bat_TotalConsume;
+extern UINT16 BMS26_ChgReqVoltage;
+extern UINT16 BMS26_ChgReqCurrent;
+extern UINT16 BMS28_HVVolt;
+extern UINT16 TMS_ReqPow;
+extern UINT32 BMS1_RechrgCycels;
+extern UINT32 BMS14_TotalChargeAh;
+extern UINT32 BMS14_TotalDischargeAh;
+extern UINT32 BMS15_TotalChargeKwh;
+extern UINT32 BMS15_TotalDischargeKwh;
+extern UINT32 BMS16_TotalEneryECOChargeAh;
+extern UINT32 BMS16_TotalEneryECOChargeKwh;
+extern UINT32 BMS17_TotalStationChargeAh;
+extern UINT32 BMS17_TotalStationChargeKwh;
+extern UINT32 BMS18_TotalPoleChargeAh;
+extern UINT32 BMS18_TotalPoleChargeKwh;
+extern UINT32 BMS19_SingleChargeAh;
+extern UINT32 BMS19_SingleChargeKwh;
+/*************************************************************
+ *Ebc->Bcu组码变量存放区
+ ************************************************************/
+extern UINT32 Ebc2BcuOutTable[5][2];
+// extern UINT8 VCU_Life;
+
+extern UINT8 VCU_ReqHV;
+extern UINT8 VCU_DCDCSts;
+extern UINT8 VCU_DCACSts;
+extern UINT8 VCU_DCAPSts;
+// extern UINT8 VCU_VehicleSpeed;
+
+extern UINT8 VCU_PosRlySts;
+extern UINT8 VCU_PosRlyErrSts;
+extern UINT8 VCU_PTCRlSts;
+extern UINT8 VCU_PTCRlErrSts;
+extern UINT8 VCU_StopChgCmd;
+extern UINT8 VCU_HVInterlock;
+extern UINT8 VCU_AssistRlySts;
+extern UINT8 VCU_AssistRlyErrSts;
+extern UINT8 VCU_ACRlySts;
+extern UINT8 VCU_ACRlyErrSts;
+extern UINT8 ISO_WorkStatus;
+extern UINT8 ISO_FaultLevel;
+extern UINT8 VIN_FrameNo;
+extern UINT8 VCU_VIN[17];
+extern UINT8 EBC_State;
+extern UINT8 EBC_ForbidHVOn;
+extern UINT8 EBC_RequestHVOff;
+extern UINT8 EBC_ChgFaultFlag;
+extern UINT8 EBC_LockupFaultFlag;
+extern UINT8 EBC_ChgCnctOverTemp;
+extern UINT8 EBC_DischgHIVLFlag;
+extern UINT8 EBC_ChargeHIVLFlag;
+extern UINT8 EBC_DChgCnctOverTemp;
+extern UINT8 EBC_FaultLevel;
+extern UINT8 EBC_FaultCode;
+extern UINT8 EBC_ChargingStatus;
+extern UINT8 EBC_ActiveHeatReq;
+extern UINT8 EBC_AirPressure;
+// extern UINT8 EBC_Life;
+// extern UINT8 EBC_ChgPos1Temp;
+// extern UINT8 EBC_ChgNeg1Temp;
+// extern UINT8 EBC_ChgPos2Temp;
+// extern UINT8 EBC_ChgNeg2Temp;
+// extern UINT8 EBC_DchgPos1Temp;
+// extern UINT8 EBC_DchgNeg1Temp;
+// extern UINT8 EBC_DchgPos2Temp;
+// extern UINT8 EBC_DchgNeg2Temp;
+extern UINT16 ISO_PosResis;
+extern UINT16 ISO_NegResis;
+/*************************************************************
+ *Vcu->Ebc组码变量存放区
+ ************************************************************/
+extern UINT8 VcuRxFlag[8];
+extern UINT32 VcuInTable[8];
+extern BOOL VcuRxShortError[8];
+extern BOOL VcuRxLongError[8];
+extern UINT8 VcuRxErrorCount[8];
+extern UINT8 Checksum;
+extern UINT8 VCU_Life;
+extern UINT8 VCU_HvOnOff;
+extern UINT8 VCU_AuxOnOff;
+extern UINT8 VCU_VehicleSpeed;
+extern UINT8 VCU_HeatOnOff;
+extern UINT8 VCU_MainPosRlySts;
+extern UINT8 VCU_MainNegRlySts;
+extern UINT8 VCU_PreChgRlySts;
+extern UINT8 VCU_AuxRlySts;
+extern UINT8 VCU_MainMotRlySts;
+extern UINT8 VCU_MainMotRlyErrSts;
+extern UINT8 VCU_Assist1RlySts;
+extern UINT8 VCU_Assist1RlyErrSts;
+extern UINT8 VCU_Assist2RlySts;
+extern UINT8 VCU_Assist2RlyErrSts;
+extern UINT8 VCU_Assist3RlySts;
+extern UINT8 VCU_Assist3RlyErrSts;
+extern UINT8 VCU_Assist4RlySts;
+extern UINT8 VCU_Assist4RlyErrSts;
+extern UINT8 VCU_VIN[17];
+extern UINT8 DrvMotPosRySts;
+extern UINT8 VehSts;
+extern UINT8 BrakePedal;
+extern UINT8 HandbrakeSts;
+extern UINT8 GearPos;
+extern UINT16 VehSpd;
+extern UINT32 VCU_TotalDistance;
+extern UINT8 EBC_VinMsgFlag;
+/*************************************************************
+ *Ebc->Vcu组码变量存放区
+ ************************************************************/
+extern UINT32 Ebc2VcuOutTable[25][2];
+extern UINT8 ReqVIN;
+extern UINT8 ReqHVOff;
+extern UINT8 ChgSysNum;
+extern UINT8 Fult2_MainPosRelayWeldErr;
+extern UINT8 Fult2_MainNegRelayWeldErr;
+extern UINT8 Fult2_DCChgPos1RelayWeldErr;
+extern UINT8 Fult2_DCChgNeg1RelayWeldErr;
+extern UINT8 Fult2_DCChgPos2RelayWeldErr;
+extern UINT8 Fult2_DCChgNeg2RelayWeldErr;
+extern UINT8 HeatPosRelayWeldErr;
+extern UINT8 HeatNegRelayWeldErr;
+extern UINT8 MainPosRelaySt;
+extern UINT8 MainNegRelaySt;
+extern UINT8 PreChgRelaySt;
+extern UINT8 DCChrgPos1RelaySt;
+extern UINT8 DCChrgNeg1RelaySt;
+extern UINT8 DCChrgPos2RelaySt;
+extern UINT8 DCChrgNeg2RelaySt;
+extern UINT8 AuxRelayWeldErr;
+extern UINT8 Fult2_BranchBreakErr;
+extern UINT8 Fult2_OverChrgCurrInTheDrive;
+extern UINT8 Fult2_MainPosRelayOpenErr;
+extern UINT8 Fult2_MainNegRelayOpenErr;
+extern UINT8 Fult2_DCChgPos1RelayOpenErr;
+extern UINT8 Fult2_DCChgPos2RelayOpenErr;
+extern UINT8 Fult2_DCChgNeg1RelayOpenErr;
+extern UINT8 Fult2_DCChgNeg2RelayOpenErr;
+extern UINT8 Fult2_HeatRelayWeldErr;
+extern UINT8 Fult2_HeatRelayOpenErr;
+extern UINT8 Fult2_TMSErr;
+extern UINT8 Fult2_PowerSupplyErr;
+extern UINT8 Fult2_PackSelfProtect;
+extern UINT8 Fult2_ChrgNTCTempOver;
+extern UINT8 BattSysNum;
+extern UINT8 BatSysFaultCode;
+extern UINT8 ST1_CheckSum;
+extern UINT8 ST1_Life;
+extern UINT8 BMS_SysSts;
+extern UINT8 AssisRelaySts;
+extern UINT8 BlanceSts;
+extern UINT8 DCChrgConnectSt;
+extern UINT8 ChrgMode;
+extern UINT8 ChrgStatus;
+extern UINT8 FaultLevel;
+extern UINT8 Fult1_DelTemp;
+extern UINT8 Fult1_OverTemp;
+extern UINT8 Fult1_PackOverHVolt;
+extern UINT8 Fult1_PackLowHVolt;
+extern UINT8 Fult1_LowSOC;
+extern UINT8 Fult1_OverUcell;
+extern UINT8 Fult1_LowUcell;
+extern UINT8 Fult1_LowInsRes;
+extern UINT8 Fult1_UcellUniformity;
+extern UINT8 Fult2_CellLowTemp;
+extern UINT8 Fult2_OverDischrgCurr;
+extern UINT8 Fult2_OverChrgCurrInTheChrg;
+extern UINT8 Fult_BranchVolUniformity;
+extern UINT8 Fult_BMSHardware;
+extern UINT8 Fult1_OverSOC;
+extern UINT8 Fult1_SOCChangeFast;
+extern UINT8 Fult2_InnerCommunicationErr;
+extern UINT8 Fult1_BatSysNotMatch;
+extern UINT8 Fult1_HVILFault;
+extern UINT8 Fult2_FireDetectorEr;
+extern UINT8 Fult2_PackFireWarning;
+extern UINT8 Fult2_FaultNum;
+extern UINT8 SOC;
+extern UINT8 SOH;
+extern UINT8 Max_Temp;
+extern UINT8 Min_Temp;
+extern UINT8 Avg_Temp;
+extern UINT8 MaxTempSysNr;
+extern UINT8 MaxTempNr;
+extern UINT8 MinTempSysNr;
+extern UINT8 MinTempNr;
+extern UINT8 MaxUcellSysNr;
+extern UINT8 MaxUcellNr;
+extern UINT8 MinUcellSysNr;
+extern UINT8 MinUcellNr;
+extern UINT8 Gun1DCNegTemp;
+extern UINT8 Gun1DCPosTemp;
+extern UINT8 Gun2DCNegTemp;
+extern UINT8 Gun2DCPosTemp;
+extern UINT8 HeatPosRelaySt;
+extern UINT8 HeatNegRelaySt;
+extern UINT8 UcellFrameNum;
+extern UINT8 UcellCSCNum;
+extern UINT8 TempFrameNum;
+extern UINT8 TempCSCNum;
+// extern UINT8 CurCSC_TempN;
+// extern UINT8 CurCSC_TempN1;
+// extern UINT8 CurCSC_TempN2;
+// extern UINT8 CurCSC_TempN3;
+// extern UINT8 CurCSC_TempN4;
+// extern UINT8 CurCSC_TempN5;
+
+extern UINT8 BattType;
+extern UINT8 CoolType;
+extern UINT8 TotCSCNum;
+extern UINT8 CellVoltPlat;
+extern UINT8 MinAvlCellVolt;
+extern UINT8 MaxAvlCellVolt;
+extern UINT8 EBC_DchgPos1Temp;
+extern UINT8 EBC_DchgNeg1Temp;
+extern UINT8 EBC_DchgPos2Temp;
+extern UINT8 EBC_DchgNeg2Temp;
+extern UINT8 EBC_ChgPos1Temp;
+extern UINT8 EBC_ChgNeg1Temp;
+extern UINT8 EBC_ChgPos2Temp;
+extern UINT8 EBC_ChgNeg2Temp;
+extern UINT8 ReqMode;
+extern UINT8 HVCmd;
+extern UINT8 ChgSts;
+extern UINT8 HVRelaySts;
+extern UINT8 SetTemp;
+extern UINT8 Bms_Life;
+extern UINT8 CRC;
+extern UINT8 TMS_WorkStatus;
+extern UINT8 TMS_HVRelayST;
+extern UINT8 TMS_OutletTemp;
+extern UINT8 TMS_InletTemp;
+extern UINT8 TMS_ErrCode;
+extern UINT8 TMS_FaultLevel;
+// extern UINT8 EBC_Life;
+
+extern UINT8 EBC_LockupSts;
+extern UINT8 EBC_ConnectorSts;
+extern UINT8 EBC_DischgConnectorSts;
+extern UINT8 EBC_ChgConnectorSts;
+extern UINT8 EBC_FaultLevel;
+extern UINT8 EBC_FaultCode;
+extern UINT16 BMS_SoftwareVersion;
+extern UINT16 BMS_HardwareVersion;
+extern UINT16 PackCurrent;
+extern UINT16 InstChrgCurMaxAllw;
+extern UINT16 InstDischrgCurMaxAllw;
+extern UINT16 PosIsolation;
+extern UINT16 NegIsolation;
+extern UINT16 PackInsideVolt;
+extern UINT16 PackOutsideVolt;
+extern UINT16 Max_Ucell;
+extern UINT16 Avg_Ucell;
+extern UINT16 Min_Ucell;
+extern UINT16 ChrgCurMaxAllw;
+// extern UINT16 CurCSC_UCellN;
+// extern UINT16 CurCSC_UCellN1;
+// extern UINT16 CurCSC_UCellN2;
+
+extern UINT16 Pack_RateCap;
+extern UINT16 Pack_RateHVolt;
+extern UINT16 Pack_RatePower;
+extern UINT16 PackTotCellNum;
+extern UINT16 PackTotTempNum;
+extern UINT16 SingleChargeKwh;
+extern UINT16 HVVolt;
+// extern UINT16 TMS_ReqPow;
+
+extern UINT32 TotalChargeKwh;
+extern UINT32 TotalDischargeKwh;
+extern UINT32 TotalEneryECOChargeKwh;
+extern UINT32 TotalStationChargeKwh;
+extern UINT32 TotalPoleChargeKwh;
+/*************************************************************
+ *Ebc->ble组码变量存放区
+ ************************************************************/
+extern uint16 CANNet_rAccPedUW;
+extern uint32 PressureValue;
+extern uint16 Distence1;
+extern uint16 Distence2;
+extern uint8 Switch1;
+extern uint8 Switch2;
+extern uint8 ControlState;
+extern uint32 Control_Times;
+extern uint32 PressureValueBuffer;
+extern uint32 VehCo_fInputUIA[2];
+extern uint16 VehCo_rInputUWA[2];
+extern uint16 VehCo_uADChanUWA[_ATD_NUM_CHAN];
+extern uint8 VehCo_bDINChanUBA[_DIN_NUM_CHAN];
+extern float32 VehCo_uBattF;
+extern uint16 VehCo_uAccPedUW;
+#define EEPDATA_START_SEC_VAR
+#include "MemMap.h"
+extern uint32 VehCo_ctEEPTestUB;
+extern uint32 VehCo_ctEEPTestUI; //在定义时给EEPROM里的变量赋初值
+extern uint32 Control_Times;
+#define EEPDATA_STOP_SEC_VAR
+#include "MemMap.h"
+// Ble
+extern uint16 bcud_E_snglChrg;       //单次充电能量,精度0.1kwh
+extern uint16 ebcd_Nr_swapBatt;      //换电次数
+extern uint16 ebcd_Nr_swapSucBatt;   //换电成功次数
+extern uint16 bcud_pct_soc;          //电池SOC,精度0.1
+extern uint16 bcud_Q_snglChrg;       //单次充电容量,精度0.1Ah
+extern uint16 bcud_V_battU;          //电池电压 精度0.1V
+extern uint32 bcud_E_accChrg;        //累计充电能量,精度0.1kwh
+extern uint32 bcud_E_accDischrg;     //累计放电能量,精度0.1kwh
+extern uint32 bcud_E_accPlugInChrg;  //累计插枪充电能量,精度0.1kwh
+extern uint32 bcud_E_accRecovry;     //累计回收能量,精度0.1kwh
+extern uint32 bcud_E_accSwapBatt;    //累计换电站能量,精度0.1kwh
+extern uint32 bcud_Q_accChrg;        //累计充电容量,精度0.1ah
+extern uint32 bcud_Q_accDischrg;     //累计放电容量,精度0.1ah
+extern uint32 bcud_Q_accPlugInChrg;  //累计插枪充电容量,精度0.1ah
+extern uint32 bcud_Q_accRecovry;     //累计回收容量,精度0.1ah
+extern uint32 bcud_Q_accSwapBatt;    //累计换电站容量,精度0.1ah
+extern uint32 vcud_M_accDrv;         //累计行驶里程,精度0.1km
+extern uint8 bcud_pct_bcuSoh;        //电池Soh,精度0.4%
+extern uint8 bcud_st_bcuComun;       //电池通讯状态,0-通信中断,1-通信正常
+extern uint8 bcud_st_bcuMainRelay;   //主继电器信号,0-保留 1-断开,2-关闭 3-异常
+extern uint8 bcud_st_bcuTmsLiquid;   //热管理液位状态,1-液位正常,0-液位过低
+extern uint8 bcud_st_hvWork;         //电池高压状态,0-高压开启 1-预充,2-高压关断,3-高压上电故障
+extern uint8 bcuv_Num_battSn[32];    //电池SN号码
+extern uint8 ebcd_flg_pluginLockSig; //互锁接插件信号状态,1-触发,0-无触发
+extern uint8 ebcd_flg_swapAdmit;     //允许换电判断:0-不允许,1-允许
+extern uint8 ebcd_Nr_errMax;         //故障等级:当前故障最大等级
+extern uint8 ebcd_Num_err1;          //故障码1
+extern uint8 ebcd_Num_err2;          //故障码2
+extern uint8 ebcd_st_ebcConnect;     // Ebc通讯模式,0-无线蓝牙,1-有线连接 ,默认0
+extern uint8 ebcd_st_ebcLockWork;    // Ebc解锁模式,0-单步模式,1-自动模式
+extern uint8 ebcd_st_ebcWork;        // Ebc当前状态 0-行车,1-通讯,2-换电
+extern uint8 ebcd_st_errTable1;      //故障表1,bit0-气压异常,bit1-液位异常,bit2-Flash读取异常
+extern uint8 ebcd_st_errTable2;      //故障表2,bit0-互锁异常,bit1-整车CAN异常,bit2-电池CAN异常,bit3-锁钩异常,bit4-升降机异常,bit5-电池位置异常
+extern uint8 ebcd_st_errTable3;      //故障表3,bit0-放电互锁异常,bit1-充电互锁异常,bit2-整车高压互锁异常
+extern uint8 ebcd_st_lockSensor;     //锁紧传感器信号:bit0-bit3:传感器0-3的状态每,bit:1-触发,0-不触发
+extern uint8 ebcd_st_lockSucJug;     //锁紧完成判断:0-完全未锁紧,1-完全锁紧,2-未完全锁紧"
+extern uint8 ebcd_st_pedstSensor;    //底座落座传感器:bit0-bit1:传感器0-1的状态,每bit:1-触发,0-无触发
+extern uint8 ebcd_st_pedstSucJug;    //电池底座到位判断:0-完全未到位,1-完全到位,2-未完全到位
+extern uint8 ebcd_st_pluginLockSig;  //互锁接插件信号具体状态,1-触发,0-无触发
+extern uint8 ebcd_st_unlockSensor;   //解锁传感器信号:bit0-bit3:传感器0-3的状态每,bit:1-触发,0-不触发
+extern uint8 ebcd_st_unlockSucJug;   //解锁完成判断:0-完全未解锁,1-完全解锁,2-未完全解锁
+// extern uint8 vcud_P_airSensor;            //压力传感器气压值:单位Mpa,精度0.01Mpa
+extern uint8 vcud_P_airSensorBack;        //后桥气压值,单位Mpa,精度0.01Mpa
+extern uint8 vcud_P_airSensorForward;     //前桥气压值,单位Mpa,精度0.01Mpa
+extern uint8 vcud_st_carStart;            //整车启动状态,0001-车辆启动状态,0010-熄火,0011-其他状态,1111-无效
+extern uint8 vcud_st_footbrake;           //脚刹信号,0-无效,1-有效
+extern uint8 vcud_st_gear;                //档位信号,FF-倒挡(R),0-空挡(N),X-前进档(DX)X取1-12
+extern uint8 vcud_st_handbrake;           //手刹信号,0-无效,1-有效
+extern uint8 vcud_st_keyOn;               //钥匙信号,1-上电,0-下电
+extern uint8 vcud_st_Steer;               //方向盘信号,bit0-左侧转向灯,bit1-右侧转向灯,每bit 0-OFF,1-ON
+extern uint8 vcud_st_vcuComun;            // vcu通讯状态,0-通信中断,1-通信正常
+extern uint8 vcuv_Num_vin[17];            // VIN码
+extern uint8 bled_flg_lockCmd;            //锁钩电磁阀锁紧命令,1-有效,0-无效
+extern uint8 bled_flg_unlockCmd;          //锁钩电磁阀解锁命令,1-有效,0-无效
+extern uint8 bled_flg_lockCmdForce;       //锁钩电磁阀锁紧强制命令,1-有效,0-无效
+extern uint8 bled_flg_unlockCmdForce;     //锁钩电磁阀解锁强制命令,1-有效,0-无效
+extern uint8 bled_flg_topAscendCmd;       //顶板上升命令,1-有效,0-无效
+extern uint8 bled_flg_topDescendCmd;      //顶板下降命令,1-有效,0-无效
+extern uint8 bled_flg_topAscendCmdForce;  //顶板强制上升命令,1-有效,0-无效
+extern uint8 bled_flg_topDescendCmdForce; //顶板强制下降命令,1-有效,0-无效
+extern uint8 bled_flg_openDustReCmd;      //除尘打开指令,1-有效,0-无效
+extern uint8 bled_flg_closeDustReCmd;     //除尘关闭指令,1-有效,0-无效
+extern uint8 bled_flg_Heart;              //心跳维持指令
+extern uint8 bled_flg_getEbcData;         //获取ebc数据指令
+extern uint8 bled_flg_getVcuData;         //获取vcu数据指令
+extern uint8 bled_flg_getBmsData;         //获取bms数据指令
+extern uint8 bled_flg_handShake;          //握手指令
+extern uint8 bled_flg_swapBattDone;       //换电完成指令
+extern uint8 bled_flg_backToDrv;          //回到行驶状态指令
+extern uint8 bled_flg_autoLock;           //自动锁定指令
+extern uint8 bled_flg_autoUnlock;         //自动解锁指令
+extern uint8 bled_flg_toSwapMod;          //换到换电状态
+extern uint8 bled_flg_safeStopCmd;        //急停指令
+extern uint32 bled_Nr_softVer;            // BLE软件版本
+extern uint8 bled_flg_role;               // ble的主从模式 01-主,02-从
+extern uint8 bled_flg_bleConn;            // ble蓝牙连接状态
+extern uint8 bled_flg_bleDisconn;         // ble蓝牙断开状态
+//正式变量
+extern uint8 ebcd_P_airSensor;
+extern uint8 ebcd_T_plugin[4];          //四个接插件温度
+extern uint8 ebcd_flg_forbidHVOn;       //禁止高压上电
+extern uint8 ebcb_flg_reqHvOff;         //请求高压下电
+extern uint8 ebcd_flg_LockErr;          //锁紧机构故障状态
+extern uint8 ebcd_flg_dChrgLockErr;     //放电互锁故障状态
+extern uint8 ebcd_flg_chrgLockErr;      //充电互锁故障状态
+extern uint8 ebcd_flg_dChgCnctOverTemp; //放电连接器过温标志
+extern uint8 ebcd_st_ebcWork;           // Ebc当前状态 0-行车,1-通讯,2-换电
+extern uint8 ebcd_Nr_errMax;            //故障等级:当前故障最大等级
+extern uint8 ebcd_Num_faultCode;        // ebc故障码,未定义
+extern uint8 ebcd_st_chargingMod;       //充电模式,1-车载充电,2-换电站充电
+extern uint8 ebdc_st_lockUpState;       //锁止机构状态,0-故障,1-解锁成功,2-上锁成功
+extern uint8 ebdc_st_ConnecState;       //换电连接器状态(充电回路&放电回路同时闭合代表闭合,有一路断开则为断开),0_未连接 1_连接
+
+extern const uint16 T_table[240];
+extern const uint32 R_table[240];
+#endif /* SYSTEM_VEHICLE_COMMUNICATION_CANVAR_H_ */

+ 747 - 0
System/Vehicle/Communication/VcuCanProtocolFunc.c

@@ -0,0 +1,747 @@
+#include "VcuCanProtocolFunc.h"
+/**
+ * @brief : VcuCan淇℃伅瑙g爜鍑芥暟
+ * @param {UINT32} ID
+ * @param {UINT8} *rawData
+ * @return {*}
+ */
+void VcuDecodeFunction(UINT32 ID, UINT8 *rawData)
+{
+	switch (ID)
+	{
+	case 0x1802F3D0:
+		Checksum = (UINT8)(((*(UINT8 *)(rawData + 0))) & 0xFF);
+		VCU_Life = (UINT8)(((*(UINT8 *)(rawData + 1))) & 0xF);
+		VCU_HvOnOff = (UINT8)(((*(UINT8 *)(rawData + 1)) >> 4) & 0x3);
+		VCU_AuxOnOff = (UINT8)(((*(UINT8 *)(rawData + 1)) >> 6) & 0x3);
+		VCU_VehicleSpeed = (UINT8)(((*(UINT8 *)(rawData + 2))) & 0xFF);
+		VCU_HeatOnOff = (UINT8)(((*(UINT8 *)(rawData + 3))) & 0x3);
+		VCU_MainPosRlySts = (UINT8)(((*(UINT8 *)(rawData + 3)) >> 2) & 0x3);
+		VCU_MainNegRlySts = (UINT8)(((*(UINT8 *)(rawData + 3)) >> 4) & 0x3);
+		VCU_PreChgRlySts = (UINT8)(((*(UINT8 *)(rawData + 3)) >> 6) & 0x3);
+		VCU_AuxRlySts = (UINT8)(((*(UINT8 *)(rawData + 4))) & 0x3);
+		VCU_MainMotRlySts = (UINT8)(((*(UINT8 *)(rawData + 4)) >> 2) & 0x3);
+		VCU_MainMotRlyErrSts = (UINT8)(((*(UINT8 *)(rawData + 4)) >> 4) & 0x3);
+		VCU_Assist1RlySts = (UINT8)(((*(UINT8 *)(rawData + 4)) >> 6) & 0x3);
+		VCU_Assist1RlyErrSts = (UINT8)(((*(UINT8 *)(rawData + 5))) & 0x3);
+		VCU_Assist2RlySts = (UINT8)(((*(UINT8 *)(rawData + 5)) >> 2) & 0x3);
+		VCU_Assist2RlyErrSts = (UINT8)(((*(UINT8 *)(rawData + 5)) >> 4) & 0x3);
+		VCU_Assist3RlySts = (UINT8)(((*(UINT8 *)(rawData + 5)) >> 6) & 0x3);
+		VCU_Assist3RlyErrSts = (UINT8)(((*(UINT8 *)(rawData + 6))) & 0x3);
+		VCU_Assist4RlySts = (UINT8)(((*(UINT8 *)(rawData + 6)) >> 2) & 0x3);
+		VCU_Assist4RlyErrSts = (UINT8)(((*(UINT8 *)(rawData + 6)) >> 4) & 0x3);
+		VcuRxFlag[0] = 0x01;
+		break;
+	case 0x18E1F3D0:
+		if (*rawData >= 0x1 && *rawData <= 3)
+		{
+			for (UINT8 i = 0; i < 7; i++)
+			{
+				if ((UINT8)(i + ((*rawData) - 1) * 7) < (UINT8)sizeof(VCU_VIN))
+				{
+					VCU_VIN[i + ((*rawData) - 1) * 7] = *(rawData + i + 1) & 0xFF;
+				}
+			}
+			EBC_VinMsgFlag = EBC_VinMsgFlag | (1 << (*rawData - 1));
+		}
+		VcuRxFlag[1] = 0x01;
+		break;
+	case 0x18FEDA17:
+		VCU_TotalDistance = (UINT32)(((*(UINT32 *)(rawData + 0))) & 0xFFFFFFFF);
+		VcuRxFlag[2] = 0x01;
+		break;
+	case 0x18FF15F6:
+		DrvMotPosRySts = (UINT8)(((*(UINT8 *)(rawData + 0))) & 0x1);
+		VcuRxFlag[3] = 0x01;
+		break;
+	case 0x18FF43A8:
+		VehSts = (UINT8)(((*(UINT8 *)(rawData + 0))) & 0xF);
+		VcuRxFlag[4] = 0x01;
+		break;
+	case 0x18FF44A8:
+		BrakePedal = (UINT8)(((*(UINT8 *)(rawData + 4))) & 0xFF);
+		VcuRxFlag[5] = 0x01;
+		break;
+	case 0x18FF4617:
+		VehSpd = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
+		HandbrakeSts = (UINT8)(((*(UINT8 *)(rawData + 2))) & 0x3);
+		VcuRxFlag[6] = 0x01;
+		break;
+	case 0x18FF48A8:
+		GearPos = (UINT8)(((*(UINT8 *)(rawData + 0)) >> 4) & 0xF);
+		VcuRxFlag[7] = 0x01;
+		break;
+	default:
+		break;
+	}
+}
+/**
+ * @brief : Vcu涓㈠抚淇℃伅璇婃柇
+ * @param {*}
+ * @return {*}
+ */
+void VcuRxDiagnose(void)
+{
+	static UINT16 TimeCounter = 0;//ms
+	TimeCounter = TimeCounter + 10;
+	/*
+	Can涓㈠抚璇婃柇
+	*/
+	for (UINT8 i = 0; i < sizeof(VcuInTable) / 4; i++)
+	{
+		if (VcuRxFlag[i] == 1) // received msg, and clear the error counter
+		{
+			VcuRxErrorCount[i] = 0;
+			VcuRxFlag[i] = 0;
+			continue;
+		}
+		if (VcuRxErrorCount[i] < 3)
+		{
+			VcuRxShortError[i] = 0;
+			VcuRxLongError[i] = 0;
+		}
+		else if (VcuRxErrorCount[i] >= 3 && VcuRxErrorCount[i] < 13)
+		{
+			VcuRxShortError[i] = 1;
+			VcuRxLongError[i] = 0;
+		}
+		else if (VcuRxErrorCount[i] >= 13)
+		{
+			VcuRxShortError[i] = 0;
+			VcuRxLongError[i] = 1;
+			VcuRxMsgSetInvalidValue(VcuInTable[i]);
+			VcuRxErrorCount[i] = 0;
+		}
+		else if (VcuRxErrorCount[i] == 0xFF)
+		{
+			VcuRxErrorCount[i] = 0xFE;
+		}
+	}
+	/*
+	CAN涓㈠抚绱
+	*/
+	if (TimeCounter % 100 == 0) // period <=100ms
+	{
+		VcuRxErrorCount[0]++; // can msg 0x1802F3D0
+		// if(VcuRxErrorCount[0]>=13)
+		VcuRxErrorCount[3]++; // can msg 0x18FF15F6
+		// if(VcuRxErrorCount[3]>=13)
+		VcuRxErrorCount[6]++; // can msg 0x18FF4617
+		// if(VcuRxErrorCount[6]>=13)
+		VcuRxErrorCount[7]++; // can msg 0x18FF48A8
+							  // if(VcuRxErrorCount[7]>=13)
+	}
+	if (TimeCounter % 200 == 0) // period ==200ms
+	{
+	}
+	if (TimeCounter % 500 == 0) // period ==500ms
+	{
+		VcuRxErrorCount[2]++; // can msg 0x18FEDA17
+		// if(VcuRxErrorCount[2]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[2]);
+		VcuRxErrorCount[4]++; // can msg 0x18FF43A8
+		// if(VcuRxErrorCount[4]>=13)
+		// printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[4]);
+		VcuRxErrorCount[5]++; // can msg 0x18FF44A8
+							  // if(VcuRxErrorCount[5]>=13)
+							  // printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[5]);
+	}
+	if (TimeCounter % 1000 == 0) // period ==1000ms
+	{
+		VcuRxErrorCount[1]++; // can msg 0x18E1F3D0
+							  // if(VcuRxErrorCount[1]>=13)
+							  // printf("can msg 0x%x lost,cycle time1000ms\n",COMInTable[1]);
+	}
+	if (TimeCounter % 2000 == 0) // period ==2000ms
+	{
+	}
+	if (TimeCounter % 3000 == 0) // period ==3000ms
+	{
+	}
+	if (TimeCounter % 5000 == 0) // period ==5000ms
+	{
+	}
+}
+/**
+ * @brief : VcuCan淇℃伅澶辨晥缃綅
+ * @param {UINT32} ID
+ * @return {*}
+ */
+void VcuRxMsgSetInvalidValue(UINT32 ID)
+{
+	switch (ID)
+	{
+	case 0x1802F3D0:
+		Checksum = 0xFF;
+		VCU_Life = 0xFF;
+		VCU_HvOnOff = 0xFF;
+		VCU_AuxOnOff = 0xFF;
+		VCU_VehicleSpeed = 0xFF;
+		VCU_HeatOnOff = 0xFF;
+		VCU_MainPosRlySts = 0xFF;
+		VCU_MainNegRlySts = 0xFF;
+		VCU_PreChgRlySts = 0xFF;
+		VCU_AuxRlySts = 0xFF;
+		VCU_MainMotRlySts = 0xFF;
+		VCU_MainMotRlyErrSts = 0xFF;
+		VCU_Assist1RlySts = 0xFF;
+		VCU_Assist1RlyErrSts = 0xFF;
+		VCU_Assist2RlySts = 0xFF;
+		VCU_Assist2RlyErrSts = 0xFF;
+		VCU_Assist3RlySts = 0xFF;
+		VCU_Assist3RlyErrSts = 0xFF;
+		VCU_Assist4RlySts = 0xFF;
+		VCU_Assist4RlyErrSts = 0xFF;
+		break;
+	case 0x18E1F3D0:
+		break;
+	case 0x18FEDA17:
+		VCU_TotalDistance = 0xFFFFFFFF;
+		break;
+	case 0x18FF15F6:
+		DrvMotPosRySts = 0xFF;
+		break;
+	case 0x18FF43A8:
+		VehSts = 0xFF;
+		break;
+	case 0x18FF44A8:
+		BrakePedal = 0xFF;
+		break;
+	case 0x18FF4617:
+		VehSpd = 0xFFFF;
+		HandbrakeSts = 0xFF;
+		break;
+	case 0x18FF48A8:
+		GearPos = 0xFF;
+		break;
+	default:
+		break;
+	}
+}
+
+/*
+缁勭爜鍑芥暟
+*/
+void VcuEncodeFunction(UINT32 ID, UINT8 *rawData)
+{
+	switch (ID)
+	{
+	case 0x1801D0F3:
+		ReqVIN = BMS13_ReqVIN;
+		ReqHVOff = BMS2_RqHVPoerOff;
+		*(UINT8 *)(rawData + 0) = *(UINT8 *)(rawData + 0) | ((ReqVIN << 0) & 0xFF);
+		*(UINT8 *)(rawData + 0) = *(UINT8 *)(rawData + 0) | ((ReqHVOff << 2) & 0xFF);
+		break;
+	case 0x1801D8F3:
+		// BMS_SoftwareVersion = ;//瀹氫箟涓轰竴鑷�
+		// BMS_HardwareVersion = ;
+		*(UINT16 *)(rawData + 0) = *(UINT16 *)(rawData + 0) | ((BMS_SoftwareVersion << 0) & 0xFFFF);
+		*(UINT16 *)(rawData + 2) = *(UINT16 *)(rawData + 2) | ((BMS_HardwareVersion << 0) & 0xFFFF);
+		break;
+	case 0x1880D0F3:
+		ChgSysNum = 1; // 瀹氫箟涓�1涓�
+		Fult2_MainPosRelayWeldErr = BMS12_Fult2_MainPosRelayWeldErr;
+		Fult2_MainNegRelayWeldErr = BMS12_Fult2_MainNegRelayWeldErr;
+		Fult2_DCChgPos1RelayWeldErr = BMS12_Fult2_DCChrgPos1RelayWeldErr;
+		Fult2_DCChgNeg1RelayWeldErr = BMS12_Fult2_DCChrgNeg1RelayWeldErr;
+		Fult2_DCChgPos2RelayWeldErr = BMS12_Fult2_DCChrgPos2RelayWeldErr;
+		Fult2_DCChgNeg2RelayWeldErr = BMS12_Fult2_DCChrgNeg2RelayWeldErr;
+		HeatPosRelayWeldErr = 0x00;
+		HeatNegRelayWeldErr = 0x00;
+		MainPosRelaySt = BMS1_MainPosRelaySt;
+		MainNegRelaySt = BMS1_MainNegRelaySt;
+		PreChgRelaySt = BMS1_PreChgRelaySt;
+		DCChrgPos1RelaySt = BMS1_DCChrgPos1RelaySt;
+		DCChrgNeg1RelaySt = BMS1_DCChrgNeg1RelaySt;
+		DCChrgPos2RelaySt = BMS1_DCChrgPos2RelaySt;
+		DCChrgNeg2RelaySt = BMS1_DCChrgNeg2RelaySt;
+		AuxRelayWeldErr = 0x00;
+		Fult2_BranchBreakErr = BMS12_Fult2_BranchBreakErr;
+		Fult2_OverChrgCurrInTheDrive = BMS12_Fult2_OverChrgCurrInTheDrive;
+		Fult2_MainPosRelayOpenErr = BMS12_Fult2_MainPosRelayOpenErr;
+		Fult2_MainNegRelayOpenErr = BMS12_Fult2_MainNegRelayOpenErr;
+		Fult2_DCChgPos1RelayOpenErr = BMS12_Fult2_DCChrgPos1RelayOpenErr;
+		Fult2_DCChgPos2RelayOpenErr = BMS12_Fult2_DCChrgNeg1RelayOpenErr;
+		Fult2_DCChgNeg1RelayOpenErr = BMS12_Fult2_DCChrgPos2RelayOpenErr;
+		Fult2_DCChgNeg2RelayOpenErr = BMS12_Fult2_DCChrgNeg2RelayOpenErr;
+		Fult2_HeatRelayWeldErr = BMS12_Fult2_HeatRelayWeldErr;
+		Fult2_HeatRelayOpenErr = BMS12_Fult2_HeatRelayOpenErr;
+		Fult2_TMSErr = BMS12_Fult2_TMSErr;
+		Fult2_PowerSupplyErr = BMS12_Fult2_PowerSupplyErr;
+		Fult2_PackSelfProtect = BMS12_Fult2_PackSelfProtect;
+		Fult2_ChrgNTCTempOver = BMS12_Fult2_ChrgNTCTempOver;
+		BattSysNum = BMS9_BattSysNum;
+		BatSysFaultCode = BMS2_FaultCode; // TBD 鏄惁闇�瑕佸鍔燛BC鏁呴殰鐮�
+		*(UINT8 *)(rawData + 0) = *(UINT8 *)(rawData + 0) | ((ChgSysNum << 0) & 0xFF);
+		*(UINT8 *)(rawData + 0) = *(UINT8 *)(rawData + 0) | ((Fult2_MainPosRelayWeldErr << 4) & 0xFF);
+		*(UINT8 *)(rawData + 0) = *(UINT8 *)(rawData + 0) | ((Fult2_MainNegRelayWeldErr << 5) & 0xFF);
+		*(UINT8 *)(rawData + 0) = *(UINT8 *)(rawData + 0) | ((Fult2_DCChgPos1RelayWeldErr << 6) & 0xFF);
+		*(UINT8 *)(rawData + 0) = *(UINT8 *)(rawData + 0) | ((Fult2_DCChgNeg1RelayWeldErr << 7) & 0xFF);
+		*(UINT8 *)(rawData + 1) = *(UINT8 *)(rawData + 1) | ((Fult2_DCChgPos2RelayWeldErr << 0) & 0xFF);
+		*(UINT8 *)(rawData + 1) = *(UINT8 *)(rawData + 1) | ((Fult2_DCChgNeg2RelayWeldErr << 1) & 0xFF);
+		*(UINT8 *)(rawData + 1) = *(UINT8 *)(rawData + 1) | ((HeatPosRelayWeldErr << 2) & 0xFF);
+		*(UINT8 *)(rawData + 1) = *(UINT8 *)(rawData + 1) | ((HeatNegRelayWeldErr << 3) & 0xFF);
+		*(UINT8 *)(rawData + 1) = *(UINT8 *)(rawData + 1) | ((MainPosRelaySt << 4) & 0xFF);
+		*(UINT8 *)(rawData + 1) = *(UINT8 *)(rawData + 1) | ((MainNegRelaySt << 6) & 0xFF);
+		*(UINT8 *)(rawData + 2) = *(UINT8 *)(rawData + 2) | ((PreChgRelaySt << 0) & 0xFF);
+		*(UINT8 *)(rawData + 2) = *(UINT8 *)(rawData + 2) | ((DCChrgPos1RelaySt << 2) & 0xFF);
+		*(UINT8 *)(rawData + 2) = *(UINT8 *)(rawData + 2) | ((DCChrgNeg1RelaySt << 4) & 0xFF);
+		*(UINT8 *)(rawData + 2) = *(UINT8 *)(rawData + 2) | ((DCChrgPos2RelaySt << 6) & 0xFF);
+		*(UINT8 *)(rawData + 3) = *(UINT8 *)(rawData + 3) | ((DCChrgNeg2RelaySt << 0) & 0xFF);
+		*(UINT8 *)(rawData + 3) = *(UINT8 *)(rawData + 3) | ((AuxRelayWeldErr << 2) & 0xFF);
+		*(UINT8 *)(rawData + 3) = *(UINT8 *)(rawData + 3) | ((Fult2_BranchBreakErr << 3) & 0xFF);
+		*(UINT8 *)(rawData + 3) = *(UINT8 *)(rawData + 3) | ((Fult2_OverChrgCurrInTheDrive << 4) & 0xFF);
+		*(UINT8 *)(rawData + 3) = *(UINT8 *)(rawData + 3) | ((Fult2_MainPosRelayOpenErr << 6) & 0xFF);
+		*(UINT8 *)(rawData + 3) = *(UINT8 *)(rawData + 3) | ((Fult2_MainNegRelayOpenErr << 7) & 0xFF);
+		*(UINT8 *)(rawData + 4) = *(UINT8 *)(rawData + 4) | ((Fult2_DCChgPos1RelayOpenErr << 0) & 0xFF);
+		*(UINT8 *)(rawData + 4) = *(UINT8 *)(rawData + 4) | ((Fult2_DCChgPos2RelayOpenErr << 1) & 0xFF);
+		*(UINT8 *)(rawData + 4) = *(UINT8 *)(rawData + 4) | ((Fult2_DCChgNeg1RelayOpenErr << 2) & 0xFF);
+		*(UINT8 *)(rawData + 4) = *(UINT8 *)(rawData + 4) | ((Fult2_DCChgNeg2RelayOpenErr << 3) & 0xFF);
+		*(UINT8 *)(rawData + 4) = *(UINT8 *)(rawData + 4) | ((Fult2_HeatRelayWeldErr << 4) & 0xFF);
+		*(UINT8 *)(rawData + 4) = *(UINT8 *)(rawData + 4) | ((Fult2_HeatRelayOpenErr << 5) & 0xFF);
+		*(UINT8 *)(rawData + 4) = *(UINT8 *)(rawData + 4) | ((Fult2_TMSErr << 6) & 0xFF);
+		*(UINT8 *)(rawData + 4) = *(UINT8 *)(rawData + 4) | ((Fult2_PowerSupplyErr << 7) & 0xFF);
+		*(UINT8 *)(rawData + 5) = *(UINT8 *)(rawData + 5) | ((Fult2_PackSelfProtect << 0) & 0xFF);
+		*(UINT8 *)(rawData + 5) = *(UINT8 *)(rawData + 5) | ((Fult2_ChrgNTCTempOver << 1) & 0xFF);
+		*(UINT8 *)(rawData + 6) = *(UINT8 *)(rawData + 6) | ((BattSysNum << 0) & 0xFF);
+		*(UINT8 *)(rawData + 7) = *(UINT8 *)(rawData + 7) | ((BatSysFaultCode << 0) & 0xFF);
+		break;
+	case 0x1881D0F3:
+		ST1_Life = ST1_Life + 1;
+		if (ST1_Life >= 15)
+		{
+			ST1_Life = 0;
+		}
+		if (BMS1_SysSts == 2)
+		{
+			BMS_SysSts = 1; //楂樺帇涓婄數
+		}
+		else
+		{
+			BMS_SysSts = 2; //楂樺帇涓嬬數
+		}
+		AssisRelaySts = 0x00; // bms涓嶅彂锛屽浐瀹氫负0
+		BlanceSts = BMS1_BalanceStatus;
+		if (BMS1_DCChrgConnectSt == 1 || BMS1_DCChrgConnectSt == 2)
+		{
+			DCChrgConnectSt = 1;
+		}
+		else
+		{
+			DCChrgConnectSt = 0;
+		}
+		ChrgMode = BMS1_ChrgMode;
+		ChrgStatus = BMS1_ChrgStatus;
+		FaultLevel = BMS2_FaultLevel;
+		Fult1_DelTemp = BMS11_Fult1_DelTemp;
+		Fult1_OverTemp = BMS11_Fult1_OverTemp;
+		Fult1_PackOverHVolt = BMS11_Fult1_PackOverHVolt;
+		Fult1_PackLowHVolt = BMS11_Fult1_PackLowHVolt;
+		Fult1_LowSOC = BMS11_Fult1_LowSOC;
+		Fult1_OverUcell = BMS11_Fult1_OverUcell;
+		Fult1_LowUcell = BMS11_Fult1_LowUcell;
+		Fult1_LowInsRes = BMS11_Fult1_LowInsRes;
+		Fult1_UcellUniformity = BMS11_Fult1_UcellUniformity;
+		Fult2_CellLowTemp = BMS12_Fult2_CellLowTemp;
+		Fult2_OverDischrgCurr = BMS12_Fult2_OverDischrgCurr;
+		Fult2_OverChrgCurrInTheChrg = BMS12_Fult2_OverChrgCurrInTheChrg;
+		Fult_BranchVolUniformity = 0; // BMS涓嶅彂锛屽畾涔夋棤鏁呴殰
+		Fult_BMSHardware = 0;		  // BMS涓嶅彂锛屽畾涔変负鏃犳晠闅�
+		Fult1_OverSOC = BMS11_Fult1_OverSOC;
+		Fult1_SOCChangeFast = BMS11_Fult1_SOCChangeFast;
+		Fult2_InnerCommunicationErr = BMS12_Fult2_InnerCommunicationErr;
+		Fult1_BatSysNotMatch = BMS11_Fult1_BatSysNotMatch;
+		Fult1_HVILFault = BMS11_Fult1_HVILFault;
+		Fult2_FireDetectorEr = BMS12_Fult2_FireDetectorEr;
+		Fult2_PackFireWarning = BMS12_Fult2_PackFireWarning;
+		Fult2_FaultNum = BMS12_Fult2_FaultNum;
+		*(UINT8 *)(rawData + 1) = *(UINT8 *)(rawData + 1) | ((ST1_Life << 0) & 0xFF);
+		*(UINT8 *)(rawData + 1) = *(UINT8 *)(rawData + 1) | ((BMS_SysSts << 4) & 0xFF);
+		*(UINT8 *)(rawData + 1) = *(UINT8 *)(rawData + 1) | ((AssisRelaySts << 6) & 0xFF);
+		*(UINT8 *)(rawData + 1) = *(UINT8 *)(rawData + 1) | ((BlanceSts << 7) & 0xFF);
+		*(UINT8 *)(rawData + 2) = *(UINT8 *)(rawData + 2) | ((DCChrgConnectSt << 0) & 0xFF);
+		*(UINT8 *)(rawData + 2) = *(UINT8 *)(rawData + 2) | ((ChrgMode << 1) & 0xFF);
+		*(UINT8 *)(rawData + 2) = *(UINT8 *)(rawData + 2) | ((ChrgStatus << 3) & 0xFF);
+		*(UINT8 *)(rawData + 2) = *(UINT8 *)(rawData + 2) | ((FaultLevel << 5) & 0xFF);
+		*(UINT8 *)(rawData + 3) = *(UINT8 *)(rawData + 3) | ((Fult1_DelTemp << 0) & 0xFF);
+		*(UINT8 *)(rawData + 3) = *(UINT8 *)(rawData + 3) | ((Fult1_OverTemp << 2) & 0xFF);
+		*(UINT8 *)(rawData + 3) = *(UINT8 *)(rawData + 3) | ((Fult1_PackOverHVolt << 4) & 0xFF);
+		*(UINT8 *)(rawData + 3) = *(UINT8 *)(rawData + 3) | ((Fult1_PackLowHVolt << 6) & 0xFF);
+		*(UINT8 *)(rawData + 4) = *(UINT8 *)(rawData + 4) | ((Fult1_LowSOC << 0) & 0xFF);
+		*(UINT8 *)(rawData + 4) = *(UINT8 *)(rawData + 4) | ((Fult1_OverUcell << 2) & 0xFF);
+		*(UINT8 *)(rawData + 4) = *(UINT8 *)(rawData + 4) | ((Fult1_LowUcell << 4) & 0xFF);
+		*(UINT8 *)(rawData + 4) = *(UINT8 *)(rawData + 4) | ((Fult1_LowInsRes << 6) & 0xFF);
+		*(UINT8 *)(rawData + 5) = *(UINT8 *)(rawData + 5) | ((Fult1_UcellUniformity << 0) & 0xFF);
+		*(UINT8 *)(rawData + 5) = *(UINT8 *)(rawData + 5) | ((Fult2_CellLowTemp << 2) & 0xFF);
+		*(UINT8 *)(rawData + 5) = *(UINT8 *)(rawData + 5) | ((Fult2_OverDischrgCurr << 4) & 0xFF);
+		*(UINT8 *)(rawData + 5) = *(UINT8 *)(rawData + 5) | ((Fult2_OverChrgCurrInTheChrg << 6) & 0xFF);
+		*(UINT8 *)(rawData + 6) = *(UINT8 *)(rawData + 6) | ((Fult_BranchVolUniformity << 0) & 0xFF);
+		*(UINT8 *)(rawData + 6) = *(UINT8 *)(rawData + 6) | ((Fult_BMSHardware << 2) & 0xFF);
+		*(UINT8 *)(rawData + 6) = *(UINT8 *)(rawData + 6) | ((Fult1_OverSOC << 4) & 0xFF);
+		*(UINT8 *)(rawData + 6) = *(UINT8 *)(rawData + 6) | ((Fult1_SOCChangeFast << 5) & 0xFF);
+		*(UINT8 *)(rawData + 6) = *(UINT8 *)(rawData + 6) | ((Fult2_InnerCommunicationErr << 6) & 0xFF);
+		*(UINT8 *)(rawData + 6) = *(UINT8 *)(rawData + 6) | ((Fult1_BatSysNotMatch << 7) & 0xFF);
+		*(UINT8 *)(rawData + 7) = *(UINT8 *)(rawData + 7) | ((Fult1_HVILFault << 0) & 0xFF);
+		*(UINT8 *)(rawData + 7) = *(UINT8 *)(rawData + 7) | ((Fult2_FireDetectorEr << 1) & 0xFF);
+		*(UINT8 *)(rawData + 7) = *(UINT8 *)(rawData + 7) | ((Fult2_PackFireWarning << 2) & 0xFF);
+		*(UINT8 *)(rawData + 7) = *(UINT8 *)(rawData + 7) | ((Fult2_FaultNum << 3) & 0xFF);
+		ST1_CheckSum = 0x00;
+		for (UINT8 i = 1; i < 8; i++)
+		{
+			ST1_CheckSum = ST1_CheckSum ^ (*(UINT8 *)(rawData + i));
+		}
+		*(UINT8 *)(rawData + 0) = *(UINT8 *)(rawData + 0) | ((ST1_CheckSum << 0) & 0xFF);
+		break;
+	case 0x1882D0F3:
+		SOC = BMS2_SOC;
+		SOH = BMS2_SOH;
+		PackCurrent = BMS2_PackCurrent;
+		InstChrgCurMaxAllw = BMS5_InstChrgCurMaxAllw;
+		InstDischrgCurMaxAllw = BMS5_InstDischrgCurMaxAllw;
+		*(UINT8 *)(rawData + 0) = *(UINT8 *)(rawData + 0) | ((SOC << 0) & 0xFF);
+		*(UINT8 *)(rawData + 1) = *(UINT8 *)(rawData + 1) | ((SOH << 0) & 0xFF);
+		*(UINT16 *)(rawData + 2) = *(UINT16 *)(rawData + 2) | ((PackCurrent << 0) & 0xFFFF);
+		*(UINT16 *)(rawData + 4) = *(UINT16 *)(rawData + 4) | ((InstChrgCurMaxAllw << 0) & 0xFFFF);
+		*(UINT16 *)(rawData + 6) = *(UINT16 *)(rawData + 6) | ((InstDischrgCurMaxAllw << 0) & 0xFFFF);
+		break;
+	case 0x1883D0F3:
+		PosIsolation = BMS4_PosIsolation;
+		NegIsolation = BMS4_NegIsolation;
+		PackInsideVolt = BMS2_PackInsideVolt;
+		PackOutsideVolt = 0xFFFF;
+		*(UINT16 *)(rawData + 0) = *(UINT16 *)(rawData + 0) | ((PosIsolation << 0) & 0xFFFF);
+		*(UINT16 *)(rawData + 2) = *(UINT16 *)(rawData + 2) | ((NegIsolation << 0) & 0xFFFF);
+		*(UINT16 *)(rawData + 4) = *(UINT16 *)(rawData + 4) | ((PackInsideVolt << 0) & 0xFFFF);
+		*(UINT16 *)(rawData + 6) = *(UINT16 *)(rawData + 6) | ((PackOutsideVolt << 0) & 0xFFFF);
+		break;
+	case 0x1884D0F3:
+		Max_Temp = (UINT8)(BMS8_Max_Temp + 10);
+		Min_Temp = (UINT8)(BMS8_Min_Temp + 10);
+		Avg_Temp = (UINT8)(BMS8_Avg_Temp + 10);
+		MaxTempSysNr = BMS8_MaxTempSysNr;
+		MaxTempNr = BMS8_MaxTempNr;
+		MinTempSysNr = BMS8_MinTempSysNr;
+		MinTempNr = BMS8_MinTempNr;
+		*(UINT8 *)(rawData + 0) = *(UINT8 *)(rawData + 0) | ((Max_Temp << 0) & 0xFF);
+		*(UINT8 *)(rawData + 1) = *(UINT8 *)(rawData + 1) | ((Min_Temp << 0) & 0xFF);
+		*(UINT8 *)(rawData + 2) = *(UINT8 *)(rawData + 2) | ((Avg_Temp << 0) & 0xFF);
+		*(UINT8 *)(rawData + 3) = *(UINT8 *)(rawData + 3) | ((MaxTempSysNr << 0) & 0xFF);
+		*(UINT8 *)(rawData + 4) = *(UINT8 *)(rawData + 4) | ((MaxTempNr << 0) & 0xFF);
+		*(UINT8 *)(rawData + 5) = *(UINT8 *)(rawData + 5) | ((MinTempSysNr << 0) & 0xFF);
+		*(UINT8 *)(rawData + 6) = *(UINT8 *)(rawData + 6) | ((MinTempNr << 0) & 0xFF);
+		break;
+	case 0x1885D0F3:
+		Max_Ucell = BMS6_Max_Ucell;
+		MaxUcellSysNr = BMS7_MaxUcellSysNr;
+		MaxUcellNr = BMS7_MaxUcellNr;
+		Avg_Ucell = BMS6_Avg_Ucell;
+		*(UINT16 *)(rawData + 0) = *(UINT16 *)(rawData + 0) | ((Max_Ucell << 0) & 0xFFFF);
+		*(UINT8 *)(rawData + 2) = *(UINT8 *)(rawData + 2) | ((MaxUcellSysNr << 0) & 0xFF);
+		*(UINT8 *)(rawData + 3) = *(UINT8 *)(rawData + 3) | ((MaxUcellNr << 0) & 0xFF);
+		*(UINT16 *)(rawData + 4) = *(UINT16 *)(rawData + 4) | ((Avg_Ucell << 0) & 0xFFFF);
+		break;
+	case 0x1886D0F3:
+		Min_Ucell = BMS6_Min_Ucell;
+		MinUcellSysNr = BMS7_MinUcellSysNr;
+		MinUcellNr = BMS7_MinUcellNr;
+		if (BMS5_ChrgCurMaxAllw < 10000)
+		{
+			ChrgCurMaxAllw = 10000 - BMS5_ChrgCurMaxAllw;
+		}
+		else
+		{
+			ChrgCurMaxAllw = 0;
+		}
+		*(UINT16 *)(rawData + 0) = *(UINT16 *)(rawData + 0) | ((Min_Ucell << 0) & 0xFFFF);
+		*(UINT8 *)(rawData + 2) = *(UINT8 *)(rawData + 2) | ((MinUcellSysNr << 0) & 0xFF);
+		*(UINT8 *)(rawData + 3) = *(UINT8 *)(rawData + 3) | ((MinUcellNr << 0) & 0xFF);
+		*(UINT16 *)(rawData + 4) = *(UINT16 *)(rawData + 4) | ((ChrgCurMaxAllw << 0) & 0xFFFF);
+		break;
+	case 0x1887D0F3:
+		Gun1DCNegTemp = BMS23_Gun1DCNegTemp;
+		Gun1DCPosTemp = BMS23_Gun1DCPosTemp;
+		Gun2DCNegTemp = BMS23_Gun2DCNegTemp;
+		Gun2DCPosTemp = BMS23_Gun2DCPosTemp;
+		if (BMS1_HeatPosRelaySt == 1)
+		{
+			HeatPosRelaySt = 0;
+		}
+		else if (BMS1_HeatPosRelaySt == 2)
+		{
+			HeatPosRelaySt = 1;
+		}
+		if (BMS1_HeatNegRelaySt == 1)
+		{
+			HeatNegRelaySt = 0;
+		}
+		else if (BMS1_HeatNegRelaySt == 2)
+		{
+			HeatNegRelaySt = 1;
+		}
+		*(UINT8 *)(rawData + 0) = *(UINT8 *)(rawData + 0) | ((Gun1DCNegTemp << 0) & 0xFF);
+		*(UINT8 *)(rawData + 1) = *(UINT8 *)(rawData + 1) | ((Gun1DCPosTemp << 0) & 0xFF);
+		*(UINT8 *)(rawData + 2) = *(UINT8 *)(rawData + 2) | ((Gun2DCNegTemp << 0) & 0xFF);
+		*(UINT8 *)(rawData + 3) = *(UINT8 *)(rawData + 3) | ((Gun2DCPosTemp << 0) & 0xFF);
+		*(UINT8 *)(rawData + 4) = *(UINT8 *)(rawData + 4) | ((HeatPosRelaySt << 0) & 0xFF);
+		*(UINT8 *)(rawData + 4) = *(UINT8 *)(rawData + 4) | ((HeatNegRelaySt << 2) & 0xFF);
+		break;
+	case 0x18C1D0F3:
+	{
+		UINT16 BMS_Cell_Volt_Buffer[3] = {0x00};
+		UcellCSCNum = 0x01; // 瀹氫箟涓�1
+		UcellFrameNum = UcellFrameNum + 1;
+		for (UINT8 i = 0; i < 3; i++)
+		{
+			if (((UcellFrameNum - 1) * 3 + i) < sizeof(BMS_Cell_Volt) / 2)
+			{
+				BMS_Cell_Volt_Buffer[i] = BMS_Cell_Volt[(UcellFrameNum - 1) * 3 + i];
+			}
+			else
+			{
+				UcellFrameNum = 0;
+				break;
+			}
+		}
+		*(UINT8 *)(rawData + 0) = *(UINT8 *)(rawData + 0) | ((UcellFrameNum << 0) & 0xFF);
+		*(UINT8 *)(rawData + 1) = *(UINT8 *)(rawData + 1) | ((UcellCSCNum << 0) & 0xFF);
+		*(UINT16 *)(rawData + 2) = *(UINT16 *)(rawData + 2) | ((BMS_Cell_Volt_Buffer[0] << 0) & 0xFFFF);
+		*(UINT16 *)(rawData + 4) = *(UINT16 *)(rawData + 4) | ((BMS_Cell_Volt_Buffer[1] << 0) & 0xFFFF);
+		*(UINT16 *)(rawData + 6) = *(UINT16 *)(rawData + 6) | ((BMS_Cell_Volt_Buffer[2] << 0) & 0xFFFF);
+		break;
+	}
+	case 0x18C2D0F3:
+	{
+		UINT8 BMS_Cell_TempN_Buffer[6] = {0x00};
+		TempCSCNum = 0x01; // 瀹氫箟涓�1
+		TempFrameNum = TempFrameNum + 1;
+		for (UINT8 i = 0; i < 6; i++)
+		{
+			if (((TempFrameNum - 1) * 6 + i) < sizeof(BMS_Cell_TempN))
+			{
+				BMS_Cell_TempN_Buffer[i] = BMS_Cell_TempN[(TempFrameNum - 1) * 3 + i] + 10;
+			}
+			else
+			{
+				TempFrameNum = 0;
+				break;
+			}
+		}
+		*(UINT8 *)(rawData + 0) = *(UINT8 *)(rawData + 0) | ((TempFrameNum << 0) & 0xFF);
+		*(UINT8 *)(rawData + 1) = *(UINT8 *)(rawData + 1) | ((TempCSCNum << 0) & 0xFF);
+		*(UINT8 *)(rawData + 2) = *(UINT8 *)(rawData + 2) | ((BMS_Cell_TempN_Buffer[0] << 0) & 0xFF);
+		*(UINT8 *)(rawData + 3) = *(UINT8 *)(rawData + 3) | ((BMS_Cell_TempN_Buffer[1] << 0) & 0xFF);
+		*(UINT8 *)(rawData + 4) = *(UINT8 *)(rawData + 4) | ((BMS_Cell_TempN_Buffer[2] << 0) & 0xFF);
+		*(UINT8 *)(rawData + 5) = *(UINT8 *)(rawData + 5) | ((BMS_Cell_TempN_Buffer[3] << 0) & 0xFF);
+		*(UINT8 *)(rawData + 6) = *(UINT8 *)(rawData + 6) | ((BMS_Cell_TempN_Buffer[4] << 0) & 0xFF);
+		*(UINT8 *)(rawData + 7) = *(UINT8 *)(rawData + 7) | ((BMS_Cell_TempN_Buffer[5] << 0) & 0xFF);
+		break;
+	}
+	case 0x18E1D0F3:
+	{
+		UINT8 Sys_chk = 0;
+		*(UINT8 *)(rawData + 1) = *(UINT8 *)(rawData + 1) | ((0x01 << 0) & 0xFF);
+		*(UINT8 *)(rawData + 2) = *(UINT8 *)(rawData + 2) | ((BMS_SN_SysCode[0] << 0) & 0xFF);
+		*(UINT8 *)(rawData + 3) = *(UINT8 *)(rawData + 3) | ((BMS_SN_SysCode[1] << 0) & 0xFF);
+		*(UINT8 *)(rawData + 4) = *(UINT8 *)(rawData + 4) | ((BMS_SN_SysCode[2] << 0) & 0xFF);
+		*(UINT8 *)(rawData + 5) = *(UINT8 *)(rawData + 5) | ((BMS_SN_SysCode[3] << 0) & 0xFF);
+		*(UINT8 *)(rawData + 6) = *(UINT8 *)(rawData + 6) | ((BMS_SN_SysCode[4] << 0) & 0xFF);
+		*(UINT8 *)(rawData + 7) = *(UINT8 *)(rawData + 7) | ((BMS_SN_SysCode[5] << 0) & 0xFF);
+		for (UINT8 i = 0; i < 7; i++)
+		{
+			Sys_chk = Sys_chk ^ (*(UINT8 *)(rawData + 1 + i));
+		}
+		*(UINT8 *)(rawData + 0) = *(UINT8 *)(rawData + 0) | ((Sys_chk << 0) & 0xFF);
+		break;
+	}
+	case 0x18E2D0F3:
+	{
+		UINT8 Sys_chk = 0;
+		*(UINT8 *)(rawData + 1) = *(UINT8 *)(rawData + 1) | ((BMS_SN_SysCode[6] << 0) & 0xFF);
+		*(UINT8 *)(rawData + 2) = *(UINT8 *)(rawData + 2) | ((BMS_SN_SysCode[7] << 0) & 0xFF);
+		*(UINT8 *)(rawData + 3) = *(UINT8 *)(rawData + 3) | ((BMS_SN_SysCode[8] << 0) & 0xFF);
+		*(UINT8 *)(rawData + 4) = *(UINT8 *)(rawData + 4) | ((BMS_SN_SysCode[9] << 0) & 0xFF);
+		*(UINT8 *)(rawData + 5) = *(UINT8 *)(rawData + 5) | ((BMS_SN_SysCode[10] << 0) & 0xFF);
+		*(UINT8 *)(rawData + 6) = *(UINT8 *)(rawData + 6) | ((BMS_SN_SysCode[11] << 0) & 0xFF);
+		*(UINT8 *)(rawData + 7) = *(UINT8 *)(rawData + 7) | ((BMS_SN_SysCode[12] << 0) & 0xFF);
+		for (UINT8 i = 0; i < 7; i++)
+		{
+			Sys_chk = Sys_chk ^ (*(UINT8 *)(rawData + 1 + i));
+		}
+		*(UINT8 *)(rawData + 0) = *(UINT8 *)(rawData + 0) | ((Sys_chk << 0) & 0xFF);
+		break;
+	}
+	case 0x18E3D0F3:
+	{
+		UINT8 Sys_chk = 0;
+		*(UINT8 *)(rawData + 1) = *(UINT8 *)(rawData + 1) | ((BMS_SN_SysCode[13] << 0) & 0xFF);
+		*(UINT8 *)(rawData + 2) = *(UINT8 *)(rawData + 2) | ((BMS_SN_SysCode[14] << 0) & 0xFF);
+		*(UINT8 *)(rawData + 3) = *(UINT8 *)(rawData + 3) | ((BMS_SN_SysCode[15] << 0) & 0xFF);
+		*(UINT8 *)(rawData + 4) = *(UINT8 *)(rawData + 4) | ((BMS_SN_SysCode[16] << 0) & 0xFF);
+		*(UINT8 *)(rawData + 5) = *(UINT8 *)(rawData + 5) | ((BMS_SN_SysCode[17] << 0) & 0xFF);
+		*(UINT8 *)(rawData + 6) = *(UINT8 *)(rawData + 6) | ((BMS_SN_SysCode[18] << 0) & 0xFF);
+		*(UINT8 *)(rawData + 7) = *(UINT8 *)(rawData + 7) | ((BMS_SN_SysCode[19] << 0) & 0xFF);
+		for (UINT8 i = 0; i < 7; i++)
+		{
+			Sys_chk = Sys_chk ^ (*(UINT8 *)(rawData + 1 + i));
+		}
+		*(UINT8 *)(rawData + 0) = *(UINT8 *)(rawData + 0) | ((Sys_chk << 0) & 0xFF);
+		break;
+	}
+	case 0x18E4D0F3:
+	{
+		UINT8 Sys_chk = 0;
+		*(UINT8 *)(rawData + 1) = *(UINT8 *)(rawData + 1) | ((BMS_SN_SysCode[20] << 0) & 0xFF);
+		*(UINT8 *)(rawData + 2) = *(UINT8 *)(rawData + 2) | ((BMS_SN_SysCode[21] << 0) & 0xFF);
+		*(UINT8 *)(rawData + 3) = *(UINT8 *)(rawData + 3) | ((BMS_SN_SysCode[22] << 0) & 0xFF);
+		*(UINT8 *)(rawData + 4) = *(UINT8 *)(rawData + 4) | ((BMS_SN_SysCode[23] << 0) & 0xFF);
+		*(UINT8 *)(rawData + 5) = *(UINT8 *)(rawData + 5) | ((0xFF << 0) & 0xFF);
+		*(UINT8 *)(rawData + 6) = *(UINT8 *)(rawData + 6) | ((0XFF << 0) & 0xFF);
+		*(UINT8 *)(rawData + 7) = *(UINT8 *)(rawData + 7) | ((0xFF << 0) & 0xFF);
+		for (UINT8 i = 0; i < 7; i++)
+		{
+			Sys_chk = Sys_chk ^ (*(UINT8 *)(rawData + 1 + i));
+		}
+		*(UINT8 *)(rawData + 0) = *(UINT8 *)(rawData + 0) | ((Sys_chk << 0) & 0xFF);
+		break;
+	}
+	case 0x18E5D0F3:
+		Pack_RateCap = BMS21_RateCap / 10;
+		Pack_RateHVolt = BMS21_RateHVolt;
+		Pack_RatePower = BMS21_RatePower;
+		BattType = BMS21_BattType;
+		CoolType = BMS21_CoolType;
+		*(UINT16 *)(rawData + 0) = *(UINT16 *)(rawData + 0) | ((Pack_RateCap << 0) & 0xFFFF);
+		*(UINT16 *)(rawData + 2) = *(UINT16 *)(rawData + 2) | ((Pack_RateHVolt << 0) & 0xFFFF);
+		*(UINT16 *)(rawData + 4) = *(UINT16 *)(rawData + 4) | ((Pack_RatePower << 0) & 0xFFFF);
+		*(UINT8 *)(rawData + 6) = *(UINT8 *)(rawData + 6) | ((BattType << 0) & 0xFF);
+		*(UINT8 *)(rawData + 6) = *(UINT8 *)(rawData + 6) | ((CoolType << 4) & 0xFF);
+		break;
+	case 0x18E6D0F3:
+		TotCSCNum = BMS9_TotCSCNum;
+		PackTotCellNum = BMS9_PackTotCellNum;
+		PackTotTempNum = BMS9_PackTotTempNum;
+		CellVoltPlat = 0xFF;   // BMS涓嶅彂锛屽畾涔変负鏃犳晥
+		MinAvlCellVolt = 0xFF; // BMS涓嶅彂锛屽畾涔変负鏃犳晥
+		MaxAvlCellVolt = 0xFF; // BMS涓嶅彂锛屽畾涔変负鏃犳晥
+		*(UINT8 *)(rawData + 0) = TotCSCNum;
+		*(UINT8 *)(rawData + 1) = PackTotCellNum;
+		*(UINT8 *)(rawData + 2) = PackTotCellNum>>8;
+		*(UINT8 *)(rawData + 3) = PackTotTempNum;
+		*(UINT8 *)(rawData + 4) = PackTotTempNum>>8;
+		*(UINT8 *)(rawData + 5) = CellVoltPlat;
+		*(UINT8 *)(rawData + 6) = MinAvlCellVolt;
+		*(UINT8 *)(rawData + 7) = MaxAvlCellVolt;
+		break;
+	case 0x18F1D0F3:
+		TotalChargeKwh = BMS15_TotalChargeKwh;
+		TotalDischargeKwh = BMS15_TotalDischargeKwh;
+		SingleChargeKwh = BMS19_SingleChargeKwh;
+		*(UINT8 *)(rawData + 0) = TotalChargeKwh;
+		*(UINT8 *)(rawData + 1) = TotalChargeKwh>>8;
+		*(UINT8 *)(rawData + 2) = TotalChargeKwh>>16;
+		*(UINT8 *)(rawData + 3) = TotalDischargeKwh;
+		*(UINT8 *)(rawData + 4) = TotalDischargeKwh>>8;
+		*(UINT8 *)(rawData + 5) = TotalDischargeKwh>>16;
+		*(UINT8 *)(rawData + 6) = SingleChargeKwh;
+		*(UINT8 *)(rawData + 7) = SingleChargeKwh>>8;
+		break;
+	case 0x18F2D0F3:
+		TotalEneryECOChargeKwh = BMS16_TotalEneryECOChargeKwh;
+		TotalStationChargeKwh = BMS17_TotalStationChargeKwh;
+		*(UINT8 *)(rawData + 0) = TotalEneryECOChargeKwh;
+		*(UINT8 *)(rawData + 1) = TotalEneryECOChargeKwh>>8;
+		*(UINT8 *)(rawData + 2) = TotalEneryECOChargeKwh>>16;
+		*(UINT8 *)(rawData + 3) = TotalStationChargeKwh;
+		*(UINT8 *)(rawData + 4) = TotalStationChargeKwh>>8;
+		*(UINT8 *)(rawData + 5) = TotalStationChargeKwh>>16;
+		*(UINT8 *)(rawData + 6) = 0xFF;
+		*(UINT8 *)(rawData + 7) = 0xFF;
+		break;
+	case 0x18F3D0F3:
+		TotalPoleChargeKwh = BMS18_TotalPoleChargeKwh;
+		*(UINT8 *)(rawData + 0) = BMS18_TotalPoleChargeKwh;
+		*(UINT8 *)(rawData + 1) = BMS18_TotalPoleChargeKwh>>8;
+		*(UINT8 *)(rawData + 2) = BMS18_TotalPoleChargeKwh>>16;
+		*(UINT8 *)(rawData + 3) = 0xFF;
+		*(UINT8 *)(rawData + 4) = 0xFF;
+		*(UINT8 *)(rawData + 5) = 0xFF;
+		*(UINT8 *)(rawData + 6) = 0xFF;
+		*(UINT8 *)(rawData + 7) = 0xFF;
+		break;
+	case 0x18FEF8A7:
+		EBC_DchgPos1Temp = ebcd_T_plugin[0];
+		EBC_DchgNeg1Temp = ebcd_T_plugin[1];
+		EBC_DchgPos2Temp = ebcd_T_plugin[2];
+		EBC_DchgNeg2Temp = ebcd_T_plugin[3];
+		EBC_ChgPos1Temp = 0xFF; //淇濈暀鍊硷紝瀹氫箟涓烘棤鏁�
+		EBC_ChgNeg1Temp = 0xFF; //淇濈暀鍊硷紝瀹氫箟涓烘棤鏁�
+		EBC_ChgPos2Temp = 0xFF; //淇濈暀鍊硷紝瀹氫箟涓烘棤鏁�
+		EBC_ChgNeg2Temp = 0xFF; //淇濈暀鍊硷紝瀹氫箟涓烘棤鏁�
+		*(UINT8 *)(rawData + 0) = *(UINT8 *)(rawData + 0) | ((EBC_DchgPos1Temp << 0) & 0xFF);
+		*(UINT8 *)(rawData + 1) = *(UINT8 *)(rawData + 1) | ((EBC_DchgNeg1Temp << 0) & 0xFF);
+		*(UINT8 *)(rawData + 2) = *(UINT8 *)(rawData + 2) | ((EBC_DchgPos2Temp << 0) & 0xFF);
+		*(UINT8 *)(rawData + 3) = *(UINT8 *)(rawData + 3) | ((EBC_DchgNeg2Temp << 0) & 0xFF);
+		*(UINT8 *)(rawData + 4) = *(UINT8 *)(rawData + 4) | ((EBC_ChgPos1Temp << 0) & 0xFF);
+		*(UINT8 *)(rawData + 5) = *(UINT8 *)(rawData + 5) | ((EBC_ChgNeg1Temp << 0) & 0xFF);
+		*(UINT8 *)(rawData + 6) = *(UINT8 *)(rawData + 6) | ((EBC_ChgPos2Temp << 0) & 0xFF);
+		*(UINT8 *)(rawData + 7) = *(UINT8 *)(rawData + 7) | ((EBC_ChgNeg2Temp << 0) & 0xFF);
+		break;
+	case 0x18FF45F4:
+		ReqMode = BMS28_ReqMode;
+		HVCmd = BMS28_HVCmd;
+		ChgSts = BMS1_ChrgStatus;
+		HVRelaySts = BMS28_HVRelaySts;
+		HVVolt = BMS28_HVVolt;
+		SetTemp = BMS28_SetTemp;
+		Bms_Life = BMS28_Life;
+		CRC = BMS28_CRC;
+		*(UINT8 *)(rawData + 0) = *(UINT8 *)(rawData + 0) | ((ReqMode << 0) & 0xFF);
+		*(UINT8 *)(rawData + 0) = *(UINT8 *)(rawData + 0) | ((HVCmd << 2) & 0xFF);
+		*(UINT8 *)(rawData + 0) = *(UINT8 *)(rawData + 0) | ((ChgSts << 4) & 0xFF);
+		*(UINT8 *)(rawData + 0) = *(UINT8 *)(rawData + 0) | ((HVRelaySts << 6) & 0xFF);
+		*(UINT8 *)(rawData + 2) = *(UINT8 *)(rawData + 2) | ((HVVolt >> 8) & 0xFF);
+		*(UINT8 *)(rawData + 3) = *(UINT8 *)(rawData + 3) | ((HVVolt << 0) & 0xFF);
+		*(UINT8 *)(rawData + 4) = *(UINT8 *)(rawData + 4) | ((SetTemp << 0) & 0xFF);
+		*(UINT8 *)(rawData + 6) = *(UINT8 *)(rawData + 6) | ((Bms_Life << 0) & 0xFF);
+		*(UINT8 *)(rawData + 7) = *(UINT8 *)(rawData + 7) | ((CRC << 0) & 0xFF);
+		break;
+	case 0x18FFC13A:
+		// TMS_WorkStatus = ;
+		// TMS_HVRelayST = ;
+		// TMS_OutletTemp = ;
+		// TMS_InletTemp = ;
+		// TMS_ReqPow = ;
+		// TMS_ErrCode = ;
+		// TMS_FaultLevel = ;
+		*(UINT8 *)(rawData + 0) = *(UINT8 *)(rawData + 0) | ((TMS_WorkStatus << 0) & 0xFF);
+		*(UINT8 *)(rawData + 0) = *(UINT8 *)(rawData + 0) | ((TMS_HVRelayST << 2) & 0xFF);
+		*(UINT8 *)(rawData + 1) = *(UINT8 *)(rawData + 1) | ((TMS_OutletTemp << 0) & 0xFF);
+		*(UINT8 *)(rawData + 2) = *(UINT8 *)(rawData + 2) | ((TMS_InletTemp << 0) & 0xFF);
+		*(UINT8 *)(rawData + 5) = *(UINT8 *)(rawData + 5) | ((TMS_ReqPow >> 8) & 0xFF);
+		*(UINT8 *)(rawData + 6) = *(UINT8 *)(rawData + 6) | ((TMS_ReqPow << 0) & 0xFF);
+		*(UINT8 *)(rawData + 7) = *(UINT8 *)(rawData + 7) | ((TMS_ErrCode << 0) & 0xFF);
+		*(UINT8 *)(rawData + 7) = *(UINT8 *)(rawData + 7) | ((TMS_FaultLevel << 6) & 0xFF);
+		break;
+	case 0x18FFF8A7:
+	{
+		static UINT8 Life = 0;
+		Life = Life + 1;
+		EBC_LockupSts = ebdc_st_lockUpState;
+		EBC_ConnectorSts = ebdc_st_ConnecState;
+		EBC_DischgConnectorSts = 2; // 淇濈暀淇″彿锛屽畾涔変负鏃犳晥
+		EBC_ChgConnectorSts = 2;	// 淇濈暀淇″彿锛屽畾涔変负鏃犳晥
+		EBC_FaultLevel = ebcd_Nr_errMax;
+		EBC_FaultCode = ebcd_Num_faultCode;
+		*(UINT8 *)(rawData + 0) = *(UINT8 *)(rawData + 0) | ((Life << 0) & 0xFF);
+		*(UINT8 *)(rawData + 1) = *(UINT8 *)(rawData + 1) | ((EBC_LockupSts << 0) & 0xFF);
+		*(UINT8 *)(rawData + 1) = *(UINT8 *)(rawData + 1) | ((EBC_ConnectorSts << 2) & 0xFF);
+		*(UINT8 *)(rawData + 1) = *(UINT8 *)(rawData + 1) | ((EBC_DischgConnectorSts << 4) & 0xFF);
+		*(UINT8 *)(rawData + 1) = *(UINT8 *)(rawData + 1) | ((EBC_ChgConnectorSts << 6) & 0xFF);
+		*(UINT8 *)(rawData + 3) = *(UINT8 *)(rawData + 3) | ((EBC_FaultLevel << 0) & 0xFF);
+		*(UINT8 *)(rawData + 4) = *(UINT8 *)(rawData + 4) | ((EBC_FaultCode << 0) & 0xFF);
+		break;
+	}
+	default:
+		break;
+	}
+}

+ 14 - 0
System/Vehicle/Communication/VcuCanProtocolFunc.h

@@ -0,0 +1,14 @@
+/*
+ * @Author       : ChenJie
+ * @Date         : 2021-12-24 15:26:57
+ * @Version      : V3.0
+ * @LastEditors  : ChenJie
+ * @LastEditTime : 2021-12-27 16:11:49
+ * @Description  : file content
+ * @FilePath     : \VehicleControl\VehicleControl\src\System\Vehicle\Communication\VcuCanProtocolFunc.h
+ */
+#include "CanVar.h"
+void VcuDecodeFunction(UINT32 ID, UINT8 *rawData);
+void VcuRxDiagnose(void);
+void VcuRxMsgSetInvalidValue(UINT32 ID);
+void VcuEncodeFunction(UINT32 ID, UINT8 *rawData);

+ 82 - 180
System/Vehicle/VehCo.c

@@ -1,267 +1,169 @@
+/*
+ * @Author       : ChenJie
+ * @Date         : 2021-11-25 15:36:06
+ * @Version      : V3.0
+ * @LastEditors  : ChenJie
+ * @LastEditTime : 2021-12-15 11:53:14
+ * @Description  : file content
+ * @FilePath     : \VehicleControl\VehicleControl\src\System\Vehicle\VehCo.c
+ */
 /********************************************************************************
-* 常州易控汽车电子股份有限公司
-* (c) Copyright 2009-2015 ECTEK
-* 保留所有权利
-********************************************************************************
-* 工程名称:整车管理
-* 文件名: VehCo.c
-* 功能描述 : 整车管理协调
-* 引用记录:
-* 备注: 
-* 修订记录:
-*		日期		      版本		  作者		描述
-*   2011.07.14          00.01.00      李中     第一版
-*******************************************************************************/
+ * 常州易控汽车电子股份有限公司
+ * (c) Copyright 2009-2015 ECTEK
+ * 保留所有权利
+ ********************************************************************************
+ * 工程名称:整车管理
+ * 文件名: VehCo.c
+ * 功能描述 : 整车管理协调
+ * 引用记录:
+ * 备注:
+ * 修订记录:
+ *		日期		      版本		  作者		描述
+ *   2011.07.14          00.01.00      李中     第一版
+ *******************************************************************************/
 
 #include "VehCo.h"
 #include "HardwareLib.h"
 #include "CANNet.h"
 #include "AccPedCD.h"
 
-
 #define APPLAYERVER_START_SEC_VAR
 #include "MemMap.h"
 
-    const uint8 AppLayer_idxVerUBA[64]="P156V101"; //应用层软件版本信息,可通过UDS接口读取
+const uint8 AppLayer_idxVerUBA[64] = "P156V101"; //应用层软件版本信息,可通过UDS接口读取
 
 #define APPLAYERVER_STOP_SEC_VAR
 #include "MemMap.h"
 
-
 /*********************************************************************************************/
 /*示例代码*/
 #ifdef _SAMPLE_CODE_
-
-    uint32 VehCo_fTestUI;
-    uint16 VehCo_rTestUW;
-
-    uint32 VehCo_fInputUIA[2];
-    uint16 VehCo_rInputUWA[2];
-
-    uint16 VehCo_uADChanUWA[_ATD_NUM_CHAN];
-    uint8 VehCo_bDINChanUBA[_DIN_NUM_CHAN];
-
-    float32 VehCo_uBattF;
-
-    uint16 VehCo_uAccPedUW;
-
-    uint32 PressureValue = 0;
-    uint16 Distence1 = 0;
-    uint16 Distence2 = 0;
-    uint8	Switch1 = 0;
-    uint8	Switch2 = 0;
-    uint8	ControlState = 0;
-
-    #define EEPDATA_START_SEC_VAR
-    #include "MemMap.h"
-        uint32 VehCo_ctEEPTestUB=0;
-        uint32 VehCo_ctEEPTestUI=0; //在定义时给EEPROM里的变量赋初值
-        uint32 Control_Times = 0;
-    #define EEPDATA_STOP_SEC_VAR
-    #include "MemMap.h"
-
-#endif  //_SAMPLE_CODE_
-/*********************************************************************************************/
-
+#endif //_SAMPLE_CODE_
+       /*********************************************************************************************/
 
 /*************************************************************/
 /*标定数据区开始(请不要在该区域加入非标定数据相关的内容)                                                                                 */
 
-    #define MAPDATA_START_SEC_VAR_CONST
-    #include "MemMap.h"
-
-    /*VehCo*/
-    PRAGMA_MAPDATA const uint16 VehCo_bTestCANWuFinUW_C=0; /*测试模式下控制CAN唤醒状态结束*/
-    PRAGMA_MAPDATA const uint16 VehCo_bTestCPCtrlUW_C=0; /*CP下拉阻值选择测试操作*/
+#define MAPDATA_START_SEC_VAR_CONST
+#include "MemMap.h"
 
-    #define MAPDATA_STOP_SEC_VAR_CONST
-    #include "MemMap.h"
+/*VehCo*/
+PRAGMA_MAPDATA const uint16 VehCo_bTestCANWuFinUW_C = 0; /*测试模式下控制CAN唤醒状态结束*/
+PRAGMA_MAPDATA const uint16 VehCo_bTestCPCtrlUW_C = 0;   /*CP下拉阻值选择测试操作*/
+#define MAPDATA_STOP_SEC_VAR_CONST
+#include "MemMap.h"
 
 /*标定数据区结束                                                                                                                                                                               */
 /*************************************************************/
-#define _BOOTLOADER_EMBEDDED
-#ifdef _BOOTLOADER_EMBEDDED
-uint32 VehCo_pBootloaderUIP;
-#pragma section ".bootloader_entry" ax
-	void Bootloader_Entry(void);
-#pragma section
-#endif
-
-
-
-
 
 #define _BOOTLOADER_EMBEDDED
 #ifdef _BOOTLOADER_EMBEDDED
 uint32 VehCo_pBootloaderUIP;
 #pragma section ".bootloader_entry" ax
-    void Bootloader_Entry(void);
+void Bootloader_Entry(void);
 #pragma section
 #endif
 
-
 //整车管理初始化
 void VehCo_Init(void)
 {
-
 #ifdef _BOOTLOADER_EMBEDDED
-	VehCo_pBootloaderUIP = (uint32)Bootloader_Entry;
+    VehCo_pBootloaderUIP = (uint32)Bootloader_Entry;
 #endif
 
-    #ifdef _BOOTLOADER_EMBEDDED
-        VehCo_pBootloaderUIP = (uint32)Bootloader_Entry;
-    #endif
-
-    /*********************************************************************************************/
-    /*示例代码*/
-    #ifdef _SAMPLE_CODE_
-
-        VehCo_fTestUI = 0;
-        VehCo_rTestUW = 0;
-
-        AccPedCD_Init();
-
-        VehCo_uAccPedUW=0;
-
-    #endif  //_SAMPLE_CODE_
-    /*********************************************************************************************/
+/*********************************************************************************************/
+/*示例代码*/
+#ifdef _SAMPLE_CODE_
+    AccPedCD_Init();
+    //VehCo_uAccPedUW = 0;
+#endif //_SAMPLE_CODE_
+       /*********************************************************************************************/
 
-	CANNet_Init();
+    CANNet_Init();
 
     /*打开强电主继电器*/
-    PSwtDrv_Interface(_PSWT_INDEX_MAINRELAY_CHAN,1);
+    PSwtDrv_Interface(_PSWT_INDEX_MAINRELAY_CHAN, 1);
+    //打开蓝牙电源
+    PSwtDrv_Interface(_PSWT_INDEX_BLEPWRCONTROL, 1);
 }
 
 //整车管理10ms基准运行任务
 void VehCo_Manage10ms(void)
 {
-	/*********************************************************************************************/
-    /*样例代码*/
-    #ifdef _SAMPLE_CODE_
+/*********************************************************************************************/
+/*样例代码*/
+#ifdef _SAMPLE_CODE_
 
-	    VehCo_Ctrl();
+    VehCo_Ctrl();
+    VcuRxDiagnose();
+    BcuRxDiagnose();
 
-    #endif  //_SAMPLE_CODE_
+#endif //_SAMPLE_CODE_
     /*********************************************************************************************/
 }
 
 //整车管理1ms基准运行任务
 void VehCo_Manage1ms(void)
 {
-    CANNet_Manage1ms();
+    CAN0Net_Manage1ms();
+    CAN1Net_Manage1ms();
+    CAN2Net_Manage1ms();
 }
 
 //停机准备状态操作,10ms运行一次
 uint8 VehCo_Afterrun(void)
 {
-    uint8 stRetUB=0;
+    uint8 stRetUB = 0;
 
-    if(HardwareDrv_bBootloaderReqUB == 1)
+    if (HardwareDrv_bBootloaderReqUB == 1)
     {
         //进入Bootloader烧写状态准备,将系统置于安全状态
-        //if(xxx==1)
         {
-            stRetUB=1;
+            stRetUB = 1;
         }
     }
     else
     {
-        //进入停机关电准备
+//进入停机关电准备
 
-        /*********************************************************************************************/
-        /*样例代码*/
-        #ifdef _SAMPLE_CODE_
-
-            VehCo_Ctrl();
+/*样例代码*/
+#ifdef _SAMPLE_CODE_
 
-        #endif  //_SAMPLE_CODE_
-        /*********************************************************************************************/
+        VehCo_Ctrl();
 
-        //if(xxx==1)
+#endif //_SAMPLE_CODE_
         {
-            stRetUB=1;
+            stRetUB = 1;
         }
     }
-	
     return stRetUB;
 }
 
-
 /*********************************************************************************************/
 /*样例代码*/
 #ifdef _SAMPLE_CODE_
 
-    void VehCo_Ctrl(void)
+void VehCo_Ctrl(void)
+{
+    /*在CAN唤醒的情况下,由上层算法决定CAN唤醒过程结束*/
+    if (BattCD_stWakeupU.B.bCAN == 1)
     {
-        uint8 ManuEnable=0;
-
-        //控制算法
-        VehCo_uBattF=(float32)BattCD_uFltUW/100.0F;
-
-        AccPedCD_Update();
-        AccPedCD_Monitor();
-
-        VehCo_fTestUI = 5000;
-        VehCo_rTestUW = (VehCo_rTestUW+10)%_PWM_DUTYCYCLE_FULL;
-        PPWMDrv_Interface(_PPWM_INDEX_FBAK1_CHAN, VehCo_fTestUI, VehCo_rTestUW);
-        //PPWMDrv_Interface(_PPWM_INDEX_FHBAK1_CHAN, VehCo_fTestUI, VehCo_rTestUW);
-
-        PulseAcqDrv_GetChanFreq(_PULSEACQ_INDEX_CP_CHAN, &VehCo_fInputUIA[0], &VehCo_rInputUWA[0]);
-        PulseAcqDrv_GetChanFreq(_PULSEACQ_INDEX_BAK2_CHAN, &VehCo_fInputUIA[1], &VehCo_rInputUWA[1]);
-
-        DODrv_SetChanState(_DO_INDEX_CPCTL_CHAN,(uint8)VehCo_bTestCPCtrlUW_C);
-
-        /*在CAN唤醒的情况下,由上层算法决定CAN唤醒过程结束*/
-        if(BattCD_stWakeupU.B.bCAN == 1)
+        if (VehCo_bTestCANWuFinUW_C == 1)
         {
-            if(VehCo_bTestCANWuFinUW_C==1)
-            {
-                BattCD_stWakeupU.B.bCAN = 0;
-            }
+            BattCD_stWakeupU.B.bCAN = 0;
         }
-
-        uint16 DistenceBufferV[2]={0,0},DistenceBufferR[2]={0,0},PressureValueBuffer = 0;
-        //开关1采集
-        DINDrv_SetChanThres(_DIN_INDEX_BAK1_CHAN,1,4095U);
-        Switch1=!DINDrv_GetChanState(_DIN_INDEX_BAK1_CHAN);
-        //手动控制采集
-        DINDrv_SetChanThres(_DIN_INDEX_BAK2_CHAN,1,4095U);
-        ManuEnable=!DINDrv_GetChanState(_DIN_INDEX_BAK2_CHAN);
-        //位移量采集
-        DistenceBufferV[0] = ATDDrv_GetChanResult(_ATD_INDEX_BAK3_CHAN);
-        DistenceBufferR[0] = (uint16)((DistenceBufferV[0]/(5.0*4095-DistenceBufferV[0]))*1000.0);
-        Distence1 = (uint16)((2132-DistenceBufferR[0])*(0.1219));
-        //压力采集
-        PressureValueBuffer = ATDDrv_GetChanResult(_ATD_INDEX_ACCPED1_CHAN);
-        PressureValue = (uint16)(PressureValueBuffer*1000/4095.0);
-        //控制输出
-        VehCo_ctEEPTestUI+=10;
-        VehCo_ctEEPTestUB+=10;
-		if(VehCo_ctEEPTestUI>=5*1000)
-		{
-			PSwtDrv_Interface(_PSWT_INDEX_HBAK1_CHAN,1);//输出
-			ControlState = 1;//解锁
-		}
-		else
-		{
-			PSwtDrv_Interface(_PSWT_INDEX_HBAK1_CHAN,0);//不输出
-			ControlState = 2;//锁定
-		}
-		if(VehCo_ctEEPTestUI>=10*1000*2)
-		{
-			Control_Times++;
-			VehCo_ctEEPTestUI = 0;
-		}
-		if(ManuEnable==0)
-		{
-			Control_Times=0;
-			VehCo_ctEEPTestUI = 0;
-		}
     }
+#ifdef _APP_TEST_CODE
+    TestDeviceFun();
+    VehCo_uBattF = (float32)BattCD_uFltUW / 100.0F;
+#endif
+#ifdef _APP_RELEASE_CODE
+    /*正式程序开始*/
 
-#endif  //_SAMPLE_CODE_
+    GetHVLockState();
+    GetDIOState();
+    GetAIOValue();
+#endif
+}
+#endif //_SAMPLE_CODE_
 /*********************************************************************************************/
-
-
-
-

+ 21 - 21
System/Vehicle/VehCo.h

@@ -3,30 +3,31 @@
  * @Date         : 2021-11-24 14:01:24
  * @Version      : V3.0
  * @LastEditors  : ChenJie
- * @LastEditTime : 2021-11-25 16:01:09
+ * @LastEditTime : 2021-12-15 11:53:13
  * @Description  : file content
  * @FilePath     : \VehicleControl\VehicleControl\src\System\Vehicle\VehCo.h
  */
 /********************************************************************************
-* 常州易控汽车电子股份有限公司
-* (c) Copyright 2009-2015 ECTEK
-* 保留所有权利
-********************************************************************************
-* 工程名称:整车管理
-* 文件名: VehCo.h
-* 功能描述 : 整车管理协调头文件
-* 引用记录:
-* 备注: 
-* 修订记录:
-*		日期		      版本		  作者		描述
-*   2011.07.14          00.01.00      李中     第一版                                           
-*******************************************************************************/
+ * 常州易控汽车电子股份有限公司
+ * (c) Copyright 2009-2015 ECTEK
+ * 保留所有权利
+ ********************************************************************************
+ * 工程名称:整车管理
+ * 文件名: VehCo.h
+ * 功能描述 : 整车管理协调头文件
+ * 引用记录:
+ * 备注:
+ * 修订记录:
+ *		日期		      版本		  作者		描述
+ *   2011.07.14          00.01.00      李中     第一版
+ *******************************************************************************/
 
 #ifndef __VEHCO_H
 #define __VEHCO_H
-
 #include "Std_Types.h"
-
+#include <AppFunc.h>
+#include "VcuCanProtocolFunc.h"
+#include "BcuCanProtocolFunc.h"
 /********************************************************/
 /*上层与底层的调度接口*/
 //系统初始化
@@ -36,7 +37,7 @@ void VehCo_Init(void);
 void VehCo_Manage10ms(void);
 void VehCo_Manage1ms(void);
 
-//Afterrun关电处理,返回0表示处理未完成,返回1表示处理完成
+// Afterrun关电处理,返回0表示处理未完成,返回1表示处理完成
 uint8 VehCo_Afterrun(void);
 /********************************************************/
 
@@ -51,15 +52,14 @@ extern const uint8 AppLayer_idxVerUBA[64]; //应
 /*********************************************************************************************/
 /*样例代码*/
 #ifdef _SAMPLE_CODE_
-
+/*app定义*********************************************************************************************/
+extern uint32 Control_Times;
+/*********************************************************************************************/
 void VehCo_Ctrl(void);
-
 #define EEPDATA_START_SEC_VAR
 #include "MemMap.h"
-
 extern uint32 VehCo_ctEEPTestUI; //在定义时给EEPROM里的变量赋初值
 extern uint32 VehCo_ctEEPTestUI;
-extern uint32 Control_Times;
 #define EEPDATA_STOP_SEC_VAR
 #include "MemMap.h"