Browse Source

【3.0.0.26】1.更改Bcu参数和逻辑

CHENJIE-PC\QiXiang_CHENJIE 3 năm trước cách đây
mục cha
commit
f1a1ada3c3

+ 1 - 0
ARMCC/Makefile

@@ -32,6 +32,7 @@ obj-y             += PLAT/project/$(TARGET)/apps/qx_app/src/app.o \
 						PLAT/project/$(TARGET)/apps/qx_app/src/EmbeddedCoder_src/SOH.o \
 						PLAT/project/$(TARGET)/apps/qx_app/src/EmbeddedCoder_src/SOC.o \
 						PLAT/project/$(TARGET)/apps/qx_app/src/EmbeddedCoder_src/BLC.o \
+						PLAT/project/$(TARGET)/apps/qx_app/src/EmbeddedCoder_src/CM.o \
 						PLAT/project/$(TARGET)/apps/qx_app/src/EmbeddedCoder_src/look1_is16lu16n16tu16_binlcase.o \
 						PLAT/project/$(TARGET)/apps/qx_app/src/EmbeddedCoder_src/look1_iu16lu16n16tu16_binlcase.o \
 						PLAT/project/$(TARGET)/apps/qx_app/src/EmbeddedCoder_src/BCUCal.o \

+ 2 - 2
inc/AppConfig.h

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

+ 2 - 0
inc/BCU.h

@@ -2,6 +2,8 @@
 #include "AppSignal.h"
 #include "SFM.h"
 #include "SPM.h"
+#include "CM.h"
+#include "TMS.h"
 #include "BCUCal.h"
 #include "BCUDisp.h"
 #define PROC_BCU_TASK_STACK_SIZE           (2048)

+ 4 - 0
inc/EmbeddedCoder_inc/BCUCal.h

@@ -93,6 +93,10 @@ extern const uint16_T socm_V_disChrgCor[3]; /* 放电CCV对应的电压; */
 extern const uint16_T socc_pct_chrgCor;
 extern const uint16_T socc_pct_disChrgCor;
 
+extern const int16_T cmm_T_ChrgCurr[3];
+extern const int16_T cmm_V_ChrgCurr[6];
+extern const int16_T cmm_I_ChrgCurr[3][6];
+
 extern const uint16_T tmsc_T_openThr;                         /* 热管理开启温度; */
 extern const uint16_T tmsc_T_closeMinThr;                     /* 热管理关闭温度(最低模组); */
 extern const uint16_T tmsc_T_closeMaxThr;                     /* 热管理开启温度(最高模组); */

+ 11 - 0
inc/EmbeddedCoder_inc/CM.h

@@ -0,0 +1,11 @@
+#include "rtwtypes.h"
+#include "BCUCal.h"
+#include "BCUDisp.h"
+#include "numeric.h"
+
+extern boolean_T FirstRun_CM;
+extern void CM_Init(void);
+extern void CM(void);
+
+//extern boolean_T JudgeTimeSystem(boolean_T Enable,boolean_T Input, uint8_T *N,uint8_T Thr);
+extern int16_T lookupChrgCurr(int16_T X,int16_T Y,uint16_T xN,uint16_T yN);

+ 2 - 2
inc/EmbeddedCoder_inc/SOH.h

@@ -3,5 +3,5 @@
 extern boolean_T FirstRun_SOH;
 extern void SOH_Init(void);
 extern void SOH(void);
-extern void  ArrMax(uint16_T *Data,uint16_T *Max, uint16_T m);
-extern void  ArrMin(uint16_T *Data,uint16_T *Min, uint16_T m);
+extern uint16_T  ArrMax(uint16_T *Data, uint16_T m);
+extern uint16_T  ArrMin(uint16_T *Data, uint16_T m);

+ 6 - 0
inc/EmbeddedCoder_inc/SPM.h

@@ -1,6 +1,12 @@
 #include "rtwtypes.h"
 #include "BCUCal.h"
 #include "BCUDisp.h"
+#include "SOH.h"
+#include "SOC.h"
+#include "BLC.h"
+
+
+
 extern boolean_T FirstRun_SPM;
 
 extern void SPM_Init(void);

+ 3 - 0
src/EmbeddedCoder_src/BCUCal.c

@@ -94,6 +94,9 @@ const uint16_T socm_V_chrgCor[3] = {4160U, 4175U, 4188U};    /* 充电CCV对应
 const uint16_T socm_V_disChrgCor[3] = {3303U, 3359U, 3368U}; /* 放电CCV对应的电压; */
 const uint16_T socc_pct_chrgCor = 980;
 const uint16_T socc_pct_disChrgCor = 50;
+const int16_T cmm_T_ChrgCurr[3] = {40,60,80};
+const int16_T cmm_V_ChrgCurr[6] = {3200,3201,3900,3901,4100,4101};
+const int16_T cmm_I_ChrgCurr[3][6] = {{0,100,100,100,100,50},{50,400,400,200,200,100},{40,300,300,150,150,80}};
 
 const uint16_T tmsc_T_openThr = 45U;     /* 热管理开启温度; */
 const uint16_T tmsc_T_closeMinThr = 50U; /* 热管理关闭温度(最低模组); */

+ 2 - 2
src/EmbeddedCoder_src/BLC.c

@@ -48,7 +48,7 @@ void BLC(void)
     
     if(FirstRun_BLC)
     {
-        ArrMax(&blcv_Q_reqCpEi[0],&MaxCp, cmnc_num_cellUNum);
+        MaxCp = ArrMax(&blcv_Q_reqCpEi[0], cmnc_num_cellUNum);
         if(MaxCp > cmnc_Q_ratedCp * 100)
         {
             memset(blcn_Q_reqCpEE,0, sizeof(blcn_Q_reqCpEE));
@@ -166,7 +166,7 @@ void BLC(void)
             blcv_flg_excute[i] = false ;
         }
 
-		blcn_Q_impleCp[i] = (uint16_T) (temp[i] /36000 * 1000);
+		blcn_Q_impleCp[i] = (uint16_T) (temp[i] /3600 * 1000);
         blcv_Q_reqCpEo[i] = ( (int16_T)(blcn_Q_reqCpNow[i] - blcn_Q_impleCp[i]) < 0 ? 0 :blcn_Q_reqCpNow[i] - blcn_Q_impleCp[i]);
         blcv_Q_totalCpEo[i] = (uint32_T) (blcn_Q_totalCpEE[i] + blcn_Q_impleCp[i]);  
     }

+ 232 - 0
src/EmbeddedCoder_src/CM.c

@@ -0,0 +1,232 @@
+#include "CM.h"
+
+boolean_T FirstRun_CM;
+void CM_Init(void)
+{
+    FirstRun_CM = true;
+}
+
+void CM(void)
+{
+    static uint16_T cmn_V_cellUMax;
+    static uint16_T cmn_V_cellUMin;
+    static uint16_T chrgFulCnt;
+    static boolean_T cmn_flg_chrgFul;
+    static uint16_T chrgCnt;
+    static uint16_T noChrgCnt;
+    int16_T cmd_I_chrgCurrReq1 = 0;
+    int16_T cmd_I_chrgCurrReq2 = 0;
+    int16_T cmd_I_chrgCurrReq3 = 0;
+    int16_T cmd_I_chrgCurrReq4 = 0;
+	static boolean_T First;
+    static uint8_T cmd_st_chrgSt_end;
+	static boolean_T chrgFul;
+    if(FirstRun_CM)
+    {
+        cmn_V_cellUMax = 0;
+        cmn_V_cellUMin = 0;
+        chrgFulCnt = 0;
+        chrgCnt = 0;
+        noChrgCnt = 0;
+        cmn_flg_chrgFul = false;
+		cmd_st_chrgSt = 0;
+		chrgFul = 0;
+    }
+    //=====================================================================
+    //============================充电模式=================================
+    //=====================================================================
+    if(ihd_st_chrgConnect > 0)
+    {
+        cmd_st_chrgMod = 1;
+    }
+    else
+    {
+        cmd_st_chrgMod = 0;
+    }
+	
+    //=====================================================================
+    //============================充电需求电流=============================
+    //=====================================================================
+    if (cmd_st_chrgMod)
+    {
+        if(sfmd_V_cellUMin > cmn_V_cellUMin)
+        {
+            cmn_V_cellUMin = sfmd_V_cellUMin;
+        }
+        if(sfmd_V_cellUMax > cmn_V_cellUMax)
+        {
+            cmn_V_cellUMax = sfmd_V_cellUMax;
+        }
+        cmd_I_chrgCurrReq1 = lookupChrgCurr((int16_T)sfmd_T_modTMin,(int16_T)cmn_V_cellUMin,3,6);
+        cmd_I_chrgCurrReq2 = lookupChrgCurr((int16_T)sfmd_T_modTMax,(int16_T)cmn_V_cellUMin,3,6);
+        cmd_I_chrgCurrReq3 = lookupChrgCurr((int16_T)sfmd_T_modTMin,(int16_T)cmn_V_cellUMax,3,6);
+        cmd_I_chrgCurrReq4 = lookupChrgCurr((int16_T)sfmd_T_modTMax,(int16_T)cmn_V_cellUMax,3,6);
+		cmd_I_chrgCurrReq =  min( min(cmd_I_chrgCurrReq1, cmd_I_chrgCurrReq2),min(cmd_I_chrgCurrReq3,cmd_I_chrgCurrReq4));
+    }
+    else
+    {
+        cmd_I_chrgCurrReq = 0;
+    }
+	
+    //=====================================================================
+    //============================充电状态=================================
+    //=====================================================================
+    if (cmd_st_chrgMod > 0)
+    {
+        noChrgCnt = 0; 
+        if (sfmd_I_curr > 1)
+        {
+            cmd_st_chrgSt = 1;
+        } 
+		if(JudgeTimeSystem(1,sfmd_V_cellUMax >= cmnc_V_chrgFul ,&chrgFulCnt ,20))
+		{
+		   chrgFul = true;
+           cmn_flg_chrgFul = true;
+		} 
+        if(cmn_flg_chrgFul)
+        {
+            cmd_st_chrgSt = 2;
+            cmd_I_chrgCurrReq = 0;
+        }
+
+		//
+        if (cmd_st_chrgSt != 2 && JudgeTimeSystem(1,sfmd_I_curr < 1 ,&chrgCnt ,100) )
+        {
+            cmd_st_chrgSt = 3;
+            cmd_I_chrgCurrReq = 0;
+        }
+		//
+        if((sfmd_st_fltAct >> 6) & 0x01)
+        {
+            cmd_st_chrgSt = 3;
+            cmd_I_chrgCurrReq = 0; 
+        }
+
+
+
+
+		
+		cmd_st_chrgSt_end = cmd_st_chrgSt;
+    }
+    else
+    {   
+        cmn_flg_chrgFul = false;
+        chrgCnt = 0;
+        noChrgCnt ++;
+        if(cmd_st_chrgSt_end == 1  && noChrgCnt <= 100 )
+        {
+            cmd_st_chrgSt = 3;
+        }
+        else
+        {
+            cmd_st_chrgSt = 0;
+        }
+    }
+	
+    // ===================================================================
+    // =================故障结束原因========================================
+    // ===================================================================
+    if(cmd_st_chrgSt == 3 )
+    {
+        if (ihd_st_chrgConnect == 0 && First)
+        {
+            cmd_idx_chrgEndReason = 1 ; // 用户主动停止
+        }
+        if((sfmd_st_fltAct >> 6) & 0x01 && First)
+        {
+            cmd_idx_chrgEndReason = 2 ; // 因电池故障限制充电;
+        }
+
+
+		
+        First = false;
+    }
+    else
+    {
+        First = true ;
+        cmd_idx_chrgEndReason = 0;
+    }
+
+    FirstRun_CM = false;
+	//printf("fltAct:%d,chrgMod:%d,chrgSt:%d,chrgCurrReq:%d,chrgEndReason:%d\n\n",sfmd_st_fltAct,cmd_st_chrgMod,cmd_st_chrgSt,cmd_I_chrgCurrReq,cmd_idx_chrgEndReason);
+}
+
+
+//==============================================================================================================================
+//==============================================================================================================================
+int16_T lookupChrgCurr(int16_T X,int16_T Y,uint16_T cmm_T_ChrgCurrN,uint16_T cmm_V_ChrgCurrN)
+{
+    int16_T Z;
+    int16_T temp1;
+    int16_T temp2;
+    uint16_T i;
+    uint16_T j;
+	
+    //===================================
+    if (X <= cmm_T_ChrgCurr[0])
+    {
+        if(Y <= cmm_V_ChrgCurr[0])
+        {
+            Z = cmm_I_ChrgCurr[0][0];
+        }
+        for(j = 0;j < cmm_V_ChrgCurrN - 1;j++)
+        {
+            if (Y > cmm_V_ChrgCurr[j] && Y <= cmm_V_ChrgCurr[j+1])
+            {
+                Z = (int16_T) (     (int32_T)(Y - cmm_V_ChrgCurr[i]) * (cmm_I_ChrgCurr[0][j+1] -cmm_I_ChrgCurr[0][j]) /(cmm_V_ChrgCurr[j+1] - cmm_V_ChrgCurr[j])     ) + cmm_I_ChrgCurr[0][j];
+            }
+        }
+        if(Y > cmm_V_ChrgCurr[cmm_V_ChrgCurrN-1])
+        {
+            Z = cmm_I_ChrgCurr[0][cmm_V_ChrgCurrN-1];
+        }
+    }
+    //======================================================================
+    for (i = 0; i < cmm_T_ChrgCurrN - 1;i++ )
+    {
+        if (X > cmm_T_ChrgCurr[i] && X <= cmm_T_ChrgCurr[i+1])
+        {
+            if(Y <= cmm_V_ChrgCurr[0])
+            {
+                Z = (int16_T) ((int32_T)(X - cmm_T_ChrgCurr[i]) * (cmm_I_ChrgCurr[i+1][0] -cmm_I_ChrgCurr[i][0])/(cmm_T_ChrgCurr[i+1] - cmm_T_ChrgCurr[i])) + cmm_I_ChrgCurr[i][0]  ;
+            }
+            for(j = 0;j < cmm_V_ChrgCurrN - 1;j++)
+            { 
+                if (Y > cmm_V_ChrgCurr[j] && Y <= cmm_V_ChrgCurr[j+1])
+                {
+                    temp1 = (int16_T) ( (int32_T)(  (X - cmm_T_ChrgCurr[i]) * (cmm_I_ChrgCurr[i+1][j] - cmm_I_ChrgCurr[i][j])  )/(cmm_T_ChrgCurr[i+1] - cmm_T_ChrgCurr[i])) + cmm_I_ChrgCurr[i][j];
+                    temp2 = (int16_T) ( (int32_T)( (X - cmm_T_ChrgCurr[i]) * (cmm_I_ChrgCurr[i+1][j+1] - cmm_I_ChrgCurr[i][j+1]) )/(cmm_T_ChrgCurr[i+1] - cmm_T_ChrgCurr[i])) + cmm_I_ChrgCurr[i][j+1];
+                    Z =  (int16_T) ( (int32_T)( (Y - cmm_V_ChrgCurr[j]) * (temp2 -temp1)  )/(cmm_V_ChrgCurr[j+1] - cmm_V_ChrgCurr[j])) + temp1 ;
+		
+                    //break;
+                }
+            }
+            if(Y > cmm_V_ChrgCurr[cmm_V_ChrgCurrN-1])
+            {
+                Z = (int16_T) (  (int32_T)( (X - cmm_T_ChrgCurr[i]) * (cmm_I_ChrgCurr[i+1][cmm_V_ChrgCurrN-1] -cmm_I_ChrgCurr[i][cmm_V_ChrgCurrN-1])  )/(cmm_T_ChrgCurr[i+1] - cmm_T_ChrgCurr[i]))+ cmm_I_ChrgCurr[i][cmm_V_ChrgCurrN-1];
+            }
+           // break;
+        }
+    }
+    //=====================================================================
+    if (X > cmm_T_ChrgCurr[cmm_T_ChrgCurrN-1])
+    {
+        if(Y <= cmm_V_ChrgCurr[0])
+        {
+            Z = cmm_I_ChrgCurr[cmm_T_ChrgCurrN-1][0];
+        }
+        for(j = 0;j < cmm_V_ChrgCurrN - 1;j++)
+        {
+            if (Y > cmm_V_ChrgCurr[j] && Y <= cmm_V_ChrgCurr[j+1])
+            {
+                Z = (int16_T) (  (int32_T)( (Y - cmm_V_ChrgCurr[i]) * (cmm_I_ChrgCurr[cmm_T_ChrgCurrN-1][j+1] -cmm_I_ChrgCurr[cmm_T_ChrgCurrN-1][j]) )/(cmm_V_ChrgCurr[j+1] - cmm_V_ChrgCurr[j])) + cmm_I_ChrgCurr[cmm_T_ChrgCurrN-1][j];
+               //  break;
+            }
+        }
+        if(Y > cmm_V_ChrgCurr[cmm_V_ChrgCurrN-1])
+        {
+            Z = cmm_I_ChrgCurr[cmm_T_ChrgCurrN-1][cmm_V_ChrgCurrN-1];
+        }
+    }  
+	return Z;
+}

+ 22 - 25
src/EmbeddedCoder_src/SOC.c

@@ -199,9 +199,9 @@ void SOC(void)
     P_Min_Delay[3] = -K[1] * H[0] * P1[2] + P1[3] * (1 - K[1]);
 
     //输出
-    EKFSOCMin = (uint16_T)(soc_Min_Delay * 10);
-    socn_flg_ekfInvalidMin = (deltU > 0.005) || (deltU < -0.005);
-    //printf("2----socmin:%f,Up:%f,U1:%d,sfmd_V_cellUMin:%d,deltU:%f,flg:%d,soc1:%f,K[0]:%f,K[1]:%f\n",soc_Min_Delay,Up_Min_Delay,ihv_V_cellU[0],sfmd_V_cellUMin,deltU,socn_flg_ekfInvalidMin,soc1,K[0],K[1]);
+    EKFSOCMin = (uint16_T) (soc_Min_Delay * 10);
+    socn_flg_ekfInvalidMin= (deltU > 0.01)||(deltU < -0.01);
+	//printf("2----socmin:%f,Up:%f,U1:%d,sfmd_V_cellUMin:%d,deltU:%f,flg:%d,soc1:%f,K[0]:%f,K[1]:%f\n",soc_Min_Delay,Up_Min_Delay,ihv_V_cellU[0],sfmd_V_cellUMin,deltU,socn_flg_ekfInvalidMin,soc1,K[0],K[1]);
     //------------------------EKFSOCmax-----------------------------------
     if (FirstRun_SOC)
     {
@@ -264,7 +264,7 @@ void SOC(void)
     P_Max_Delay[3] = -K[1] * H[0] * P1[2] + P1[3] * (1 - K[1]);
     //输出
     EKFSOCMax = (uint16_T)(soc_Max_Delay * 10);
-    socn_flg_ekfInvalidMax = (deltU > 0.005) || (deltU < -0.005);
+    socn_flg_ekfInvalidMax = (deltU > 0.01) || (deltU < -0.01);
     //printf("3----socmax:%f,Up:%f,sfmd_V_cellUMax:%d,deltU:%f,flg:%d\n",soc_Max_Delay,Up_Max_Delay,sfmd_V_cellUMax,deltU,socn_flg_ekfInvalidMax);
     //-----------------------EKFSOC----------------------------------------
     socn_flg_ekfInvalid = socn_flg_ekfInvalidMax || socn_flg_ekfInvalidMin;
@@ -378,7 +378,7 @@ void SOC(void)
         {
             fulCntl = 0;
         }
-        if (fulCntl > 2 || fulFlg)
+        if((fulCntl > 2) || fulFlg)
         {
             fulFlg = 1;
         }
@@ -489,8 +489,9 @@ void SOC(void)
         statCntl = 0;
     }
     statFlg = statCntl > 2;
-
-    Flg = (FirstRun_SOC || (ihd_st_chrgSta_Delay == 2 && ihd_st_workStat != 2) || (ihd_st_chrgSta_Delay != 2 && ihd_st_workStat == 2) || ((int16_T)(socn_pct_utrackSoc - socn_pct_utrackSoc_Delay) > 20 || (int16_T)(socn_pct_utrackSoc - socn_pct_utrackSoc_Delay) < -20) || statFlg);
+	
+    Flg= (FirstRun_SOC || (ihd_st_chrgSta_Delay == 2 && ihd_st_workStat != 2) || (ihd_st_chrgSta_Delay!= 2 && ihd_st_workStat == 2)
+    || ((int16_T)(socn_pct_utrackSoc -socn_pct_utrackSoc_Delay) > 20 || (int16_T)(socn_pct_utrackSoc -socn_pct_utrackSoc_Delay) <- 20 ) || statFlg);
 
     ihd_st_chrgSta_Delay = ihd_st_workStat;
     socn_pct_utrackSoc_Delay = socn_pct_utrackSoc;
@@ -579,17 +580,13 @@ void SOC(void)
 
 //-------------------------------------------------------------------------
 real_T docvmath(real_T soc)
-{
+{   
     real_T docv;
     docv = ((((((-1.0936E-13 * pow(soc, 7.0) +
-                 3.9249E-11 * pow(soc, 6.0)) +
-                -5.5776E-9 * pow(soc, 5.0)) +
-               3.996E-7 * pow(soc, 4.0)) +
-              -1.5332E-5 * pow(soc, 3.0)) +
-             soc * soc * 0.0003192) +
-            -0.00371 * soc) +
-           0.02732;
-    return docv;
+    3.9249E-11 * pow(soc, 6.0)) + -5.5776E-9 * pow(soc, 5.0)) +
+    3.996E-7 * pow(soc, 4.0)) + -1.5332E-5 * pow(soc, 3.0)) + soc
+    * soc * 0.0003192) + -0.00371 * soc) + 0.02732;
+	return docv;
 }
 ////
 uint16_T SOC_LookUp(uint16_T battsoc, uint16_T x[3], uint16_T y[3])
@@ -599,27 +596,27 @@ uint16_T SOC_LookUp(uint16_T battsoc, uint16_T x[3], uint16_T y[3])
     {
         bcusoc = y[0];
     }
-    //
+	//
     if (battsoc >= x[2])
     {
         bcusoc = y[2];
     }
-    //
-    if (battsoc > x[0] && battsoc < x[1]) //(x-x0)*(y1-y0)/(x1-x0)+y0
+	//
+    if (battsoc > x[0] && battsoc < x[1])   //(x-x0)*(y1-y0)/(x1-x0)+y0
     {
 
-        bcusoc = (uint16_T)((real_T)((battsoc - x[0]) * 0.1) * (real_T)((y[1] - y[0]) * 0.1) / (real_T)((x[1] - x[0]) * 0.1) * 10) + y[0];
-    }
-    //
+	   bcusoc =   (uint16_T) ((real_T)((battsoc - x[0]) * 0.1) * (real_T)((y[1] - y[0]) * 0.1) /(real_T)((x[1] - x[0]) * 0.1) * 10)+ y[0];
+	}
+	//
     if (battsoc >= x[1] && battsoc < x[2]) //(x-x1)*(y2-y1)/(x2-x1)+y1
     {
-        bcusoc = (uint16_T)((real_T)((battsoc - x[1]) * 0.1) * (real_T)((y[2] - y[1]) * 0.1) / (real_T)((x[2] - x[1]) * 0.1) * 10) + y[1];
+       bcusoc =   (uint16_T) ((real_T)((battsoc - x[1]) * 0.1) * (real_T)((y[2] - y[1]) * 0.1) /(real_T)((x[2] - x[1]) * 0.1) * 10)+ y[1];
     }
-    return bcusoc;
+	return bcusoc;
 }
 //-------------------------------------------------------------------------
 
-uint16_T SOCfitSystem(uint16_T SOC, uint16_T *SOCfit, uint16_T m)
+uint16_T SOCfitSystem(uint16_T SOC,uint16_T *SOCfit, uint16_T m)
 {
     int16_T socdelt;
     socdelt = (int16_T)(SOC - *SOCfit);

+ 23 - 18
src/EmbeddedCoder_src/SOH.c

@@ -64,10 +64,10 @@ void SOH(void)
         //=======================================================================================
         //--------------------------EE校验-------------------------------------------------------
         //=======================================================================================
-        ArrMin((&(sohv_Q_cellCapArrEi[0])), &cellCapArr_Min , cmnc_num_cellUNum);
-        ArrMax((&(sohv_Q_cellCapArrEi[0])), &cellCapArr_Max , cmnc_num_cellUNum);
-        ArrMin((&(sohv_Q_packCapArrEi[0])), &packCapArr_Min , 10);
-        ArrMax((&(sohv_Q_packCapArrEi[0])), &packCapArr_Max , 10);
+        cellCapArr_Min = ArrMin((&(sohv_Q_cellCapArrEi[0])) , cmnc_num_cellUNum);
+        cellCapArr_Max = ArrMax((&(sohv_Q_cellCapArrEi[0])) , cmnc_num_cellUNum);
+        packCapArr_Min = ArrMin((&(sohv_Q_packCapArrEi[0])) , 10);
+        packCapArr_Max = ArrMax((&(sohv_Q_packCapArrEi[0])) , 10);
         if(sohd_Q_chrgEi > cmnc_Q_ratedCp || cellCapArr_Min < 10 || cellCapArr_Max > cmnc_Q_ratedCp + 100 || packCapArr_Min < 10 || packCapArr_Max > cmnc_Q_ratedCp + 100 )
         {
             memset(sohn_V_chrgStartStatEE, 0 , sizeof(sohn_V_chrgStartStatEE));
@@ -134,8 +134,8 @@ void SOH(void)
                      chrgCellCapArr[i] =    (uint16_T)( (real_T)(sohv_Q_cellCapArrEo[i] * 0.1)*(1 - temp[i]) * 10);
                      disChrgCellCapArr[i] = (uint16_T)( (real_T)(sohv_Q_cellCapArrEo[i] * 0.1)*(    temp[i]) * 10);
  				} 
-                 ArrMin((&(chrgCellCapArr[0])), &chrgCap_Min , cmnc_num_cellUNum);
-                 ArrMin((&(disChrgCellCapArr[0])), &disChrgCap_Min , cmnc_num_cellUNum);
+                 chrgCap_Min = ArrMin((&(chrgCellCapArr[0])) , cmnc_num_cellUNum);
+                 disChrgCap_Min = ArrMin((&(disChrgCellCapArr[0])) , cmnc_num_cellUNum);
                  for(i = 0; i < 9;i++)
                  {
                      sohv_Q_packCapArrEo[i] = sohn_Q_packCapArrEE[i+1];
@@ -155,10 +155,10 @@ void SOH(void)
          }
  
  
-         SumQ=0;
+         SumQ = 0;
          for(i = 0; i < 10;i++)
          {
-             SumQ =SumQ + sohv_Q_packCapArrEo[i];
+             SumQ = SumQ + sohv_Q_packCapArrEo[i];
          }
          sohd_pct_bcuSoh = (uint16_T)(((real_T)(SumQ  * 0.1)/10.0/ (real_T)(cmnc_Q_ratedCp * 0.1) * 100) * 10);  
          sohd_pct_bcuSoh = (sohd_pct_bcuSoh > 1000 ? 1000 : sohd_pct_bcuSoh);
@@ -172,7 +172,7 @@ void SOH(void)
      	memcpy(sohn_V_chrgStartStat,appv_V_cellU, sizeof(appv_V_cellU));
      }
      
-     if(sfmd_I_curr < 10 && sfmd_I_curr > -10)
+     if(sfmd_I_curr < 10 && sfmd_I_curr > -10 && !sfmd_flg_cellUDisable)
      {
          memcpy(sohn_V_chrgStartStat,sfmv_V_cellU, sizeof(sfmv_V_cellU));
      }
@@ -188,7 +188,7 @@ void SOH(void)
     if(ihd_st_workStat == 2)
     {
         Ahincr = Ahincr + (real_T)sfmd_I_curr * 0.1;
-        tmp_0 = (int16_T)(Ahincr/36000 * 10);
+        tmp_0 = (int16_T)(Ahincr/3600 * 10);
 		
         sohd_Q_chrgEo = tmp_0 > 0 ? (uint16_T)tmp_0 : 0;  
         if(sfmd_flg_currDisable)
@@ -224,29 +224,34 @@ void SOH(void)
 
 
 ////////////////////////////////////////////////////////////////
-void  ArrMax(uint16_T *Data,uint16_T *Max, uint16_T m)
+uint16_T  ArrMax(uint16_T *Data, uint16_T m)
 {
     uint16_T i;
-    *Max = Data[0];
+	uint16_T DataMax;
+    DataMax = Data[0];
     for(i = 0; i < m; i++)
     {
-        if (*Max < Data[i])
+        if (DataMax < Data[i])
         {
-            *Max = Data[i];
+            DataMax = Data[i];
         }
     }
+	return DataMax;
 }
 
 ///////////////////////////////////////////////////////////////////
-void  ArrMin(uint16_T *Data,uint16_T *Min, uint16_T m)
+uint16_T  ArrMin(uint16_T *Data, uint16_T m)
 {
     uint16_T i;
-    *Min = Data[0];
+	uint16_T DataMin;
+    DataMin = Data[0];
     for(i = 0; i < m; i++)
     {
-        if (*Min > Data[i])
+        if (DataMin > Data[i])
         {
-            *Min = Data[i];
+            DataMin = Data[i];
         }
     }
+	return DataMin;
 }
+

+ 2 - 12
src/EmbeddedCoder_src/SPM.c

@@ -16,8 +16,6 @@ void SPM(void)
 {
 
   static uint16_T spmd_Nr_cellNr;
-  	static uint16_T t1 = 0;
-	static uint16_T t2 = 0;
   uint8_T Feq = 10;
   if (FirstRun_SPM)
   {
@@ -38,19 +36,11 @@ void SPM(void)
     cand_Nr_cellNr = 1;
   }
 
-  
   SOH();
   BLC();
-  if (!ihd_flg_urtRecFlt)
+  if (!ihd_flg_urtRecFlt || sfmd_V_cellUMax == 0)
   {
-
-    t1 ++;
-    if(t1>=10)
-   {
-    SOC();
-	t1=0;
-    }
-	
+      SOC();
   }