瀏覽代碼

【V3.0.0.10】 1.故障诊断统一放置并判定,2.租期锁加入,3.BCU参数分类存放,4.电池锁定增加强制锁定状态,5.蜂鸣器控制函数更改,6.CAN升级BMS控制加入,7.算法修改,8.初值修改

CHENJIE-PC\QiXiang_CHENJIE 3 年之前
父節點
當前提交
93dd0ff1b3
共有 48 個文件被更改,包括 2460 次插入7945 次删除
  1. 20 6
      inc/AppConfig.h
  2. 11 1
      inc/AppFunc.h
  3. 9 0
      inc/AppSignal.h
  4. 1 1
      inc/AppTaskUart.h
  5. 3 3
      inc/BCU.h
  6. 16 26
      inc/EmbeddedCoder_inc/BCU.h
  7. 1 0
      inc/EmbeddedCoder_inc/BCUCal.h
  8. 5 4
      inc/EmbeddedCoder_inc/BCUDisp.h
  9. 1 133
      inc/EmbeddedCoder_inc/BLC.h
  10. 0 89
      inc/EmbeddedCoder_inc/BLC_private.h
  11. 0 30
      inc/EmbeddedCoder_inc/BLC_types.h
  12. 241 0
      inc/EmbeddedCoder_inc/RTE_Device.h
  13. 7 237
      inc/EmbeddedCoder_inc/SOC.h
  14. 0 90
      inc/EmbeddedCoder_inc/SOC_private.h
  15. 0 30
      inc/EmbeddedCoder_inc/SOC_types.h
  16. 3 169
      inc/EmbeddedCoder_inc/SOH.h
  17. 0 89
      inc/EmbeddedCoder_inc/SOH_private.h
  18. 0 30
      inc/EmbeddedCoder_inc/SOH_types.h
  19. 1 89
      inc/EmbeddedCoder_inc/SPM.h
  20. 0 90
      inc/EmbeddedCoder_inc/SPM_private.h
  21. 0 30
      inc/EmbeddedCoder_inc/SPM_types.h
  22. 24 0
      inc/EmbeddedCoder_inc/div_repeat_s32_floor.h
  23. 23 0
      inc/EmbeddedCoder_inc/div_s32_floor.h
  24. 23 0
      inc/EmbeddedCoder_inc/mul_s32_loSR.h
  25. 23 0
      inc/EmbeddedCoder_inc/mul_s32_sr32_ceil.h
  26. 606 224
      src/AppFunc.c
  27. 11 9
      src/AppSignal.c
  28. 4 0
      src/AppTaskCan.c
  29. 37 9
      src/AppTaskControl.c
  30. 26 6
      src/AppTaskMain.c
  31. 34 7
      src/AppTaskTcp.c
  32. 2 6
      src/AppTaskUart.c
  33. 101 170
      src/BCU.c
  34. 0 281
      src/EmbeddedCoder_src/BCU1.c
  35. 5 6
      src/EmbeddedCoder_src/BCUCal.c
  36. 15 15
      src/EmbeddedCoder_src/BCUDisp.c
  37. 156 418
      src/EmbeddedCoder_src/BLC.c
  38. 1 1
      src/EmbeddedCoder_src/SFM.c
  39. 0 2162
      src/EmbeddedCoder_src/SFM1.c
  40. 636 1983
      src/EmbeddedCoder_src/SOC.c
  41. 233 754
      src/EmbeddedCoder_src/SOH.c
  42. 0 599
      src/EmbeddedCoder_src/SOH1.c
  43. 29 147
      src/EmbeddedCoder_src/SPM.c
  44. 47 0
      src/EmbeddedCoder_src/div_repeat_s32_floor.c
  45. 50 0
      src/EmbeddedCoder_src/div_s32_floor.c
  46. 28 0
      src/EmbeddedCoder_src/mul_s32_loSR.c
  47. 27 0
      src/EmbeddedCoder_src/mul_s32_sr32_ceil.c
  48. 0 1
      src/hal_module_adapter.c

+ 20 - 6
inc/AppConfig.h

@@ -11,9 +11,9 @@
 #define BMS_MANUFACTURE             (2)                 //BMS制造商表示1-超力源,2-美顺
 #define BMS_INFO                    (1)                 //1-1表示超力源4830,1-2表示超力源6060,2-1表示美顺6455
 #define DATA_MODULE_TYPE            (1)                 //1表示NB模块,2表示4G cat1
-#define EOLSTATE                    (1)                 //1表示下线检测跳过,使用默认值,0表示使用下线检测
+#define EOLSTATE                    (0)                 //1表示下线检测跳过,使用默认值,0表示使用下线检测
 #define DEFAULT_SN                  "RLTEST00000000002" //默认上传的SN编码
-#define	APPSWVERSION		        0x03000009          //数据模块软件版本号
+#define	APPSWVERSION		        0x0300000A          //数据模块软件版本号
 
 #define TCP_ADD                     "iotp.fast-fun.cn"  //数据上传的地址
 #define TCP_PORT					8712                //数据上传的端口
@@ -25,6 +25,7 @@
 
 #define APP_CONFIG_FILE_NAME                "qxappconfig.nvm"
 #define APP_DATAINFO_FILE_NAME              "qxappDataInfo3.nvm"
+#define BCU_DATAINFO_FILE_NAME              "qxBcuDataInfo.nvm"
 #define BATT_SN_LEN                17
 #define BMS_OTHER_TEMP              2
 #define WORK_TIME               5
@@ -63,12 +64,11 @@
 #define FLASH_BMS_FOTA_LEN                0x32000           //BMS升级文件存储长度 = =200k
 #define FLASH_BMS_FOTA_END_ADDR           0x318000          //BMS升级文件存储结束地址
 //declear struct vars   结构体变量定义
-
 typedef struct _AppConfigDataType
 {	
     BOOL   appDataModify;		//数据更改标志位
 	UINT8  battSN[BATT_SN_LEN]; //电池SN号码
-   	BOOL   isBattLocked;		//0:not locked;	1:locked
+   	BOOL   isBattLocked;		//0:not locked;	1:locked  //暂时取消没有使用
     UINT8  chargEndWorkTime;     //
     UINT8  BattTempCount;       //电池温度个数
     UINT8  BattCellCount;       //电池电压串数
@@ -98,8 +98,18 @@ typedef struct _AppDataType
     UINT32 AccMileage;                  //累计里程,单位m
     UINT16 SysReStartCount;             //系统重启次数
     UINT8  RelayControl;                //继电器控制
+    UINT8  BattForceLock;               //电池强制锁定状态
     UINT8  BattLock;                    //电池锁定状态
     UINT8  BattStolenFlag;              //电池被盗状态
+    UINT8  UserLock;                    // 用户锁锁定
+    UINT8  RentalLock;                  //租期锁锁定
+    UINT8  RentalType;                  //租期类型
+    UINT8  ExpiryTimeArray[6];          //超期时间
+    UINT8  ErrorMsg;
+}AppDataBody;
+typedef struct _AppAlgorithmType
+{
+    BOOL   appDataModify;		        //数据更改标志位
     UINT32 blcv_Q_totalCpE[28];         //累计均衡容量 读取量 数组最大28
     UINT16 blcv_Q_reqCpE[28];           //均衡需求容量 读取量 数组最大28
     UINT16 socd_pct_bcuSocE;            //电池显示SOC 读取量;
@@ -110,13 +120,17 @@ typedef struct _AppDataType
     UINT16 sohd_Q_chrgE;                //充入容量读取量;
     UINT16 sohv_Q_packCapArrE[10];     //10次整包容量(数组)读取量;
     UINT16 sohv_Q_cellCapArrE[28];     //  
-}AppDataBody;
+}AppAlgorithmData;
 typedef struct _AppDataHeader
 {
     UINT16 fileBodySize; //file body size, not include size of header;
     UINT8  checkSum;
 }AppDataHeader;
-
+typedef struct _BCUDataHeader
+{
+    UINT16 fileBodySize; //file body size, not include size of header;
+    UINT8  checkSum;
+}BcuDataHeader;
 typedef struct AppSocketConnectionContext_Tag
 {
     INT32 id;

+ 11 - 1
inc/AppFunc.h

@@ -25,6 +25,9 @@ typedef struct _Fota_Type
     UINT8   Fota_CRC ;
 
 }Fota_Type;
+void ExpiryTimeCal(UINT8 *StartTimeArray,UINT16 rentalDays,UINT8 *ExpiryTimeArray);
+INT8 rentalEndDetectFunc(void);
+void BattLockFunc(void);
 void BattWorkDelayFunc(UINT8 battWorkCurrentState);
 UINT8 bcc_chk(UINT8* data, UINT16 length);
 void LEDDisplay(void);
@@ -36,14 +39,17 @@ UINT8 LookUpRTtable(UINT32 R_value);
 BOOL BattHeaterSwitch(UINT8* heaterSwitch,UINT8 HeatForceControl);
 void SaveAppData(void);
 void LoadAppData(void);
+void SaveBcuData(void);
+void LoadBcuData(void);
 void SaveAppConfig(void);
 void LoadAppConfig(void);
 static void setDefaultAppConfigData(void);
 static void setDefaultAppDataInfo(void);
+static void setDefaultBcuDataInfo(void);
 void CanMsgTx1000ms(void);
 void UDS_Service(CAN_Msg_Type* CanRxMsg);
 void CANEncodeFunction(UINT32 ID,UINT8* msgData);
-void relayControlFunc(UINT8 RingTimes,float DutyRatio);
+void relayControlFunc(float DutyRatio);
 BOOL UDSClearFotaDownloadRegion();
 BOOL UDSAskforDownLoadData();
 UINT8 UDSNegtiveAnswer(UINT8 answerLen,UINT8 messageIndex, UINT32 negCode);
@@ -54,3 +60,7 @@ UINT16  encryptionAlgorithm (UINT16 plainText);
 void Fota_Func(UINT8 *DataPtr,INT32 connectId);
 static UINT8 bcc_chk_fota(UINT8* data, UINT8 length);
 static UINT8 Fota_crc_chk(UINT8* data,UINT8 length);
+
+
+void PutErrorBufferArray(UINT16 *ErrorBufferArray,UINT16 ErrorTemp);
+void FaultDetectFunc(UINT16 *ErrorBufferArray);

+ 9 - 0
inc/AppSignal.h

@@ -21,6 +21,7 @@ extern UINT32 ErrFlg;
 extern BOOL downloadReady;
 
 //extern declear the UINT8 vars
+extern UINT8    AvgBattTemp;
 extern UINT8	battCellTemp[8];
 extern UINT8	MOSTemp;
 extern UINT8	packTemp;
@@ -57,6 +58,7 @@ extern UINT8 	UDSSwitch;
 extern UINT8 	UDSSwitch ;
 extern UINT8 	PosFlag ;     
 extern UINT8    UartRecvFlag ;
+extern UINT8   UartErrorFlag ;
 extern UINT8    UartCmdRecvFlag;
 extern UINT8	UDSService[2];           //uds 服务
 extern UINT8	UDSSubService[2];       // uds 子服务
@@ -85,6 +87,7 @@ extern UINT32	battProtectState;
 extern UINT32	nbSwVersion ;
 extern UINT32	battBalanceoInfo;
 extern UINT32   Battdesigncap;
+extern UINT32  PowerVoltage;
 extern volatile UINT32  TimeCounter;
 
 
@@ -94,7 +97,13 @@ extern QueueHandle_t GpsRecvHandle;
 extern QueueHandle_t UartWriteCmdHandle;
 extern AppConfigDataType AppNVMData;
 extern AppDataBody AppDataInfo;
+extern AppAlgorithmData   BcuDataInfo;
 extern AppSocketConnectionContext socContext;  //网络连接状态
 extern process_app 		    gProcess_app;
 
 
+//BCU
+extern UINT16 socd_pct_battSoc;
+extern UINT16 socd_pct_ahSoc;
+extern UINT16 socd_pct_estSoc;
+extern UINT16 socd_pct_ekfSoc;

+ 1 - 1
inc/AppTaskUart.h

@@ -29,7 +29,7 @@
 #include "numeric.h"
 #include "AppSignal.h"
 
-#define  PROC_UART_TASK_STACK_SIZE (1024)
+#define  PROC_UART_TASK_STACK_SIZE (2048)
 
 #define BMS_ADDRESS_CODE    0x01
 #define UART_READ_CODE      0x03

+ 3 - 3
inc/BCU.h

@@ -62,9 +62,9 @@ struct tag_RTM_BCU_T {
 };
 
 /* Model entry point functions */
-extern void BCU_initialize(void);
-extern void BCU_step(void);
-extern void BCU_terminate(void);
+extern void BCU_Init(void);
+extern void BCU(void);
+extern void BCUEEDataSave(void);
 
 /* Real-time Model object */
 extern RT_MODEL_BCU_T *const BCU_M;

+ 16 - 26
inc/EmbeddedCoder_inc/BCU1.h → inc/EmbeddedCoder_inc/BCU.h

@@ -3,9 +3,9 @@
  *
  * Code generated for Simulink model 'BCU'.
  *
- * Model version                  : 1.19
+ * Model version                  : 1.33
  * Simulink Coder version         : 9.4 (R2020b) 29-Jul-2020
- * C/C++ source code generated on : Fri Aug 20 13:49:53 2021
+ * C/C++ source code generated on : Thu Sep  9 18:19:09 2021
  *
  * Target selection: ert.tlc
  * Embedded hardware selection: Intel->x86-64 (Windows64)
@@ -13,20 +13,27 @@
  * Validation result: Not run
  */
 
-
-
 #ifndef RTW_HEADER_BCU_h_
 #define RTW_HEADER_BCU_h_
 #ifndef BCU_COMMON_INCLUDES_
 #define BCU_COMMON_INCLUDES_
 #include "rtwtypes.h"
-#include "commontypedef.h"
-#include "AppSignal.h"
 #include "zero_crossing_types.h"
+#include "AppSignal.h"
 
 #endif                                 /* BCU_COMMON_INCLUDES_ */
 
 #include "BCU_types.h"
+
+/* Child system includes */
+#define SFM_MDLREF_HIDE_CHILD_
+#include "SFM.h"
+#define SPM_MDLREF_HIDE_CHILD_
+#include "SPM.h"
+
+/* Includes for objects with custom storage classes. */
+#include "BCUCal.h"
+#include "BCUDisp.h"
 #define PROC_BCU_TASK_STACK_SIZE           (2048)
 typedef enum
 {
@@ -35,23 +42,6 @@ typedef enum
     PROCESS_STATE_WORK,
     PROCESS_STATE_SLEEP
 }process_Bcu;
-/* Child system includes */
-
-//=======================================================================
-/* Child system includes */
-#define SOH_MDLREF_HIDE_CHILD_
-#include "SOH.h"
-#define SOC_MDLREF_HIDE_CHILD_
-#include "SOC.h"
-#define BLC_MDLREF_HIDE_CHILD_
-#include "BLC.h"
-#define SFM_MDLREF_HIDE_CHILD_
-
-extern uint16_T Time;
-
-/* Includes for objects with custom storage classes. */
-#include "BCUCal.h"
-#include "BCUDisp.h"
 
 /* Macros for accessing real-time model data structure */
 #ifndef rtmGetErrorStatus
@@ -72,9 +62,9 @@ struct tag_RTM_BCU_T {
 };
 
 /* Model entry point functions */
-extern void BCU_initialize(void);
-extern void BCU_step(void);
-extern void BCU_terminate(void);
+extern void BCU_Init(void);
+extern void BCU(void);
+extern void BCUEEDataSave(void);
 
 /* Real-time Model object */
 extern RT_MODEL_BCU_T *const BCU_M;

+ 1 - 0
inc/EmbeddedCoder_inc/BCUCal.h

@@ -20,6 +20,7 @@ extern const int16_T blcc_T_close;
 extern const int16_T blcc_T_open;
 extern const uint16_T blcc_V_low;
 extern const uint16_T cmnc_Q_ratedCp;
+extern const uint16_T cmnc_num_cellUNumMax;
 
 /* ¶î¶¨ÈÝÁ¿£» */
 extern const uint8_T cmnc_num_cellUNum;

+ 5 - 4
inc/EmbeddedCoder_inc/BCUDisp.h

@@ -14,8 +14,10 @@
 
 /* Exported data declaration */
 /* Declaration for custom storage class: ExportToFile */
+extern uint16_T socd_pct_estSoc;
 extern uint16_T FltCodeArr[20];
-extern real_T OCV;
+extern uint16_T appv_V_cellU[28];
+
 extern uint16_T blcn_Q_impleCp[28];
 extern uint16_T blcv_Q_reqCpEi[28];
 
@@ -33,9 +35,10 @@ extern boolean_T blcv_flg_excute[28];
 extern uint8_T cand_Nr_cellNr;
 extern uint16_T cand_Q_cellCap;
 extern uint16_T cand_V_chrgStartStat;
+extern uint16_T cand_Q_reqCp;
+extern uint32_T cand_Q_totalCp;
 
 /* 均衡执行请求标志位 (数组) */
-extern real_T deltaU;
 extern int16_T ihd_I_curr;
 
 /* 电池包电流; */
@@ -78,8 +81,6 @@ extern int16_T ihv_T_modT[6];
 extern uint16_T ihv_V_cellU[28];
 
 /* 电池单体电压(数组); */
-extern real_T k1;
-extern real_T k2;
 extern int16_T sfmd_I_curr;
 extern uint8_T sfmd_N_fltLevel;
 extern int16_T sfmd_T_modTMax;

+ 1 - 133
inc/EmbeddedCoder_inc/BLC.h

@@ -1,139 +1,7 @@
-/*
- * File: BLC.h
- *
- * Code generated for Simulink model 'BLC'.
- *
- * Model version                  : 1.50
- * Simulink Coder version         : 9.4 (R2020b) 29-Jul-2020
- * C/C++ source code generated on : Thu Sep  9 17:18:08 2021
- *
- * Target selection: ert.tlc
- * Embedded hardware selection: Intel->x86-64 (Windows64)
- * Code generation objectives: Unspecified
- * Validation result: Not run
- */
-
-#ifndef RTW_HEADER_BLC_h_
-#define RTW_HEADER_BLC_h_
-#include <string.h>
-#ifndef BLC_COMMON_INCLUDES_
-#define BLC_COMMON_INCLUDES_
 #include "rtwtypes.h"
-#endif                                 /* BLC_COMMON_INCLUDES_ */
-
-#include "BLC_types.h"
-
-/* Includes for objects with custom storage classes. */
 #include "BCUCal.h"
 #include "BCUDisp.h"
 
-/* Block signals for model 'BLC' */
-#ifndef BLC_MDLREF_HIDE_CHILD_
-
-typedef struct {
-  uint32_T blcv_Q_totalCpEE_Merge[28]; /* '<S2>/blcv_Q_totalCpEE_Merge' */
-  uint16_T blcn_Q_reqCpNow_j[28];      /* '<S6>/Chart' */
-  uint16_T blcv_Q_reqCpEE_Merge[28];   /* '<S2>/blcv_Q_reqCpEE_Merge' */
-  boolean_T blcn_flg_stop[28];         /* '<S7>/Chart' */
-  boolean_T blcn_flg_pause[28];        /* '<S4>/Chart' */
-  boolean_T in;                        /* '<S12>/in' */
-} B_BLC_c_T;
-
-#endif                                 /*BLC_MDLREF_HIDE_CHILD_*/
-
-/* Block states (default storage) for model 'BLC' */
-#ifndef BLC_MDLREF_HIDE_CHILD_
-
-typedef struct {
-  uint32_T blcCap[28];                 /* '<S5>/Chart' */
-  uint16_T reqCp_reset_DSTATE[28];     /* '<S1>/reqCp_reset' */
-  uint16_T QL;                         /* '<S6>/Chart1' */
-  boolean_T UnitDelay1_DSTATE;         /* '<S11>/Unit Delay1' */
-  boolean_T UnitDelay1_DSTATE_a;       /* '<S1>/Unit Delay1' */
-  uint8_T i_close;                     /* '<S4>/Chart' */
-  uint8_T i_open;                      /* '<S4>/Chart' */
-  boolean_T FristFlg;                  /* '<S6>/Chart1' */
-  boolean_T FristFlg_b;                /* '<S6>/Chart' */
-} DW_BLC_f_T;
-
-#endif                                 /*BLC_MDLREF_HIDE_CHILD_*/
-
-#ifndef BLC_MDLREF_HIDE_CHILD_
-
-/* Real-time Model Data Structure */
-struct tag_RTM_BLC_T {
-  const char_T **errorStatus;
-};
-
-#endif                                 /*BLC_MDLREF_HIDE_CHILD_*/
-
-#ifndef BLC_MDLREF_HIDE_CHILD_
-
-typedef struct {
-  RT_MODEL_BLC_T rtm;
-} MdlrefDW_BLC_T;
-
-#endif                                 /*BLC_MDLREF_HIDE_CHILD_*/
-
+extern boolean_T FirstRun_BLC;
 extern void BLC_Init(void);
 extern void BLC(void);
-
-/* Model reference registration function */
-extern void BLC_initialize(const char_T **rt_errorStatus);
-
-#ifndef BLC_MDLREF_HIDE_CHILD_
-
-extern MdlrefDW_BLC_T BLC_MdlrefDW;
-
-#endif                                 /*BLC_MDLREF_HIDE_CHILD_*/
-
-#ifndef BLC_MDLREF_HIDE_CHILD_
-
-/* Block signals (default storage) */
-extern B_BLC_c_T BLC_B;
-
-/* Block states (default storage) */
-extern DW_BLC_f_T BLC_DW;
-
-#endif                                 /*BLC_MDLREF_HIDE_CHILD_*/
-
-/*-
- * The generated code includes comments that allow you to trace directly
- * back to the appropriate location in the model.  The basic format
- * is <system>/block_name, where system is the system number (uniquely
- * assigned by Simulink) and block_name is the name of the block.
- *
- * Use the MATLAB hilite_system command to trace the generated code back
- * to the model.  For example,
- *
- * hilite_system('<S3>')    - opens system 3
- * hilite_system('<S3>/Kp') - opens and selects block Kp which resides in S3
- *
- * Here is the system hierarchy for this model
- *
- * '<Root>' : 'BLC'
- * '<S1>'   : 'BLC/BLC'
- * '<S2>'   : 'BLC/BLC/EE'
- * '<S3>'   : 'BLC/BLC/Enalbe'
- * '<S4>'   : 'BLC/BLC/pause'
- * '<S5>'   : 'BLC/BLC/record'
- * '<S6>'   : 'BLC/BLC/reqCpNow_Count'
- * '<S7>'   : 'BLC/BLC/stop'
- * '<S8>'   : 'BLC/BLC/EE/If Action Subsystem'
- * '<S9>'   : 'BLC/BLC/EE/If Action Subsystem1'
- * '<S10>'  : 'BLC/BLC/EE/Subsystem'
- * '<S11>'  : 'BLC/BLC/Enalbe/Frist Keep'
- * '<S12>'  : 'BLC/BLC/Enalbe/Frist Keep/Subsystem3'
- * '<S13>'  : 'BLC/BLC/pause/Chart'
- * '<S14>'  : 'BLC/BLC/record/Chart'
- * '<S15>'  : 'BLC/BLC/reqCpNow_Count/Chart'
- * '<S16>'  : 'BLC/BLC/reqCpNow_Count/Chart1'
- * '<S17>'  : 'BLC/BLC/stop/Chart'
- */
-#endif                                 /* RTW_HEADER_BLC_h_ */
-
-/*
- * File trailer for generated code.
- *
- * [EOF]
- */

+ 0 - 89
inc/EmbeddedCoder_inc/BLC_private.h

@@ -1,89 +0,0 @@
-/*
- * File: BLC_private.h
- *
- * Code generated for Simulink model 'BLC'.
- *
- * Model version                  : 1.50
- * Simulink Coder version         : 9.4 (R2020b) 29-Jul-2020
- * C/C++ source code generated on : Thu Sep  9 17:18:08 2021
- *
- * Target selection: ert.tlc
- * Embedded hardware selection: Intel->x86-64 (Windows64)
- * Code generation objectives: Unspecified
- * Validation result: Not run
- */
-
-#ifndef RTW_HEADER_BLC_private_h_
-#define RTW_HEADER_BLC_private_h_
-#include "rtwtypes.h"
-#ifndef UCHAR_MAX
-#include <limits.h>
-#endif
-
-#if ( UCHAR_MAX != (0xFFU) ) || ( SCHAR_MAX != (0x7F) )
-#error Code was generated for compiler with different sized uchar/char. \
-Consider adjusting Test hardware word size settings on the \
-Hardware Implementation pane to match your compiler word sizes as \
-defined in limits.h of the compiler. Alternatively, you can \
-select the Test hardware is the same as production hardware option and \
-select the Enable portable word sizes option on the Code Generation > \
-Verification pane for ERT based targets, which will disable the \
-preprocessor word size checks.
-#endif
-
-#if ( USHRT_MAX != (0xFFFFU) ) || ( SHRT_MAX != (0x7FFF) )
-#error Code was generated for compiler with different sized ushort/short. \
-Consider adjusting Test hardware word size settings on the \
-Hardware Implementation pane to match your compiler word sizes as \
-defined in limits.h of the compiler. Alternatively, you can \
-select the Test hardware is the same as production hardware option and \
-select the Enable portable word sizes option on the Code Generation > \
-Verification pane for ERT based targets, which will disable the \
-preprocessor word size checks.
-#endif
-
-#if ( UINT_MAX != (0xFFFFFFFFU) ) || ( INT_MAX != (0x7FFFFFFF) )
-#error Code was generated for compiler with different sized uint/int. \
-Consider adjusting Test hardware word size settings on the \
-Hardware Implementation pane to match your compiler word sizes as \
-defined in limits.h of the compiler. Alternatively, you can \
-select the Test hardware is the same as production hardware option and \
-select the Enable portable word sizes option on the Code Generation > \
-Verification pane for ERT based targets, which will disable the \
-preprocessor word size checks.
-#endif
-
-#if ( ULONG_MAX != (0xFFFFFFFFU) ) || ( LONG_MAX != (0x7FFFFFFF) )
-#error Code was generated for compiler with different sized ulong/long. \
-Consider adjusting Test hardware word size settings on the \
-Hardware Implementation pane to match your compiler word sizes as \
-defined in limits.h of the compiler. Alternatively, you can \
-select the Test hardware is the same as production hardware option and \
-select the Enable portable word sizes option on the Code Generation > \
-Verification pane for ERT based targets, which will disable the \
-preprocessor word size checks.
-#endif
-
-/* Macros for accessing real-time model data structure */
-#ifndef rtmGetErrorStatus
-#define rtmGetErrorStatus(rtm)         (*((rtm)->errorStatus))
-#endif
-
-#ifndef rtmSetErrorStatus
-#define rtmSetErrorStatus(rtm, val)    (*((rtm)->errorStatus) = (val))
-#endif
-
-#ifndef rtmGetErrorStatusPointer
-#define rtmGetErrorStatusPointer(rtm)  (rtm)->errorStatus
-#endif
-
-#ifndef rtmSetErrorStatusPointer
-#define rtmSetErrorStatusPointer(rtm, val) ((rtm)->errorStatus = (val))
-#endif
-#endif                                 /* RTW_HEADER_BLC_private_h_ */
-
-/*
- * File trailer for generated code.
- *
- * [EOF]
- */

+ 0 - 30
inc/EmbeddedCoder_inc/BLC_types.h

@@ -1,30 +0,0 @@
-/*
- * File: BLC_types.h
- *
- * Code generated for Simulink model 'BLC'.
- *
- * Model version                  : 1.50
- * Simulink Coder version         : 9.4 (R2020b) 29-Jul-2020
- * C/C++ source code generated on : Thu Sep  9 17:18:08 2021
- *
- * Target selection: ert.tlc
- * Embedded hardware selection: Intel->x86-64 (Windows64)
- * Code generation objectives: Unspecified
- * Validation result: Not run
- */
-
-#ifndef RTW_HEADER_BLC_types_h_
-#define RTW_HEADER_BLC_types_h_
-
-/* Model Code Variants */
-
-/* Forward declaration for rtModel */
-typedef struct tag_RTM_BLC_T RT_MODEL_BLC_T;
-
-#endif                                 /* RTW_HEADER_BLC_types_h_ */
-
-/*
- * File trailer for generated code.
- *
- * [EOF]
- */

+ 241 - 0
inc/EmbeddedCoder_inc/RTE_Device.h

@@ -0,0 +1,241 @@
+#ifndef __RTE_DEVICE_H
+#define __RTE_DEVICE_H
+
+#include "ec616.h"
+
+/*  Peripheral IO Mode Select, Must Configure First !!!
+    Note, when receiver works in DMA_MODE, interrupt is also enabled to transfer tailing bytes.
+*/
+
+#define POLLING_MODE            	0x1
+#define DMA_MODE                		0x2
+#define IRQ_MODE                		0x3
+#define UNILOG_MODE            		0x4
+
+#define RTE_UART0_TX_IO_MODE    UNILOG_MODE
+#define RTE_UART0_RX_IO_MODE    DMA_MODE
+
+#define RTE_UART1_TX_IO_MODE    POLLING_MODE
+#define RTE_UART1_RX_IO_MODE    DMA_MODE
+
+#define RTE_UART2_TX_IO_MODE    POLLING_MODE
+#define RTE_UART2_RX_IO_MODE    DMA_MODE
+
+#define RTE_SPI0_IO_MODE           POLLING_MODE
+
+#define RTE_SPI1_IO_MODE           POLLING_MODE
+
+#define I2C0_INIT_MODE               POLLING_MODE
+#define I2C1_INIT_MODE               POLLING_MODE
+
+
+// I2C0 (Inter-integrated Circuit Interface) [Driver_I2C0]
+// Configuration settings for Driver_I2C0 in component ::Drivers:I2C
+#define RTE_I2C0                        1
+
+// { PAD_PIN25},  // 0 : gpio10 / 1 : I2C0 SCL
+// { PAD_PIN26},  // 0 : gpio8  / 1 : I2C0 SDA
+#define RTE_I2C0_SCL_BIT                25
+#define RTE_I2C0_SCL_FUNC               PAD_MuxAlt1
+
+#define RTE_I2C0_SDA_BIT                26
+#define RTE_I2C0_SDA_FUNC               PAD_MuxAlt1
+
+// DMA
+//   Tx
+//     Channel     <0=>0 <1=>1 <2=>2 <3=>3 <4=>4 <5=>5 <6=>6 <7=>7
+#define RTE_I2C0_DMA_TX_EN              0
+#define RTE_I2C0_DMA_TX_REQID           DMA_RequestI2C0TX
+//   Rx
+//     Channel     <0=>0 <1=>1 <2=>2 <3=>3 <4=>4 <5=>5 <6=>6 <7=>7
+#define RTE_I2C0_DMA_RX_EN              0
+#define RTE_I2C0_DMA_RX_REQID           DMA_RequestI2C0RX
+
+// I2C1 (Inter-integrated Circuit Interface) [Driver_I2C1]
+// Configuration settings for Driver_I2C1 in component ::Drivers:I2C
+#define RTE_I2C1                        0
+
+// { PAD_PIN27},  // 0 : gpio17 / 1 : I2C1 SCL
+// { PAD_PIN28},  // 0 : gpio9  / 1 : I2C1 SDA
+#define RTE_I2C1_SCL_BIT                27
+#define RTE_I2C1_SCL_FUNC               PAD_MuxAlt1
+
+#define RTE_I2C1_SDA_BIT                28
+#define RTE_I2C1_SDA_FUNC               PAD_MuxAlt1
+
+// DMA
+//   Tx
+//     Channel     <0=>0 <1=>1 <2=>2 <3=>3 <4=>4 <5=>5 <6=>6 <7=>7
+#define RTE_I2C1_DMA_TX_EN              1
+#define RTE_I2C1_DMA_TX_REQID           DMA_RequestI2C1TX
+//   Rx
+//     Channel     <0=>0 <1=>1 <2=>2 <3=>3 <4=>4 <5=>5 <6=>6 <7=>7
+#define RTE_I2C1_DMA_RX_EN              1
+#define RTE_I2C1_DMA_RX_REQID           DMA_RequestI2C1RX
+
+
+// UART0 (Universal asynchronous receiver transmitter) [Driver_USART0]
+// Configuration settings for Driver_USART0 in component ::Drivers:USART
+#define RTE_UART0                       1
+#define RTE_UART0_CTS_PIN_EN            0
+#define RTE_UART0_RTS_PIN_EN            0
+#if 1
+// { PAD_PIN23},  // 0 : gpio14 / 1 : UART1 RXD  / 2 :SPI0_MISO /3 : UART0_RXD
+// { PAD_PIN24},  // 0 : gpio15 / 1 : UART1 TXD  / 2: SPI0_SCLK /3 : UART0_TXD
+#define RTE_UART0_RX_BIT                23
+#define RTE_UART0_RX_FUNC               PAD_MuxAlt3
+
+#define RTE_UART0_TX_BIT                24
+#define RTE_UART0_TX_FUNC               PAD_MuxAlt3
+#else
+// { PAD_PIN13},  // 0 : gpio2 / 1 : UART0 RTSn / 3 : SPI1 SSn
+// { PAD_PIN14},  // 0 : gpio3 / 1 : UART0 CTSn / 3 : SPI1 MOSI
+// { PAD_PIN15},  // 0 : gpio4 / 1 : UART0 RXD  / 3 : SPI1 MISO
+// { PAD_PIN16},  // 0 : gpio5 / 1 : UART0 TXD  / 3 : SPI1 SCLK
+#define RTE_UART0_RTS_BIT               13
+#define RTE_UART0_RTS_FUNC              PAD_MuxAlt1
+
+#define RTE_UART0_CTS_BIT               14
+#define RTE_UART0_CTS_FUNC              PAD_MuxAlt1
+
+#define RTE_UART0_RX_BIT                15
+#define RTE_UART0_RX_FUNC               PAD_MuxAlt1
+
+#define RTE_UART0_TX_BIT                16
+#define RTE_UART0_TX_FUNC               PAD_MuxAlt1
+#endif
+
+// DMA
+//  Tx
+//    Channel     <0=>0 <1=>1 <2=>2 <3=>3 <4=>4 <5=>5 <6=>6 <7=>7
+#define RTE_UART0_DMA_TX_REQID          DMA_RequestUSART0TX
+//  Rx
+//    Channel    <0=>0 <1=>1 <2=>2 <3=>3 <4=>4 <5=>5 <6=>6 <7=>7
+#define RTE_UART0_DMA_RX_REQID          DMA_RequestUSART0RX
+
+// UART1 (Universal asynchronous receiver transmitter) [Driver_USART1]
+// Configuration settings for Driver_USART1 in component ::Drivers:USART
+#define RTE_UART1                       1
+#define RTE_UART1_CTS_PIN_EN            0
+#define RTE_UART1_RTS_PIN_EN            0
+// { PAD_PIN17},  // 0 : gpio6   / 3 : UART1 RTS
+// { PAD_PIN18},  // 0 : gpio7   / 3 : UART1 CTS
+// { PAD_PIN19},  // 0 : gpio13  / 3 : UART1 RXD
+// { PAD_PIN20},  // 0 : gpio12  / 3 : UART1 TXD
+#define RTE_UART1_RTS_BIT               17
+#define RTE_UART1_RTS_FUNC              PAD_MuxAlt3
+
+#define RTE_UART1_CTS_BIT               18
+#define RTE_UART1_CTS_FUNC              PAD_MuxAlt3
+
+#define RTE_UART1_RX_BIT                19
+#define RTE_UART1_RX_FUNC               PAD_MuxAlt3
+
+#define RTE_UART1_TX_BIT                20
+#define RTE_UART1_TX_FUNC               PAD_MuxAlt3
+
+// DMA
+//   Tx
+//     Channel     <0=>0 <1=>1 <2=>2 <3=>3 <4=>4 <5=>5 <6=>6 <7=>7
+#define RTE_UART1_DMA_TX_REQID          DMA_RequestUSART1TX
+//   Rx
+//     Channel    <0=>0 <1=>1 <2=>2 <3=>3 <4=>4 <5=>5 <6=>6 <7=>7
+#define RTE_UART1_DMA_RX_REQID          DMA_RequestUSART1RX
+
+// UART2 (Universal asynchronous receiver transmitter) [Driver_USART2]
+// Configuration settings for Driver_USART2 in component ::Drivers:USART
+#define RTE_UART2                       1
+#define RTE_UART2_CTS_PIN_EN            0
+#define RTE_UART2_RTS_PIN_EN            0
+
+// { PAD_PIN29},  // 0 : gpio18 / 1 : UART2 RXD
+// { PAD_PIN30},  // 0 : gpio19 / 1 : UART2 TXD
+#define RTE_UART2_RX_BIT                29
+#define RTE_UART2_RX_FUNC               PAD_MuxAlt1
+
+#define RTE_UART2_TX_BIT                30
+#define RTE_UART2_TX_FUNC               PAD_MuxAlt1
+
+
+// DMA
+//   Tx
+//     Channel     <0=>0 <1=>1 <2=>2 <3=>3 <4=>4 <5=>5 <6=>6 <7=>7
+#define RTE_UART2_DMA_TX_REQID          DMA_RequestUSART2TX
+//   Rx
+//     Channel    <0=>0 <1=>1 <2=>2 <3=>3 <4=>4 <5=>5 <6=>6 <7=>7
+#define RTE_UART2_DMA_RX_REQID          DMA_RequestUSART2RX
+
+// SPI0 (Serial Peripheral Interface) [Driver_SPI0]
+// Configuration settings for Driver_SPI0 in component ::Drivers:SPI
+#define RTE_SPI0                        0
+
+// { PAD_PIN21},  // 0 : gpio16 / 1 : UART1 RTS / 2 : SPI0 SSn
+// { PAD_PIN22},  // 0 : gpio11 / 1 : UART1 CTS / 2 : SPI0 MOSI
+// { PAD_PIN23},  // 0 : gpio14 / 1 : UART1 RXD / 2 : SPI0 MISO
+// { PAD_PIN24},  // 0 : gpio15 / 1 : UART1 TXD / 2 : SPI0 SCLK
+#define RTE_SPI0_SSN_BIT                21
+#define RTE_SPI0_SSN_FUNC               PAD_MuxAlt2
+
+#define RTE_SPI0_MOSI_BIT               22
+#define RTE_SPI0_MOSI_FUNC              PAD_MuxAlt2
+
+#define RTE_SPI0_MISO_BIT               23
+#define RTE_SPI0_MISO_FUNC              PAD_MuxAlt2
+
+#define RTE_SPI0_SCLK_BIT               24
+#define RTE_SPI0_SCLK_FUNC              PAD_MuxAlt2
+
+#define RTE_SPI0_SSN_GPIO_INSTANCE      1
+#define RTE_SPI0_SSN_GPIO_INDEX         0
+
+// DMA
+//   Tx
+//     Channel     <0=>0 <1=>1 <2=>2 <3=>3 <4=>4 <5=>5 <6=>6 <7=>7
+#define RTE_SPI0_DMA_TX_REQID           DMA_RequestSPI0TX
+
+//   Rx
+//     Channel     <0=>0 <1=>1 <2=>2 <3=>3 <4=>4 <5=>5 <6=>6 <7=>7
+#define RTE_SPI0_DMA_RX_REQID           DMA_RequestSPI0RX
+
+// SPI1 (Serial Peripheral Interface) [Driver_SPI1]
+// Configuration settings for Driver_SPI1 in component ::Drivers:SPI
+#define RTE_SPI1                        1
+
+// { PAD_PIN13},  // 0 : gpio2 / 1 : UART0 RTSn / 3 : SPI1 SSn
+// { PAD_PIN14},  // 0 : gpio3 / 1 : UART0 CTSn / 3 : SPI1 MOSI
+// { PAD_PIN15},  // 0 : gpio4 / 1 : UART0 RXD  / 3 : SPI1 MISO
+// { PAD_PIN16},  // 0 : gpio5 / 1 : UART0 TXD  / 3 : SPI1 SCLK
+#define RTE_SPI1_SSN_BIT                13
+#define RTE_SPI1_SSN_FUNC               PAD_MuxAlt3
+
+#define RTE_SPI1_MOSI_BIT               14
+#define RTE_SPI1_MOSI_FUNC              PAD_MuxAlt3
+
+#define RTE_SPI1_MISO_BIT               15
+#define RTE_SPI1_MISO_FUNC              PAD_MuxAlt3
+
+#define RTE_SPI1_SCLK_BIT               16
+#define RTE_SPI1_SCLK_FUNC              PAD_MuxAlt3
+
+#define RTE_SPI1_SSN_GPIO_INSTANCE      0
+#define RTE_SPI1_SSN_GPIO_INDEX         2
+
+// DMA
+//   Tx
+//     Channel     <0=>0 <1=>1 <2=>2 <3=>3 <4=>4 <5=>5 <6=>6 <7=>7
+#define RTE_SPI1_DMA_TX_REQID           DMA_RequestSPI1TX
+
+//   Rx
+//     Channel     <0=>0 <1=>1 <2=>2 <3=>3 <4=>4 <5=>5 <6=>6 <7=>7
+#define RTE_SPI1_DMA_RX_REQID           DMA_RequestSPI1RX
+
+
+// PWM0 Controller [Driver_PWM0]
+// Configuration settings for Driver_PWM0 in component ::Drivers:PWM
+#define RTE_PWM                         1
+
+#define EFUSE_INIT_MODE POLLING_MODE
+
+#define FLASH_BARE_RW_MODE 1
+
+#endif  /* __RTE_DEVICE_H */

+ 7 - 237
inc/EmbeddedCoder_inc/SOC.h

@@ -1,247 +1,17 @@
-/*
- * File: SOC.h
- *
- * Code generated for Simulink model 'SOC'.
- *
- * Model version                  : 1.51
- * Simulink Coder version         : 9.4 (R2020b) 29-Jul-2020
- * C/C++ source code generated on : Thu Sep  9 17:18:48 2021
- *
- * Target selection: ert.tlc
- * Embedded hardware selection: Intel->x86-64 (Windows64)
- * Code generation objectives: Unspecified
- * Validation result: Not run
- */
 
-#ifndef RTW_HEADER_SOC_h_
-#define RTW_HEADER_SOC_h_
 #include <math.h>
-#ifndef SOC_COMMON_INCLUDES_
-#define SOC_COMMON_INCLUDES_
-#include "rtwtypes.h"
-#include "zero_crossing_types.h"
-#endif                                 /* SOC_COMMON_INCLUDES_ */
-
-#include "SOC_types.h"
-
-/* Includes for objects with custom storage classes. */
 #include "BCUCal.h"
 #include "BCUDisp.h"
-
-/* Block signals for model 'SOC' */
-#ifndef SOC_MDLREF_HIDE_CHILD_
-
-typedef struct {
-  uint16_T in;                         /* '<S55>/in' */
-  uint16_T Switch;                     /* '<S5>/Switch' */
-  uint16_T Divide;                     /* '<S5>/Divide' */
-  uint16_T socn_pct_bcuSocEE_Merge;    /* '<S2>/socn_pct_bcuSocEE_Merge' */
-  int16_T in_f;                        /* '<S54>/in' */
-  int16_T in_d;                        /* '<S60>/in' */
-  int16_T in_c;                        /* '<S56>/in' */
-} B_SOC_c_T;
-
-#endif                                 /*SOC_MDLREF_HIDE_CHILD_*/
-
-/* Block states (default storage) for model 'SOC' */
-#ifndef SOC_MDLREF_HIDE_CHILD_
-
-typedef struct {
-  real_T SOCk_Delay_DSTATE;            /* '<S12>/SOCk_Delay' */
-  real_T P_Delay_DSTATE[4];            /* '<S12>/P_Delay' */
-  real_T SOCk_Delay_DSTATE_e;          /* '<S13>/SOCk_Delay' */
-  real_T P_Delay_DSTATE_m[4];          /* '<S13>/P_Delay' */
-  real_T Up_Delay_DSTATE;              /* '<S13>/Up_Delay' */
-  real_T Up_Delay_DSTATE_h;            /* '<S12>/Up_Delay' */
-  real_T Divide_DWORK4;                /* '<S17>/Divide' */
-  real_T Divide_DWORK4_h;              /* '<S26>/Divide' */
-  int32_T _DSTATE;                     /* '<S4>/  ' */
-  uint16_T Time_Delay_DSTATE;          /* '<S35>/Time_Delay' */
-  uint16_T Time_Delay_DSTATE_e;        /* '<S61>/Time_Delay' */
-  uint16_T Time_Delay_DSTATE_g;        /* '<S59>/Time_Delay' */
-  uint16_T Time_Delay_DSTATE_f;        /* '<S58>/Time_Delay' */
-  uint16_T UnitDelay7_DSTATE;          /* '<S6>/Unit Delay7' */
-  uint16_T socd_pct_battSoc0_Delay_DSTATE;/* '<S6>/socd_pct_battSoc0_Delay' */
-  uint16_T socd_pct_bcusocDelay_DSTATE;/* '<S6>/socd_pct_bcusocDelay' */
-  uint16_T socd_pct_bcuSoc0_Delay_DSTATE;/* '<S6>/socd_pct_bcuSoc0_Delay' */
-  uint16_T socd_flg_EEsave_Delay_DSTATE;/* '<S32>/socd_flg_EEsave_Delay' */
-  uint16_T socn_pct_estsoc_Delay_DSTATE;/* '<S57>/socn_pct_estsoc_Delay' */
-  uint16_T socfit_Delay_DSTATE;        /* '<S42>/socfit_Delay' */
-  uint16_T socfit_Delay_DSTATE_n;      /* '<S37>/socfit_Delay' */
-  uint8_T ihd_st_chrgSta_Delay_DSTATE; /* '<S6>/ihd_st_chrgSta_Delay' */
-  uint8_T Time_reset_DSTATE;           /* '<S49>/Time_reset' */
-  boolean_T FirstDelay_DSTATE;         /* '<S1>/FirstDelay' */
-  boolean_T Frist_DSTATE;              /* '<S14>/Frist' */
-  boolean_T Frist_DSTATE_h;            /* '<S23>/Frist' */
-  boolean_T First_Delay_DSTATE;        /* '<S6>/First_Delay' */
-  boolean_T First_Delay1_DSTATE;       /* '<S6>/First_Delay1' */
-  boolean_T UnitDelay1_DSTATE;         /* '<S52>/Unit Delay1' */
-  boolean_T UnitDelay1_DSTATE_p;       /* '<S53>/Unit Delay1' */
-  boolean_T lowFLg_Delay_DSTATE;       /* '<S51>/lowFLg_Delay' */
-  boolean_T overFlg_reset_DSTATE;      /* '<S50>/overFlg_reset' */
-  boolean_T fulFLg_reset_DSTATE;       /* '<S50>/fulFLg_reset' */
-  int8_T If_ActiveSubsystem;           /* '<S7>/If' */
-} DW_SOC_f_T;
-
-#endif                                 /*SOC_MDLREF_HIDE_CHILD_*/
-
-/* Zero-crossing (trigger) state for model 'SOC' */
-#ifndef SOC_MDLREF_HIDE_CHILD_
-
-typedef struct {
-  ZCSigState Subsystem2_Trig_ZCE;      /* '<S51>/Subsystem2' */
-  ZCSigState Subsystem2_Trig_ZCE_k;    /* '<S50>/Subsystem2' */
-} ZCE_SOC_T;
-
-#endif                                 /*SOC_MDLREF_HIDE_CHILD_*/
-
-#ifndef SOC_MDLREF_HIDE_CHILD_
-
-/* Real-time Model Data Structure */
-struct tag_RTM_SOC_T {
-  const char_T **errorStatus;
-};
-
-#endif                                 /*SOC_MDLREF_HIDE_CHILD_*/
-
-#ifndef SOC_MDLREF_HIDE_CHILD_
-
-typedef struct {
-  RT_MODEL_SOC_T rtm;
-} MdlrefDW_SOC_T;
-
-#endif                                 /*SOC_MDLREF_HIDE_CHILD_*/
+extern boolean_T FirstRun_SOC;
 
 extern void SOC_Init(void);
-extern void SOC_Disable(void);
 extern void SOC(void);
+extern boolean_T FirstRun_SOC;
 
-/* Model reference registration function */
-extern void SOC_initialize(const char_T **rt_errorStatus);
-
-#ifndef SOC_MDLREF_HIDE_CHILD_
-
-extern void SOC_MATLABFunction(real_T rtu_x, real_T *rty_y);
-extern void SOC_IfActionSubsystem(uint16_T rtu_SOC, uint16_T rtu_SOCfit,
-  uint16_T *rty_Out1, uint16_T rtp_m);
-extern void SOC_IfActionSubsystem1(uint16_T rtu_SOC, uint16_T rtu_SOCfit,
-  uint16_T *rty_Out1);
-
-#endif                                 /*SOC_MDLREF_HIDE_CHILD_*/
-
-#ifndef SOC_MDLREF_HIDE_CHILD_
-
-extern MdlrefDW_SOC_T SOC_MdlrefDW;
-
-#endif                                 /*SOC_MDLREF_HIDE_CHILD_*/
-
-#ifndef SOC_MDLREF_HIDE_CHILD_
-
-/* Block signals (default storage) */
-extern B_SOC_c_T SOC_B;
-
-/* Block states (default storage) */
-extern DW_SOC_f_T SOC_DW;
-
-/* Previous zero-crossings (trigger) states */
-extern ZCE_SOC_T SOC_PrevZCX;
-
-#endif                                 /*SOC_MDLREF_HIDE_CHILD_*/
-
-/*-
- * These blocks were eliminated from the model due to optimizations:
- *
- * Block '<S12>/Scope' : Unused code path elimination
- * Block '<S12>/Signal Conversion' : Unused code path elimination
- * Block '<S29>/Display' : Unused code path elimination
- * Block '<S6>/Scope1' : Unused code path elimination
- * Block '<S33>/Scope2' : Unused code path elimination
- * Block '<S12>/Signal Conversion1' : Eliminate redundant signal conversion block
- * Block '<S37>/Signal Conversion' : Eliminate redundant signal conversion block
- * Block '<S49>/Saturation1' : Eliminated Saturate block
- */
 
-/*-
- * The generated code includes comments that allow you to trace directly
- * back to the appropriate location in the model.  The basic format
- * is <system>/block_name, where system is the system number (uniquely
- * assigned by Simulink) and block_name is the name of the block.
- *
- * Use the MATLAB hilite_system command to trace the generated code back
- * to the model.  For example,
- *
- * hilite_system('<S3>')    - opens system 3
- * hilite_system('<S3>/Kp') - opens and selects block Kp which resides in S3
- *
- * Here is the system hierarchy for this model
- *
- * '<Root>' : 'SOC'
- * '<S1>'   : 'SOC/SOC'
- * '<S2>'   : 'SOC/SOC/EEcheck'
- * '<S3>'   : 'SOC/SOC/EKF'
- * '<S4>'   : 'SOC/SOC/EKF1'
- * '<S5>'   : 'SOC/SOC/Inti_correct'
- * '<S6>'   : 'SOC/SOC/bcuSoc'
- * '<S7>'   : 'SOC/SOC/estSOC'
- * '<S8>'   : 'SOC/SOC/EEcheck/If Action Subsystem'
- * '<S9>'   : 'SOC/SOC/EEcheck/If Action Subsystem1'
- * '<S10>'  : 'SOC/SOC/EEcheck/Subsystem'
- * '<S11>'  : 'SOC/SOC/EKF/EKF'
- * '<S12>'  : 'SOC/SOC/EKF/Subsystem'
- * '<S13>'  : 'SOC/SOC/EKF/Subsystem1'
- * '<S14>'  : 'SOC/SOC/EKF/Subsystem/初始'
- * '<S15>'  : 'SOC/SOC/EKF/Subsystem/协方差更新'
- * '<S16>'  : 'SOC/SOC/EKF/Subsystem/协方差计算'
- * '<S17>'  : 'SOC/SOC/EKF/Subsystem/卡尔曼增益'
- * '<S18>'  : 'SOC/SOC/EKF/Subsystem/状态修正'
- * '<S19>'  : 'SOC/SOC/EKF/Subsystem/状态更新'
- * '<S20>'  : 'SOC/SOC/EKF/Subsystem/电池参数'
- * '<S21>'  : 'SOC/SOC/EKF/Subsystem/矩阵计算'
- * '<S22>'  : 'SOC/SOC/EKF/Subsystem/矩阵计算/MATLAB Function'
- * '<S23>'  : 'SOC/SOC/EKF/Subsystem1/初始'
- * '<S24>'  : 'SOC/SOC/EKF/Subsystem1/协方差更新'
- * '<S25>'  : 'SOC/SOC/EKF/Subsystem1/协方差计算'
- * '<S26>'  : 'SOC/SOC/EKF/Subsystem1/卡尔曼增益'
- * '<S27>'  : 'SOC/SOC/EKF/Subsystem1/状态修正'
- * '<S28>'  : 'SOC/SOC/EKF/Subsystem1/状态更新'
- * '<S29>'  : 'SOC/SOC/EKF/Subsystem1/电池参数'
- * '<S30>'  : 'SOC/SOC/EKF/Subsystem1/矩阵计算'
- * '<S31>'  : 'SOC/SOC/EKF/Subsystem1/矩阵计算/MATLAB Function'
- * '<S32>'  : 'SOC/SOC/bcuSoc/Subsystem1'
- * '<S33>'  : 'SOC/SOC/bcuSoc/Subsystem2'
- * '<S34>'  : 'SOC/SOC/bcuSoc/Subsystem3'
- * '<S35>'  : 'SOC/SOC/bcuSoc/keep juged1'
- * '<S36>'  : 'SOC/SOC/bcuSoc/Subsystem2/LookUP1'
- * '<S37>'  : 'SOC/SOC/bcuSoc/Subsystem2/SOCfit'
- * '<S38>'  : 'SOC/SOC/bcuSoc/Subsystem2/SOCfit/If Action Subsystem'
- * '<S39>'  : 'SOC/SOC/bcuSoc/Subsystem2/SOCfit/If Action Subsystem1'
- * '<S40>'  : 'SOC/SOC/bcuSoc/Subsystem2/SOCfit/If Action Subsystem2'
- * '<S41>'  : 'SOC/SOC/bcuSoc/Subsystem3/LookUP1'
- * '<S42>'  : 'SOC/SOC/bcuSoc/Subsystem3/SOCfit1'
- * '<S43>'  : 'SOC/SOC/bcuSoc/Subsystem3/SOCfit1/If Action Subsystem'
- * '<S44>'  : 'SOC/SOC/bcuSoc/Subsystem3/SOCfit1/If Action Subsystem1'
- * '<S45>'  : 'SOC/SOC/bcuSoc/Subsystem3/SOCfit1/If Action Subsystem2'
- * '<S46>'  : 'SOC/SOC/estSOC/If Action Subsystem'
- * '<S47>'  : 'SOC/SOC/estSOC/If Action Subsystem1'
- * '<S48>'  : 'SOC/SOC/estSOC/If Action Subsystem2'
- * '<S49>'  : 'SOC/SOC/estSOC/Time++'
- * '<S50>'  : 'SOC/SOC/estSOC/chrgCCV'
- * '<S51>'  : 'SOC/SOC/estSOC/disChrgCCV'
- * '<S52>'  : 'SOC/SOC/estSOC/If Action Subsystem/Frist Keep'
- * '<S53>'  : 'SOC/SOC/estSOC/If Action Subsystem/Frist Keep1'
- * '<S54>'  : 'SOC/SOC/estSOC/If Action Subsystem/Frist Keep/Subsystem3'
- * '<S55>'  : 'SOC/SOC/estSOC/If Action Subsystem/Frist Keep1/Subsystem3'
- * '<S56>'  : 'SOC/SOC/estSOC/chrgCCV/Subsystem2'
- * '<S57>'  : 'SOC/SOC/estSOC/chrgCCV/inc'
- * '<S58>'  : 'SOC/SOC/estSOC/chrgCCV/keep juged'
- * '<S59>'  : 'SOC/SOC/estSOC/chrgCCV/keep juged1'
- * '<S60>'  : 'SOC/SOC/estSOC/disChrgCCV/Subsystem2'
- * '<S61>'  : 'SOC/SOC/estSOC/disChrgCCV/keep juged'
- */
-#endif                                 /* RTW_HEADER_SOC_h_ */
+extern void docvmath(real_T soc ,real_T *docv);
+extern void SOC_LookUp(uint16_T battsoc, uint16_T x[3], uint16_T y[3],uint16_T *bcusoc);
+extern void SOC_MATLABFunction(real_T soc, real_T *docv);
+extern void SOCfit_IfActionSubsystem1(uint16_T SOC, uint16_T SOCfit, uint16_T *SOCout, uint16_T m);
+extern void SOCfit_IfActionSubsystem2(uint16_T SOC, uint16_T SOCfit, uint16_T *SOCout, uint16_T m);
 
-/*
- * File trailer for generated code.
- *
- * [EOF]
- */

+ 0 - 90
inc/EmbeddedCoder_inc/SOC_private.h

@@ -1,90 +0,0 @@
-/*
- * File: SOC_private.h
- *
- * Code generated for Simulink model 'SOC'.
- *
- * Model version                  : 1.51
- * Simulink Coder version         : 9.4 (R2020b) 29-Jul-2020
- * C/C++ source code generated on : Thu Sep  9 17:18:48 2021
- *
- * Target selection: ert.tlc
- * Embedded hardware selection: Intel->x86-64 (Windows64)
- * Code generation objectives: Unspecified
- * Validation result: Not run
- */
-
-#ifndef RTW_HEADER_SOC_private_h_
-#define RTW_HEADER_SOC_private_h_
-#include "rtwtypes.h"
-#include "zero_crossing_types.h"
-#ifndef UCHAR_MAX
-#include <limits.h>
-#endif
-
-#if ( UCHAR_MAX != (0xFFU) ) || ( SCHAR_MAX != (0x7F) )
-#error Code was generated for compiler with different sized uchar/char. \
-Consider adjusting Test hardware word size settings on the \
-Hardware Implementation pane to match your compiler word sizes as \
-defined in limits.h of the compiler. Alternatively, you can \
-select the Test hardware is the same as production hardware option and \
-select the Enable portable word sizes option on the Code Generation > \
-Verification pane for ERT based targets, which will disable the \
-preprocessor word size checks.
-#endif
-
-#if ( USHRT_MAX != (0xFFFFU) ) || ( SHRT_MAX != (0x7FFF) )
-#error Code was generated for compiler with different sized ushort/short. \
-Consider adjusting Test hardware word size settings on the \
-Hardware Implementation pane to match your compiler word sizes as \
-defined in limits.h of the compiler. Alternatively, you can \
-select the Test hardware is the same as production hardware option and \
-select the Enable portable word sizes option on the Code Generation > \
-Verification pane for ERT based targets, which will disable the \
-preprocessor word size checks.
-#endif
-
-#if ( UINT_MAX != (0xFFFFFFFFU) ) || ( INT_MAX != (0x7FFFFFFF) )
-#error Code was generated for compiler with different sized uint/int. \
-Consider adjusting Test hardware word size settings on the \
-Hardware Implementation pane to match your compiler word sizes as \
-defined in limits.h of the compiler. Alternatively, you can \
-select the Test hardware is the same as production hardware option and \
-select the Enable portable word sizes option on the Code Generation > \
-Verification pane for ERT based targets, which will disable the \
-preprocessor word size checks.
-#endif
-
-#if ( ULONG_MAX != (0xFFFFFFFFU) ) || ( LONG_MAX != (0x7FFFFFFF) )
-#error Code was generated for compiler with different sized ulong/long. \
-Consider adjusting Test hardware word size settings on the \
-Hardware Implementation pane to match your compiler word sizes as \
-defined in limits.h of the compiler. Alternatively, you can \
-select the Test hardware is the same as production hardware option and \
-select the Enable portable word sizes option on the Code Generation > \
-Verification pane for ERT based targets, which will disable the \
-preprocessor word size checks.
-#endif
-
-/* Macros for accessing real-time model data structure */
-#ifndef rtmGetErrorStatus
-#define rtmGetErrorStatus(rtm)         (*((rtm)->errorStatus))
-#endif
-
-#ifndef rtmSetErrorStatus
-#define rtmSetErrorStatus(rtm, val)    (*((rtm)->errorStatus) = (val))
-#endif
-
-#ifndef rtmGetErrorStatusPointer
-#define rtmGetErrorStatusPointer(rtm)  (rtm)->errorStatus
-#endif
-
-#ifndef rtmSetErrorStatusPointer
-#define rtmSetErrorStatusPointer(rtm, val) ((rtm)->errorStatus = (val))
-#endif
-#endif                                 /* RTW_HEADER_SOC_private_h_ */
-
-/*
- * File trailer for generated code.
- *
- * [EOF]
- */

+ 0 - 30
inc/EmbeddedCoder_inc/SOC_types.h

@@ -1,30 +0,0 @@
-/*
- * File: SOC_types.h
- *
- * Code generated for Simulink model 'SOC'.
- *
- * Model version                  : 1.51
- * Simulink Coder version         : 9.4 (R2020b) 29-Jul-2020
- * C/C++ source code generated on : Thu Sep  9 17:18:48 2021
- *
- * Target selection: ert.tlc
- * Embedded hardware selection: Intel->x86-64 (Windows64)
- * Code generation objectives: Unspecified
- * Validation result: Not run
- */
-
-#ifndef RTW_HEADER_SOC_types_h_
-#define RTW_HEADER_SOC_types_h_
-
-/* Model Code Variants */
-
-/* Forward declaration for rtModel */
-typedef struct tag_RTM_SOC_T RT_MODEL_SOC_T;
-
-#endif                                 /* RTW_HEADER_SOC_types_h_ */
-
-/*
- * File trailer for generated code.
- *
- * [EOF]
- */

+ 3 - 169
inc/EmbeddedCoder_inc/SOH.h

@@ -1,173 +1,7 @@
-/*
- * File: SOH.h
- *
- * Code generated for Simulink model 'SOH'.
- *
- * Model version                  : 1.38
- * Simulink Coder version         : 9.4 (R2020b) 29-Jul-2020
- * C/C++ source code generated on : Thu Sep  9 18:12:51 2021
- *
- * Target selection: ert.tlc
- * Embedded hardware selection: Intel->x86-64 (Windows64)
- * Code generation objectives: Unspecified
- * Validation result: Not run
- */
-
-#ifndef RTW_HEADER_SOH_h_
-#define RTW_HEADER_SOH_h_
-#ifndef SOH_COMMON_INCLUDES_
-#define SOH_COMMON_INCLUDES_
-#include "rtwtypes.h"
-#endif                                 /* SOH_COMMON_INCLUDES_ */
-
-#include "SOH_types.h"
-
-/* Includes for objects with custom storage classes. */
 #include "BCUCal.h"
 #include "BCUDisp.h"
-
-/* Block signals for model 'SOH' */
-#ifndef SOH_MDLREF_HIDE_CHILD_
-
-typedef struct {
-  uint16_T Divide;                     /* '<S9>/Divide' */
-  uint16_T d[28];                      /* '<S14>/d' */
-  uint16_T Add2;                       /* '<S14>/Add2' */
-  uint16_T in[28];                     /* '<S18>/in' */
-  uint16_T Qavrg;                      /* '<S3>/Chart' */
-  uint16_T sohn_Q_packCapArrEo[10];    /* '<S3>/Chart' */
-  uint16_T Saturation;                 /* '<S12>/Saturation' */
-  uint16_T ihv_V_CellU[28];            /* '<S10>/ihv_V_CellU' */
-  boolean_T in_g;                      /* '<S22>/in' */
-} B_SOH_c_T;
-
-#endif                                 /*SOH_MDLREF_HIDE_CHILD_*/
-
-/* Block states (default storage) for model 'SOH' */
-#ifndef SOH_MDLREF_HIDE_CHILD_
-
-typedef struct {
-  int32_T Ahincr_reset_DSTATE;         /* '<S12>/Ahincr_reset' */
-  uint16_T sohd_tm_chrgStartSta_Delay_DSTA;/* '<S6>/sohd_tm_chrgStartSta_Delay' */
-  uint16_T Time_Delay_DSTATE;          /* '<S9>/Time_Delay' */
-  uint16_T sohv_V_chrgStartEo_Delay_DSTATE[28];/* '<S6>/sohv_V_chrgStartEo_Delay' */
-  uint8_T UnitDelay_DSTATE;            /* '<S6>/Unit Delay' */
-  uint8_T UnitDelay_DSTATE_g;          /* '<S7>/Unit Delay' */
-  boolean_T UnitDelay1_DSTATE;         /* '<S21>/Unit Delay1' */
-  boolean_T reset_DSTATE;              /* '<S6>/reset' */
-  boolean_T sohd_flg_chrgEndEo_reset_DSTATE;/* '<S7>/sohd_flg_chrgEndEo_reset' */
-  boolean_T UnitDelay1_DSTATE_g;       /* '<S15>/Unit Delay1' */
-  boolean_T reset_DSTATE_b;            /* '<S11>/reset' */
-  boolean_T Fflg;                      /* '<S3>/Chart' */
-  boolean_T ResettableSubsystem_MODE;  /* '<S8>/Resettable Subsystem' */
-  boolean_T EnabledSubsystem_MODE;     /* '<S7>/Enabled Subsystem' */
-  boolean_T ResettableSubsystem_MODE_i;/* '<S6>/Resettable Subsystem' */
-} DW_SOH_f_T;
-
-#endif                                 /*SOH_MDLREF_HIDE_CHILD_*/
-
-#ifndef SOH_MDLREF_HIDE_CHILD_
-
-/* Real-time Model Data Structure */
-struct tag_RTM_SOH_T {
-  const char_T **errorStatus;
-};
-
-#endif                                 /*SOH_MDLREF_HIDE_CHILD_*/
-
-#ifndef SOH_MDLREF_HIDE_CHILD_
-
-typedef struct {
-  RT_MODEL_SOH_T rtm;
-} MdlrefDW_SOH_T;
-
-#endif                                 /*SOH_MDLREF_HIDE_CHILD_*/
-
+extern boolean_T FirstRun_SOH;
 extern void SOH_Init(void);
-extern void SOH_Disable(void);
 extern void SOH(void);
-
-/* Model reference registration function */
-extern void SOH_initialize(const char_T **rt_errorStatus);
-
-#ifndef SOH_MDLREF_HIDE_CHILD_
-
-extern void SOH_Min_Init(uint16_T *rty_Min);
-extern uint16_T SOH_Min(const uint16_T rtu_Arry[28]);
-
-#endif                                 /*SOH_MDLREF_HIDE_CHILD_*/
-
-#ifndef SOH_MDLREF_HIDE_CHILD_
-
-extern MdlrefDW_SOH_T SOH_MdlrefDW;
-
-#endif                                 /*SOH_MDLREF_HIDE_CHILD_*/
-
-#ifndef SOH_MDLREF_HIDE_CHILD_
-
-/* Block signals (default storage) */
-extern B_SOH_c_T SOH_B;
-
-/* Block states (default storage) */
-extern DW_SOH_f_T SOH_DW;
-
-#endif                                 /*SOH_MDLREF_HIDE_CHILD_*/
-
-/*-
- * These blocks were eliminated from the model due to optimizations:
- *
- * Block '<S9>/Saturation' : Eliminated Saturate block
- */
-
-/*-
- * The generated code includes comments that allow you to trace directly
- * back to the appropriate location in the model.  The basic format
- * is <system>/block_name, where system is the system number (uniquely
- * assigned by Simulink) and block_name is the name of the block.
- *
- * Use the MATLAB hilite_system command to trace the generated code back
- * to the model.  For example,
- *
- * hilite_system('<S3>')    - opens system 3
- * hilite_system('<S3>/Kp') - opens and selects block Kp which resides in S3
- *
- * Here is the system hierarchy for this model
- *
- * '<Root>' : 'SOH'
- * '<S1>'   : 'SOH/SOH'
- * '<S2>'   : 'SOH/SOH/Chrgmation'
- * '<S3>'   : 'SOH/SOH/Conut'
- * '<S4>'   : 'SOH/SOH/CountEn'
- * '<S5>'   : 'SOH/SOH/EEDeal'
- * '<S6>'   : 'SOH/SOH/Chrgmation/ChrgBe'
- * '<S7>'   : 'SOH/SOH/Chrgmation/ChrgEnd'
- * '<S8>'   : 'SOH/SOH/Chrgmation/Chrging'
- * '<S9>'   : 'SOH/SOH/Chrgmation/ChrgBe/Resettable Subsystem'
- * '<S10>'  : 'SOH/SOH/Chrgmation/ChrgBe/Resettable Subsystem1'
- * '<S11>'  : 'SOH/SOH/Chrgmation/ChrgEnd/Enabled Subsystem'
- * '<S12>'  : 'SOH/SOH/Chrgmation/Chrging/Resettable Subsystem'
- * '<S13>'  : 'SOH/SOH/Conut/Chart'
- * '<S14>'  : 'SOH/SOH/Conut/Subsystem'
- * '<S15>'  : 'SOH/SOH/Conut/Subsystem/Frist Keep'
- * '<S16>'  : 'SOH/SOH/Conut/Subsystem/Min'
- * '<S17>'  : 'SOH/SOH/Conut/Subsystem/Min1'
- * '<S18>'  : 'SOH/SOH/Conut/Subsystem/Frist Keep/Subsystem3'
- * '<S19>'  : 'SOH/SOH/Conut/Subsystem/Min/ArrMin'
- * '<S20>'  : 'SOH/SOH/Conut/Subsystem/Min1/ArrMin'
- * '<S21>'  : 'SOH/SOH/CountEn/Frist Keep'
- * '<S22>'  : 'SOH/SOH/CountEn/Frist Keep/Subsystem3'
- * '<S23>'  : 'SOH/SOH/EEDeal/EECkeck'
- * '<S24>'  : 'SOH/SOH/EEDeal/FalseAction'
- * '<S25>'  : 'SOH/SOH/EEDeal/TureAction'
- * '<S26>'  : 'SOH/SOH/EEDeal/EECkeck/Max'
- * '<S27>'  : 'SOH/SOH/EEDeal/EECkeck/Min1'
- * '<S28>'  : 'SOH/SOH/EEDeal/EECkeck/Max/ArrMin'
- * '<S29>'  : 'SOH/SOH/EEDeal/EECkeck/Min1/ArrMin'
- */
-#endif                                 /* RTW_HEADER_SOH_h_ */
-
-/*
- * File trailer for generated code.
- *
- * [EOF]
- */
+extern void  ArrMax(uint16_T *Data,uint16_T *Max, uint16_T m);
+extern void  ArrMin(uint16_T *Data,uint16_T *Min, uint16_T m);

+ 0 - 89
inc/EmbeddedCoder_inc/SOH_private.h

@@ -1,89 +0,0 @@
-/*
- * File: SOH_private.h
- *
- * Code generated for Simulink model 'SOH'.
- *
- * Model version                  : 1.38
- * Simulink Coder version         : 9.4 (R2020b) 29-Jul-2020
- * C/C++ source code generated on : Thu Sep  9 18:12:51 2021
- *
- * Target selection: ert.tlc
- * Embedded hardware selection: Intel->x86-64 (Windows64)
- * Code generation objectives: Unspecified
- * Validation result: Not run
- */
-
-#ifndef RTW_HEADER_SOH_private_h_
-#define RTW_HEADER_SOH_private_h_
-#include "rtwtypes.h"
-#ifndef UCHAR_MAX
-#include <limits.h>
-#endif
-
-#if ( UCHAR_MAX != (0xFFU) ) || ( SCHAR_MAX != (0x7F) )
-#error Code was generated for compiler with different sized uchar/char. \
-Consider adjusting Test hardware word size settings on the \
-Hardware Implementation pane to match your compiler word sizes as \
-defined in limits.h of the compiler. Alternatively, you can \
-select the Test hardware is the same as production hardware option and \
-select the Enable portable word sizes option on the Code Generation > \
-Verification pane for ERT based targets, which will disable the \
-preprocessor word size checks.
-#endif
-
-#if ( USHRT_MAX != (0xFFFFU) ) || ( SHRT_MAX != (0x7FFF) )
-#error Code was generated for compiler with different sized ushort/short. \
-Consider adjusting Test hardware word size settings on the \
-Hardware Implementation pane to match your compiler word sizes as \
-defined in limits.h of the compiler. Alternatively, you can \
-select the Test hardware is the same as production hardware option and \
-select the Enable portable word sizes option on the Code Generation > \
-Verification pane for ERT based targets, which will disable the \
-preprocessor word size checks.
-#endif
-
-#if ( UINT_MAX != (0xFFFFFFFFU) ) || ( INT_MAX != (0x7FFFFFFF) )
-#error Code was generated for compiler with different sized uint/int. \
-Consider adjusting Test hardware word size settings on the \
-Hardware Implementation pane to match your compiler word sizes as \
-defined in limits.h of the compiler. Alternatively, you can \
-select the Test hardware is the same as production hardware option and \
-select the Enable portable word sizes option on the Code Generation > \
-Verification pane for ERT based targets, which will disable the \
-preprocessor word size checks.
-#endif
-
-#if ( ULONG_MAX != (0xFFFFFFFFU) ) || ( LONG_MAX != (0x7FFFFFFF) )
-#error Code was generated for compiler with different sized ulong/long. \
-Consider adjusting Test hardware word size settings on the \
-Hardware Implementation pane to match your compiler word sizes as \
-defined in limits.h of the compiler. Alternatively, you can \
-select the Test hardware is the same as production hardware option and \
-select the Enable portable word sizes option on the Code Generation > \
-Verification pane for ERT based targets, which will disable the \
-preprocessor word size checks.
-#endif
-
-/* Macros for accessing real-time model data structure */
-#ifndef rtmGetErrorStatus
-#define rtmGetErrorStatus(rtm)         (*((rtm)->errorStatus))
-#endif
-
-#ifndef rtmSetErrorStatus
-#define rtmSetErrorStatus(rtm, val)    (*((rtm)->errorStatus) = (val))
-#endif
-
-#ifndef rtmGetErrorStatusPointer
-#define rtmGetErrorStatusPointer(rtm)  (rtm)->errorStatus
-#endif
-
-#ifndef rtmSetErrorStatusPointer
-#define rtmSetErrorStatusPointer(rtm, val) ((rtm)->errorStatus = (val))
-#endif
-#endif                                 /* RTW_HEADER_SOH_private_h_ */
-
-/*
- * File trailer for generated code.
- *
- * [EOF]
- */

+ 0 - 30
inc/EmbeddedCoder_inc/SOH_types.h

@@ -1,30 +0,0 @@
-/*
- * File: SOH_types.h
- *
- * Code generated for Simulink model 'SOH'.
- *
- * Model version                  : 1.38
- * Simulink Coder version         : 9.4 (R2020b) 29-Jul-2020
- * C/C++ source code generated on : Thu Sep  9 18:12:51 2021
- *
- * Target selection: ert.tlc
- * Embedded hardware selection: Intel->x86-64 (Windows64)
- * Code generation objectives: Unspecified
- * Validation result: Not run
- */
-
-#ifndef RTW_HEADER_SOH_types_h_
-#define RTW_HEADER_SOH_types_h_
-
-/* Model Code Variants */
-
-/* Forward declaration for rtModel */
-typedef struct tag_RTM_SOH_T RT_MODEL_SOH_T;
-
-#endif                                 /* RTW_HEADER_SOH_types_h_ */
-
-/*
- * File trailer for generated code.
- *
- * [EOF]
- */

+ 1 - 89
inc/EmbeddedCoder_inc/SPM.h

@@ -1,97 +1,9 @@
-/*
- * File: SPM.h
- *
- * Code generated for Simulink model 'SPM'.
- *
- * Model version                  : 1.31
- * Simulink Coder version         : 9.4 (R2020b) 29-Jul-2020
- * C/C++ source code generated on : Thu Sep  9 18:13:23 2021
- *
- * Target selection: ert.tlc
- * Embedded hardware selection: Intel->x86-64 (Windows64)
- * Code generation objectives: Unspecified
- * Validation result: Not run
- */
-
-#ifndef RTW_HEADER_SPM_h_
-#define RTW_HEADER_SPM_h_
-#ifndef SPM_COMMON_INCLUDES_
-#define SPM_COMMON_INCLUDES_
 #include "rtwtypes.h"
-#include "zero_crossing_types.h"
-#endif                                 /* SPM_COMMON_INCLUDES_ */
-
-#include "SPM_types.h"
-
-/* Child system includes */
-#ifndef SPM_MDLREF_HIDE_CHILD_
-#define SOH_MDLREF_HIDE_CHILD_
-#include "SOH.h"
-#endif                                 /*SPM_MDLREF_HIDE_CHILD_*/
-
-#ifndef SPM_MDLREF_HIDE_CHILD_
-#define BLC_MDLREF_HIDE_CHILD_
-#include "BLC.h"
-#endif                                 /*SPM_MDLREF_HIDE_CHILD_*/
-
-#ifndef SPM_MDLREF_HIDE_CHILD_
-#define SOC_MDLREF_HIDE_CHILD_
-#include "SOC.h"
-#endif                                 /*SPM_MDLREF_HIDE_CHILD_*/
-
-/* Includes for objects with custom storage classes. */
 #include "BCUCal.h"
 #include "BCUDisp.h"
-#ifndef SPM_MDLREF_HIDE_CHILD_
-
-/* Real-time Model Data Structure */
-struct tag_RTM_SPM_T {
-  const char_T **errorStatus;
-};
-
-#endif                                 /*SPM_MDLREF_HIDE_CHILD_*/
-
-#ifndef SPM_MDLREF_HIDE_CHILD_
-
-typedef struct {
-  RT_MODEL_SPM_T rtm;
-} MdlrefDW_SPM_T;
-
-#endif                                 /*SPM_MDLREF_HIDE_CHILD_*/
+extern boolean_T FirstRun_SPM;
 
 extern void SPM_Init(void);
-extern void SPM_Disable(void);
 extern void SPM(void);
 
-/* Model reference registration function */
-extern void SPM_initialize(const char_T **rt_errorStatus);
-
-#ifndef SPM_MDLREF_HIDE_CHILD_
-
-extern MdlrefDW_SPM_T SPM_MdlrefDW;
-
-#endif                                 /*SPM_MDLREF_HIDE_CHILD_*/
-
-/*-
- * The generated code includes comments that allow you to trace directly
- * back to the appropriate location in the model.  The basic format
- * is <system>/block_name, where system is the system number (uniquely
- * assigned by Simulink) and block_name is the name of the block.
- *
- * Use the MATLAB hilite_system command to trace the generated code back
- * to the model.  For example,
- *
- * hilite_system('<S3>')    - opens system 3
- * hilite_system('<S3>/Kp') - opens and selects block Kp which resides in S3
- *
- * Here is the system hierarchy for this model
- *
- * '<Root>' : 'SPM'
- */
-#endif                                 /* RTW_HEADER_SPM_h_ */
 
-/*
- * File trailer for generated code.
- *
- * [EOF]
- */

+ 0 - 90
inc/EmbeddedCoder_inc/SPM_private.h

@@ -1,90 +0,0 @@
-/*
- * File: SPM_private.h
- *
- * Code generated for Simulink model 'SPM'.
- *
- * Model version                  : 1.31
- * Simulink Coder version         : 9.4 (R2020b) 29-Jul-2020
- * C/C++ source code generated on : Thu Sep  9 18:13:23 2021
- *
- * Target selection: ert.tlc
- * Embedded hardware selection: Intel->x86-64 (Windows64)
- * Code generation objectives: Unspecified
- * Validation result: Not run
- */
-
-#ifndef RTW_HEADER_SPM_private_h_
-#define RTW_HEADER_SPM_private_h_
-#include "rtwtypes.h"
-#include "zero_crossing_types.h"
-#ifndef UCHAR_MAX
-#include <limits.h>
-#endif
-
-#if ( UCHAR_MAX != (0xFFU) ) || ( SCHAR_MAX != (0x7F) )
-#error Code was generated for compiler with different sized uchar/char. \
-Consider adjusting Test hardware word size settings on the \
-Hardware Implementation pane to match your compiler word sizes as \
-defined in limits.h of the compiler. Alternatively, you can \
-select the Test hardware is the same as production hardware option and \
-select the Enable portable word sizes option on the Code Generation > \
-Verification pane for ERT based targets, which will disable the \
-preprocessor word size checks.
-#endif
-
-#if ( USHRT_MAX != (0xFFFFU) ) || ( SHRT_MAX != (0x7FFF) )
-#error Code was generated for compiler with different sized ushort/short. \
-Consider adjusting Test hardware word size settings on the \
-Hardware Implementation pane to match your compiler word sizes as \
-defined in limits.h of the compiler. Alternatively, you can \
-select the Test hardware is the same as production hardware option and \
-select the Enable portable word sizes option on the Code Generation > \
-Verification pane for ERT based targets, which will disable the \
-preprocessor word size checks.
-#endif
-
-#if ( UINT_MAX != (0xFFFFFFFFU) ) || ( INT_MAX != (0x7FFFFFFF) )
-#error Code was generated for compiler with different sized uint/int. \
-Consider adjusting Test hardware word size settings on the \
-Hardware Implementation pane to match your compiler word sizes as \
-defined in limits.h of the compiler. Alternatively, you can \
-select the Test hardware is the same as production hardware option and \
-select the Enable portable word sizes option on the Code Generation > \
-Verification pane for ERT based targets, which will disable the \
-preprocessor word size checks.
-#endif
-
-#if ( ULONG_MAX != (0xFFFFFFFFU) ) || ( LONG_MAX != (0x7FFFFFFF) )
-#error Code was generated for compiler with different sized ulong/long. \
-Consider adjusting Test hardware word size settings on the \
-Hardware Implementation pane to match your compiler word sizes as \
-defined in limits.h of the compiler. Alternatively, you can \
-select the Test hardware is the same as production hardware option and \
-select the Enable portable word sizes option on the Code Generation > \
-Verification pane for ERT based targets, which will disable the \
-preprocessor word size checks.
-#endif
-
-/* Macros for accessing real-time model data structure */
-#ifndef rtmGetErrorStatus
-#define rtmGetErrorStatus(rtm)         (*((rtm)->errorStatus))
-#endif
-
-#ifndef rtmSetErrorStatus
-#define rtmSetErrorStatus(rtm, val)    (*((rtm)->errorStatus) = (val))
-#endif
-
-#ifndef rtmGetErrorStatusPointer
-#define rtmGetErrorStatusPointer(rtm)  (rtm)->errorStatus
-#endif
-
-#ifndef rtmSetErrorStatusPointer
-#define rtmSetErrorStatusPointer(rtm, val) ((rtm)->errorStatus = (val))
-#endif
-#endif                                 /* RTW_HEADER_SPM_private_h_ */
-
-/*
- * File trailer for generated code.
- *
- * [EOF]
- */

+ 0 - 30
inc/EmbeddedCoder_inc/SPM_types.h

@@ -1,30 +0,0 @@
-/*
- * File: SPM_types.h
- *
- * Code generated for Simulink model 'SPM'.
- *
- * Model version                  : 1.31
- * Simulink Coder version         : 9.4 (R2020b) 29-Jul-2020
- * C/C++ source code generated on : Thu Sep  9 18:13:23 2021
- *
- * Target selection: ert.tlc
- * Embedded hardware selection: Intel->x86-64 (Windows64)
- * Code generation objectives: Unspecified
- * Validation result: Not run
- */
-
-#ifndef RTW_HEADER_SPM_types_h_
-#define RTW_HEADER_SPM_types_h_
-
-/* Model Code Variants */
-
-/* Forward declaration for rtModel */
-typedef struct tag_RTM_SPM_T RT_MODEL_SPM_T;
-
-#endif                                 /* RTW_HEADER_SPM_types_h_ */
-
-/*
- * File trailer for generated code.
- *
- * [EOF]
- */

+ 24 - 0
inc/EmbeddedCoder_inc/div_repeat_s32_floor.h

@@ -0,0 +1,24 @@
+/*
+ * File: div_repeat_s32_floor.h
+ *
+ * Code generated for Simulink model 'SOC'.
+ *
+ * Model version                  : 1.52
+ * Simulink Coder version         : 9.4 (R2020b) 29-Jul-2020
+ * C/C++ source code generated on : Tue Sep 14 16:42:25 2021
+ */
+
+#ifndef RTW_HEADER_div_repeat_s32_floor_h_
+#define RTW_HEADER_div_repeat_s32_floor_h_
+#include "rtwtypes.h"
+
+extern int32_T div_repeat_s32_floor(int32_T numerator, int32_T denominator,
+  uint32_T nRepeatSub);
+
+#endif                                 /* RTW_HEADER_div_repeat_s32_floor_h_ */
+
+/*
+ * File trailer for generated code.
+ *
+ * [EOF]
+ */

+ 23 - 0
inc/EmbeddedCoder_inc/div_s32_floor.h

@@ -0,0 +1,23 @@
+/*
+ * File: div_s32_floor.h
+ *
+ * Code generated for Simulink model 'SOC'.
+ *
+ * Model version                  : 1.52
+ * Simulink Coder version         : 9.4 (R2020b) 29-Jul-2020
+ * C/C++ source code generated on : Tue Sep 14 16:42:25 2021
+ */
+
+#ifndef RTW_HEADER_div_s32_floor_h_
+#define RTW_HEADER_div_s32_floor_h_
+#include "rtwtypes.h"
+
+extern int32_T div_s32_floor(int32_T numerator, int32_T denominator);
+
+#endif                                 /* RTW_HEADER_div_s32_floor_h_ */
+
+/*
+ * File trailer for generated code.
+ *
+ * [EOF]
+ */

+ 23 - 0
inc/EmbeddedCoder_inc/mul_s32_loSR.h

@@ -0,0 +1,23 @@
+/*
+ * File: mul_s32_loSR.h
+ *
+ * Code generated for Simulink model 'SOC'.
+ *
+ * Model version                  : 1.52
+ * Simulink Coder version         : 9.4 (R2020b) 29-Jul-2020
+ * C/C++ source code generated on : Tue Sep 14 16:42:25 2021
+ */
+
+#ifndef RTW_HEADER_mul_s32_loSR_h_
+#define RTW_HEADER_mul_s32_loSR_h_
+#include "rtwtypes.h"
+
+extern int32_T mul_s32_loSR(int32_T a, int32_T b, uint32_T aShift);
+
+#endif                                 /* RTW_HEADER_mul_s32_loSR_h_ */
+
+/*
+ * File trailer for generated code.
+ *
+ * [EOF]
+ */

+ 23 - 0
inc/EmbeddedCoder_inc/mul_s32_sr32_ceil.h

@@ -0,0 +1,23 @@
+/*
+ * File: mul_s32_sr32_ceil.h
+ *
+ * Code generated for Simulink model 'SOC'.
+ *
+ * Model version                  : 1.52
+ * Simulink Coder version         : 9.4 (R2020b) 29-Jul-2020
+ * C/C++ source code generated on : Tue Sep 14 16:42:25 2021
+ */
+
+#ifndef RTW_HEADER_mul_s32_sr32_ceil_h_
+#define RTW_HEADER_mul_s32_sr32_ceil_h_
+#include "rtwtypes.h"
+
+extern int32_T mul_s32_sr32_ceil(int32_T a, int32_T b);
+
+#endif                                 /* RTW_HEADER_mul_s32_sr32_ceil_h_ */
+
+/*
+ * File trailer for generated code.
+ *
+ * [EOF]
+ */

+ 606 - 224
src/AppFunc.c

@@ -9,6 +9,412 @@
 #include "AppFunc.h"
 #include "numeric.h"
 #include "hal_module_adapter.h"
+void FaultDetectFunc(UINT16 *ErrorBufferArray)
+{
+	static UINT16 HeatErrorCounter = 0;
+	static UINT16 CollecErrorCounter = 0;
+	static UINT16 VbatErrorCounter = 0;
+	UINT16 ErrorNumTemp = 0;
+	UINT8 ret;
+	if(battWarningState!=0)
+	{
+		ret = ((battWarningState) & 0x01) == 1 ;
+		if (ret)
+		{
+			ErrorNumTemp = 7;
+			PutErrorBufferArray(ErrorBufferArray,ErrorNumTemp);
+			//str += "ERROR:存在电芯过放告警故障!!\n";单体电压过低
+		}
+		ret = ((battWarningState >> 1) & 0x01) == 1 ;
+		if (ret)
+		{
+			ErrorNumTemp = 10;
+			PutErrorBufferArray(ErrorBufferArray,ErrorNumTemp);
+			//str += "ERROR:存在总电压过放告警故障!!\n";总电压过低
+		}
+		ret = ((battWarningState >> 2) & 0x01) == 1 ;
+		if (ret)
+		{
+			ErrorNumTemp = 8;
+			PutErrorBufferArray(ErrorBufferArray,ErrorNumTemp);
+			//str += "ERROR:存在电芯过压告警故障!!\n";
+		}
+		ret = ((battWarningState >> 3) & 0x01) == 1 ;
+		if (ret)
+		{
+			ErrorNumTemp = 11;
+			PutErrorBufferArray(ErrorBufferArray,ErrorNumTemp);
+			//str += "ERROR:存在总电压过压告警故障!!\n";
+		}
+		ret = ((battWarningState >> 4) & 0x01) == 1 ;
+		if (ret)
+		{
+			ErrorNumTemp = 12;
+			PutErrorBufferArray(ErrorBufferArray,ErrorNumTemp);
+			//str += "ERROR:存在放电过流告警故障!!\n";
+		}
+		ret = ((battWarningState >> 5) & 0x01) == 1 ;
+		if (ret)
+		{
+			ErrorNumTemp = 13;
+			PutErrorBufferArray(ErrorBufferArray,ErrorNumTemp);
+			//str += "ERROR:存在充电过流告警故障!!\n";
+		}
+		ret = ((battWarningState >> 6) & 0x01) == 1 ;
+		if (ret)
+		{
+			ErrorNumTemp = 2;
+			PutErrorBufferArray(ErrorBufferArray,ErrorNumTemp);
+			//str += "ERROR:存在放电过温告警故障!!\n";
+		}
+		ret = ((battWarningState >> 7) & 0x01) == 1 ;
+		if (ret)
+		{
+			ErrorNumTemp = 2;
+			PutErrorBufferArray(ErrorBufferArray,ErrorNumTemp);
+			//str += "ERROR:存在充电过温告警故障!!\n";
+		}
+		ret = ((battWarningState >> 8) & 0x01) == 1 ;
+		if (ret)
+		{
+			//str += "ERROR:存在环境高温告警故障!!\n";
+		}
+		ret = ((battWarningState >> 9) & 0x01) == 1 ;
+		if (ret)
+		{
+			//str += "ERROR:存在环境低温告警故障!!\n";
+		}
+		ret = ((battWarningState >> 10) & 0x01) == 1 ;
+		if (ret)
+		{
+			ErrorNumTemp = 27;
+			PutErrorBufferArray(ErrorBufferArray,ErrorNumTemp);
+			//str += "ERROR:存在battSOC低告警故障!!\n";
+		}
+		ret = ((battWarningState >> 11) & 0x01) == 1 ;
+		if (ret)
+		{
+			ErrorNumTemp = 3;
+			PutErrorBufferArray(ErrorBufferArray,ErrorNumTemp);
+			//str += "ERROR:存在MOS高温告警故障!!\n";
+		}
+		ret = ((battWarningState >> 16) & 0x01) == 1;
+		if (ret)
+		{
+			ErrorNumTemp = 18;
+			PutErrorBufferArray(ErrorBufferArray,ErrorNumTemp);
+			//str += "ERROR:存在温度采集失效/传感器故障!!\n";
+		}
+		ret = ((battWarningState >> 17) & 0x01) == 1;
+		if (ret)
+		{
+			ErrorNumTemp = 19;
+			PutErrorBufferArray(ErrorBufferArray,ErrorNumTemp);
+			//str += "ERROR:存在电压采集失效/断线故障!!\n";
+		}
+		ret = ((battWarningState >> 18) & 0x01) == 1;
+		if (ret)
+		{
+			ErrorNumTemp = 17;
+			PutErrorBufferArray(ErrorBufferArray,ErrorNumTemp);
+			//str += "ERROR:存在放电MOS失效故障!!\n";
+		}
+		ret = ((battWarningState >> 19) & 0x01) == 1;
+		if (ret)
+		{
+			ErrorNumTemp = 16;
+			PutErrorBufferArray(ErrorBufferArray,ErrorNumTemp);
+			//str += "ERROR:存在充电MOS失效故障!!\n";
+		}
+		ret = ((battWarningState >> 20) & 0x01) == 1;
+		if (ret)
+		{
+			ErrorNumTemp = 22;
+			PutErrorBufferArray(ErrorBufferArray,ErrorNumTemp);
+			//str += "ERROR:存在电芯不均衡告警!!\n";
+		}
+		ret = ((battWarningState >> 22) & 0x01) == 1;
+		if (ret)
+		{
+			ErrorNumTemp = 1;
+			PutErrorBufferArray(ErrorBufferArray,ErrorNumTemp);
+			//str += "ERROR:存在放电低温告警故障!!\n";
+		}
+		ret = ((battWarningState >> 23) & 0x01) == 1 ;
+		if (ret)
+		{
+			ErrorNumTemp = 1;
+			PutErrorBufferArray(ErrorBufferArray,ErrorNumTemp);
+			//str += "ERROR:存在充电低温告警故障!!\n";
+		}
+	}
+
+	if(UartErrorFlag==1)//内网通信故障
+	{
+		ErrorNumTemp = 33;
+		PutErrorBufferArray(ErrorBufferArray,ErrorNumTemp);
+	}
+	if((AvgBattTemp>=45+40)&&(battHeatEnableState==0x00)&&(MOSTemp>=70+40))//温度的判定需要加40摄氏度,如果模组最高>=45度,模组最低>=45度,mos温度>=70度,并且加热关闭,持续超过10s,则断开继电器,锁定放电mos
+	{
+		HeatErrorCounter++;
+		if(HeatErrorCounter>100)
+		{
+			AppDataInfo.ErrorMsg = 20;
+			AppDataInfo.appDataModify = TRUE;
+			AppDataInfo.RelayControl  =  TRUE;
+			AppDataInfo.BattForceLock = TRUE;
+		}
+	}
+	else
+	{
+		HeatErrorCounter = 0;
+	}
+	if (AppDataInfo.ErrorMsg !=0)
+	{
+		ErrorNumTemp = 20;
+		PutErrorBufferArray(ErrorBufferArray,ErrorNumTemp);
+	}
+
+	if(PowerVoltage<9*1000||PowerVoltage>90*1000)
+	{
+		VbatErrorCounter++;
+		if(VbatErrorCounter>=100)
+		{
+			ErrorNumTemp = 37;
+			PutErrorBufferArray(ErrorBufferArray,ErrorNumTemp);
+		}
+	}
+	else
+	{
+		VbatErrorCounter = 0;
+	}
+	if(fastChargeTemp==0||normalChargeTemp==0||heatTemp1==0||heatTemp2==0)
+	{
+		CollecErrorCounter++;
+		if(CollecErrorCounter>100)
+		{
+			ErrorNumTemp = 18;
+			PutErrorBufferArray(ErrorBufferArray,ErrorNumTemp);
+		}
+	}
+	else 
+	{	CollecErrorCounter = 0;
+		if(fastChargeTemp>(50+40)||normalChargeTemp>(50+40))
+		{
+			ErrorNumTemp = 4;
+			PutErrorBufferArray(ErrorBufferArray,ErrorNumTemp);
+		}
+		if(heatTemp1>(50+40)||heatTemp2>(50+40))
+		{
+			ErrorNumTemp = 5;
+			PutErrorBufferArray(ErrorBufferArray,ErrorNumTemp);
+		}
+	}
+	if((maxCellTemp-minCellTemp)>20)
+	{
+		ErrorNumTemp = 6;
+		PutErrorBufferArray(ErrorBufferArray,ErrorNumTemp);
+	}
+	return;
+}
+void PutErrorBufferArray(UINT16 *ErrorBufferArray,UINT16 ErrorTemp)//临时函数处理
+{	
+	for(UINT8 i=0;i<20;i++)
+	{
+		if(*(ErrorBufferArray+i)==0)
+		{
+			*(ErrorBufferArray+i) = ErrorTemp;
+			return;
+		}
+		else
+		{
+			continue;
+		}
+	}
+	return;
+}
+void ExpiryTimeCal(UINT8 *StartTimeArray,UINT16 rentalDays,UINT8 *ExpiryTimeArray)
+{
+    UINT8 lastday = 0;
+	UINT8 year = 0,month = 0,hour = 0,minute = 0,second = 0;
+	UINT16 day = 0;
+	year= *(StartTimeArray+0);
+	month=*(StartTimeArray+1);
+	day=  *(StartTimeArray+2) + rentalDays;
+	if(month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12)
+	{
+		lastday = 31;
+	}
+    else if(month == 4 || month == 6 || month == 9 || month == 11)
+	{
+		lastday = 30;
+	}
+    else
+	{
+		if((year%400 == 0)||(year%4 == 0 && year%100 != 0))
+			lastday = 29;
+		else
+			lastday = 28;
+	}
+	while(day > lastday)
+	{ 
+		day -= lastday;
+		month += 1;
+
+		if(month > 12)
+		{
+			month -= 12;
+			year += 1;
+		}
+		if(month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12)
+		{
+			lastday = 31;
+		}
+		else if(month == 4 || month == 6 || month == 9 || month == 11)
+		{
+			lastday = 30;
+		}
+		else
+		{
+			if((year%400 == 0)||(year%4 == 0 && year%100 != 0))
+				lastday = 29;
+			else
+				lastday = 28;
+		}
+	}
+	*(ExpiryTimeArray+0) = year;
+	*(ExpiryTimeArray+1) = month;
+	*(ExpiryTimeArray+2) = day;
+	*(ExpiryTimeArray+3) = *(StartTimeArray+3);
+	*(ExpiryTimeArray+4) = *(StartTimeArray+4);
+	*(ExpiryTimeArray+5) = *(StartTimeArray+5);
+	return;
+}
+INT8 rentalEndDetectFunc(void)
+{
+	OsaUtcTimeTValue TimeStracture;
+	UTC8TimeType UTC8Time,ExpiryTime;
+	UINT16 year;
+    UINT8 month,day,hour,minute,sec;
+	appGetSystemTimeUtcSync(&TimeStracture);
+    year=(TimeStracture.UTCtimer1&0xffff0000)>>16;
+    month=(TimeStracture.UTCtimer1&0xff00)>>8;
+    day=TimeStracture.UTCtimer1&0xff;
+    hour=(TimeStracture.UTCtimer2&0xff000000)>>24;
+    minute=(TimeStracture.UTCtimer2&0xff0000)>>16;
+    sec=(TimeStracture.UTCtimer2&0xff00)>>8;
+    UTCToBeijing((UTC8TimeType *)&UTC8Time,year,month,day,hour,minute,sec);	
+	if(UTC8Time.year>2000)
+	{
+		#ifdef USING_PRINTF
+            printf("retal Jug:%d %d %d %d,%d %d %d %d\n",UTC8Time.year,UTC8Time.month,UTC8Time.day,UTC8Time.hour,AppDataInfo.ExpiryTimeArray[0],AppDataInfo.ExpiryTimeArray[1],AppDataInfo.ExpiryTimeArray[2],AppDataInfo.ExpiryTimeArray[3]);
+        #endif
+        if(((UTC8Time.year - 0x07D0) & 0xFF)==AppDataInfo.ExpiryTimeArray[0])//年份相等判定月份
+        {
+            if(UTC8Time.month==AppDataInfo.ExpiryTimeArray[1])//月份相等判定日期
+            {
+                if(UTC8Time.day==AppDataInfo.ExpiryTimeArray[2])//日期相等判定小时
+                {
+                    // if(UTC8Time.hour<=AppDataInfo.ExpiryTimeArray[3])//小时相等不锁定,小时超出锁定
+                    // {
+                    //     return 0;
+                    // }
+                    // else
+                    // {
+                    //     return 1;
+                    // }
+                    return 0;
+                }
+                else if(UTC8Time.day>AppDataInfo.ExpiryTimeArray[2])
+                {
+                    return 1;
+                }
+                else if(UTC8Time.day<AppDataInfo.ExpiryTimeArray[2])
+                {
+                    return 0;
+                }
+            }
+            else if(UTC8Time.month>AppDataInfo.ExpiryTimeArray[1])//实际月份大于终止月份
+            {
+                return 1;
+            }
+            else if(UTC8Time.month<AppDataInfo.ExpiryTimeArray[1])//实际月份小于终止月份
+            {
+                return 0;
+            }
+        }
+        else if(((UTC8Time.year - 0x07D0) & 0xFF)>AppDataInfo.ExpiryTimeArray[0])//实际年份大于终止年份
+        {
+            return 1;
+        }
+        else if(((UTC8Time.year - 0x07D0) & 0xFF)<AppDataInfo.ExpiryTimeArray[0])//年比较,实际年份小于终止年份
+        {
+            return 0;
+        }
+	}
+    else
+    {
+        return -1;//没有获取到时间返回
+    }
+
+}
+void BattLockFunc(void)
+{
+    if(AppDataInfo.RentalType==0)//测试模式
+    {
+        ;
+    }
+    else if (AppDataInfo.RentalType==1)//零售模式
+    {
+        if(AppDataInfo.RentalLock==TRUE)
+        {
+            AppDataInfo.UserLock = FALSE;
+            AppDataInfo.RentalLock=FALSE;
+            AppDataInfo.appDataModify=TRUE; 
+        }
+    }
+    else if(AppDataInfo.RentalType==2)// 租赁模式
+    {
+        INT8 ret = -1;
+        ret = rentalEndDetectFunc();
+        if(ret==1 && AppDataInfo.RentalLock==FALSE)//租期判定是否超期函数
+        {
+            #ifdef USING_PRINTF
+                printf("retal lock,%d\n",ret);
+            #endif
+            AppDataInfo.RentalLock=TRUE;
+            AppDataInfo.appDataModify=TRUE;
+        }
+        else if(ret==0 && AppDataInfo.RentalLock==TRUE)
+        {
+            #ifdef USING_PRINTF
+                printf("retal unlock,%d\n",ret);
+            #endif
+            AppDataInfo.RentalLock=FALSE;
+            AppDataInfo.appDataModify=TRUE;
+            AppDataInfo.UserLock = FALSE;
+        }
+    }
+	if(AppDataInfo.BattForceLock==FALSE)
+	{
+		if(AppDataInfo.RentalLock==FALSE&&AppDataInfo.UserLock==FALSE)
+		{
+			AppDataInfo.BattLock = FALSE;
+			AppDataInfo.appDataModify = TRUE;
+		}
+		else if(AppDataInfo.RentalLock==TRUE||AppDataInfo.UserLock==TRUE)
+		{
+			AppDataInfo.BattLock = TRUE;
+			AppDataInfo.appDataModify = TRUE;
+		} 
+	}
+	else
+	{
+		AppDataInfo.BattLock = TRUE;
+		AppDataInfo.appDataModify = TRUE;
+	}	  
+    return;
+}
 void BattWorkDelayFunc(UINT8 battWorkCurrentState)
 {
 	static UINT16 workDelayCounter = 0;
@@ -204,28 +610,23 @@ BOOL BattHeaterSwitch(UINT8* heaterSwitch,UINT8 HeatForceControl)
  * 输出:LED控制
  * 处理:根据不同状态进行LED显示
 ***********************************************************************************************************************/
-void relayControlFunc(UINT8 RingTimes,float DutyRatio)
+void relayControlFunc(float DutyRatio)
 {
 	static UINT8  BuzzerTimer = 0;
 	UINT8  BuzzerPeriod = 10;//1000ms
-	UINT8 timerCount=0;
 	BuzzerTimer++;
-	while(timerCount<RingTimes)
+	if(BuzzerTimer<(UINT8)(BuzzerPeriod*DutyRatio))
 	{
-		if(BuzzerTimer<(UINT8)(BuzzerPeriod*DutyRatio))
-		{
-			relayControl(TRUE);
-		}
-		else if(BuzzerTimer>=(UINT8)(BuzzerPeriod*DutyRatio) && BuzzerTimer<BuzzerPeriod)
-		{
-			relayControl(FALSE);
-		}
-		else
-		{
-			relayControl(FALSE);
-			BuzzerTimer = 0;
-		}
-		timerCount++;
+		relayControl(TRUE);
+	}
+	else if(BuzzerTimer>=(UINT8)(BuzzerPeriod*DutyRatio) && BuzzerTimer<BuzzerPeriod)
+	{
+		relayControl(FALSE);
+	}
+	else
+	{
+		relayControl(FALSE);
+		BuzzerTimer = 0;
 	}
 }
 /***********************************************************************************************************************
@@ -528,17 +929,22 @@ BOOL uartBattInfoDecode(UINT8* dataPtr)
 	UINT8 	BATT_CELL_VOL_NUM = 0,BATT_TEMP_NUM = 0;
 	UINT32  Battsumvoltage = 0;
 	BATT_CELL_VOL_NUM =  (dataPtr[(0x00)*2] << 8) | (dataPtr[(0x00)*2 + 1]);
-	if(BATT_CELL_VOL_NUM==0)
-	{
-		return FALSE;
-	}
 	BATT_TEMP_NUM = ((dataPtr[(0x01)*2] << 8) | (dataPtr[(0x01)*2 + 1]))-BMS_OTHER_TEMP;
-	if(AppNVMData.BattCellCount!=BATT_CELL_VOL_NUM || AppNVMData.BattTempCount!=BATT_TEMP_NUM )
+	if((AppNVMData.BattCellCount!=BATT_CELL_VOL_NUM || AppNVMData.BattTempCount!=BATT_TEMP_NUM) &&(BATT_CELL_VOL_NUM !=0 ) && (BATT_TEMP_NUM!=0)  )
 	{
 		AppNVMData.appDataModify = TRUE;
 		AppNVMData.BattCellCount = BATT_CELL_VOL_NUM;
 		AppNVMData.BattTempCount = BATT_TEMP_NUM;
 	}
+	else
+	{
+		BATT_CELL_VOL_NUM = AppNVMData.BattCellCount;
+		BATT_TEMP_NUM = AppNVMData.BattTempCount;
+	}
+	#ifdef USING_PRINTF1
+        printf("BattCellCount:%d,BATT_CELL_VOL_NUM:%d ",AppNVMData.BattCellCount,BATT_CELL_VOL_NUM);
+		printf("BattTempCount:%d,BATT_TEMP_NUM:%d ",AppNVMData.BattTempCount,BATT_TEMP_NUM);
+    #endif	
     for(i=0;i<BATT_CELL_VOL_NUM;i++)
     {
 		battCellU[i] = (dataPtr[(0x02+i)*2] << 8) | dataPtr[(0x02+i)*2 + 1];
@@ -628,192 +1034,19 @@ BOOL uartBattInfoDecode(UINT8* dataPtr)
 
 	maxCellTemp = 0x00;
 	minCellTemp = 0xFF;
+	AvgBattTemp = 0;
+	UINT16 SumBattTemp = 0;
 	for(i=0;i<BATT_TEMP_NUM;i++)
 	{
+		SumBattTemp = SumBattTemp + battCellTemp[i];
 		maxCellTemp = max(maxCellTemp,battCellTemp[i]);
 		minCellTemp = min(minCellTemp,battCellTemp[i]);		
 	}
+	AvgBattTemp = (SumBattTemp - maxCellTemp - minCellTemp)/(BATT_TEMP_NUM - 2);
 	nbSwVersion = APPSWVERSION;
 	nbHwVersion = HWVERSION;
-	BmsErrorDecode(battWarningState);
     return true;
 }
-/***********************************************************************************************************************
- * BMS故障解码函数
- * 输入:BMS故障编码
- * 输出:状态参数
- * 处理:将BMS故障编码依次解为标准故障码
-***********************************************************************************************************************/
-static UINT8 BmsErrorDecode(UINT32 battWarningState)
-{
-	UINT16 ErrorNumTemp;
-	UINT8 ret;
-	if(battWarningState==0)
-	{
-		return 0;
-	}
-	else
-	{
-		if(osOK==osMutexAcquire(Error_Mutex, 100))
-		{
-			ret = ((battWarningState) & 0x01) == 1 ;
-			if (ret)
-			{
-				ErrorNumTemp = 7;
-				PutErrorNum((UINT16 *)ErrorNum,sizeof(ErrorNum),ErrorNumTemp);
-				//str += "ERROR:存在电芯过放告警故障!!\n";单体电压过低
-			}
-
-			ret = ((battWarningState >> 1) & 0x01) == 1 ;
-			if (ret)
-			{
-				ErrorNumTemp = 10;
-				PutErrorNum((UINT16 *)ErrorNum,sizeof(ErrorNum),ErrorNumTemp);
-				//str += "ERROR:存在总电压过放告警故障!!\n";总电压过低
-			}
-
-			ret = ((battWarningState >> 2) & 0x01) == 1 ;
-			if (ret)
-			{
-				ErrorNumTemp = 8;
-				PutErrorNum((UINT16 *)ErrorNum,sizeof(ErrorNum),ErrorNumTemp);
-				//str += "ERROR:存在电芯过压告警故障!!\n";
-			}
-
-			ret = ((battWarningState >> 3) & 0x01) == 1 ;
-			if (ret)
-			{
-				ErrorNumTemp = 11;
-				PutErrorNum((UINT16 *)ErrorNum,sizeof(ErrorNum),ErrorNumTemp);
-				//str += "ERROR:存在总电压过压告警故障!!\n";
-			}
-
-			ret = ((battWarningState >> 4) & 0x01) == 1 ;
-			if (ret)
-			{
-				ErrorNumTemp = 12;
-				PutErrorNum((UINT16 *)ErrorNum,sizeof(ErrorNum),ErrorNumTemp);
-				//str += "ERROR:存在放电过流告警故障!!\n";
-			}
-
-			ret = ((battWarningState >> 5) & 0x01) == 1 ;
-			if (ret)
-			{
-				ErrorNumTemp = 13;
-				PutErrorNum((UINT16 *)ErrorNum,sizeof(ErrorNum),ErrorNumTemp);
-				//str += "ERROR:存在充电过流告警故障!!\n";
-			}
-
-			ret = ((battWarningState >> 6) & 0x01) == 1 ;
-			if (ret)
-			{
-				ErrorNumTemp = 2;
-				PutErrorNum((UINT16 *)ErrorNum,sizeof(ErrorNum),ErrorNumTemp);
-				//str += "ERROR:存在放电过温告警故障!!\n";
-			}
-
-			ret = ((battWarningState >> 7) & 0x01) == 1 ;
-			if (ret)
-			{
-				ErrorNumTemp = 2;
-				PutErrorNum((UINT16 *)ErrorNum,sizeof(ErrorNum),ErrorNumTemp);
-				//str += "ERROR:存在充电过温告警故障!!\n";
-			}
-
-			ret = ((battWarningState >> 8) & 0x01) == 1 ;
-			if (ret)
-			{
-				//str += "ERROR:存在环境高温告警故障!!\n";
-			}
-
-			ret = ((battWarningState >> 9) & 0x01) == 1 ;
-			if (ret)
-			{
-				//str += "ERROR:存在环境低温告警故障!!\n";
-			}
-
-			ret = ((battWarningState >> 10) & 0x01) == 1 ;
-			if (ret)
-			{
-				ErrorNumTemp = 27;
-				PutErrorNum((UINT16 *)ErrorNum,sizeof(ErrorNum),ErrorNumTemp);
-				//str += "ERROR:存在battSOC低告警故障!!\n";
-			}
-
-			ret = ((battWarningState >> 11) & 0x01) == 1 ;
-			if (ret)
-			{
-				ErrorNumTemp = 3;
-				PutErrorNum((UINT16 *)ErrorNum,sizeof(ErrorNum),ErrorNumTemp);
-				//str += "ERROR:存在MOS高温告警故障!!\n";
-			}
-
-			ret = ((battWarningState >> 16) & 0x01) == 1;
-			if (ret)
-			{
-				ErrorNumTemp = 18;
-				PutErrorNum((UINT16 *)ErrorNum,sizeof(ErrorNum),ErrorNumTemp);
-				//str += "ERROR:存在温度采集失效/传感器故障!!\n";
-			}
-
-			ret = ((battWarningState >> 17) & 0x01) == 1;
-			if (ret)
-			{
-				ErrorNumTemp = 19;
-				PutErrorNum((UINT16 *)ErrorNum,sizeof(ErrorNum),ErrorNumTemp);
-				//str += "ERROR:存在电压采集失效/断线故障!!\n";
-			}
-
-			ret = ((battWarningState >> 18) & 0x01) == 1;
-			if (ret)
-			{
-				ErrorNumTemp = 17;
-				PutErrorNum((UINT16 *)ErrorNum,sizeof(ErrorNum),ErrorNumTemp);
-				//str += "ERROR:存在放电MOS失效故障!!\n";
-			}
-
-			ret = ((battWarningState >> 19) & 0x01) == 1;
-			if (ret)
-			{
-				ErrorNumTemp = 16;
-				PutErrorNum((UINT16 *)ErrorNum,sizeof(ErrorNum),ErrorNumTemp);
-				//str += "ERROR:存在充电MOS失效故障!!\n";
-			}
-
-			ret = ((battWarningState >> 20) & 0x01) == 1;
-			if (ret)
-			{
-				ErrorNumTemp = 22;
-				PutErrorNum((UINT16 *)ErrorNum,sizeof(ErrorNum),ErrorNumTemp);
-				//str += "ERROR:存在电芯不均衡告警!!\n";
-			}
-
-			ret = ((battWarningState >> 22) & 0x01) == 1;
-			if (ret)
-			{
-				ErrorNumTemp = 1;
-				PutErrorNum((UINT16 *)ErrorNum,sizeof(ErrorNum),ErrorNumTemp);
-				//str += "ERROR:存在放电低温告警故障!!\n";
-			}
-
-			ret = ((battWarningState >> 23) & 0x01) == 1 ;
-			if (ret)
-			{
-				ErrorNumTemp = 1;
-				PutErrorNum((UINT16 *)ErrorNum,sizeof(ErrorNum),ErrorNumTemp);
-				//str += "ERROR:存在充电低温告警故障!!\n";
-			}
-		}
-		else
-		{
-			#ifdef USING_PRINTF
-				printf("get Muxtex error\n");
-			#endif
-		}
-		osMutexRelease(Error_Mutex);
-	}
-	return 1;
-}
 /***********************************************************************************************************************
  * 获取故障码函数
  * 输入:故障数组和长度
@@ -906,6 +1139,41 @@ void SaveAppData(void)
         #ifdef USING_PRINTF
 			printf(" NVM: 'qxappconfig.nvm', write the file body failed\n");
 		#endif
+		OsaFclose(fp);
+    	return;
+    }
+    OsaFclose(fp);
+    return;
+}
+void SaveBcuData(void)
+{
+    OSAFILE fp = PNULL;
+    UINT32  writeCount = 0;
+	BcuDataHeader BcuDataHr;
+    fp = OsaFopen(BCU_DATAINFO_FILE_NAME, "wb");   //read & write
+    if(OsaFseek(fp, 0, SEEK_SET) != 0)
+	{
+	    OsaFclose(fp);
+        return;
+	}
+    if (fp == PNULL)
+    {
+        return;
+    }
+    BcuDataHr.fileBodySize   = sizeof(BcuDataInfo); 
+    BcuDataHr.checkSum       = OsaCalcCrcValue((UINT8 *)&BcuDataInfo, sizeof(BcuDataInfo));
+    writeCount = OsaFwrite(&BcuDataHr, sizeof(BcuDataHr), 1, fp);
+    if (writeCount != 1)
+    {
+        OsaFclose(fp);
+        return;
+    }
+    BcuDataInfo.appDataModify = FALSE;
+    writeCount = OsaFwrite(&BcuDataInfo, sizeof(BcuDataInfo), 1, fp);
+    if (writeCount != 1)
+    {
+		OsaFclose(fp);
+        return;
     }
     OsaFclose(fp);
     return;
@@ -981,6 +1249,70 @@ void LoadAppData(void)
     OsaFclose(fp);
     return;
 }
+void LoadBcuData(void)
+{
+    OSAFILE fp = PNULL;
+    UINT32  readCount = 0;
+    UINT8   crcCheck = 0;
+    void    *pReadAppConfig = (void *)&BcuDataInfo;
+	BcuDataHeader BcuDataHr;
+    fp = OsaFopen(BCU_DATAINFO_FILE_NAME, "rb");   //read only
+    if (fp == PNULL)
+    {
+        #ifdef USING_PRINTF
+            printf(" NVM, can't open NVM: 'qxappData.nvm', use the defult value\n");
+        #endif
+        setDefaultBcuDataInfo();
+        SaveBcuData();
+        return;
+    }
+    readCount = OsaFread(&BcuDataHr, sizeof(BcuDataHr), 1, fp);
+    UINT8 readtimes=0;
+    while (readCount != 1 && readtimes<=5 )
+    {
+        readtimes++;
+        readCount = OsaFread(&BcuDataHr, sizeof(BcuDataHr), 1, fp);
+        osDelay(10);
+    }
+    if(readtimes>5)
+    {
+        OsaFclose(fp);
+        setDefaultBcuDataInfo();
+        SaveBcuData();
+        return;
+    }
+    if(BcuDataHr.fileBodySize==sizeof(BcuDataInfo))//结构体数据没变动,可直接读出
+    {
+        readCount = OsaFread(pReadAppConfig, BcuDataHr.fileBodySize, 1, fp);
+        //crcCheck = OsaCalcCrcValue((UINT8 *)pReadAppConfig, sizeof(AppNVMData));
+        readtimes = 0;
+        while (readtimes<=5 && readCount != 1)
+        {
+            readtimes++;
+            readCount = OsaFread(pReadAppConfig, BcuDataHr.fileBodySize, 1, fp);
+            //crcCheck = OsaCalcCrcValue((UINT8 *)pReadAppConfig, sizeof(AppNVMData));
+        }
+    }
+    else
+    {
+        setDefaultBcuDataInfo();
+        readCount = OsaFread(pReadAppConfig, BcuDataHr.fileBodySize, 1, fp);
+        //crcCheck = OsaCalcCrcValue((UINT8 *)pReadAppConfig, sizeof(AppNVMData));
+        readtimes = 0;
+        while (readtimes<=5 && readCount != 1)
+        {
+            readtimes++;
+            readCount = OsaFread(pReadAppConfig, BcuDataHr.fileBodySize, 1, fp);
+            //crcCheck = OsaCalcCrcValue((UINT8 *)pReadAppConfig, sizeof(AppNVMData));
+        }
+        SaveBcuData();
+        #ifdef USING_PRINTF
+            printf(" Struct update\n");
+        #endif
+    }
+    OsaFclose(fp);
+    return;
+}
 /***********************************************************************************************************************
  * 配置文件保存函数
  * 输入:空
@@ -1137,8 +1469,6 @@ static void setDefaultAppConfigData(void)
     UINT8  i = 0;
     memset(&AppNVMData, 0x00, sizeof(AppConfigDataType));
 	AppNVMData.appDataModify = TRUE;		//数据更改标志位
-	// char sn[BATT_SN_LEN];
-	// appGetSNNumSync(sn);
 	memcpy(AppNVMData.battSN,DEFAULT_SN,BATT_SN_LEN);
    	AppNVMData.isBattLocked = 0;		//0:not locked;	1:locked
     AppNVMData.chargEndWorkTime = 30;     //
@@ -1172,19 +1502,31 @@ static void setDefaultAppDataInfo(void)
     AppDataInfo.AccMileage = 0;
     AppDataInfo.SysReStartCount = 0;
 	AppDataInfo.RelayControl = 0;
+	AppDataInfo.BattForceLock = 0;
 	AppDataInfo.BattLock = 0;
 	AppDataInfo.BattStolenFlag = 0;    
-	memset(AppDataInfo.blcv_Q_totalCpE, 0x00, 28*sizeof(UINT32));          
-	memset(AppDataInfo.blcv_Q_reqCpE, 0x00, 28*sizeof(UINT16));
-    AppDataInfo.socd_pct_bcuSocE = 0;            
-    AppDataInfo.socd_pct_battSocE = 0;           
-    AppDataInfo.sohd_tm_chrgStartStatE = 0;      
-    AppDataInfo.sohd_flg_chrgEndE = 0; 
-	AppDataInfo.sohv_Q_cellCapArrE[28];
-	memset(AppDataInfo.sohv_Q_cellCapArrE, 300, 28*sizeof(UINT16));
-	memset(AppDataInfo.sohv_V_chrgStartStatE, 0x00, 28*sizeof(UINT16));
-    AppDataInfo.sohd_Q_chrgE = 0;                
-	memset(AppDataInfo.sohv_Q_packCapArrE, 300, 10*sizeof(UINT16));   
+    AppDataInfo.UserLock = 0;                    // 用户锁锁定
+    AppDataInfo.RentalLock = 0;                  //租期锁锁定
+    AppDataInfo.RentalType = 0;                  //租期类型
+    memset(AppDataInfo.ExpiryTimeArray,0x00,6);          //超期时间
+	AppDataInfo.ErrorMsg = 0;
+    return;
+}
+static void setDefaultBcuDataInfo(void)
+{
+    memset(&BcuDataInfo, 0x00, sizeof(BcuDataInfo));
+    BcuDataInfo.appDataModify = false;  
+	memset(BcuDataInfo.blcv_Q_totalCpE, 0x00, 28*sizeof(UINT32));          
+	memset(BcuDataInfo.blcv_Q_reqCpE, 0x00, 28*sizeof(UINT16));
+    BcuDataInfo.socd_pct_bcuSocE = 0;            
+    BcuDataInfo.socd_pct_battSocE = 0;           
+    BcuDataInfo.sohd_tm_chrgStartStatE = 0;      
+    BcuDataInfo.sohd_flg_chrgEndE = 0; 
+	BcuDataInfo.sohv_Q_cellCapArrE[28];
+	memset(BcuDataInfo.sohv_Q_cellCapArrE, 0, 28*sizeof(UINT16));
+	memset(BcuDataInfo.sohv_V_chrgStartStatE, 0, 28*sizeof(UINT16));
+    BcuDataInfo.sohd_Q_chrgE = 0;                
+	memset(BcuDataInfo.sohv_Q_packCapArrE, 0, 10*sizeof(UINT16));   
     return;
 }
 /***********************************************************************************************************************
@@ -1838,6 +2180,10 @@ void CANEncodeFunction(UINT32 ID,UINT8* msgData)
 			*(UINT8*)(msgData +5) =battHeatEnableState&0xFF;
 			break;
 		case	0x7CD:
+			reservedSignal1 = battProtectState&0xFF;
+			reservedSignal2 = (battProtectState>>8)&0xFF;
+			reservedSignal3 = (battProtectState>>16)&0xFF;
+			reservedSignal4 = (battProtectState>>24)&0xFF;
 			*(UINT8*)(msgData +0) =reservedSignal1&0xFF;
 			*(UINT8*)(msgData +1) =reservedSignal2&0xFF;
 			*(UINT8*)(msgData +2) =reservedSignal3&0xFF;
@@ -1887,6 +2233,7 @@ void CANEncodeFunction(UINT32 ID,UINT8* msgData)
 void UDS_Service(CAN_Msg_Type* CanRxMsg)
 {
 	UINT8 i,j= 0;
+	UINT32 k=0;
 	INT8 ret,errorCount = 0;
 	BOOL boolRet = false;
 	static UINT8 snFlag = 0;
@@ -1897,6 +2244,8 @@ void UDS_Service(CAN_Msg_Type* CanRxMsg)
 	UINT32 posCode,negCode;
 	UINT32  updateDifferDataByteLen = 0;
 	static UINT8 updateDataBuffer[100];
+	static UINT8 controllerFlag = 0xFF;
+	UINT32 flashStartAddr = 0x00;
 	
 	
 	
@@ -2121,10 +2470,11 @@ void UDS_Service(CAN_Msg_Type* CanRxMsg)
 					{
 						if(UDSSubService[i] == 0x0F)  //clear the fota flash
 						{
-							if(UDSSubServiceActionCode[i] == 0x01)
+							if(UDSSubServiceActionCode[i] != 0x00 && UDSSubServiceActionCode[i] != 0xFF)
 							{
 								//Clear the Flash
-								boolRet = UDSClearFotaDownloadRegion();
+								controllerFlag = UDSSubServiceActionCode[i];
+								boolRet = UDSClearFotaDownloadRegion(controllerFlag);
 								//if ok											
 								UDSPositiveAnswer(0x05,i,(UINT32)boolRet);
 							}
@@ -2207,13 +2557,27 @@ void UDS_Service(CAN_Msg_Type* CanRxMsg)
 								if(sliceCounterFlag == 0x1FFFFFF)  //received all the 25 message of current package
 								{															
 									//write the buffer(100 byte) to flash
-									ret = (uint8_t)BSP_QSPI_Write_Safe(updateDataBuffer,FLASH_FOTA_REGION_START+(updateDifferDataPackageCounter)*100,100);
+									if(controllerFlag == 0x01)
+									{
+										flashStartAddr = FLASH_FOTA_REGION_START;
+									}
+									else if(controllerFlag == 0x02 || controllerFlag == 0x03)
+									{
+										flashStartAddr = FLASH_BMS_FOTA_START_ADDR;
+									}
+									else
+									{
+										UDSNegtiveAnswer(0x08,i,0xFFFFFFFF);
+										return;
+									}
+										
+									ret = (uint8_t)BSP_QSPI_Write_Safe(updateDataBuffer,flashStartAddr+(updateDifferDataPackageCounter)*100,100);
 									errorCount = 0;
 									while(ret != QSPI_OK && errorCount<3)  //try to write most 3 times
 									{
 										errorCount++;
-										BSP_QSPI_Erase_Safe(FLASH_FOTA_REGION_START+(updateDifferDataPackageCounter)*100,100);
-										ret = (uint8_t)BSP_QSPI_Write_Safe(updateDataBuffer,FLASH_FOTA_REGION_START+(updateDifferDataPackageCounter)*100,100);
+										BSP_QSPI_Erase_Safe(flashStartAddr+(updateDifferDataPackageCounter)*100,100);
+										ret = (uint8_t)BSP_QSPI_Write_Safe(updateDataBuffer,flashStartAddr+(updateDifferDataPackageCounter)*100,100);
 									}
 									if(ret == QSPI_OK)  // write successed
 									{
@@ -2251,16 +2615,27 @@ void UDS_Service(CAN_Msg_Type* CanRxMsg)
 				case 0x37:  //exit some one process
 					if(UDSDialogMode == 3)
 					{
-						if(UDSSubService[i] == 0x0F)  // exit the download 
+						 if(UDSSubService[i] == 0x0F)  // exit the download 
 						 {
-							UDSPositiveAnswer(0x04,i,0x00);
-					
-							downloadReady = FALSE;
+						 	if(UDSSubServiceActionCode[i] == controllerFlag)
+						 	{						 	
+								if(controllerFlag == 0x02 || controllerFlag == 0x03)//update bms
+								{
+									BMS_Fota_update_flag = true;
+								}
+								downloadReady = FALSE;
+								UDSPositiveAnswer(0x04,i,UDSSubServiceActionCode[i]);
+						 	}
+						 	else
+						 	{
+								UDSNegtiveAnswer(0x05,i,0xEE);
+						 	}
+							
 						 }
 						 else
 						 {
 							UDSNegtiveAnswer(0x05,i,0xEE);
-						}
+					     }
 					}
 					else
 					{
@@ -2413,10 +2788,17 @@ BOOL UDSAskforDownLoadData()
  * 输出:--
  * 处理:清除数据接收的flash区域
 ***********************************************************************************************************************/
-BOOL UDSClearFotaDownloadRegion()
+BOOL UDSClearFotaDownloadRegion(UINT8 controllerFlag)
 {
 	UINT8 ret = FALSE;
-	ret = BSP_QSPI_Erase_Safe(FLASH_FOTA_REGION_START, 0x46000); //512k-32k -200k = 280k -> 0x46000
+	if(controllerFlag == 0x01)
+	{
+		ret = BSP_QSPI_Erase_Safe(FLASH_FOTA_REGION_START, 0x46000); //512k-32k -200k = 280k -> 0x46000
+	}
+	else if(controllerFlag == 0x02 || controllerFlag == 0x03)
+	{
+		ret = BSP_QSPI_Erase_Safe(FLASH_BMS_FOTA_START_ADDR, FLASH_BMS_FOTA_LEN);
+	}
 	
 	if(ret == QSPI_OK)
 	{

+ 11 - 9
src/AppSignal.c

@@ -19,13 +19,14 @@ BOOL downloadReady = FALSE;
 
 
 /**declear the uint8 vars**/
-UINT8	battCellTemp[8] = {0xFF};       //Battery temperature 电池温度数值
-UINT8	MOSTemp = 0xFF;                 //mos temprature mos温度
-UINT8	packTemp = 0xFF;                //battery pack temprature   电池箱体温度
-UINT8	fastChargeTemp = 0xFF;          // fast charge plug temprature  快充插头温度
-UINT8	normalChargeTemp = 0xFF;        // normal charge plug temprature    慢充插头温度
-UINT8	heatTemp1 = 0xFF;               //Heating plate1 temperature    加热板温度1
-UINT8	heatTemp2 = 0xFF;               //Heating plate2 temperature    加热板温度2
+UINT8   AvgBattTemp = 0;
+UINT8	battCellTemp[8] = {0};       //Battery temperature 电池温度数值
+UINT8	MOSTemp =0;                 //mos temprature mos温度
+UINT8	packTemp = 0;                //battery pack temprature   电池箱体温度
+UINT8	fastChargeTemp = 0;          // fast charge plug temprature  快充插头温度
+UINT8	normalChargeTemp = 0;        // normal charge plug temprature    慢充插头温度
+UINT8	heatTemp1 = 0;               //Heating plate1 temperature    加热板温度1
+UINT8	heatTemp2 = 0;               //Heating plate2 temperature    加热板温度2
 UINT8	nbReservedTemp1 = 0xFF;         //
 UINT8	nbReservedTemp2 = 0xFF;         //
 UINT8	maxCellTemp = 0xFF;             //最高单体温度
@@ -54,6 +55,7 @@ UINT8   CanMsgEnble = 0;            //Can send status Can中断状态
 UINT8 	UDSSwitch = 0;              //下线检测标志位
 UINT8 	PosFlag = 0;                //定位信息是否有效标志位
 UINT8   UartRecvFlag = 0;           //Uart收到消息标志位0表示未收到,1表示收到
+UINT8   UartErrorFlag = 0;           //Uart故障标志位0表示正常,1表示故障
 UINT8   UartCmdRecvFlag = 0;        //Uart控制应答回复
 UINT8	UDSService[2] = {0};           //uds 服务
 UINT8	UDSSubService[2]  = {0};       // uds 子服务
@@ -83,7 +85,7 @@ UINT32	nbSwVersion = 0;       // 数据模块软件状态
 UINT32	battBalanceoInfo = 0;  //电池均衡状态
 UINT32  Battdesigncap =0xFFFFFFFF;      //battery design cap 电池包设计容量
 volatile UINT32  TimeCounter = 0x00;             //主任务定时器计数
-
+UINT32  PowerVoltage = 0;
 
 /**declear the Handle vars**/
 osMutexId_t Error_Mutex = NULL;         //故障互锁句柄
@@ -93,8 +95,8 @@ QueueHandle_t UartWriteCmdHandle = NULL;//Uart写命令队列句柄
 /**declear other vars**/   
 
 AppConfigDataType           AppNVMData;
-
 AppDataBody                 AppDataInfo;
+AppAlgorithmData            BcuDataInfo;
 
 AppSocketConnectionContext  socContext = {-1,0};  //网络连接状态
 

+ 4 - 0
src/AppTaskCan.c

@@ -136,6 +136,10 @@ static void CanTask()
 							{
 								HeatForceControl = 0x00;
 							}
+							if(CanRxMsg[i].Data[2] == 0x01)
+							{
+								BMS_Fota_update_flag = true;
+							}
 						}
 					}	
 					if(udsFlag==1)

+ 37 - 9
src/AppTaskControl.c

@@ -28,6 +28,8 @@ static void ControlTask(void* arg)
     PROC_CONTROL_STATE_SWITCH(PROCESS_CONTROL_STATE_IDLE);
     UINT32 CurrentTime = 0;
     UINT8 AdcOrder = 1;
+    UINT8 RingTimes = 0;
+    UINT16 ErrorBufferArray[20] = {0};
     while (true)
     {
         switch(gProcess_Control_Task)
@@ -47,17 +49,27 @@ static void ControlTask(void* arg)
                     CurrentTime = TimeCounter;
                     if(AppDataInfo.BattLock==FALSE && getbit(UartCmdRecvFlag,0) ==1)
                     {
-                        relayControlFunc(3,0.4);
-                        clrbit(UartCmdRecvFlag,0);
+                        relayControlFunc(0.4);
+                        RingTimes++;
+                        if(RingTimes>=3)
+                        {
+                            RingTimes = 0;
+                            clrbit(UartCmdRecvFlag,0);
+                        }
                     }
                     else if (AppDataInfo.BattLock==TRUE && getbit(UartCmdRecvFlag,0)==1)
                     {
-                        relayControlFunc(2,0.4);
-                        clrbit(UartCmdRecvFlag,0);
+                        relayControlFunc(0.4);
+                        RingTimes++;
+                        if(RingTimes>=2)
+                        {
+                            RingTimes = 0;
+                            clrbit(UartCmdRecvFlag,0);
+                        }
                     }
                     else if(BuzzerControl==TRUE && TimeCounter%10==0)
                     {
-                        relayControlFunc(1,0.4);
+                        relayControlFunc(0.4);
                     }
                 }
                 if(TimeCounter%10==0)
@@ -79,6 +91,24 @@ static void ControlTask(void* arg)
                     PROC_CONTROL_STATE_SWITCH(PROCESS_CONTROL_STATE_SLEEP);
                     break;
                 }
+
+                //临时故障诊断函数
+                memset(ErrorBufferArray,0x00,20);
+                FaultDetectFunc(ErrorBufferArray);
+                if(osOK==osMutexAcquire(Error_Mutex, 1))
+                {
+                    for(UINT8 index=0;index<20;index++)
+                    {
+                        if(ErrorBufferArray[index]!=0)
+                        {
+                            #ifdef USING_PRINTF1
+                                printf("ErrorBufferArray-%d  \t",ErrorBufferArray[index]);
+                            #endif	
+                            PutErrorNum((UINT16 *)ErrorNum,sizeof(ErrorNum),ErrorBufferArray[index]); 
+                        }
+                    }
+                }
+                osMutexRelease(Error_Mutex);
                 break;
             }
             case PROCESS_CONTROL_STATE_SLEEP:
@@ -142,10 +172,8 @@ void GetAdcValue(UINT8 num)
             heatTemp2 = LookUpRTtable(adcValue);                       
             break;
         case  VBAT:
-            NB_ADC_Get(&adcValue,VBAT);    
-            #ifdef USING_PRINTF1
-                printf("VBAT:%d\n",adcValue);
-            #endif	                    
+            NB_ADC_Get(&adcValue,VBAT);  
+            PowerVoltage =   adcValue;                    
             break;
         default:
             break;

+ 26 - 6
src/AppTaskMain.c

@@ -84,9 +84,17 @@ static void MainTask(void* arg)
                 if(TimeCounter%10==0)
                 {
                     BattWorkDelayFunc(battWorkState);
-                    #ifdef USING_PRINTF
-                        printf("[%d]-%d \n",__LINE__,TimeCounter);
+                    #ifdef USING_PRINTF1
+                        printf("[%d]-%d-%d,%d,%d \n",__LINE__,TimeCounter,socd_pct_battSoc,fastChargeTemp,normalChargeTemp);
                     #endif
+                    if(TimeCounter%(10*60)==0)
+                    {
+                        BattLockFunc();
+                    }
+                    if(AppDataInfo.appDataModify)
+                    {
+                        SaveAppData();
+                    }
                 }
                 if(WorkTimerEnd==TRUE)//从工作转换为监听的条件,定时器结束
                 {
@@ -118,13 +126,17 @@ static void MainTask(void* arg)
                     {
                         SaveAppData();
                     }
+                    if(BcuDataInfo.appDataModify)
+                    {
+                        SaveBcuData();
+                    }
                     appSetCFUN(0);
                     osDelay(1000);
                     EC_SystemReset();
                 }
-				if(AppDataInfo.appDataModify)
+				if(BcuDataInfo.appDataModify)//BCU数据实时保存
                 {
-                    SaveAppData();
+                    SaveBcuData();
                 }
                 break;
             }
@@ -146,13 +158,17 @@ static void MainTask(void* arg)
                 {
                     osDelay(100);
                 }
+                if(AppNVMData.appDataModify)
+                {
+                    SaveAppConfig();
+                }
                 if(AppDataInfo.appDataModify)
                 {
                     SaveAppData();
                 }
-                if(AppNVMData.appDataModify)
+                if(BcuDataInfo.appDataModify)
                 {
-                    SaveAppConfig();
+                    SaveBcuData();
                 }
                 #ifdef USING_PRINTF1
                     printf("[%d]%x - %x - %x - %x\n",__LINE__,SleepTimerEnd,BMS_Fota_update_flag,TCPWorkState,PadInterrupt);
@@ -181,6 +197,10 @@ static void MainTask(void* arg)
                     {
                         SaveAppConfig();
                     }
+                    if(BcuDataInfo.appDataModify)
+                    {
+                        SaveBcuData();
+                    }
                     appSetCFUN(0);
                     osDelay(1000);
                     EC_SystemReset();

+ 34 - 7
src/AppTaskTcp.c

@@ -41,6 +41,11 @@ static void TcpTask(void* arg)
 		TcpRecvHandle = osMessageQueueNew(3,sizeof(TcpipConnectionRecvDataInd*), NULL);
 	}
     osDelay(5000);//等待驻网延时5s
+    slpManWakeSrc_e Wakeup_source;
+    Wakeup_source =  slpManGetWakeupSrc();//获取唤醒源
+    #ifdef DEBUGLOG
+        Debug_printf("[%d,%d]\n",Wakeup_source,AppDataInfo.SysReStartCount);
+    #endif
     while (true)
     {
         osDelay(100);
@@ -433,7 +438,7 @@ static void TcpDataInfoAssembleSend()
             if(1)
             {
                 len = tcpipConnectionSend(socContext.id, (UINT8 *)&GpsToTcpInfo, sizeof(GpsToTcpInfo), 0, 0, 0);
-                #ifdef USING_PRINTF
+                #ifdef USING_PRINTF1
                     for (int i = 0; i < sizeof(GpsToTcpInfo); i++)
                     {
                         printf("%02x ",*((UINT8 *)&GpsToTcpInfo+i));
@@ -539,7 +544,9 @@ static void TcpDataInfoAssembleSend()
         DebugMsgtoTcpType DebugMsgInfo;
         UINT16 BufferLen = 0;
         UINT8 rbuf[1000];
-		sprintf((char *)rbuf,"%x",battProtectState);
+		sprintf((char *)rbuf,"%x,%d,%d,%d,%d,%d,%d,%d,,%d,%d,%d,%d,%d,%d,%d",
+        battProtectState,AppDataInfo.RelayControl,chargerConnectState,PowerVoltage,socd_pct_battSoc,socd_pct_ahSoc,socd_pct_estSoc,socd_pct_ekfSoc,
+        AppDataInfo.RentalType,AppDataInfo.ExpiryTimeArray[0],AppDataInfo.ExpiryTimeArray[1],AppDataInfo.ExpiryTimeArray[2],AppDataInfo.ExpiryTimeArray[3],AppDataInfo.ExpiryTimeArray[4],AppDataInfo.ExpiryTimeArray[5]);
 		BufferLen = strlen(rbuf);
         SendBuffer = malloc(BufferLen+sizeof(DebugMsgInfo));
         memcpy(SendBuffer+sizeof(DebugMsgInfo)-1, rbuf,BufferLen);
@@ -590,11 +597,6 @@ static void TcpDataInfoAssembleSend()
     {
         DebugMsgtoTcpType DebugMsgInfo;
         UINT16 BufferLen = 0;
-        slpManWakeSrc_e Wakeup_source;
-        Wakeup_source =  slpManGetWakeupSrc();//获取唤醒源
-        #ifdef DEBUGLOG
-            Debug_printf("[%d,%d]\n",Wakeup_source,AppDataInfo.SysReStartCount);
-        #endif
         BufferLen = Debug_GetSize();
         if(BufferLen==0)
         {
@@ -793,6 +795,31 @@ static void TcpDataInfoRecvHandle()
                             tcpipConnectionSend(socContext.id,TcpCmdAnswer,31,0,0,0);
                         }   
                     }
+                    else if(*(Ptr+30)==0x85)//租期设置
+                    {
+                        UINT8 rentalStartArray[6] = {0},ExpiryUTC8TimeArray[6] = {0};
+                        UINT16 rentaldays = 0;
+                        TcpCmdAnswer[3] = 0x01;
+                        MEMCPY(&TcpCmdAnswer[4],(Ptr+4),BATT_SN_LEN);
+                        TcpCmdAnswer[21] = TCP_ENCPT_DISABLE;
+                        TcpCmdAnswer[22] = 0x00;
+                        TcpCmdAnswer[23] = 0x06;
+                        MEMCPY(&TcpCmdAnswer[24],(Ptr+24),6);
+                        TcpCmdAnswer[30] = bcc_chk(TcpCmdAnswer,30);
+                        AppDataInfo.RentalType = *(Ptr+31);
+                        MEMCPY(rentalStartArray,(Ptr+32),6);
+                        rentaldays = *(Ptr+38)<<8|*(Ptr+39);
+                        ExpiryTimeCal(rentalStartArray,rentaldays,ExpiryUTC8TimeArray);
+                        MEMCPY(AppDataInfo.ExpiryTimeArray,ExpiryUTC8TimeArray,6);
+                        AppDataInfo.appDataModify = TRUE;
+                        tcpipConnectionSend(socContext.id,TcpCmdAnswer,31,0,0,0);
+                        #ifdef USING_PRINTF
+                            printf("rental!\n");
+                            for(UINT8 i =0 ;i<6;i++)
+                                printf("%d  ",ExpiryUTC8TimeArray[i]);
+                        #endif
+                        BattLockFunc();
+                    }
                     else
                     {
                         TcpCmdAnswer[3] = 0x0f;

+ 2 - 6
src/AppTaskUart.c

@@ -135,6 +135,7 @@ static void UartTask(void* arg)
 				#endif
                 if(Uart_Recv_LEN>5)
                 {
+					UartErrorFlag = 0;
 					UartRecvFlagCounter = 0;
                     UartRecvFlag = 1;
                     UartAnswerData.len = Uart_Recv_LEN;
@@ -154,14 +155,9 @@ static void UartTask(void* arg)
 				}
 				if(UartRecvFlagCounter>=10)
 				{
-					if(osOK==osMutexAcquire(Error_Mutex, 100))
-					{
-						UINT8 ErrorNumTemp = 33;
-						PutErrorNum((UINT16 *)ErrorNum,sizeof(ErrorNum),ErrorNumTemp);
-					}
-					osMutexRelease(Error_Mutex);
 					uartBattInfoDecode(UartAnswerData.data);
 					UartRecvFlag = 0;
+					UartErrorFlag = 1;
 					PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_INTI);
 					break;
 				}

+ 101 - 170
src/BCU.c

@@ -14,148 +14,117 @@
  */
 
 #include "BCU.h"
-#include "BCU_private.h"
+
 static StaticTask_t         gProcess_Bcu_Task_t;
 static UINT8                gProcess_Bcu_TaskStack[PROC_BCU_TASK_STACK_SIZE];
 static osThreadId_t         BcuTaskId = NULL;
 static process_Bcu 		    gProcess_Bcu_Task;
 #define PROC_BCU_STATE_SWITCH(a)  (gProcess_Bcu_Task = a)
-
 /* Real-time model */
 static RT_MODEL_BCU_T BCU_M_;
 RT_MODEL_BCU_T *const BCU_M = &BCU_M_;
 
-/* Model step function */
-void BCU_step(void)
-{
-      uint8_T i;
-	  osDelay(1000);
+//======================================================
+void BCU(void)
+{     
+      uint16_T i;
+      static uint16_T sleep_time;
+	  UINT32 locateTimeCounter = 0;
+	  osDelay(3000);
 	  PROC_BCU_STATE_SWITCH(PROCESS_STATE_INIT);
+	  
 	  while (TRUE)
 	  {
 		switch(gProcess_Bcu_Task)
 		{
-		  case PROCESS_STATE_INIT:
-		  { BCU_initialize();  
-		    cand_Nr_cellNr=0;
-			memcpy(blcv_Q_totalCpEi,AppDataInfo.blcv_Q_totalCpE, 28*sizeof(uint32_T));		 
-			memcpy(blcv_Q_reqCpEi,AppDataInfo.blcv_Q_reqCpE, 28*sizeof(uint16_T));	 
-			socd_pct_bcuSocEi = AppDataInfo.socd_pct_bcuSocE;			
-			socd_pct_battSocEi = AppDataInfo.socd_pct_battSocE; 		
-			sohd_tm_chrgStartStatEi = AppDataInfo.sohd_tm_chrgStartStatE;	  
-			sohd_flg_chrgEndEi = AppDataInfo.sohd_flg_chrgEndE; 		   
-			memcpy(sohv_V_chrgStartStatEi,AppDataInfo.sohv_V_chrgStartStatE, 28*sizeof(uint16_T));
-			sohd_Q_chrgEi = AppDataInfo.sohd_Q_chrgE;				  
-			memcpy(sohv_Q_packCapArrEi,AppDataInfo.sohv_Q_packCapArrE, 10*sizeof(uint16_T));
-			memcpy(sohv_Q_cellCapArrEi,AppDataInfo.sohv_Q_cellCapArrE, 28*sizeof(uint16_T));
-			PROC_BCU_STATE_SWITCH(PROCESS_STATE_IDLE);
-			break;
-		  }
-		  case PROCESS_STATE_IDLE:
+		  case PROCESS_STATE_INIT:	
 		  {
-			while (TRUE)
-			{
-			  osDelay(100);
-			  if(gProcess_app!=LISTEN)
-			  {
-				PROC_BCU_STATE_SWITCH(PROCESS_STATE_WORK);
-				break;
-			  }
-			  else
-			  {
-				PROC_BCU_STATE_SWITCH(PROCESS_STATE_SLEEP);
-				break;
-			  }
-			}
+		    BCU_Init();  
+			memcpy(blcv_Q_totalCpEi,BcuDataInfo.blcv_Q_totalCpE, sizeof(blcv_Q_totalCpEi));		 
+			memcpy(blcv_Q_reqCpEi,BcuDataInfo.blcv_Q_reqCpE, sizeof(blcv_Q_reqCpEi));	 
+			socd_pct_bcuSocEi = BcuDataInfo.socd_pct_bcuSocE;			
+			socd_pct_battSocEi = BcuDataInfo.socd_pct_battSocE; 		
+			sohd_tm_chrgStartStatEi = BcuDataInfo.sohd_tm_chrgStartStatE;	  
+			sohd_flg_chrgEndEi = BcuDataInfo.sohd_flg_chrgEndE; 		   
+			memcpy(sohv_V_chrgStartStatEi,BcuDataInfo.sohv_V_chrgStartStatE, sizeof(sohv_V_chrgStartStatEi));
+			sohd_Q_chrgEi = BcuDataInfo.sohd_Q_chrgE;				  
+			memcpy(sohv_Q_packCapArrEi,BcuDataInfo.sohv_Q_packCapArrE, sizeof(sohv_Q_packCapArrEi));
+			memcpy(sohv_Q_cellCapArrEi,BcuDataInfo.sohv_Q_cellCapArrE, sizeof(sohv_Q_cellCapArrEi));
+			PROC_BCU_STATE_SWITCH(PROCESS_STATE_WORK);
 			break;
 		  }
+		  //------------------------------------------------------------------------------------	  
 		  case PROCESS_STATE_WORK:
-		  {
+		  { 
+		    sleep_time=0;
 			while (TRUE)
 			{
-			  osDelay(100);
-			  if(gProcess_app==LISTEN)
-			  {
-				PROC_BCU_STATE_SWITCH(PROCESS_STATE_SLEEP);
-				break;
-			  }
-			  //***************
-			  ihd_I_curr = (int16_T)(-(battI - 10000));
-			  ihd_V_cellUMax = maxCellVol;
-			  ihd_V_cellUMin = minCellVol;
-			  ihd_V_cellUAvrg = avrgCellVol;
-			  memcpy(ihv_V_cellU,battCellU,AppNVMData.BattCellCount*sizeof(uint16_T));
-			  for(i=0;i<4;i++)
-			  {
-			   ihv_T_modT[i]= battCellTemp[i]-40;
-			  	}
-			  //memcpy(ihv_T_modT,battCellTemp,AppNVMData.BattTempCount*sizeof(uint16_T));
-			  ihd_T_modTMax = maxCellTemp-40;
-			  ihd_T_modTMin = minCellTemp-40;
-			  ihd_st_workStat  = BattWorkStateDelay;
-			  ihd_L_urtRecv=UartRecvFlag;
-			  ihd_flg_currFlt= ((battWarningState >> 1) & 0x01) == 1;   //battu low
-			  ihd_flg_chrgMosClosFlt= ((battWarningState >> 19) & 0x01) == 1;
-			  ihd_flg_dischrgMosClosFlt=((battWarningState >> 18) & 0x01) == 1;
-			 // socd_pct_battSocEi=300;
-
-
-			  SFM();
-	
-
-			  SPM();
-
-
-			  //
-              cand_Nr_cellNr=cand_Nr_cellNr+1;
-			  if(cand_Nr_cellNr> cmnc_num_cellUNum)
+			  	//osDelay(100);
+			  	if(locateTimeCounter != TimeCounter)
 			  	{
-               cand_Nr_cellNr=1;
-
-			  }
-			  cand_Q_cellCap=sohv_Q_cellCap[cand_Nr_cellNr-1];
-			  cand_V_chrgStartStat=sohv_V_chrgStartStatEo[cand_Nr_cellNr-1];
-			  //
-
-				if(socd_flg_EEsave==1)
-				{
-				  memcpy(AppDataInfo.blcv_Q_totalCpE,blcv_Q_totalCpEo, 28*sizeof(uint32_T));	   
-				  memcpy(AppDataInfo.blcv_Q_reqCpE,blcv_Q_reqCpEo, 28*sizeof(uint16_T));	
-				  AppDataInfo.socd_pct_bcuSocE =  socd_pct_bcuSocEo;  
-				  AppDataInfo.socd_pct_battSocE = socd_pct_battSocEo;
-				  AppDataInfo.sohd_tm_chrgStartStatE = sohd_tm_chrgStartStatEo;
-				  AppDataInfo.sohd_flg_chrgEndE = sohd_flg_chrgEndEo;	  
-				  memcpy(AppDataInfo.sohv_V_chrgStartStatE,sohv_V_chrgStartStatEo, 28*sizeof(uint16_T));
-				  AppDataInfo. sohd_Q_chrgE = sohd_Q_chrgEo;		   
-				  memcpy(AppDataInfo.sohv_Q_packCapArrE,sohv_Q_packCapArrEo, 10*sizeof(uint16_T));
-				  memcpy(AppDataInfo.sohv_Q_cellCapArrE,sohv_Q_cellCapArrEo, 28*sizeof(uint16_T));
-				  AppDataInfo.appDataModify = TRUE;
-				 }
-
+					  locateTimeCounter = TimeCounter;
+					  if(BattWorkStateDelay==0&&battI==10000)
+					  {
+					    sleep_time++;
+					    if(sleep_time>100)
+					  	 {
+					  	 sleep_time=101;
+						  PROC_BCU_STATE_SWITCH(PROCESS_STATE_SLEEP);
+						  break;
+					     }
+					  }
+					  else
+					  {
+					  	sleep_time = 0;
+					  }
+					//  printf("sleep_time:%d,BattWorkStateDelay:%d,battI:%d\n",sleep_time,BattWorkStateDelay,battI);
+					  
+					  //=============================================================================
+					  ihd_I_curr = (int16_T)(-(battI - 10000));
+					  memcpy(ihv_V_cellU,battCellU,sizeof(battCellU));
+					  for(i=0;i<cmnc_num_modTNum;i++)
+					  	{
+						  ihv_T_modT[i]= (int16_T) (battCellTemp[i]-40);
+
+					  	}
+
+					  ihd_st_workStat  = BattWorkStateDelay;
+					  ihd_L_urtRecv=!UartErrorFlag;
+					  ihd_flg_chrgMosClosFlt= ((battWarningState >> 19) & 0x01) == 1;
+					  ihd_flg_dischrgMosClosFlt=((battWarningState >> 18) & 0x01) == 1;
+		              ihd_flg_currFlt =((battWarningState >> 18) & 0x01) == 1;
+
+					  //=============================================================================
+					  SFM();
+					  SPM();
+
+					 //==============================shi shi cun chu=======
+					  if(socd_flg_EEsave==1)
+					  {
+						 BCUEEDataSave();
+					  }
+			  	}
+				osDelay(5);
 			}
 			break;
 		  }
+		  //----------------------------------------------------------------------------------------------------
 		  case PROCESS_STATE_SLEEP:
 		  { 
-			memcpy(AppDataInfo.blcv_Q_totalCpE,blcv_Q_totalCpEo, 28*sizeof(uint32_T));		 
-			memcpy(AppDataInfo.blcv_Q_reqCpE,blcv_Q_reqCpEo, 28*sizeof(uint16_T));	  
-			AppDataInfo.socd_pct_bcuSocE =	socd_pct_bcuSocEo;	
-			AppDataInfo.socd_pct_battSocE = socd_pct_battSocEo;
-			AppDataInfo.sohd_tm_chrgStartStatE = sohd_tm_chrgStartStatEo;
-			AppDataInfo.sohd_flg_chrgEndE = sohd_flg_chrgEndEo; 	
-			memcpy(AppDataInfo.sohv_V_chrgStartStatE,sohv_V_chrgStartStatEo, 28*sizeof(uint16_T));
-			AppDataInfo. sohd_Q_chrgE = sohd_Q_chrgEo;			 
-			memcpy(AppDataInfo.sohv_Q_packCapArrE,sohv_Q_packCapArrEo, 10*sizeof(uint16_T));
-			memcpy(AppDataInfo.sohv_Q_cellCapArrE,sohv_Q_cellCapArrEo, 28*sizeof(uint16_T));
-			AppDataInfo.appDataModify = TRUE;
+			BCUEEDataSave();
 			//
-			cand_Nr_cellNr=0;
 			ihd_tm_parkTime=0;
 			while (TRUE)
 			{
 			  osDelay(1000);
 			  ihd_tm_parkTime++;
-			  if(gProcess_app!=LISTEN)
+			  //printf("ihd_tm_parkTime:%d\n",ihd_tm_parkTime);
+			  if(BattWorkStateDelay==0&&battI==10000)
+			  {    
+			    memcpy(appv_V_cellU,battCellU,sizeof(appv_V_cellU));
+			  }
+
+			  if(BattWorkStateDelay!=0||ihd_tm_parkTime>cmnc_tm_parkTime+10||battI!=10000)
 			  {
 				PROC_BCU_STATE_SWITCH(PROCESS_STATE_INIT);
 				break;
@@ -173,72 +142,18 @@ void BCU_step(void)
 }
 
 /* Model initialize function */
-void BCU_initialize(void)
+void BCU_Init(void)
 {
-  /* Registration code */
-
-  /* block I/O */
-
-  /* custom signals */
-  {
-    int32_T i;
-    for (i = 0; i < 28; i++) {
-      sohv_Q_cellCap[i] = 300U;
-    }
-  }
-
-  sohd_pct_bcuSoh = 1000U;
 
-  /* Model Initialize function for ModelReference Block: '<Root>/SFM' */
   SFM_initialize(rtmGetErrorStatusPointer(BCU_M));
-
-  /* Model Initialize function for ModelReference Block: '<Root>/SPM' */
-  SPM_initialize(rtmGetErrorStatusPointer(BCU_M));
-
-  /* SystemInitialize for ModelReference: '<Root>/SFM' incorporates:
-   *  Inport: '<Root>/In1'
-   *  Inport: '<Root>/battI '
-   *  Inport: '<Root>/ihd_L_urtRecv'
-   *  Inport: '<Root>/ihd_P_gas'
-   *  Inport: '<Root>/ihd_flg_chrgMosClosFlt'
-   *  Inport: '<Root>/ihd_flg_disChrgMosClosFlt'
-   *  Inport: '<Root>/ihv_T_modT'
-   *  Inport: '<Root>/ihv_V_cellU'
-   */
   SFM_Init();
-
-  /* SystemInitialize for ModelReference: '<Root>/SPM' incorporates:
-   *  Inport: '<Root>/blcv_Q_reqCpEi'
-   *  Inport: '<Root>/blcv_Q_totalCpEi'
-   *  Inport: '<Root>/ihd_T_bdtemp'
-   *  Inport: '<Root>/ihd_st_workStat'
-   *  Inport: '<Root>/ihd_tm_packTime'
-   *  Inport: '<Root>/socd_pct_battSocEi'
-   *  Inport: '<Root>/socd_pct_bcuSocEi'
-   *  Inport: '<Root>/sohd_Q_chrgEi '
-   *  Inport: '<Root>/sohd_flg_chrgEndEi '
-   *  Inport: '<Root>/sohd_tm_chrgStartStatEi '
-   *  Inport: '<Root>/sohv_Q_cellCapArrEi 1'
-   *  Inport: '<Root>/sohv_Q_packCapArrEi '
-   *  Inport: '<Root>/sohv_V_chrgStartStatEi '
-   */
   SPM_Init();
 }
 
-/* Model terminate function */
-void BCU_terminate(void)
-{
-  /* (no terminate code required) */
-}
-
-/*
- * File trailer for generated code.
- *
- * [EOF]
- */
 
-	  void AppTaskBcuInit(void *arg)
-	{
+//================================================================================
+void AppTaskBcuInit(void *arg)
+{
 		osThreadAttr_t task_attr;
 		memset(&task_attr,0,sizeof(task_attr));
 		memset(gProcess_Bcu_TaskStack, 0xA5, PROC_BCU_TASK_STACK_SIZE);
@@ -248,6 +163,22 @@ void BCU_terminate(void)
 		task_attr.priority = osPriorityBelowNormal7;
 		task_attr.cb_mem = &gProcess_Bcu_Task_t;
 		task_attr.cb_size = sizeof(StaticTask_t);
-		BcuTaskId = osThreadNew(BCU_step, NULL, &task_attr);
-	}
+		BcuTaskId = osThreadNew(BCU, NULL, &task_attr);
+}
+//=========================================================================================
+void BCUEEDataSave(void)
+{
+	  memcpy(BcuDataInfo.blcv_Q_totalCpE,blcv_Q_totalCpEo, sizeof(blcv_Q_totalCpEo));	   
+	  memcpy(BcuDataInfo.blcv_Q_reqCpE,blcv_Q_reqCpEo, sizeof(blcv_Q_reqCpEo));	
+	  BcuDataInfo.socd_pct_bcuSocE =  socd_pct_bcuSocEo;  
+	  BcuDataInfo.socd_pct_battSocE = socd_pct_battSocEo;
+	  BcuDataInfo.sohd_tm_chrgStartStatE = sohd_tm_chrgStartStatEo;
+	  BcuDataInfo.sohd_flg_chrgEndE = sohd_flg_chrgEndEo;	  
+	  memcpy(BcuDataInfo.sohv_V_chrgStartStatE,sohv_V_chrgStartStatEo, sizeof(sohv_V_chrgStartStatEo));
+	  BcuDataInfo.sohd_Q_chrgE = sohd_Q_chrgEo;		   
+	  memcpy(BcuDataInfo.sohv_Q_packCapArrE,sohv_Q_packCapArrEo, sizeof(sohv_Q_packCapArrEo));
+	  memcpy(BcuDataInfo.sohv_Q_cellCapArrE,sohv_Q_cellCapArrEo, sizeof(sohv_Q_cellCapArrEo));
+	  BcuDataInfo.appDataModify = TRUE;
+
+ }
  

+ 0 - 281
src/EmbeddedCoder_src/BCU1.c

@@ -1,281 +0,0 @@
-
-/*
- * File: BCU.c
- *
- * Code generated for Simulink model 'BCU'.
- *
- * Model version                  : 1.19
- * Simulink Coder version         : 9.4 (R2020b) 29-Jul-2020
- * C/C++ source code generated on : Fri Aug 20 13:49:53 2021
- *
- * Target selection: ert.tlc
- * Embedded hardware selection: Intel->x86-64 (Windows64)
- * Code generation objectives: Unspecified
- * Validation result: Not run
- */
-
-#include "BCU.h"
-#include "BCU_private.h"
-
-
-static StaticTask_t         gProcess_Bcu_Task_t;
-static UINT8                gProcess_Bcu_TaskStack[PROC_BCU_TASK_STACK_SIZE];
-static osThreadId_t         BcuTaskId = NULL;
-static process_Bcu 		    gProcess_Bcu_Task;
-#define PROC_BCU_STATE_SWITCH(a)  (gProcess_Bcu_Task = a)
-
-
-/* Real-time model */
-static RT_MODEL_BCU_T BCU_M_;
-RT_MODEL_BCU_T *const BCU_M = &BCU_M_;
-
-
-/* Model step function */
-void BCU_step(void)
-{      uint8_T i;
-	  osDelay(1000);
-	  PROC_BCU_STATE_SWITCH(PROCESS_STATE_INIT);
-	  while (TRUE)
-	  {
-		switch(gProcess_Bcu_Task)
-		{
-		  case PROCESS_STATE_INIT:
-		  { BCU_initialize();  
-			memcpy(blcv_Q_totalCpEi,AppDataInfo.blcv_Q_totalCpE, 28*sizeof(uint32_T));		 
-			memcpy(blcv_Q_reqCpEi,AppDataInfo.blcv_Q_reqCpE, 28*sizeof(uint16_T));	 
-			socd_pct_bcuSocEi = AppDataInfo.socd_pct_bcuSocE;			
-			socd_pct_battSocEi = AppDataInfo.socd_pct_battSocE; 		
-			sohd_tm_chrgStartStatEi = AppDataInfo.sohd_tm_chrgStartStatE;	  
-			sohd_flg_chrgEndEi = AppDataInfo.sohd_flg_chrgEndE; 		   
-			memcpy(sohv_V_chrgStartStatEi,AppDataInfo.sohv_V_chrgStartStatE, 28*sizeof(uint16_T));
-			sohd_Q_chrgEi = AppDataInfo.sohd_Q_chrgE;				  
-			memcpy(sohv_Q_packCapArrEi,AppDataInfo.sohv_Q_packCapArrE, 10*sizeof(uint16_T));
-			memcpy(sohv_Q_cellCapArrEi,AppDataInfo.sohv_Q_cellCapArrE, 28*sizeof(uint16_T));
-			PROC_BCU_STATE_SWITCH(PROCESS_STATE_IDLE);
-			break;
-		  }
-		  case PROCESS_STATE_IDLE:
-		  {
-			while (TRUE)
-			{
-			  osDelay(100);
-			  if(gProcess_app!=LISTEN)
-			  {
-				PROC_BCU_STATE_SWITCH(PROCESS_STATE_WORK);
-				break;
-			  }
-			  else
-			  {
-				PROC_BCU_STATE_SWITCH(PROCESS_STATE_SLEEP);
-				break;
-			  }
-			}
-			break;
-		  }
-		  case PROCESS_STATE_WORK:
-		  {
-			while (TRUE)
-			{
-			  osDelay(1000);
-			  if(gProcess_app==LISTEN)
-			  {
-				PROC_BCU_STATE_SWITCH(PROCESS_STATE_SLEEP);
-				break;
-			  }
-			  //***************
-			  ihd_I_curr = (int16_T)(-(battI - 10000)*10);
-			  ihd_V_cellUMax = maxCellVol;
-			  ihd_V_cellUMin = minCellVol;
-			  ihd_V_cellUAvrg = avrgCellVol;
-			  memcpy(ihv_V_cellU,battCellU,AppNVMData.BattCellCount*sizeof(uint16_T));
-			  memcpy(ihv_T_modT,battCellTemp,AppNVMData.BattTempCount*sizeof(uint16_T));
-			  ihd_T_modTMax = maxCellTemp;
-			  ihd_T_modTMin = minCellTemp;
-			  ihd_st_workStat  = battWorkState;//BattWorkStateDelay;
-			  ihd_st_fault = 0;
-			 // socd_pct_battSocEi=300;
-			  ihd_T_bdtemp = 400;
-
-			  /* Constant: '<Root>/Constant' */
-			  
-			  //****************************
-			  /* ModelReference: '<Root>/SOH' incorporates:
-			  *  Inport: '<Root>/ihd_I_curr'
-			  *  Inport: '<Root>/ihd_st_workStat'
-			  *  Inport: '<Root>/ihd_tm_packTime'
-			  *  Inport: '<Root>/ihv_V_cellU'
-			  *  Inport: '<Root>/sohd_Q_chrgEi '
-			  *  Inport: '<Root>/sohd_flg_chrgEndEi '
-			  *  Inport: '<Root>/sohd_tm_chrgStartStatEi '
-			  *  Inport: '<Root>/sohv_Q_packCapArrEi '
-			  *  Inport: '<Root>/sohv_V_chrgStartStatEi '
-			  */
-			   SOH();
-	
-			  /* ModelReference: '<Root>/SOC' incorporates:
-			  *  Inport: '<Root>/ihd_I_curr'
-			  *  Inport: '<Root>/ihd_V_cellUAvrg'
-			  *  Inport: '<Root>/ihd_V_cellUMax'
-			  *  Inport: '<Root>/ihd_V_cellUMin'
-			  *  Inport: '<Root>/ihd_st_workStat'
-			  *  Inport: '<Root>/ihd_tm_packTime'
-			  *  Inport: '<Root>/socd_pct_battSocEi'
-			  *  Inport: '<Root>/socd_pct_bcuSocEi'
-			  */
-			  SOC();
-			  // printf("[%d]-:socd_pct_battSocEi:%d,socd_pct_battSoc:%d,socd_pct_ekfSoc:%d,socd_pct_bcuSoc:%d,Umax:%d,Umin:%d,ocv:%f,UL:%f,Up:%f,k1:%f,k2:%f\n",__LINE__,socd_pct_battSocEi,socd_pct_battSoc,socd_pct_ekfSoc,socd_pct_bcuSoc,ihd_V_cellUMax,ihd_V_cellUMin,OCV,UL,Up,k1,k2);
-			  /* Constant: '<Root>/Constant' */
-			  /* ModelReference: '<Root>/BLC' incorporates:
-			  *  Inport: '<Root>/blcv_Q_reqCpEi'
-			  *  Inport: '<Root>/blcv_Q_totalCpEi'
-			  *  Inport: '<Root>/ihd_V_cellUMin'
-			  *  Inport: '<Root>/ihd_st_fault'
-			  *  Inport: '<Root>/ihd_tm_packTime'
-			  *  Inport: '<Root>/ihv_V_cellU'
-			  */
-			   BLC();
-              //
-              //
-				if(socd_flg_EEsave==1)
-				{
-				  memcpy(AppDataInfo.blcv_Q_totalCpE,blcv_Q_totalCpEo, 28*sizeof(uint32_T));	   
-				  memcpy(AppDataInfo.blcv_Q_reqCpE,blcv_Q_reqCpEo, 28*sizeof(uint16_T));	
-				  AppDataInfo.socd_pct_bcuSocE =  socd_pct_bcuSocEo;  
-				  AppDataInfo.socd_pct_battSocE = socd_pct_battSocEo;
-				  AppDataInfo.sohd_tm_chrgStartStatE = sohd_tm_chrgStartStatEo;
-				  AppDataInfo.sohd_flg_chrgEndE = sohd_flg_chrgEndEo;	  
-				  memcpy(AppDataInfo.sohv_V_chrgStartStatE,sohv_V_chrgStartStatEo, 28*sizeof(uint16_T));
-				  AppDataInfo. sohd_Q_chrgE = sohd_Q_chrgEo;		   
-				  memcpy(AppDataInfo.sohv_Q_packCapArrE,sohv_Q_packCapArrEo, 10*sizeof(uint16_T));
-				  memcpy(AppDataInfo.sohv_Q_cellCapArrE,sohv_Q_cellCapArrEo, 28*sizeof(uint16_T));
-				  AppDataInfo.appDataModify = TRUE;
-				 }
-
-			}
-			break;
-		  }
-		  case PROCESS_STATE_SLEEP:
-		  { 
-			memcpy(AppDataInfo.blcv_Q_totalCpE,blcv_Q_totalCpEo, 28*sizeof(uint32_T));		 
-			memcpy(AppDataInfo.blcv_Q_reqCpE,blcv_Q_reqCpEo, 28*sizeof(uint16_T));	  
-			AppDataInfo.socd_pct_bcuSocE =	socd_pct_bcuSocEo;	
-			AppDataInfo.socd_pct_battSocE = socd_pct_battSocEo;
-			AppDataInfo.sohd_tm_chrgStartStatE = sohd_tm_chrgStartStatEo;
-			AppDataInfo.sohd_flg_chrgEndE = sohd_flg_chrgEndEo; 	
-			memcpy(AppDataInfo.sohv_V_chrgStartStatE,sohv_V_chrgStartStatEo, 28*sizeof(uint16_T));
-			AppDataInfo. sohd_Q_chrgE = sohd_Q_chrgEo;			 
-			memcpy(AppDataInfo.sohv_Q_packCapArrE,sohv_Q_packCapArrEo, 10*sizeof(uint16_T));
-			memcpy(AppDataInfo.sohv_Q_cellCapArrE,sohv_Q_cellCapArrEo, 28*sizeof(uint16_T));
-			AppDataInfo.appDataModify = TRUE;
-			//
-			Time=0;
-			ihd_tm_parkTime=0;
-			while (TRUE)
-			{
-			  osDelay(1000);
-			  ihd_tm_parkTime++;
-			  if(gProcess_app!=LISTEN)
-			  {
-				PROC_BCU_STATE_SWITCH(PROCESS_STATE_INIT);
-				break;
-			  }
-			}
-			break;
-		  }
-		  default:
-		  {
-			PROC_BCU_STATE_SWITCH(PROCESS_STATE_INIT);
-			break;
-		  }
-		}
-	  }
-}
-
-/* Model initialize function */
-void BCU_initialize(void)
-{
-  /* Registration code */
-
-  /* block I/O */
-
-  /* custom signals */
-  {
-    int32_T i;
-    for (i = 0; i < 28; i++) {
-      sohv_Q_cellCap[i] = 300U;
-    }
-  }
-
-  sohd_pct_bcuSoh = 1000U;
-
-  /* Model Initialize function for ModelReference Block: '<Root>/BLC' */
-  BLC_initialize(rtmGetErrorStatusPointer(BCU_M));
-
-  /* Model Initialize function for ModelReference Block: '<Root>/SOC' */
-  SOC_initialize(rtmGetErrorStatusPointer(BCU_M));
-
-  /* Model Initialize function for ModelReference Block: '<Root>/SOH' */
-  SOH_initialize(rtmGetErrorStatusPointer(BCU_M));
-  //SFM_initialize(rtmGetErrorStatusPointer(BCU_M));
-
-  /* SystemInitialize for ModelReference: '<Root>/SOH' incorporates:
-   *  Inport: '<Root>/battI '
-   *  Inport: '<Root>/ihd_st_workStat'
-   *  Inport: '<Root>/ihd_tm_packTime'
-   *  Inport: '<Root>/ihv_V_cellU'
-   *  Inport: '<Root>/sohd_Q_chrgEi '
-   *  Inport: '<Root>/sohd_flg_chrgEndEi '
-   *  Inport: '<Root>/sohd_tm_chrgStartStatEi '
-   *  Inport: '<Root>/sohv_Q_packCapArrEi '
-   *  Inport: '<Root>/sohv_V_chrgStartStatEi '
-   */
-  SOH_Init();
-
-  /* SystemInitialize for ModelReference: '<Root>/SOC' incorporates:
-   *  Inport: '<Root>/battI '
-   *  Inport: '<Root>/ihd_V_cellUAvrg'
-   *  Inport: '<Root>/ihd_V_cellUMax'
-   *  Inport: '<Root>/ihd_V_cellUMin'
-   *  Inport: '<Root>/ihd_st_workStat'
-   *  Inport: '<Root>/ihd_tm_packTime'
-   *  Inport: '<Root>/socd_pct_battSocEi'
-   *  Inport: '<Root>/socd_pct_bcuSocEi'
-   */
-  SOC_Init();
-
-  /* SystemInitialize for ModelReference: '<Root>/BLC' incorporates:
-   *  Inport: '<Root>/blcv_Q_reqCpEi'
-   *  Inport: '<Root>/blcv_Q_totalCpEi'
-   *  Inport: '<Root>/ihd_V_cellUMin'
-   *  Inport: '<Root>/ihd_st_fault'
-   *  Inport: '<Root>/ihd_tm_packTime'
-   *  Inport: '<Root>/ihv_V_cellU'
-   */
-  BLC_Init();
-  //SFM_Init();
-}
-
-/* Model terminate function */
-void BCU_terminate(void)
-{
-  /* (no terminate code required) */
-}
-
-/*
- * File trailer for generated code.
- *
- * [EOF]
- */
-  void AppTaskBcuInit(void *arg)
-{
-    osThreadAttr_t task_attr;
-    memset(&task_attr,0,sizeof(task_attr));
-    memset(gProcess_Bcu_TaskStack, 0xA5, PROC_BCU_TASK_STACK_SIZE);
-    task_attr.name = "Bcu_Task";
-    task_attr.stack_mem = gProcess_Bcu_TaskStack;
-    task_attr.stack_size = PROC_BCU_TASK_STACK_SIZE;
-    task_attr.priority = osPriorityBelowNormal7;
-    task_attr.cb_mem = &gProcess_Bcu_Task_t;
-    task_attr.cb_size = sizeof(StaticTask_t);
-    BcuTaskId = osThreadNew(BCU_step, NULL, &task_attr);
-}

+ 5 - 6
src/EmbeddedCoder_src/BCUCal.c

@@ -21,11 +21,12 @@
 
 /* Const memory section */
 /* Definition for custom storage class: Const */
-const uint16_T blcc_R_esr = 1U;
+const uint16_T blcc_R_esr = 1000U;
 const int16_T blcc_T_close = 85;
 const int16_T blcc_T_open = 60;
 const uint16_T blcc_V_low = 10U;
-const uint16_T cmnc_Q_ratedCp = 300U;
+const uint16_T cmnc_Q_ratedCp = 600U;
+const uint16_T cmnc_num_cellUNumMax =28;
 
 /* 额定容量; */
 const uint8_T cmnc_num_cellUNum = 17U;
@@ -49,12 +50,10 @@ const uint16_T cmnm_R_polar[13] = { 1837U, 1055U, 7352U, 1453U, 1181U, 1125U,
   1205U, 1283U, 1228U, 1187U, 1104U, 1170U, 1049U } ;
 
 /* 放电OCV-SOC的SOC数组; */
-const uint16_T cmnm_V_ocv[13] = { 3311U, 3411U, 3476U, 3553U, 3610U, 3638U,
-  3674U, 3758U, 3845U, 3942U, 4051U, 4106U, 4175U } ;
+const uint16_T cmnm_V_ocv[13] =  { 3311U, 3411U, 3476U, 3553U, 3610U, 3638U, 3674U, 3758U, 3845U, 3942U, 4051U, 4106U, 4175U } ;
 
 /* 放电OCV-SOC的OCV数组; */
-const uint16_T cmnm_pct_soc[13] = { 0U, 50U, 100U, 200U, 300U, 400U, 500U, 600U,
-  700U, 800U, 900U, 950U, 1000U } ;
+const uint16_T cmnm_pct_soc[13] = {  0U,   50U,   100U,  200U,  300U, 400U,  500U,   600U,  700U,  800U,  900U,  950U, 1000U } ;
 
 /* 放电OCV-SOC的SOC数组; */
 const uint16_T sfmc_flg_cellUDiffThr2=300;

+ 15 - 15
src/EmbeddedCoder_src/BCUDisp.c

@@ -18,17 +18,18 @@
 #include "BCU_types.h"
 
 /* Exported data definition */
+
+uint16_T appv_V_cellU[28];
+uint16_T  socd_pct_estSoc;
+uint16_T  socd_pct_estSoc;
 boolean_T socd_flg_EEsave;
-uint16_T socd_pct_ekfSoc;
-real_T OCV;
-real_T deltaU;
-real_T k1;
-real_T k2;
-uint16_T blcn_Q_impleCp[28];
-uint8_T cand_Nr_cellNr;
-uint16_T FltCodeArr[20];
-uint16_T cand_Q_cellCap;
-uint16_T cand_V_chrgStartStat;
+uint16_T  socd_pct_ekfSoc;
+uint16_T  blcn_Q_impleCp[28];
+uint8_T   cand_Nr_cellNr;
+uint16_T  cand_Q_cellCap;
+uint16_T  cand_V_chrgStartStat;
+uint16_T  cand_Q_reqCp;
+uint32_T  cand_Q_totalCp;
 
 /* Definition for custom storage class: ExportToFile */
 uint16_T blcv_Q_reqCpEi[28];
@@ -86,8 +87,10 @@ int16_T ihv_T_modT[6];
 
 /* 模组温度(数组) */
 uint16_T ihv_V_cellU[28];
+boolean_T ihd_flg_chrgMosClosFlt;
+boolean_T ihd_flg_dischrgMosClosFlt;
+
 
-/* 电池单体电压(数组); */
 int16_T sfmd_I_curr;
 uint8_T sfmd_N_fltLevel;
 int16_T sfmd_T_modTMax;
@@ -95,13 +98,10 @@ int16_T sfmd_T_modTMin;
 uint16_T sfmd_V_cellUAvrg;
 uint16_T sfmd_V_cellUMax;
 uint16_T sfmd_V_cellUMin;
-boolean_T ihd_flg_chrgMosClosFlt;
+uint16_T FltCodeArr[20];
 
-/* 充电电Mos失效 */
 boolean_T sfmd_flg_currFlt;
-boolean_T ihd_flg_dischrgMosClosFlt;
 
-/* 放电Mos失效 */
 boolean_T sfmd_flg_volFlt;
 uint16_T sfmd_idx_fltCode;
 uint16_T sfmd_num_fltNum;

+ 156 - 418
src/EmbeddedCoder_src/BLC.c

@@ -1,440 +1,178 @@
-/*
- * File: BLC.c
- *
- * Code generated for Simulink model 'BLC'.
- *
- * Model version                  : 1.50
- * Simulink Coder version         : 9.4 (R2020b) 29-Jul-2020
- * C/C++ source code generated on : Thu Sep  9 17:18:08 2021
- *
- * Target selection: ert.tlc
- * Embedded hardware selection: Intel->x86-64 (Windows64)
- * Code generation objectives: Unspecified
- * Validation result: Not run
- */
-
 #include "BLC.h"
-#include "BLC_private.h"
-#include "div_su32.h"
 #include "look1_iu16lu16n16tu16_binlcase.h"
-#include "mul_s32_loSR_sat.h"
-#include "mul_s32_sat.h"
-#include "mul_ssu32_sat.h"
-#include "mul_u32_hiSR.h"
-#include "mul_us32_sat.h"
-
-MdlrefDW_BLC_T BLC_MdlrefDW;
-
-/* Block signals (default storage) */
-B_BLC_c_T BLC_B;
 
-/* Block states (default storage) */
-DW_BLC_f_T BLC_DW;
-
-/* System initialize for referenced model: 'BLC' */
+boolean_T FirstRun_BLC;
+////////////////////////////////////////////////////////////////////////////
 void BLC_Init(void)
-{ 
-  uint8_T i;
-  /* InitializeConditions for UnitDelay: '<S11>/Unit Delay1' */
-  BLC_DW.UnitDelay1_DSTATE = true;
-
-  /* InitializeConditions for UnitDelay: '<S1>/Unit Delay1' */
-  BLC_DW.UnitDelay1_DSTATE_a = true;
-
-  /* SystemInitialize for Chart: '<S6>/Chart' */
-  BLC_DW.FristFlg_b = true;
-
-  /* SystemInitialize for Chart: '<S6>/Chart1' */
-  BLC_DW.FristFlg = true;
-  for(i=0;i<17;i++)
-  	{
-     BLC_DW.reqCp_reset_DSTATE[i]=0;
-     BLC_DW.blcCap[i]=0;
-  	}
-  
+{
+    FirstRun_BLC = true;
 }
 
-/* Output and update for referenced model: 'BLC' */
+///////////////////////////////////////////////////////////////////////////
 void BLC(void)
-{
-  int32_T i_0;
-  int32_T q1;
-  uint32_T tmp;
-  uint32_T tmp_0;
-  int16_T u0;
-  uint16_T rtb_uDLookupTable[28];
-  uint16_T rtb_uDLookupTable1;
-  uint16_T tmp_1;
-  uint8_T i;
-  boolean_T RelationalOperator1;
-
-  /* Chart: '<S4>/Chart' incorporates:
-   *  Constant: '<S4>/Constant'
-   *  Constant: '<S4>/Constant1'
-   *  Constant: '<S4>/Constant2'
-   *  Inport: '<Root>/ihd_T_bdtemp'
-   */
-  if (ihd_T_bdtemp > blcc_T_open) {
-    i_0 = BLC_DW.i_close + 1;
-    if (BLC_DW.i_close + 1 > 255) {
-      i_0 = 255;
-    }
-
-    BLC_DW.i_close = (uint8_T)i_0;
-  } else {
-    BLC_DW.i_close = 0U;
-  }
-
-  if (BLC_DW.i_close > 10) {
-    BLC_DW.i_close = 11U;
-    for (i = 0U; i < cmnc_num_cellUNum; i++) {
-      BLC_B.blcn_flg_pause[i] = true;
-    }
-  }
-
-  if (ihd_T_bdtemp < blcc_T_close) {
-    i_0 = BLC_DW.i_open + 1;
-    if (BLC_DW.i_open + 1 > 255) {
-      i_0 = 255;
-    }
-
-    BLC_DW.i_open = (uint8_T)i_0;
-  } else {
-    BLC_DW.i_open = 0U;
-  }
-
-  if (BLC_DW.i_open > 10) {
-    BLC_DW.i_open = 11U;
-    for (i = 0U; i < cmnc_num_cellUNum; i++) {
-      BLC_B.blcn_flg_pause[i] = false;
-    }
-  }
-
-  /* End of Chart: '<S4>/Chart' */
-
-  /* Chart: '<S7>/Chart' incorporates:
-   *  Constant: '<S7>/Constant2'
-   *  UnitDelay: '<S1>/reqCp_reset'
-   */
-  for (i = 0U; i < cmnc_num_cellUNum; i++) {
-    if ((int32_T)(blcv_Q_reqCpEo[i] * 16777U) > 0) {
-      BLC_B.blcn_flg_stop[i] = false;
-    } else {
-      BLC_B.blcn_flg_stop[i] = true;
-    }
-  }
-
-  /* End of Chart: '<S7>/Chart' */
-
-  /* RelationalOperator: '<S3>/Relational Operator1' incorporates:
-   *  Constant: '<S3>/Constant1'
-   *  Constant: '<S3>/Constant2'
-   *  Inport: '<Root>/sfmd_st_fltAct'
-   *  S-Function (sfix_bitop): '<S3>/Bitwise Operator'
-   */
-  RelationalOperator1 = ((sfmd_st_fltAct & 128) == 128);
-  for (i_0 = 0; i_0 < 28; i_0++) {
-    /* SignalConversion generated from: '<S5>/Chart' incorporates:
-     *  Chart: '<S5>/Chart'
-     */
-    blcv_flg_excute[i_0] = false;
-
-    /* Chart: '<S5>/Chart' */
-    blcn_Q_impleCp[i_0] = 0U;
-  }
-
-  /* Chart: '<S5>/Chart' incorporates:
-   *  Constant: '<S5>/Constant1'
-   *  Constant: '<S5>/Constant2'
-   *  Inport: '<Root>/sfmv_V_cellU'
-   *  SignalConversion generated from: '<S5>/Chart'
-   */
-  for (i = 0U; i < cmnc_num_cellUNum; i++) {
-    if (RelationalOperator1 && (!BLC_B.blcn_flg_pause[i]) &&
-        (!BLC_B.blcn_flg_stop[i])) {
-      blcv_flg_excute[i] = true;
-      i_0 = (int32_T)mul_u32_hiSR(BLC_DW.blcCap[i], 3435973837U, 3U);
-      q1 = div_su32(sfmv_V_cellU[i], blcc_R_esr);
-      if ((i_0 < 0) && (q1 < MIN_int32_T - i_0)) {
-        i_0 = MIN_int32_T;
-      } else if ((i_0 > 0) && (q1 > MAX_int32_T - i_0)) {
-        i_0 = MAX_int32_T;
-      } else {
-        i_0 += q1;
-      }
-
-      BLC_DW.blcCap[i] = mul_us32_sat(i_0, 10);
-    } else {
-      blcv_flg_excute[i] = false;
-    }
-  }
-
-  for (i = 0U; i < cmnc_num_cellUNum; i++) {
-    tmp_0 = BLC_DW.blcCap[i] / 36000U;
-    if (tmp_0 > 65535U) {
-      tmp_0 = 65535U;
-    }
-
-    blcn_Q_impleCp[i] = (uint16_T)tmp_0;
-  }
-
-  /* Outputs for Enabled SubSystem: '<S11>/Subsystem3' incorporates:
-   *  EnablePort: '<S12>/Enable'
-   */
-  /* UnitDelay: '<S11>/Unit Delay1' incorporates:
-   *  Inport: '<Root>/sfmd_flg_volFlt'
-   *  Inport: '<S12>/in'
-   *  Logic: '<S3>/Logical Operator1'
-   */
-  if (BLC_DW.UnitDelay1_DSTATE) {
-    BLC_B.in = !sfmd_flg_volFlt;
-  }
-
-  /* End of UnitDelay: '<S11>/Unit Delay1' */
-  /* End of Outputs for SubSystem: '<S11>/Subsystem3' */
-
-  /* Logic: '<S3>/Logical Operator' incorporates:
-   *  Constant: '<S3>/Constant'
-   *  Inport: '<Root>/ihd_tm_packTime'
-   *  RelationalOperator: '<S3>/Relational Operator'
-   */
-  RelationalOperator1 = ((ihd_tm_parkTime >= cmnc_tm_parkTime) && BLC_B.in);
-
-  /* Lookup_n-D: '<S6>/1-D Lookup Table1' incorporates:
-   *  Inport: '<Root>/sfmd_V_cellUMin'
-   */
-  rtb_uDLookupTable1 = look1_iu16lu16n16tu16_binlcase(sfmd_V_cellUMin,
-    (&(cmnm_V_ocv[0])), (&(cmnm_pct_soc[0])), 12U);
-
-  /* Lookup_n-D: '<S6>/1-D Lookup Table' incorporates:
-   *  Inport: '<Root>/sfmv_V_cellU'
-   */
-  for (i_0 = 0; i_0 < 28; i_0++) {
-    rtb_uDLookupTable[i_0] = look1_iu16lu16n16tu16_binlcase(sfmv_V_cellU[i_0], (
-      &(cmnm_V_ocv[0])), (&(cmnm_pct_soc[0])), 12U);
-  }
-
-  /* End of Lookup_n-D: '<S6>/1-D Lookup Table' */
-
-  /* Chart: '<S6>/Chart' incorporates:
-   *  Constant: '<S6>/Constant'
-   *  Constant: '<S6>/Constant1'
-   *  Constant: '<S6>/Constant2'
-   *  Inport: '<Root>/sfmd_V_cellUMin'
-   *  Inport: '<Root>/sfmv_V_cellU'
-   *  Lookup_n-D: '<S6>/1-D Lookup Table'
-   *  Lookup_n-D: '<S6>/1-D Lookup Table1'
-   */
-  i = 0U;
-  if (BLC_DW.FristFlg_b && RelationalOperator1) {
-    while (i < cmnc_num_cellUNum) {
-      if (sfmv_V_cellU[i] - sfmd_V_cellUMin > blcc_V_low) {
-        i_0 = mul_s32_sat(mul_ssu32_sat(rtb_uDLookupTable[i] -
-          rtb_uDLookupTable1, cmnc_Q_ratedCp) / 100, 10);
-        if (i_0 < 0) {
-          i_0 = 0;
-        } else {
-          if (i_0 > 65535) {
-            i_0 = 65535;
-          }
+{   
+    uint16_T i;
+    static uint16_T blcn_Q_reqCpEE[28];
+    static uint32_T blcn_Q_totalCpEE[28];
+    uint16_T MaxCp;
+    
+    boolean_T blcn_flg_judge;
+    boolean_T blcn_flg_enable;
+    static boolean_T sfmd_flg_volFlt_keep;
+    
+    uint16_T blcn_pct_cellSoc[28];
+    uint16_T blcn_pct_cellSocMin;
+    static uint16_T blcn_Q_reqCpNow[28];
+    real_T Qmin;
+    real_T QL;
+    real_T reqCp;
+    
+    static uint16_T blcn_Q_reqCpEo_Delay[28];
+    boolean_T blcn_flg_stop[28];
+	boolean_T blcn_flg_pause[28];
+    static real_T temp[28];
+    uint16_T blcn_Q_impleCp[28];
+
+	if(FirstRun_BLC)
+	{
+	   for (i = 0; i < cmnc_num_cellUNum; i++)
+	   {
+	       temp[i] = 0;
+           blcn_Q_reqCpEo_Delay[i] = 0;
+	       blcn_Q_reqCpNow[i] = 0;
+	  }
+	}
+    //=========================================================================
+    //---------------------------------EE校验----------------------------------
+    //=========================================================================
+    
+    if(FirstRun_BLC)
+    {
+        ArrMax(&blcv_Q_reqCpEi[0],&MaxCp, cmnc_num_cellUNum);
+        if(MaxCp > cmnc_Q_ratedCp * 100)
+        {
+            memset(blcn_Q_reqCpEE,0, sizeof(blcn_Q_reqCpEE));
+            memset(blcn_Q_totalCpEE,0, sizeof(blcn_Q_totalCpEE));
         }
-
-        BLC_B.blcn_Q_reqCpNow_j[i] = (uint16_T)i_0;
-      }
-
-      i++;
+        else
+        {
+            memcpy(blcn_Q_reqCpEE,blcv_Q_reqCpEi, sizeof(blcv_Q_reqCpEi));
+            memcpy(blcn_Q_totalCpEE,blcv_Q_totalCpEi, sizeof(blcn_Q_totalCpEE));
+        }	
     }
-  }
-
-  BLC_DW.FristFlg_b = false;
 
-  /* End of Chart: '<S6>/Chart' */
-
-  /* Chart: '<S6>/Chart1' incorporates:
-   *  Constant: '<S6>/Constant3'
-   *  Inport: '<Root>/sohv_Q_cellCap'
-   *  Lookup_n-D: '<S6>/1-D Lookup Table'
-   */
-  i = 0U;
-  if (BLC_DW.FristFlg && RelationalOperator1) {
-    rtb_uDLookupTable1 = 65000U;
-    while (i < cmnc_num_cellUNum) {
-      tmp_0 = (uint32_T)sohv_Q_cellCap[i] * rtb_uDLookupTable[i];
-      tmp = tmp_0;
-      if (tmp_0 > 2147483647U) {
-        tmp = 2147483647U;
-      }
-
-      if ((int32_T)tmp / 100 < (int32_T)((rtb_uDLookupTable1 * 52429U) >> 19)) {
-        if (tmp_0 > 2147483647U) {
-          tmp_0 = 2147483647U;
+    //=========================================================================
+    //---------------------------------使能判断--------------------------------
+    //=========================================================================
+    if(FirstRun_BLC)
+    {
+        sfmd_flg_volFlt_keep =  sfmd_flg_volFlt;
+    }
+    blcn_flg_judge  = (ihd_tm_parkTime > cmnc_tm_parkTime)&& !sfmd_flg_volFlt_keep;
+    blcn_flg_enable = ((sfmd_st_fltAct >> 7) & 0x01) != 1;
+
+    //=========================================================================
+    //---------------------------------需求计算--------------------------------
+    //=========================================================================
+    if(FirstRun_BLC)
+    {
+        //压差法
+        if(blcn_flg_judge)
+        {
+            blcn_pct_cellSocMin = look1_iu16lu16n16tu16_binlcase(sfmd_V_cellUMin,(&(cmnm_V_ocv[0])), (&(cmnm_pct_soc[0])), 12U);
+            for (i = 0; i < cmnc_num_cellUNum; i++)
+            {
+                blcn_pct_cellSoc[i] = look1_iu16lu16n16tu16_binlcase(sfmv_V_cellU[i], ( &(cmnm_V_ocv[0])), (&(cmnm_pct_soc[0])), 12U);
+            }
+            for (i = 0; i < cmnc_num_cellUNum; i++)
+            {
+                if(sfmv_V_cellU[i] - sfmd_V_cellUMin > blcc_V_low)
+                {
+                    blcn_Q_reqCpNow[i] = (uint16_T) ((real_T)(cmnc_Q_ratedCp * 0.1) * (real_T)((blcn_pct_cellSoc[i] - blcn_pct_cellSocMin) * 0.1) /100 * 1000);
+                }
+                else
+                {
+                    blcn_Q_reqCpNow[i] = 0;
+                }
+            }
         }
-
-        i_0 = mul_s32_sat((int32_T)tmp_0 / 100, 10);
-        if (i_0 < 0) {
-          i_0 = 0;
-        } else {
-          if (i_0 > 65535) {
-            i_0 = 65535;
-          }
+        else
+        {
+            memcpy(blcn_Q_reqCpNow,blcn_Q_reqCpEE, sizeof(blcn_Q_reqCpEE));
         }
-
-        rtb_uDLookupTable1 = (uint16_T)i_0;
-        i_0 = mul_s32_loSR_sat((sohv_Q_cellCap[i] << 6) - (int32_T)(((uint16_T)
-          i_0 * 41943U) >> 16), 25, 4U);
-        if (i_0 < 0) {
-          i_0 = 0;
-        } else {
-          if (i_0 > 65535) {
-            i_0 = 65535;
-          }
+  
+	
+        /*/ 最大化容量法
+        if(blcn_flg_judge)
+        {
+            Qmin = (real_T)(sohv_Q_cellCap[0] * 0.1) * (real_T)(blcn_pct_cellSoc[0] * 0.1)/100;
+            for(i = 0; i < cmnc_num_cellUNum; i++)
+            {
+                if (Qmin >  (real_T)(sohv_Q_cellCap[i] * 0.1) * (real_T)(blcn_pct_cellSoc[i] * 0.1)/100)
+                {
+                    Qmin =  (real_T)(sohv_Q_cellCap[i] * 0.1) * (real_T)(blcn_pct_cellSoc[i] * 0.1)/100;
+                    QL   =  (real_T)(sohv_Q_cellCap[i] * 0.1) - Qmin;
+                }
+            }
+            for(i = 0; i < cmnc_num_cellUNum; i++)
+            {
+                reqCp = QL- (real_T)(sohv_Q_cellCap[i] * 0.1)*(real_T)(blcn_pct_cellSoc[i] * 0.1)/100;
+                if (reqCp >0.001)
+                {
+                    blcn_Q_reqCpNow[i] =uint16_T(reqCp * 1000);
+                }
+            }
         }
-
-        BLC_DW.QL = (uint16_T)i_0;
-      }
-
-      i++;
+        else
+        {
+            memcpy(blcn_Q_reqCpNow,blcn_Q_reqCpEE, sizeof(blcn_Q_reqCpEE));
+        } */
     }
-  }
 
-  BLC_DW.FristFlg = false;
 
-  /* End of Chart: '<S6>/Chart1' */
-
-  /* Outputs for Enabled SubSystem: '<S1>/EE' incorporates:
-   *  EnablePort: '<S2>/Enable'
-   */
-  /* UnitDelay: '<S1>/Unit Delay1' */
-  if (BLC_DW.UnitDelay1_DSTATE_a) {
-    /* MinMax: '<S10>/Min' incorporates:
-     *  Inport: '<Root>/blcv_Q_reqCpEi'
-     */
-    rtb_uDLookupTable1 = blcv_Q_reqCpEi[0];
-    for (i_0 = 0; i_0 < 27; i_0++) {
-      tmp_1 = blcv_Q_reqCpEi[i_0 + 1];
-      if (rtb_uDLookupTable1 <= tmp_1) {
-        rtb_uDLookupTable1 = tmp_1;
-      }
-    }
-
-    /* If: '<S2>/If' incorporates:
-     *  Constant: '<S10>/Constant'
-     *  MinMax: '<S10>/Min'
-     *  RelationalOperator: '<S10>/Relational Operator'
-     */
-    if ((real_T)rtb_uDLookupTable1 * 0.001 < 65.0) {
-      /* Outputs for IfAction SubSystem: '<S2>/If Action Subsystem1' incorporates:
-       *  ActionPort: '<S9>/Action Port'
-       */
-      /* Merge: '<S2>/blcv_Q_totalCpEE_Merge' incorporates:
-       *  Inport: '<Root>/blcv_Q_totalCpEi'
-       *  Inport: '<S9>/blcv_Q_totalCpEi'
-       */
-      memcpy(&BLC_B.blcv_Q_totalCpEE_Merge[0], (&(blcv_Q_totalCpEi[0])), 28U *
-             sizeof(uint32_T));
-      for (i_0 = 0; i_0 < 28; i_0++) {
-        /* Merge: '<S2>/blcv_Q_reqCpEE_Merge' incorporates:
-         *  Inport: '<Root>/blcv_Q_reqCpEi'
-         *  Inport: '<S9>/blcv_Q_reqCpEi'
-         */
-        BLC_B.blcv_Q_reqCpEE_Merge[i_0] = blcv_Q_reqCpEi[i_0];
-      }
-
-      /* End of Outputs for SubSystem: '<S2>/If Action Subsystem1' */
-    } else {
-      /* Outputs for IfAction SubSystem: '<S2>/If Action Subsystem' incorporates:
-       *  ActionPort: '<S8>/Action Port'
-       */
-      /* Merge: '<S2>/blcv_Q_totalCpEE_Merge' incorporates:
-       *  SignalConversion generated from: '<S8>/blcv_Q_totalCpEE1'
-       */
-      memset(&BLC_B.blcv_Q_totalCpEE_Merge[0], 0, 28U * sizeof(uint32_T));
-      for (i_0 = 0; i_0 < 28; i_0++) {
-        /* Merge: '<S2>/blcv_Q_reqCpEE_Merge' incorporates:
-         *  SignalConversion generated from: '<S8>/blcv_Q_reqCpEE1'
-         */
-        BLC_B.blcv_Q_reqCpEE_Merge[i_0] = 0U;
-      }
-
-      /* End of Outputs for SubSystem: '<S2>/If Action Subsystem' */
+    //=========================================================================
+    //---------------------------------stop计算--------------------------------
+    //=========================================================================
+    for(i = 0; i < cmnc_num_cellUNum; i++)
+    {
+        if(blcn_Q_reqCpEo_Delay[i] > 0)
+        {
+            blcn_flg_stop[i] = false;
+        }
+        else
+        {
+            blcn_flg_stop[i] = true;
+        }
     }
-
-    /* End of If: '<S2>/If' */
-  }
-
-  /* End of UnitDelay: '<S1>/Unit Delay1' */
-  /* End of Outputs for SubSystem: '<S1>/EE' */
-  for (i_0 = 0; i_0 < 28; i_0++) {
-    /* Switch: '<S6>/Switch' incorporates:
-     *  Merge: '<S2>/blcv_Q_reqCpEE_Merge'
-     */
-    if (RelationalOperator1) {
-      /* Saturate: '<S6>/Saturation' */
-      tmp_0 = cmnc_Q_ratedCp * 100U;
-      if (tmp_0 > 65535U) {
-        tmp_0 = 65535U;
-      }
-
-      rtb_uDLookupTable1 = BLC_B.blcn_Q_reqCpNow_j[i_0];
-      if (rtb_uDLookupTable1 >= (uint16_T)tmp_0) {
-        rtb_uDLookupTable1 = (uint16_T)tmp_0;
-      }
-
-      /* End of Saturate: '<S6>/Saturation' */
-    } else {
-      rtb_uDLookupTable1 = BLC_B.blcv_Q_reqCpEE_Merge[i_0];
+	   
+    //=========================================================================
+    //---------------------------------pause计算-------------------------------
+    //=========================================================================
+    for(i = 0; i < cmnc_num_cellUNum; i++)
+    {
+        blcn_flg_pause[i] = false;
     }
+    //=========================================================================
+    //--------------------------------指令及实际均衡容量计算--------------------
+    //=========================================================================
+    for(i = 0; i < cmnc_num_cellUNum; i++)
+    {
+        if(blcn_flg_enable && !blcn_flg_pause[i] && !  blcn_flg_stop[i])
+        {
+            blcv_flg_excute[i] = true ;
+            temp[i] = temp[i] +  (real_T) (sfmv_V_cellU[i] * 0.001) /  (real_T) (blcc_R_esr * 0.1);
+        }
+        else
+        {
+            blcv_flg_excute[i] = false ;
+        }
 
-    /* End of Switch: '<S6>/Switch' */
-
-    /* Sum: '<S5>/Add' */
-    u0 = (int16_T)(rtb_uDLookupTable1 - blcn_Q_impleCp[i_0]);
-
-    /* Saturate: '<S5>/Saturation' */
-    if (u0 >= 30000) {
-      /* Saturate: '<S5>/Saturation' */
-      blcv_Q_reqCpEo[i_0] = 30000U;
-    } else if (u0 <= 0) {
-      /* Saturate: '<S5>/Saturation' */
-      blcv_Q_reqCpEo[i_0] = 0U;
-    } else {
-      /* Saturate: '<S5>/Saturation' */
-      blcv_Q_reqCpEo[i_0] = (uint16_T)u0;
+		blcn_Q_impleCp[i] = (uint16_T) (temp[i] /36000 * 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]);  
     }
+    //
+    FirstRun_BLC = false;
+    memcpy(blcn_Q_reqCpEo_Delay,blcv_Q_reqCpEo, sizeof(blcn_Q_reqCpEE));
 
-    /* End of Saturate: '<S5>/Saturation' */
-
-    /* Sum: '<S5>/Add1' incorporates:
-     *  Merge: '<S2>/blcv_Q_totalCpEE_Merge'
-     */
-    blcv_Q_totalCpEo[i_0] = BLC_B.blcv_Q_totalCpEE_Merge[i_0] +
-      blcn_Q_impleCp[i_0];
-  }
-
-  /* Update for UnitDelay: '<S11>/Unit Delay1' incorporates:
-   *  Constant: '<S11>/Constant1'
-   */
-  BLC_DW.UnitDelay1_DSTATE = false;
-
-  /* Update for UnitDelay: '<S1>/Unit Delay1' incorporates:
-   *  Constant: '<S1>/Constant'
-   */
-  BLC_DW.UnitDelay1_DSTATE_a = false;
 }
-
-/* Model initialize function */
-void BLC_initialize(const char_T **rt_errorStatus)
-{
-  RT_MODEL_BLC_T *const BLC_M = &(BLC_MdlrefDW.rtm);
-
-  /* Registration code */
-
-  /* initialize error status */
-  rtmSetErrorStatusPointer(BLC_M, rt_errorStatus);
-}
-
-/*
- * File trailer for generated code.
- *
- * [EOF]
- */

+ 1 - 1
src/EmbeddedCoder_src/SFM.c

@@ -502,7 +502,7 @@ void SFM(void)
   /* RelationalOperator: '<S23>/Relational Operator1' incorporates:
    *  Constant: '<S23>/para'
    */
-  rtb_RelationalOperator1 = (rtb_Saturation > 1);
+  rtb_RelationalOperator1 = (rtb_Saturation > 2);
 
   /* Chart: '<S13>/Chart' incorporates:
    *  Constant: '<S13>/Constant'

+ 0 - 2162
src/EmbeddedCoder_src/SFM1.c

@@ -1,2162 +0,0 @@
-/*
- * File: SFM.c
- *
- * Code generated for Simulink model 'SFM'.
- *
- * Model version                  : 1.88
- * Simulink Coder version         : 9.4 (R2020b) 29-Jul-2020
- * C/C++ source code generated on : Fri Sep 10 17:41:38 2021
- *
- * Target selection: ert.tlc
- * Embedded hardware selection: Intel->x86-64 (Windows64)
- * Code generation objectives: Unspecified
- * Validation result: Not run
- */
-
-#include "SFM.h"
-#include "SFM_private.h"
-#include "div_uus32_sat.h"
-#include "mul_s32_hiSR.h"
-
-MdlrefDW_SFM_T SFM_MdlrefDW;
-
-/* Block signals (default storage) */
-B_SFM_c_T SFM_B;
-
-/* Block states (default storage) */
-DW_SFM_f_T SFM_DW;
-
-/*
- * System initialize for atomic system:
- *    '<S27>/Subsytem'
- *    '<S27>/Subsytem2'
- *    '<S27>/Subsytem4'
- *    '<S27>/Subsytem5'
- */
-void SFM_Subsytem_Init(DW_Subsytem_SFM_T *localDW)
-{
-  /* InitializeConditions for UnitDelay: '<S31>/delay' */
-  localDW->delay_DSTATE = 1U;
-}
-
-/*
- * Output and update for atomic system:
- *    '<S27>/Subsytem'
- *    '<S27>/Subsytem2'
- *    '<S27>/Subsytem4'
- *    '<S27>/Subsytem5'
- */
-boolean_T SFM_Subsytem(uint8_T rtu_Enable, boolean_T rtu_Precondition, int16_T
-  rtu_inputs, int16_T rtu_threshold, uint8_T rtu_CtrN, DW_Subsytem_SFM_T
-  *localDW)
-{
-  uint8_T rtb_Saturation_h;
-
-  /* Saturate: '<S31>/Saturation' incorporates:
-   *  Constant: '<S31>/Constant1'
-   *  Sum: '<S31>/Add'
-   *  UnitDelay: '<S31>/delay'
-   */
-  if ((uint8_T)(localDW->delay_DSTATE + 1U) < 200) {
-    rtb_Saturation_h = (uint8_T)(localDW->delay_DSTATE + 1U);
-  } else {
-    rtb_Saturation_h = 200U;
-  }
-
-  /* End of Saturate: '<S31>/Saturation' */
-
-  /* Product: '<S31>/Product' incorporates:
-   *  Logic: '<S31>/Logical Operator1'
-   *  RelationalOperator: '<S31>/Relational Operator'
-   *  UnitDelay: '<S31>/delay'
-   */
-  localDW->delay_DSTATE = (uint8_T)((rtu_Enable != 0) && rtu_Precondition &&
-    (rtu_inputs >= rtu_threshold) ? (int32_T)rtb_Saturation_h : 0);
-
-  /* RelationalOperator: '<S31>/Relational Operator1' */
-  return rtb_Saturation_h > rtu_CtrN;
-}
-
-/*
- * System initialize for atomic system:
- *    '<S27>/Subsytem1'
- *    '<S27>/Subsytem3'
- */
-void SFM_Subsytem1_Init(DW_Subsytem1_SFM_T *localDW)
-{
-  /* InitializeConditions for UnitDelay: '<S32>/delay' */
-  localDW->delay_DSTATE = 1U;
-}
-
-/*
- * Output and update for atomic system:
- *    '<S27>/Subsytem1'
- *    '<S27>/Subsytem3'
- */
-boolean_T SFM_Subsytem1(uint8_T rtu_Enable, boolean_T rtu_Precondition, int16_T
-  rtu_InputS, int16_T rtu_threshold, uint8_T rtu_CtrN, DW_Subsytem1_SFM_T
-  *localDW)
-{
-  uint8_T rtb_Saturation_f;
-
-  /* Saturate: '<S32>/Saturation' incorporates:
-   *  Constant: '<S32>/Constant2'
-   *  Sum: '<S32>/Add'
-   *  UnitDelay: '<S32>/delay'
-   */
-  if ((uint8_T)(localDW->delay_DSTATE + 1U) < 200) {
-    rtb_Saturation_f = (uint8_T)(localDW->delay_DSTATE + 1U);
-  } else {
-    rtb_Saturation_f = 200U;
-  }
-
-  /* End of Saturate: '<S32>/Saturation' */
-
-  /* Product: '<S32>/Product' incorporates:
-   *  Logic: '<S32>/Logical Operator'
-   *  RelationalOperator: '<S32>/Relational Operator'
-   *  UnitDelay: '<S32>/delay'
-   */
-  localDW->delay_DSTATE = (uint8_T)((rtu_Enable != 0) && rtu_Precondition &&
-    (rtu_InputS <= rtu_threshold) ? (int32_T)rtb_Saturation_f : 0);
-
-  /* RelationalOperator: '<S32>/Relational Operator1' */
-  return rtb_Saturation_f > rtu_CtrN;
-}
-
-/*
- * Output and update for atomic system:
- *    '<S28>/Subsystem5'
- *    '<S28>/Subsystem6'
- *    '<S28>/Subsystem7'
- *    '<S28>/Subsystem8'
- */
-boolean_T SFM_Subsystem5(boolean_T rtu_In1, boolean_T rtu_In2)
-{
-  /* Logic: '<S37>/Logical Operator' incorporates:
-   *  RelationalOperator: '<S37>/Relational Operator'
-   *  RelationalOperator: '<S37>/Relational Operator1'
-   */
-  return (!rtu_In1) && (!rtu_In2);
-}
-
-/*
- * System initialize for atomic system:
- *    '<S28>/Subsytem'
- *    '<S28>/Subsytem2'
- *    '<S28>/Subsytem4'
- *    '<S28>/Subsytem5'
- */
-void SFM_Subsytem_b_Init(DW_Subsytem_SFM_d_T *localDW)
-{
-  /* InitializeConditions for UnitDelay: '<S41>/delay' */
-  localDW->delay_DSTATE = 1U;
-}
-
-/*
- * Output and update for atomic system:
- *    '<S28>/Subsytem'
- *    '<S28>/Subsytem2'
- *    '<S28>/Subsytem4'
- *    '<S28>/Subsytem5'
- */
-boolean_T SFM_Subsytem_j(uint8_T rtu_Enable, boolean_T rtu_Precondition,
-  uint16_T rtu_inputs, uint16_T rtu_threshold, uint8_T rtu_CtrN,
-  DW_Subsytem_SFM_d_T *localDW)
-{
-  uint8_T rtb_Saturation_h;
-
-  /* Saturate: '<S41>/Saturation' incorporates:
-   *  Constant: '<S41>/Constant1'
-   *  Sum: '<S41>/Add'
-   *  UnitDelay: '<S41>/delay'
-   */
-  if ((uint8_T)(localDW->delay_DSTATE + 1U) < 200) {
-    rtb_Saturation_h = (uint8_T)(localDW->delay_DSTATE + 1U);
-  } else {
-    rtb_Saturation_h = 200U;
-  }
-
-  /* End of Saturate: '<S41>/Saturation' */
-
-  /* Product: '<S41>/Product' incorporates:
-   *  Logic: '<S41>/Logical Operator1'
-   *  RelationalOperator: '<S41>/Relational Operator'
-   *  UnitDelay: '<S41>/delay'
-   */
-  localDW->delay_DSTATE = (uint8_T)((rtu_Enable != 0) && rtu_Precondition &&
-    (rtu_inputs >= rtu_threshold) ? (int32_T)rtb_Saturation_h : 0);
-
-  /* RelationalOperator: '<S41>/Relational Operator1' */
-  return rtb_Saturation_h > rtu_CtrN;
-}
-
-/*
- * System initialize for atomic system:
- *    '<S28>/Subsytem1'
- *    '<S28>/Subsytem3'
- */
-void SFM_Subsytem1_f_Init(DW_Subsytem1_SFM_k_T *localDW)
-{
-  /* InitializeConditions for UnitDelay: '<S42>/delay' */
-  localDW->delay_DSTATE = 1U;
-}
-
-/*
- * Output and update for atomic system:
- *    '<S28>/Subsytem1'
- *    '<S28>/Subsytem3'
- */
-boolean_T SFM_Subsytem1_n(uint8_T rtu_Enable, boolean_T rtu_Precondition,
-  uint16_T rtu_InputS, uint16_T rtu_threshold, uint8_T rtu_CtrN,
-  DW_Subsytem1_SFM_k_T *localDW)
-{
-  uint8_T rtb_Saturation_i;
-
-  /* Saturate: '<S42>/Saturation' incorporates:
-   *  Constant: '<S42>/Constant2'
-   *  Sum: '<S42>/Add'
-   *  UnitDelay: '<S42>/delay'
-   */
-  if ((uint8_T)(localDW->delay_DSTATE + 1U) < 200) {
-    rtb_Saturation_i = (uint8_T)(localDW->delay_DSTATE + 1U);
-  } else {
-    rtb_Saturation_i = 200U;
-  }
-
-  /* End of Saturate: '<S42>/Saturation' */
-
-  /* Product: '<S42>/Product' incorporates:
-   *  Logic: '<S42>/Logical Operator'
-   *  RelationalOperator: '<S42>/Relational Operator'
-   *  UnitDelay: '<S42>/delay'
-   */
-  localDW->delay_DSTATE = (uint8_T)((rtu_Enable != 0) && rtu_Precondition &&
-    (rtu_InputS <= rtu_threshold) ? (int32_T)rtb_Saturation_i : 0);
-
-  /* RelationalOperator: '<S42>/Relational Operator1' */
-  return rtb_Saturation_i > rtu_CtrN;
-}
-
-/*
- * System initialize for atomic system:
- *    '<S28>/Subsytem6'
- *    '<S28>/Subsytem8'
- */
-void SFM_Subsytem6_Init(DW_Subsytem6_SFM_T *localDW)
-{
-  /* InitializeConditions for UnitDelay: '<S47>/delay' */
-  localDW->delay_DSTATE = 1U;
-}
-
-/*
- * Output and update for atomic system:
- *    '<S28>/Subsytem6'
- *    '<S28>/Subsytem8'
- */
-boolean_T SFM_Subsytem6(uint8_T rtu_Enable, boolean_T rtu_Precondition, uint32_T
-  rtu_inputs, uint16_T rtu_threshold, uint8_T rtu_CtrN, DW_Subsytem6_SFM_T
-  *localDW)
-{
-  uint8_T rtb_Saturation_h;
-
-  /* Saturate: '<S47>/Saturation' incorporates:
-   *  Constant: '<S47>/Constant1'
-   *  Sum: '<S47>/Add'
-   *  UnitDelay: '<S47>/delay'
-   */
-  if ((uint8_T)(localDW->delay_DSTATE + 1U) < 200) {
-    rtb_Saturation_h = (uint8_T)(localDW->delay_DSTATE + 1U);
-  } else {
-    rtb_Saturation_h = 200U;
-  }
-
-  /* End of Saturate: '<S47>/Saturation' */
-
-  /* Product: '<S47>/Product' incorporates:
-   *  Logic: '<S47>/Logical Operator1'
-   *  RelationalOperator: '<S47>/Relational Operator'
-   *  UnitDelay: '<S47>/delay'
-   */
-  localDW->delay_DSTATE = (uint8_T)((rtu_Enable != 0) && rtu_Precondition &&
-    (rtu_inputs >= rtu_threshold * 100U) ? (int32_T)rtb_Saturation_h : 0);
-
-  /* RelationalOperator: '<S47>/Relational Operator1' */
-  return rtb_Saturation_h > rtu_CtrN;
-}
-
-/*
- * System initialize for atomic system:
- *    '<S28>/Subsytem7'
- *    '<S28>/Subsytem9'
- */
-void SFM_Subsytem7_Init(DW_Subsytem7_SFM_T *localDW)
-{
-  /* InitializeConditions for UnitDelay: '<S48>/delay' */
-  localDW->delay_DSTATE = 1U;
-}
-
-/*
- * Output and update for atomic system:
- *    '<S28>/Subsytem7'
- *    '<S28>/Subsytem9'
- */
-boolean_T SFM_Subsytem7(uint8_T rtu_Enable, boolean_T rtu_Precondition, uint32_T
-  rtu_InputS, uint16_T rtu_threshold, uint8_T rtu_CtrN, DW_Subsytem7_SFM_T
-  *localDW)
-{
-  uint8_T rtb_Saturation_m;
-
-  /* Saturate: '<S48>/Saturation' incorporates:
-   *  Constant: '<S48>/Constant2'
-   *  Sum: '<S48>/Add'
-   *  UnitDelay: '<S48>/delay'
-   */
-  if ((uint8_T)(localDW->delay_DSTATE + 1U) < 200) {
-    rtb_Saturation_m = (uint8_T)(localDW->delay_DSTATE + 1U);
-  } else {
-    rtb_Saturation_m = 200U;
-  }
-
-  /* End of Saturate: '<S48>/Saturation' */
-
-  /* Product: '<S48>/Product' incorporates:
-   *  Logic: '<S48>/Logical Operator'
-   *  RelationalOperator: '<S48>/Relational Operator'
-   *  UnitDelay: '<S48>/delay'
-   */
-  localDW->delay_DSTATE = (uint8_T)((rtu_Enable != 0) && rtu_Precondition &&
-    (rtu_InputS <= rtu_threshold * 100U) ? (int32_T)rtb_Saturation_m : 0);
-
-  /* RelationalOperator: '<S48>/Relational Operator1' */
-  return rtb_Saturation_m > rtu_CtrN;
-}
-
-/* System initialize for referenced model: 'SFM' */
-void SFM_Init(void)
-{
-  /* InitializeConditions for UnitDelay: '<S23>/Time_Delay' */
-  SFM_DW.Time_Delay_DSTATE = 1U;
-
-  /* SystemInitialize for Chart: '<S13>/Chart' */
-  SFM_DW.FirstFlg = true;
-
-  /* SystemInitialize for Atomic SubSystem: '<S28>/Subsytem' */
-  SFM_Subsytem_b_Init(&SFM_DW.Subsytem_j0);
-
-  /* End of SystemInitialize for SubSystem: '<S28>/Subsytem' */
-
-  /* SystemInitialize for Atomic SubSystem: '<S28>/Subsytem2' */
-  SFM_Subsytem_b_Init(&SFM_DW.Subsytem2_p);
-
-  /* End of SystemInitialize for SubSystem: '<S28>/Subsytem2' */
-
-  /* SystemInitialize for Atomic SubSystem: '<S28>/Subsytem1' */
-  SFM_Subsytem1_f_Init(&SFM_DW.Subsytem1_n);
-
-  /* End of SystemInitialize for SubSystem: '<S28>/Subsytem1' */
-
-  /* SystemInitialize for Atomic SubSystem: '<S28>/Subsytem3' */
-  SFM_Subsytem1_f_Init(&SFM_DW.Subsytem3_b);
-
-  /* End of SystemInitialize for SubSystem: '<S28>/Subsytem3' */
-
-  /* SystemInitialize for Atomic SubSystem: '<S28>/Subsytem4' */
-  SFM_Subsytem_b_Init(&SFM_DW.Subsytem4_p);
-
-  /* End of SystemInitialize for SubSystem: '<S28>/Subsytem4' */
-
-  /* SystemInitialize for Atomic SubSystem: '<S28>/Subsytem5' */
-  SFM_Subsytem_b_Init(&SFM_DW.Subsytem5_l);
-
-  /* End of SystemInitialize for SubSystem: '<S28>/Subsytem5' */
-
-  /* SystemInitialize for Atomic SubSystem: '<S28>/Subsytem6' */
-  SFM_Subsytem6_Init(&SFM_DW.Subsytem6);
-
-  /* End of SystemInitialize for SubSystem: '<S28>/Subsytem6' */
-
-  /* SystemInitialize for Atomic SubSystem: '<S28>/Subsytem8' */
-  SFM_Subsytem6_Init(&SFM_DW.Subsytem8);
-
-  /* End of SystemInitialize for SubSystem: '<S28>/Subsytem8' */
-
-  /* SystemInitialize for Atomic SubSystem: '<S28>/Subsytem7' */
-  SFM_Subsytem7_Init(&SFM_DW.Subsytem7);
-
-  /* End of SystemInitialize for SubSystem: '<S28>/Subsytem7' */
-
-  /* SystemInitialize for Atomic SubSystem: '<S28>/Subsytem9' */
-  SFM_Subsytem7_Init(&SFM_DW.Subsytem9);
-
-  /* End of SystemInitialize for SubSystem: '<S28>/Subsytem9' */
-
-  /* SystemInitialize for Atomic SubSystem: '<S27>/Subsytem' */
-  SFM_Subsytem_Init(&SFM_DW.Subsytem_j);
-
-  /* End of SystemInitialize for SubSystem: '<S27>/Subsytem' */
-
-  /* SystemInitialize for Atomic SubSystem: '<S27>/Subsytem2' */
-  SFM_Subsytem_Init(&SFM_DW.Subsytem2);
-
-  /* End of SystemInitialize for SubSystem: '<S27>/Subsytem2' */
-
-  /* SystemInitialize for Atomic SubSystem: '<S27>/Subsytem1' */
-  SFM_Subsytem1_Init(&SFM_DW.Subsytem1_e);
-
-  /* End of SystemInitialize for SubSystem: '<S27>/Subsytem1' */
-
-  /* SystemInitialize for Atomic SubSystem: '<S27>/Subsytem3' */
-  SFM_Subsytem1_Init(&SFM_DW.Subsytem3);
-
-  /* End of SystemInitialize for SubSystem: '<S27>/Subsytem3' */
-
-  /* SystemInitialize for Atomic SubSystem: '<S27>/Subsytem4' */
-  SFM_Subsytem_Init(&SFM_DW.Subsytem4);
-
-  /* End of SystemInitialize for SubSystem: '<S27>/Subsytem4' */
-
-  /* SystemInitialize for Atomic SubSystem: '<S27>/Subsytem5' */
-  SFM_Subsytem_Init(&SFM_DW.Subsytem5);
-
-  /* End of SystemInitialize for SubSystem: '<S27>/Subsytem5' */
-
-  /* SystemInitialize for Atomic SubSystem: '<S24>/Subsytem' */
-  /* InitializeConditions for UnitDelay: '<S29>/delay' */
-  SFM_DW.delay_DSTATE_j = 1U;
-
-  /* End of SystemInitialize for SubSystem: '<S24>/Subsytem' */
-
-  /* SystemInitialize for Atomic SubSystem: '<S24>/Subsytem1' */
-  /* InitializeConditions for UnitDelay: '<S30>/delay' */
-  SFM_DW.delay_DSTATE = 1U;
-  uint8_T i;
-  for(i=0;i<17;i++)
-  	{
-
- SFM_DW.ChgNr[i]=0;
- SFM_DW.RecNr[i]=0;
- SFM_DW.UdelNr[i]=0;
-  }
-  SFM_DW.Cntl=0;
-
-  /* End of SystemInitialize for SubSystem: '<S24>/Subsytem1' */
-}
-
-/* Output and update for referenced model: 'SFM' */
-void SFM(void)
-{
-  /* local block i/o variables */
-  uint32_T rtb_SumU;
-  real_T tmp_2;
-  int32_T i_0;
-  int32_T tmp_0;
-  int32_T tmp_1;
-  uint32_T qY;
-  uint32_T qY_0;
-  uint16_T FltCodeArrS[20];
-  uint16_T avrgU;
-  uint16_T k;
-  uint16_T rtb_Saturation;
-  uint16_T temp;
-  uint16_T tmp_3;
-  uint8_T rtb_TmpSignalConversionAtSFun_l[155];
-  uint8_T rtb_TmpSignalConversionAtSFunct[155];
-  uint8_T rtb_FltActArr[20];
-  uint8_T rtb_FltLevelArr[20];
-  uint8_T i;
-  uint8_T j;
-  boolean_T rtb_TmpSignalConversionAtSFun_a[155];
-  boolean_T rtb_RelationalOperator1;
-  boolean_T rtb_RelationalOperator1_a;
-  boolean_T rtb_RelationalOperator1_bb;
-  boolean_T rtb_RelationalOperator1_d;
-  boolean_T rtb_RelationalOperator1_di;
-  boolean_T rtb_RelationalOperator1_eg;
-  boolean_T rtb_RelationalOperator1_ep;
-  boolean_T rtb_RelationalOperator1_fg;
-  boolean_T rtb_RelationalOperator1_gr;
-  boolean_T rtb_RelationalOperator1_i;
-  boolean_T rtb_RelationalOperator1_it;
-  boolean_T rtb_RelationalOperator1_j;
-  boolean_T rtb_RelationalOperator1_l;
-  boolean_T rtb_RelationalOperator1_lf;
-  boolean_T rtb_RelationalOperator1_o;
-  boolean_T rtb_RelationalOperator1_p;
-  boolean_T rtb_RelationalOperator_et;
-  boolean_T tmp;
-
-  /* Saturate: '<S23>/Saturation' incorporates:
-   *  Constant: '<S23>/Constant'
-   *  Sum: '<S23>/Add'
-   *  UnitDelay: '<S23>/Time_Delay'
-   */
-  if ((uint16_T)(SFM_DW.Time_Delay_DSTATE + 1U) < 60000) {
-    rtb_Saturation = (uint16_T)(SFM_DW.Time_Delay_DSTATE + 1U);
-  } else {
-    rtb_Saturation = 60000U;
-  }
-
-  /* End of Saturate: '<S23>/Saturation' */
-
-  /* RelationalOperator: '<S23>/Relational Operator1' incorporates:
-   *  Constant: '<S23>/para'
-   */
-  rtb_RelationalOperator1 = (rtb_Saturation > 1);
-
-  /* Chart: '<S13>/Chart' incorporates:
-   *  Constant: '<S13>/Constant'
-   *  Constant: '<S13>/Constant1'
-   *  Inport: '<Root>/ihv_V_cellU'
-   */
-  if (!rtb_RelationalOperator1) {
-    j = 0U;
-    while ((j < 3) && SFM_DW.FirstFlg) {
-      for (i = 0U; i < cmnc_num_cellUNum; i++) {
-        SFM_DW.CellUArry[j + 3 * i] = ihv_V_cellU[i];
-      }
-
-      j++;
-    }
-
-    SFM_DW.FirstFlg = false;
-    for (j = 0U; j < 2; j++) {
-      for (i = 0U; i < cmnc_num_cellUNum; i++) {
-        i_0 = 3 * i + j;
-        SFM_DW.CellUArry[i_0] = SFM_DW.CellUArry[i_0 + 1];
-      }
-    }
-
-    for (i = 0U; i < cmnc_num_cellUNum; i++) {
-      SFM_DW.CellUArry[3 * i + 2] = ihv_V_cellU[i];
-    }
-
-    for (i = 0U; i < cmnc_num_cellUNum - 1; i++) {
-      i_0 = 3 * i;
-      tmp_1 = (i + 1) * 3;
-      i_0 = SFM_DW.CellUArry[i_0 + 2] - SFM_DW.CellUArry[i_0];
-      tmp_1 = SFM_DW.CellUArry[tmp_1 + 2] - SFM_DW.CellUArry[tmp_1];
-      if (((real_T)i_0 * 0.001 < -0.05) && ((real_T)tmp_1 * 0.001 > 0.05)) {
-        tmp_0 = SFM_DW.ChgNr[i] + 1;
-        if (tmp_0 > 255) {
-          tmp_0 = 255;
-        }
-
-        SFM_DW.ChgNr[i] = (uint8_T)tmp_0;
-      } else {
-        SFM_DW.ChgNr[i] = 0U;
-      }
-
-      if ((SFM_DW.ChgNr[i] >= 2) && ((mul_s32_hiSR(i_0, 274877907, 6U) < -1) &&
-           (tmp_1 > 1000))) {
-        SFM_B.ErrFlg[i] = true;
-        SFM_DW.ErrUFlg[i] = true;
-        SFM_DW.ErrUFlg[i + 1] = true;
-      }
-
-      if (SFM_B.ErrFlg[i] && (i > 0)) {
-        for (j = 0U; j < i; j++) {
-          i_0 = i - j;
-          tmp_1 = i_0 * 3;
-          if ((real_T)(SFM_DW.CellUArry[tmp_1 + 2] - SFM_DW.CellUArry[tmp_1 + 1])
-              * 0.001 < -0.2) {
-            SFM_B.ErrFlg[i_0] = true;
-            SFM_DW.ErrUFlg[i_0] = true;
-          }
-        }
-      }
-    }
-
-    if ((mul_s32_hiSR(SFM_DW.CellUArry[2] - SFM_DW.CellUArry[1], 274877907, 6U) <
-         -1) && (mul_s32_hiSR(SFM_DW.CellUArry[5] - SFM_DW.CellUArry[4],
-          274877907, 6U) < -1) && (mul_s32_hiSR(SFM_DW.CellUArry[8] -
-          SFM_DW.CellUArry[7], 274877907, 6U) < -1)) {
-      SFM_B.GNDFlg = false;
-      SFM_DW.ErrUFlg[0] = true;
-      SFM_DW.ErrUFlg[1] = true;
-      SFM_DW.ErrUFlg[2] = true;
-    }
-
-    i = 0U;
-    SFM_B.MinU = 10000U;
-    SFM_B.MaxU = 0U;
-    rtb_SumU = 0U;
-    j = 0U;
-    while (i < cmnc_num_cellUNum) {
-      if (!SFM_DW.ErrUFlg[i]) {
-        qY_0 = rtb_SumU + /*MW:OvSatOk*/ ihv_V_cellU[i];
-        if (qY_0 < rtb_SumU) {
-          qY_0 = MAX_uint32_T;
-        }
-
-        rtb_SumU = qY_0;
-        i_0 = j + 1;
-        if (j + 1 > 255) {
-          i_0 = 255;
-        }
-
-        j = (uint8_T)i_0;
-        if (ihv_V_cellU[i] > SFM_B.MaxU) {
-          SFM_B.MaxU = ihv_V_cellU[i];
-        }
-
-        if (ihv_V_cellU[i] < SFM_B.MinU) {
-          SFM_B.MinU = ihv_V_cellU[i];
-        }
-      }
-
-      i++;
-    }
-
-    if (SFM_B.MaxU - SFM_B.MinU > 3000) {
-      qY_0 = rtb_SumU - /*MW:OvSatOk*/ SFM_B.MaxU;
-      if (qY_0 > rtb_SumU) {
-        qY_0 = 0U;
-      }
-
-      qY = qY_0 - /*MW:OvSatOk*/ SFM_B.MinU;
-      if (qY > qY_0) {
-        qY = 0U;
-      }
-
-      qY_0 = div_uus32_sat(qY, j - 2);
-      if (qY_0 > 65535U) {
-        qY_0 = 65535U;
-      }
-
-      avrgU = (uint16_T)qY_0;
-      for (i = 0U; i < cmnc_num_cellUNum; i++) {
-        if (!SFM_DW.ErrUFlg[i]) {
-          if ((real_T)(ihv_V_cellU[i] - (uint16_T)qY_0) * 0.001 > 1.5) {
-            i_0 = SFM_DW.UdelNr[i] + 1;
-            if (i_0 > 255) {
-              i_0 = 255;
-            }
-
-            SFM_DW.UdelNr[i] = (uint8_T)i_0;
-          } else {
-            SFM_DW.UdelNr[i] = 0U;
-          }
-
-          if (SFM_DW.UdelNr[i] >= 2) {
-            SFM_B.ErrFlg[i] = true;
-            SFM_DW.ErrUFlg[i] = true;
-          }
-        }
-      }
-    } else {
-      qY_0 = j == 0U ? MAX_uint32_T : rtb_SumU / j;
-      if (qY_0 > 65535U) {
-        qY_0 = 65535U;
-      }
-
-      avrgU = (uint16_T)qY_0;
-    }
-
-    for (i = 0U; i < cmnc_num_cellUNum; i++) {
-      if (SFM_DW.ErrUFlg[i]) {
-        tmp_2 = (real_T)(ihv_V_cellU[i] - avrgU) * 0.001;
-        if ((tmp_2 < 0.2) && (tmp_2 > -0.2)) {
-          i_0 = SFM_DW.RecNr[i] + 1;
-          if (i_0 > 255) {
-            i_0 = 255;
-          }
-
-          SFM_DW.RecNr[i] = (uint8_T)i_0;
-        } else {
-          SFM_DW.RecNr[i] = 0U;
-        }
-
-        if (SFM_DW.RecNr[i] >= 2) {
-          SFM_B.ErrFlg[i] = false;
-          SFM_DW.ErrUFlg[i] = false;
-          SFM_B.GNDFlg = ((i != 0) && SFM_B.GNDFlg);
-        }
-      }
-    }
-
-    for (i = 0U; i < cmnc_num_cellUNum; i++) {
-      if (SFM_DW.ErrUFlg[i]) {
-        SFM_B.CellU[i] = avrgU;
-      } else {
-        SFM_B.CellU[i] = ihv_V_cellU[i];
-      }
-    }
-  } else {
-    for (i_0 = 0; i_0 < 28; i_0++) {
-      SFM_B.CellU[i_0] = ihv_V_cellU[i_0];
-      SFM_B.ErrFlg[i_0] = false;
-    }
-  }
-
-  i = 0U;
-  rtb_SumU = 0U;
-  while (i < cmnc_num_cellUNum) {
-    qY_0 = rtb_SumU + /*MW:OvSatOk*/ SFM_B.CellU[i];
-    if (qY_0 < rtb_SumU) {
-      qY_0 = MAX_uint32_T;
-    }
-
-    rtb_SumU = qY_0;
-    i++;
-  }
-
-  for (i_0 = 0; i_0 < 28; i_0++) {
-    /* SignalConversion generated from: '<S13>/Chart' */
-    sfmv_V_cellU[i_0] = SFM_B.CellU[i_0];
-  }
-
-
- for(i=0;i<17;i++)
- 	{
- 	printf("cell%d  %d  ",i,SFM_B.ErrFlg[i]);
- 	}
- printf('\n');
-
- for(i=0;i<17;i++)
- 	{
- 	printf("cell%d  %d  ",i,ihv_V_cellU[i]);
- 	}
- printf('\n');
-  for(i=0;i<17;i++)
- 	{
- 	printf("cell%d  %d  ",i,sfmv_V_cellU[i]);
- 	}
- printf('\n');
-
-
- 
-
-
-  /* Logic: '<S13>/Logical Operator1' */
-  tmp = SFM_B.ErrFlg[0];
-  for (i_0 = 0; i_0 < 27; i_0++) {
-    tmp = (tmp || SFM_B.ErrFlg[i_0 + 1]);
-  }
-
-  rtb_RelationalOperator_et = tmp;
-
-  /* Logic: '<S15>/Logical Operator' */
-  sfmv_flg_TFlt = false;
-
-  /* SignalConversion: '<S14>/Signal Conversion' incorporates:
-   *  Inport: '<Root>/ihd_flg_currFlt'
-   */
-  sfmd_flg_currFlt = ihd_flg_currFlt;
-
-  /* SignalConversion generated from: '<S13>/Chart' */
-  sfmd_V_cellUMax = SFM_B.MaxU;
-
-  /* Outputs for Atomic SubSystem: '<S28>/Subsytem' */
-  /* Constant: '<S28>/Constant28' incorporates:
-   *  Constant: '<S28>/Constant25'
-   *  Constant: '<S28>/Constant27'
-   *  Logic: '<S28>/Logical Operator5'
-   */
-  rtb_RelationalOperator1_ep = SFM_Subsytem_j(1, !rtb_RelationalOperator1,
-    sfmd_V_cellUMax, sfmc_V_cellUMaxThr2, 2, &SFM_DW.Subsytem_j0);
-
-  /* End of Outputs for SubSystem: '<S28>/Subsytem' */
-
-  /* Outputs for Atomic SubSystem: '<S28>/Subsytem2' */
-  /* Constant: '<S28>/Constant26' incorporates:
-   *  Constant: '<S28>/Constant23'
-   *  Constant: '<S28>/Constant24'
-   *  Logic: '<S28>/Logical Operator3'
-   */
-  rtb_RelationalOperator1_j = SFM_Subsytem_j(1, !rtb_RelationalOperator1,
-    sfmd_V_cellUMax, sfmc_V_cellUMaxThr1, 2, &SFM_DW.Subsytem2_p);
-
-  /* End of Outputs for SubSystem: '<S28>/Subsytem2' */
-
-  /* SignalConversion generated from: '<S13>/Chart' */
-  sfmd_V_cellUMin = SFM_B.MinU;
-
-  /* Outputs for Atomic SubSystem: '<S28>/Subsytem1' */
-  /* Constant: '<S28>/Constant22' incorporates:
-   *  Constant: '<S28>/Constant20'
-   *  Constant: '<S28>/Constant21'
-   *  Logic: '<S28>/Logical Operator1'
-   */
-  rtb_RelationalOperator1_di = SFM_Subsytem1_n(1, !rtb_RelationalOperator1,
-    sfmd_V_cellUMin, sfmc_V_cellUMinThr2, 2, &SFM_DW.Subsytem1_n);
-
-  /* End of Outputs for SubSystem: '<S28>/Subsytem1' */
-
-  /* Outputs for Atomic SubSystem: '<S28>/Subsytem3' */
-  /* Constant: '<S28>/Constant19' incorporates:
-   *  Constant: '<S28>/Constant10'
-   *  Constant: '<S28>/Constant18'
-   *  Logic: '<S28>/Logical Operator6'
-   */
-  rtb_RelationalOperator1_l = SFM_Subsytem1_n(1, !rtb_RelationalOperator1,
-    sfmd_V_cellUMin, sfmc_V_cellUMinThr1, 2, &SFM_DW.Subsytem3_b);
-
-  /* End of Outputs for SubSystem: '<S28>/Subsytem3' */
-
-  /* Outputs for Atomic SubSystem: '<S28>/Subsytem4' */
-  /* Constant: '<S28>/Constant14' incorporates:
-   *  Constant: '<S28>/Constant12'
-   *  Constant: '<S28>/Constant13'
-   *  Logic: '<S28>/Logical Operator2'
-   *  SignalConversion generated from: '<S13>/Chart'
-   *  Sum: '<S28>/Add'
-   * */
-  rtb_RelationalOperator1_lf = SFM_Subsytem_j(1, !rtb_RelationalOperator1,
-    (uint16_T)(sfmd_V_cellUMax - sfmd_V_cellUMin), sfmc_flg_cellUDiffThr2, 2,
-    &SFM_DW.Subsytem4_p);
-
-  /* End of Outputs for SubSystem: '<S28>/Subsytem4' */
-
-  /* Outputs for Atomic SubSystem: '<S28>/Subsytem5' */
-  /* Constant: '<S28>/Constant1' incorporates:
-   *  Constant: '<S28>/Constant2'
-   *  Constant: '<S28>/Constant3'
-   *  Logic: '<S28>/Logical Operator9'
-   *  SignalConversion generated from: '<S13>/Chart'
-   *  Sum: '<S28>/Add1'
-   * */
-  rtb_RelationalOperator1_eg = SFM_Subsytem_j(1, !rtb_RelationalOperator1,
-    (uint16_T)(sfmd_V_cellUMax - sfmd_V_cellUMin), sfmc_flg_cellUDiffThr1, 2,
-    &SFM_DW.Subsytem5_l);
-
-  /* End of Outputs for SubSystem: '<S28>/Subsytem5' */
-
-  /* Logic: '<S13>/Logical Operator2' incorporates:
-   *  Logic: '<S13>/Logical Operator1'
-   */
-  sfmd_flg_volFlt = (tmp || rtb_RelationalOperator1);
-
-  /* Outputs for Atomic SubSystem: '<S28>/Subsystem5' */
-  rtb_RelationalOperator1_fg = SFM_Subsystem5(sfmd_flg_volFlt,
-    rtb_RelationalOperator1);
-
-  /* End of Outputs for SubSystem: '<S28>/Subsystem5' */
-
-  /* Outputs for Atomic SubSystem: '<S28>/Subsytem6' */
-  /* Constant: '<S28>/Constant30' incorporates:
-   *  Constant: '<S28>/Constant16'
-   *  Constant: '<S28>/Constant29'
-   */
-  rtb_RelationalOperator1_fg = SFM_Subsytem6(1, rtb_RelationalOperator1_fg,
-    rtb_SumU, sfmc_V_battUMaxThr2, 2, &SFM_DW.Subsytem6);
-
-  /* End of Outputs for SubSystem: '<S28>/Subsytem6' */
-
-  /* Outputs for Atomic SubSystem: '<S28>/Subsystem6' */
-  rtb_RelationalOperator1_o = SFM_Subsystem5(sfmd_flg_volFlt,
-    rtb_RelationalOperator1);
-
-  /* End of Outputs for SubSystem: '<S28>/Subsystem6' */
-
-  /* Outputs for Atomic SubSystem: '<S28>/Subsytem8' */
-  /* Constant: '<S28>/Constant17' incorporates:
-   *  Constant: '<S28>/Constant11'
-   *  Constant: '<S28>/Constant15'
-   */
-  rtb_RelationalOperator1_it = SFM_Subsytem6(1, rtb_RelationalOperator1_o,
-    rtb_SumU, sfmc_V_battUMaxThr1, 2, &SFM_DW.Subsytem8);
-
-  /* End of Outputs for SubSystem: '<S28>/Subsytem8' */
-
-  /* Outputs for Atomic SubSystem: '<S28>/Subsystem7' */
-  rtb_RelationalOperator1_o = SFM_Subsystem5(sfmd_flg_volFlt,
-    rtb_RelationalOperator1);
-
-  /* End of Outputs for SubSystem: '<S28>/Subsystem7' */
-
-  /* Outputs for Atomic SubSystem: '<S28>/Subsytem7' */
-  /* Constant: '<S28>/Constant9' incorporates:
-   *  Constant: '<S28>/Constant7'
-   *  Constant: '<S28>/Constant8'
-   */
-  rtb_RelationalOperator1_o = SFM_Subsytem7(1, rtb_RelationalOperator1_o,
-    rtb_SumU, sfmc_V_battUMinThr2, 2, &SFM_DW.Subsytem7);
-
-  /* End of Outputs for SubSystem: '<S28>/Subsytem7' */
-
-  /* Outputs for Atomic SubSystem: '<S28>/Subsystem8' */
-  rtb_RelationalOperator_et = SFM_Subsystem5(sfmd_flg_volFlt,
-    rtb_RelationalOperator1);
-
-  /* End of Outputs for SubSystem: '<S28>/Subsystem8' */
-
-  /* Outputs for Atomic SubSystem: '<S28>/Subsytem9' */
-  /* Constant: '<S28>/Constant6' incorporates:
-   *  Constant: '<S28>/Constant4'
-   *  Constant: '<S28>/Constant5'
-   */
-  rtb_RelationalOperator_et = SFM_Subsytem7(1, rtb_RelationalOperator_et,
-    rtb_SumU, sfmc_V_battUMinThr1, 2, &SFM_DW.Subsytem9);
-
-  /* End of Outputs for SubSystem: '<S28>/Subsytem9' */
-
-  /* Chart: '<S19>/ArrMin' incorporates:
-   *  Constant: '<S19>/Constant'
-   *  Inport: '<Root>/ihv_T_modT'
-   */
-  i = 0U;
-  sfmd_T_modTMax = ihv_T_modT[0];
-  while (i < cmnc_num_modTNum) {
-    if (sfmd_T_modTMax < ihv_T_modT[i]) {
-      sfmd_T_modTMax = ihv_T_modT[i];
-    }
-
-    i++;
-  }
-
-  /* End of Chart: '<S19>/ArrMin' */
-
-  /* Outputs for Atomic SubSystem: '<S27>/Subsytem' */
-  /* Constant: '<S27>/Constant28' incorporates:
-   *  Constant: '<S27>/Constant25'
-   *  Constant: '<S27>/Constant27'
-   *  Logic: '<S27>/Logical Operator5'
-   */
-  rtb_RelationalOperator1_p = SFM_Subsytem(1, !rtb_RelationalOperator1,
-    sfmd_T_modTMax, sfmc_T_modTMaxThr2, 2, &SFM_DW.Subsytem_j);
-
-  /* End of Outputs for SubSystem: '<S27>/Subsytem' */
-
-  /* Outputs for Atomic SubSystem: '<S27>/Subsytem2' */
-  /* Constant: '<S27>/Constant26' incorporates:
-   *  Constant: '<S27>/Constant23'
-   *  Constant: '<S27>/Constant24'
-   *  Logic: '<S27>/Logical Operator1'
-   */
-  rtb_RelationalOperator1_a = SFM_Subsytem(1, !rtb_RelationalOperator1,
-    sfmd_T_modTMax, sfmc_T_modTMaxThr1, 2, &SFM_DW.Subsytem2);
-
-  /* End of Outputs for SubSystem: '<S27>/Subsytem2' */
-
-  /* Chart: '<S20>/ArrMin' incorporates:
-   *  Constant: '<S20>/Constant'
-   *  Inport: '<Root>/ihv_T_modT'
-   */
-  i = 0U;
-  sfmd_T_modTMin = ihv_T_modT[0];
-  while (i < cmnc_num_modTNum) {
-    if (sfmd_T_modTMin > ihv_T_modT[i]) {
-      sfmd_T_modTMin = ihv_T_modT[i];
-    }
-
-    i++;
-  }
-
-  /* End of Chart: '<S20>/ArrMin' */
-
-  /* Outputs for Atomic SubSystem: '<S27>/Subsytem1' */
-  /* Constant: '<S27>/Constant22' incorporates:
-   *  Constant: '<S27>/Constant20'
-   *  Constant: '<S27>/Constant21'
-   *  Logic: '<S27>/Logical Operator3'
-   */
-  rtb_RelationalOperator1_i = SFM_Subsytem1(1, !rtb_RelationalOperator1,
-    sfmd_T_modTMin, sfmc_T_modTMinThr2, 2, &SFM_DW.Subsytem1_e);
-
-  /* End of Outputs for SubSystem: '<S27>/Subsytem1' */
-
-  /* Outputs for Atomic SubSystem: '<S27>/Subsytem3' */
-  /* Constant: '<S27>/Constant19' incorporates:
-   *  Constant: '<S27>/Constant10'
-   *  Constant: '<S27>/Constant18'
-   *  Logic: '<S27>/Logical Operator7'
-   */
-  rtb_RelationalOperator1_d = SFM_Subsytem1(1, !rtb_RelationalOperator1,
-    sfmd_T_modTMin, sfmc_T_modTMinThr1, 2, &SFM_DW.Subsytem3);
-
-  /* End of Outputs for SubSystem: '<S27>/Subsytem3' */
-
-  /* Outputs for Atomic SubSystem: '<S27>/Subsytem4' */
-  /* Constant: '<S27>/Constant14' incorporates:
-   *  Constant: '<S27>/Constant12'
-   *  Constant: '<S27>/Constant13'
-   *  Logic: '<S27>/Logical Operator4'
-   *  Sum: '<S27>/Add'
-   */
-  rtb_RelationalOperator1_bb = SFM_Subsytem(1, !rtb_RelationalOperator1,
-    (int16_T)(sfmd_T_modTMax - sfmd_T_modTMin), sfmc_T_modTDiffThr2, 2,
-    &SFM_DW.Subsytem4);
-
-  /* End of Outputs for SubSystem: '<S27>/Subsytem4' */
-
-  /* Outputs for Atomic SubSystem: '<S27>/Subsytem5' */
-  /* Constant: '<S27>/Constant1' incorporates:
-   *  Constant: '<S27>/Constant2'
-   *  Constant: '<S27>/Constant3'
-   *  Logic: '<S27>/Logical Operator10'
-   *  Sum: '<S27>/Add1'
-   */
-  rtb_RelationalOperator1_gr = SFM_Subsytem(1, !rtb_RelationalOperator1,
-    (int16_T)(sfmd_T_modTMax - sfmd_T_modTMin), sfmc_T_modTDiffThr1, 2,
-    &SFM_DW.Subsytem5);
-
-  /* End of Outputs for SubSystem: '<S27>/Subsytem5' */
-
-  /* Switch: '<S14>/Switch' incorporates:
-   *  Inport: '<Root>/ihd_flg_currFlt'
-   */
-  if (ihd_flg_currFlt) {
-    /* Switch: '<S14>/Switch' incorporates:
-     *  Constant: '<S14>/Constant'
-     */
-    sfmd_I_curr = 0;
-  } else {
-    /* Switch: '<S14>/Switch' incorporates:
-     *  Inport: '<Root>/ihd_I_curr'
-     */
-    sfmd_I_curr = ihd_I_curr;
-  }
-
-  /* End of Switch: '<S14>/Switch' */
-
-  /* Outputs for Atomic SubSystem: '<S24>/Subsytem' */
-  /* Saturate: '<S29>/Saturation' incorporates:
-   *  Constant: '<S29>/Constant1'
-   *  Sum: '<S29>/Add'
-   *  UnitDelay: '<S29>/delay'
-   */
-  if ((uint8_T)(SFM_DW.delay_DSTATE_j + 1U) < 200) {
-    i = (uint8_T)(SFM_DW.delay_DSTATE_j + 1U);
-  } else {
-    i = 200U;
-  }
-
-  /* End of Saturate: '<S29>/Saturation' */
-
-  /* Product: '<S29>/Product' incorporates:
-   *  Constant: '<S24>/Constant27'
-   *  Logic: '<S24>/Logical Operator2'
-   *  Logic: '<S29>/Logical Operator1'
-   *  RelationalOperator: '<S29>/Relational Operator'
-   *  Switch: '<S14>/Switch'
-   *  UnitDelay: '<S29>/delay'
-   */
-  SFM_DW.delay_DSTATE_j = (uint8_T)((!rtb_RelationalOperator1) && (sfmd_I_curr >=
-    sfmc_I_chrgCurrOverThr) ? (int32_T)i : 0);
-
-  /* SignalConversion generated from: '<S5>/ SFunction ' incorporates:
-   *  Chart: '<S3>/FltCodeArry'
-   *  Constant: '<S24>/Constant25'
-   *  RelationalOperator: '<S29>/Relational Operator1'
-   */
-  rtb_TmpSignalConversionAtSFun_a[130] = (i > 2);
-
-  /* End of Outputs for SubSystem: '<S24>/Subsytem' */
-
-  /* Outputs for Atomic SubSystem: '<S24>/Subsytem1' */
-  /* Saturate: '<S30>/Saturation' incorporates:
-   *  Constant: '<S30>/Constant2'
-   *  Sum: '<S30>/Add'
-   *  UnitDelay: '<S30>/delay'
-   */
-  if ((uint8_T)(SFM_DW.delay_DSTATE + 1U) < 200) {
-    i = (uint8_T)(SFM_DW.delay_DSTATE + 1U);
-  } else {
-    i = 200U;
-  }
-
-  /* End of Saturate: '<S30>/Saturation' */
-
-  /* Product: '<S30>/Product' incorporates:
-   *  Constant: '<S24>/Constant10'
-   *  Logic: '<S24>/Logical Operator1'
-   *  Logic: '<S30>/Logical Operator'
-   *  RelationalOperator: '<S30>/Relational Operator'
-   *  Switch: '<S14>/Switch'
-   *  UnitDelay: '<S30>/delay'
-   */
-  SFM_DW.delay_DSTATE = (uint8_T)((!rtb_RelationalOperator1) && (sfmd_I_curr <=
-    sfmc_I_dischrgCurrOverThr) ? (int32_T)i : 0);
-
-  /* End of Outputs for SubSystem: '<S24>/Subsytem1' */
-
-  /* SignalConversion generated from: '<S5>/ SFunction ' incorporates:
-   *  Chart: '<S3>/FltCodeArry'
-   *  Constant: '<S10>/Constant1'
-   *  Constant: '<S10>/Constant10'
-   *  Constant: '<S10>/Constant12'
-   *  Constant: '<S10>/Constant13'
-   *  Constant: '<S10>/Constant14'
-   *  Constant: '<S10>/Constant15'
-   *  Constant: '<S10>/Constant16'
-   *  Constant: '<S10>/Constant17'
-   *  Constant: '<S10>/Constant18'
-   *  Constant: '<S10>/Constant19'
-   *  Constant: '<S10>/Constant2'
-   *  Constant: '<S10>/Constant20'
-   *  Constant: '<S10>/Constant21'
-   *  Constant: '<S10>/Constant22'
-   *  Constant: '<S10>/Constant23'
-   *  Constant: '<S10>/Constant24'
-   *  Constant: '<S10>/Constant25'
-   *  Constant: '<S10>/Constant26'
-   *  Constant: '<S10>/Constant27'
-   *  Constant: '<S10>/Constant28'
-   *  Constant: '<S10>/Constant29'
-   *  Constant: '<S10>/Constant3'
-   *  Constant: '<S10>/Constant4'
-   *  Constant: '<S10>/Constant5'
-   *  Constant: '<S10>/Constant6'
-   *  Constant: '<S10>/Constant7'
-   *  Constant: '<S10>/Constant8'
-   *  Constant: '<S10>/Constant9'
-   *  Constant: '<S12>/Constant'
-   *  Constant: '<S12>/Constant1'
-   *  Constant: '<S12>/Constant2'
-   *  Constant: '<S12>/Constant3'
-   *  Constant: '<S12>/Constant4'
-   *  Constant: '<S12>/Constant5'
-   *  Constant: '<S12>/Constant6'
-   *  Constant: '<S12>/Constant7'
-   *  Constant: '<S12>/Constant8'
-   *  Constant: '<S12>/Constant9'
-   *  Constant: '<S15>/Constant11'
-   *  Constant: '<S15>/Constant12'
-   *  Constant: '<S15>/Constant13'
-   *  Constant: '<S15>/Constant14'
-   *  Constant: '<S15>/Constant15'
-   *  Constant: '<S15>/Constant16'
-   *  Constant: '<S15>/Constant17'
-   *  Constant: '<S15>/Constant18'
-   *  Constant: '<S15>/Constant19'
-   *  Constant: '<S15>/Constant20'
-   *  Constant: '<S15>/Constant21'
-   *  Constant: '<S15>/Constant4'
-   *  Constant: '<S15>/Constant5'
-   *  Constant: '<S15>/Constant6'
-   *  Constant: '<S15>/Constant7'
-   *  Constant: '<S15>/Constant8'
-   *  Constant: '<S15>/Constant9'
-   *  Constant: '<S16>/Constant'
-   *  Constant: '<S16>/Constant1'
-   *  Constant: '<S16>/Constant2'
-   *  Constant: '<S16>/Constant3'
-   *  Constant: '<S16>/Constant4'
-   *  Constant: '<S16>/Constant5'
-   *  Constant: '<S16>/Constant6'
-   *  Constant: '<S16>/Constant7'
-   *  Constant: '<S17>/Constant1'
-   *  Constant: '<S24>/Constant1'
-   *  Constant: '<S24>/Constant2'
-   *  Constant: '<S24>/Constant3'
-   *  Constant: '<S24>/Constant4'
-   *  Constant: '<S24>/Constant5'
-   *  Constant: '<S24>/Constant6'
-   *  Constant: '<S24>/Constant7'
-   *  Constant: '<S24>/Constant8'
-   *  Constant: '<S24>/Constant9'
-   *  Constant: '<S25>/Constant1'
-   *  Constant: '<S25>/Constant2'
-   *  Constant: '<S25>/Constant3'
-   *  Constant: '<S25>/Constant4'
-   *  Constant: '<S25>/Constant5'
-   *  Constant: '<S25>/Constant6'
-   *  Constant: '<S25>/Constant7'
-   *  Constant: '<S25>/Constant8'
-   *  Constant: '<S25>/Constant9'
-   *  Constant: '<S26>/Constant'
-   *  Constant: '<S27>/Constant'
-   *  Constant: '<S27>/Constant11'
-   *  Constant: '<S27>/Constant15'
-   *  Constant: '<S27>/Constant16'
-   *  Constant: '<S27>/Constant17'
-   *  Constant: '<S27>/Constant29'
-   *  Constant: '<S27>/Constant30'
-   *  Constant: '<S27>/Constant31'
-   *  Constant: '<S27>/Constant32'
-   *  Constant: '<S27>/Constant33'
-   *  Constant: '<S27>/Constant34'
-   *  Constant: '<S27>/Constant35'
-   *  Constant: '<S27>/Constant36'
-   *  Constant: '<S27>/Constant37'
-   *  Constant: '<S27>/Constant38'
-   *  Constant: '<S27>/Constant39'
-   *  Constant: '<S27>/Constant4'
-   *  Constant: '<S27>/Constant40'
-   *  Constant: '<S27>/Constant41'
-   *  Constant: '<S27>/Constant5'
-   *  Constant: '<S27>/Constant6'
-   *  Constant: '<S27>/Constant7'
-   *  Constant: '<S27>/Constant8'
-   *  Constant: '<S27>/Constant9'
-   *  Constant: '<S28>/Constant'
-   *  Constant: '<S28>/Constant31'
-   *  Constant: '<S28>/Constant32'
-   *  Constant: '<S28>/Constant33'
-   *  Constant: '<S28>/Constant34'
-   *  Constant: '<S28>/Constant35'
-   *  Constant: '<S28>/Constant36'
-   *  Constant: '<S28>/Constant37'
-   *  Constant: '<S28>/Constant38'
-   *  Constant: '<S28>/Constant39'
-   *  Constant: '<S6>/Constant'
-   *  Constant: '<S8>/Constant'
-   *  Constant: '<S8>/Constant1'
-   *  Constant: '<S8>/Constant2'
-   *  Constant: '<S8>/Constant3'
-   *  Constant: '<S8>/Constant4'
-   *  Constant: '<S9>/Constant1'
-   *  Constant: '<S9>/Constant10'
-   *  Constant: '<S9>/Constant2'
-   *  Constant: '<S9>/Constant3'
-   *  Constant: '<S9>/Constant4'
-   *  Constant: '<S9>/Constant5'
-   *  Constant: '<S9>/Constant7'
-   *  Constant: '<S9>/Constant8'
-   *  Constant: '<S9>/Constant9'
-   *  Inport: '<Root>/ihd_flg_chrgMosClosFlt'
-   *  Inport: '<Root>/ihd_flg_disChrgMosClosFlt'
-   *  Logic: '<S13>/Logical Operator1'
-   *  Logic: '<S27>/Logical Operator12'
-   *  Logic: '<S27>/Logical Operator13'
-   *  Logic: '<S27>/Logical Operator2'
-   *  Logic: '<S27>/Logical Operator6'
-   *  Logic: '<S27>/Logical Operator8'
-   *  Logic: '<S27>/Logical Operator9'
-   *  Logic: '<S28>/Logical Operator'
-   *  Logic: '<S28>/Logical Operator10'
-   *  Logic: '<S28>/Logical Operator11'
-   *  Logic: '<S28>/Logical Operator12'
-   *  Logic: '<S28>/Logical Operator13'
-   *  Logic: '<S28>/Logical Operator14'
-   *  Logic: '<S28>/Logical Operator15'
-   *  Logic: '<S28>/Logical Operator4'
-   *  Logic: '<S28>/Logical Operator7'
-   *  Logic: '<S28>/Logical Operator8'
-   *  RelationalOperator: '<S30>/Relational Operator1'
-   */
-  rtb_TmpSignalConversionAtSFun_a[0] = rtb_RelationalOperator1;
-  rtb_TmpSignalConversionAtSFun_a[1] = false;
-  rtb_TmpSignalConversionAtSFun_a[2] = false;
-  rtb_TmpSignalConversionAtSFun_a[3] = false;
-  rtb_TmpSignalConversionAtSFun_a[4] = false;
-  rtb_TmpSignalConversionAtSFun_a[5] = false;
-  rtb_TmpSignalConversionAtSFun_a[6] = false;
-  rtb_TmpSignalConversionAtSFun_a[7] = false;
-  rtb_TmpSignalConversionAtSFun_a[8] = false;
-  rtb_TmpSignalConversionAtSFun_a[9] = false;
-  rtb_TmpSignalConversionAtSFun_a[10] = false;
-  rtb_TmpSignalConversionAtSFun_a[11] = false;
-  rtb_TmpSignalConversionAtSFun_a[12] = false;
-  rtb_TmpSignalConversionAtSFun_a[13] = false;
-  rtb_TmpSignalConversionAtSFun_a[14] = false;
-  rtb_TmpSignalConversionAtSFun_a[15] = false;
-  rtb_TmpSignalConversionAtSFun_a[16] = false;
-  rtb_TmpSignalConversionAtSFun_a[17] = false;
-  rtb_TmpSignalConversionAtSFun_a[18] = false;
-  rtb_TmpSignalConversionAtSFun_a[19] = false;
-  rtb_TmpSignalConversionAtSFun_a[20] = false;
-  rtb_TmpSignalConversionAtSFun_a[21] = ihd_flg_chrgMosClosFlt;
-  rtb_TmpSignalConversionAtSFun_a[22] = false;
-  rtb_TmpSignalConversionAtSFun_a[23] = ihd_flg_dischrgMosClosFlt;
-  rtb_TmpSignalConversionAtSFun_a[24] = false;
-  rtb_TmpSignalConversionAtSFun_a[25] = false;
-  rtb_TmpSignalConversionAtSFun_a[26] = false;
-  rtb_TmpSignalConversionAtSFun_a[27] = false;
-  rtb_TmpSignalConversionAtSFun_a[28] = false;
-  rtb_TmpSignalConversionAtSFun_a[29] = false;
-  rtb_TmpSignalConversionAtSFun_a[30] = false;
-  rtb_TmpSignalConversionAtSFun_a[31] = false;
-  rtb_TmpSignalConversionAtSFun_a[32] = false;
-  rtb_TmpSignalConversionAtSFun_a[33] = false;
-  rtb_TmpSignalConversionAtSFun_a[34] = false;
-  rtb_TmpSignalConversionAtSFun_a[35] = false;
-  rtb_TmpSignalConversionAtSFun_a[36] = false;
-  rtb_TmpSignalConversionAtSFun_a[37] = false;
-  rtb_TmpSignalConversionAtSFun_a[38] = false;
-  rtb_TmpSignalConversionAtSFun_a[39] = false;
-  rtb_TmpSignalConversionAtSFun_a[40] = false;
-  rtb_TmpSignalConversionAtSFun_a[41] = false;
-  rtb_TmpSignalConversionAtSFun_a[42] = false;
-  rtb_TmpSignalConversionAtSFun_a[43] = false;
-  rtb_TmpSignalConversionAtSFun_a[44] = false;
-  rtb_TmpSignalConversionAtSFun_a[45] = false;
-  rtb_TmpSignalConversionAtSFun_a[46] = false;
-  rtb_TmpSignalConversionAtSFun_a[47] = false;
-  rtb_TmpSignalConversionAtSFun_a[48] = false;
-  rtb_TmpSignalConversionAtSFun_a[49] = false;
-  rtb_TmpSignalConversionAtSFun_a[50] = false;
-  rtb_TmpSignalConversionAtSFun_a[51] = tmp;
-  rtb_TmpSignalConversionAtSFun_a[52] = sfmv_flg_TFlt;
-  rtb_TmpSignalConversionAtSFun_a[53] = false;
-  rtb_TmpSignalConversionAtSFun_a[54] = false;
-  rtb_TmpSignalConversionAtSFun_a[55] = false;
-  rtb_TmpSignalConversionAtSFun_a[56] = false;
-  rtb_TmpSignalConversionAtSFun_a[57] = false;
-  rtb_TmpSignalConversionAtSFun_a[58] = false;
-  rtb_TmpSignalConversionAtSFun_a[59] = false;
-  rtb_TmpSignalConversionAtSFun_a[60] = false;
-  rtb_TmpSignalConversionAtSFun_a[61] = false;
-  rtb_TmpSignalConversionAtSFun_a[62] = false;
-  rtb_TmpSignalConversionAtSFun_a[63] = false;
-  rtb_TmpSignalConversionAtSFun_a[64] = false;
-  rtb_TmpSignalConversionAtSFun_a[65] = false;
-  rtb_TmpSignalConversionAtSFun_a[66] = false;
-  rtb_TmpSignalConversionAtSFun_a[67] = false;
-  rtb_TmpSignalConversionAtSFun_a[68] = false;
-  rtb_TmpSignalConversionAtSFun_a[69] = false;
-  rtb_TmpSignalConversionAtSFun_a[70] = sfmd_flg_currFlt;
-  rtb_TmpSignalConversionAtSFun_a[71] = false;
-  rtb_TmpSignalConversionAtSFun_a[72] = false;
-  rtb_TmpSignalConversionAtSFun_a[73] = false;
-  rtb_TmpSignalConversionAtSFun_a[74] = false;
-  rtb_TmpSignalConversionAtSFun_a[75] = false;
-  rtb_TmpSignalConversionAtSFun_a[76] = false;
-  rtb_TmpSignalConversionAtSFun_a[77] = false;
-  rtb_TmpSignalConversionAtSFun_a[78] = false;
-  rtb_TmpSignalConversionAtSFun_a[79] = false;
-  rtb_TmpSignalConversionAtSFun_a[80] = rtb_RelationalOperator1_ep;
-  rtb_TmpSignalConversionAtSFun_a[81] = (rtb_RelationalOperator1_j &&
-    (!rtb_RelationalOperator1_ep));
-  rtb_TmpSignalConversionAtSFun_a[82] = rtb_RelationalOperator1_di;
-  rtb_TmpSignalConversionAtSFun_a[83] = (rtb_RelationalOperator1_l &&
-    (!rtb_RelationalOperator1_di));
-  rtb_TmpSignalConversionAtSFun_a[84] = rtb_RelationalOperator1_lf;
-  rtb_TmpSignalConversionAtSFun_a[85] = (rtb_RelationalOperator1_eg &&
-    (!rtb_RelationalOperator1_lf));
-  rtb_TmpSignalConversionAtSFun_a[86] = rtb_RelationalOperator1_fg;
-  rtb_TmpSignalConversionAtSFun_a[87] = (rtb_RelationalOperator1_it &&
-    (!rtb_RelationalOperator1_fg));
-  rtb_TmpSignalConversionAtSFun_a[88] = rtb_RelationalOperator1_o;
-  rtb_TmpSignalConversionAtSFun_a[89] = (rtb_RelationalOperator_et &&
-    (!rtb_RelationalOperator1_o));
-  rtb_TmpSignalConversionAtSFun_a[90] = false;
-  rtb_TmpSignalConversionAtSFun_a[91] = false;
-  rtb_TmpSignalConversionAtSFun_a[92] = false;
-  rtb_TmpSignalConversionAtSFun_a[93] = false;
-  rtb_TmpSignalConversionAtSFun_a[94] = false;
-  rtb_TmpSignalConversionAtSFun_a[95] = false;
-  rtb_TmpSignalConversionAtSFun_a[96] = false;
-  rtb_TmpSignalConversionAtSFun_a[97] = false;
-  rtb_TmpSignalConversionAtSFun_a[98] = false;
-  rtb_TmpSignalConversionAtSFun_a[99] = false;
-  rtb_TmpSignalConversionAtSFun_a[100] = rtb_RelationalOperator1_p;
-  rtb_TmpSignalConversionAtSFun_a[101] = (rtb_RelationalOperator1_a &&
-    (!rtb_RelationalOperator1_p));
-  rtb_TmpSignalConversionAtSFun_a[102] = rtb_RelationalOperator1_i;
-  rtb_TmpSignalConversionAtSFun_a[103] = (rtb_RelationalOperator1_d &&
-    (!rtb_RelationalOperator1_i));
-  rtb_TmpSignalConversionAtSFun_a[104] = rtb_RelationalOperator1_bb;
-  rtb_TmpSignalConversionAtSFun_a[105] = (rtb_RelationalOperator1_gr &&
-    (!rtb_RelationalOperator1_bb));
-  rtb_TmpSignalConversionAtSFun_a[106] = false;
-  rtb_TmpSignalConversionAtSFun_a[107] = false;
-  rtb_TmpSignalConversionAtSFun_a[108] = false;
-  rtb_TmpSignalConversionAtSFun_a[109] = false;
-  rtb_TmpSignalConversionAtSFun_a[110] = false;
-  rtb_TmpSignalConversionAtSFun_a[111] = false;
-  rtb_TmpSignalConversionAtSFun_a[112] = false;
-  rtb_TmpSignalConversionAtSFun_a[113] = false;
-  rtb_TmpSignalConversionAtSFun_a[114] = false;
-  rtb_TmpSignalConversionAtSFun_a[115] = false;
-  rtb_TmpSignalConversionAtSFun_a[116] = false;
-  rtb_TmpSignalConversionAtSFun_a[117] = false;
-  rtb_TmpSignalConversionAtSFun_a[118] = false;
-  rtb_TmpSignalConversionAtSFun_a[119] = false;
-  rtb_TmpSignalConversionAtSFun_a[120] = false;
-  rtb_TmpSignalConversionAtSFun_a[121] = false;
-  rtb_TmpSignalConversionAtSFun_a[122] = false;
-  rtb_TmpSignalConversionAtSFun_a[123] = false;
-  rtb_TmpSignalConversionAtSFun_a[124] = false;
-  rtb_TmpSignalConversionAtSFun_a[125] = false;
-  rtb_TmpSignalConversionAtSFun_a[126] = false;
-  rtb_TmpSignalConversionAtSFun_a[127] = false;
-  rtb_TmpSignalConversionAtSFun_a[128] = false;
-  rtb_TmpSignalConversionAtSFun_a[129] = false;
-
-  /* Outputs for Atomic SubSystem: '<S24>/Subsytem1' */
-  rtb_TmpSignalConversionAtSFun_a[131] = (i > 2);
-
-  /* End of Outputs for SubSystem: '<S24>/Subsytem1' */
-  rtb_TmpSignalConversionAtSFun_a[132] = false;
-  rtb_TmpSignalConversionAtSFun_a[133] = false;
-  rtb_TmpSignalConversionAtSFun_a[134] = false;
-  rtb_TmpSignalConversionAtSFun_a[135] = false;
-  rtb_TmpSignalConversionAtSFun_a[136] = false;
-  rtb_TmpSignalConversionAtSFun_a[137] = false;
-  rtb_TmpSignalConversionAtSFun_a[138] = false;
-  rtb_TmpSignalConversionAtSFun_a[139] = false;
-  rtb_TmpSignalConversionAtSFun_a[140] = false;
-  rtb_TmpSignalConversionAtSFun_a[141] = false;
-  rtb_TmpSignalConversionAtSFun_a[142] = false;
-  rtb_TmpSignalConversionAtSFun_a[143] = false;
-  rtb_TmpSignalConversionAtSFun_a[144] = false;
-  rtb_TmpSignalConversionAtSFun_a[145] = false;
-  rtb_TmpSignalConversionAtSFun_a[146] = false;
-  rtb_TmpSignalConversionAtSFun_a[147] = false;
-  rtb_TmpSignalConversionAtSFun_a[148] = false;
-  rtb_TmpSignalConversionAtSFun_a[149] = false;
-  rtb_TmpSignalConversionAtSFun_a[150] = false;
-  rtb_TmpSignalConversionAtSFun_a[151] = false;
-  rtb_TmpSignalConversionAtSFun_a[152] = false;
-  rtb_TmpSignalConversionAtSFun_a[153] = false;
-  rtb_TmpSignalConversionAtSFun_a[154] = false;
-
-  /* SignalConversion generated from: '<S5>/ SFunction ' incorporates:
-   *  Chart: '<S3>/FltCodeArry'
-   *  Constant: '<S3>/Constant1'
-   *  Constant: '<S3>/Constant10'
-   *  Constant: '<S3>/Constant100'
-   *  Constant: '<S3>/Constant101'
-   *  Constant: '<S3>/Constant102'
-   *  Constant: '<S3>/Constant103'
-   *  Constant: '<S3>/Constant104'
-   *  Constant: '<S3>/Constant105'
-   *  Constant: '<S3>/Constant106'
-   *  Constant: '<S3>/Constant107'
-   *  Constant: '<S3>/Constant108'
-   *  Constant: '<S3>/Constant109'
-   *  Constant: '<S3>/Constant11'
-   *  Constant: '<S3>/Constant110'
-   *  Constant: '<S3>/Constant111'
-   *  Constant: '<S3>/Constant112'
-   *  Constant: '<S3>/Constant113'
-   *  Constant: '<S3>/Constant114'
-   *  Constant: '<S3>/Constant115'
-   *  Constant: '<S3>/Constant116'
-   *  Constant: '<S3>/Constant117'
-   *  Constant: '<S3>/Constant118'
-   *  Constant: '<S3>/Constant119'
-   *  Constant: '<S3>/Constant12'
-   *  Constant: '<S3>/Constant120'
-   *  Constant: '<S3>/Constant121'
-   *  Constant: '<S3>/Constant122'
-   *  Constant: '<S3>/Constant123'
-   *  Constant: '<S3>/Constant124'
-   *  Constant: '<S3>/Constant125'
-   *  Constant: '<S3>/Constant126'
-   *  Constant: '<S3>/Constant127'
-   *  Constant: '<S3>/Constant128'
-   *  Constant: '<S3>/Constant129'
-   *  Constant: '<S3>/Constant13'
-   *  Constant: '<S3>/Constant130'
-   *  Constant: '<S3>/Constant131'
-   *  Constant: '<S3>/Constant132'
-   *  Constant: '<S3>/Constant133'
-   *  Constant: '<S3>/Constant134'
-   *  Constant: '<S3>/Constant135'
-   *  Constant: '<S3>/Constant136'
-   *  Constant: '<S3>/Constant137'
-   *  Constant: '<S3>/Constant138'
-   *  Constant: '<S3>/Constant139'
-   *  Constant: '<S3>/Constant14'
-   *  Constant: '<S3>/Constant140'
-   *  Constant: '<S3>/Constant141'
-   *  Constant: '<S3>/Constant142'
-   *  Constant: '<S3>/Constant143'
-   *  Constant: '<S3>/Constant144'
-   *  Constant: '<S3>/Constant145'
-   *  Constant: '<S3>/Constant146'
-   *  Constant: '<S3>/Constant147'
-   *  Constant: '<S3>/Constant148'
-   *  Constant: '<S3>/Constant149'
-   *  Constant: '<S3>/Constant15'
-   *  Constant: '<S3>/Constant150'
-   *  Constant: '<S3>/Constant151'
-   *  Constant: '<S3>/Constant152'
-   *  Constant: '<S3>/Constant153'
-   *  Constant: '<S3>/Constant154'
-   *  Constant: '<S3>/Constant155'
-   *  Constant: '<S3>/Constant157'
-   *  Constant: '<S3>/Constant158'
-   *  Constant: '<S3>/Constant159'
-   *  Constant: '<S3>/Constant16'
-   *  Constant: '<S3>/Constant160'
-   *  Constant: '<S3>/Constant17'
-   *  Constant: '<S3>/Constant18'
-   *  Constant: '<S3>/Constant19'
-   *  Constant: '<S3>/Constant20'
-   *  Constant: '<S3>/Constant21'
-   *  Constant: '<S3>/Constant22'
-   *  Constant: '<S3>/Constant23'
-   *  Constant: '<S3>/Constant24'
-   *  Constant: '<S3>/Constant25'
-   *  Constant: '<S3>/Constant26'
-   *  Constant: '<S3>/Constant27'
-   *  Constant: '<S3>/Constant28'
-   *  Constant: '<S3>/Constant29'
-   *  Constant: '<S3>/Constant30'
-   *  Constant: '<S3>/Constant31'
-   *  Constant: '<S3>/Constant32'
-   *  Constant: '<S3>/Constant33'
-   *  Constant: '<S3>/Constant34'
-   *  Constant: '<S3>/Constant35'
-   *  Constant: '<S3>/Constant36'
-   *  Constant: '<S3>/Constant37'
-   *  Constant: '<S3>/Constant38'
-   *  Constant: '<S3>/Constant39'
-   *  Constant: '<S3>/Constant4'
-   *  Constant: '<S3>/Constant40'
-   *  Constant: '<S3>/Constant41'
-   *  Constant: '<S3>/Constant42'
-   *  Constant: '<S3>/Constant43'
-   *  Constant: '<S3>/Constant44'
-   *  Constant: '<S3>/Constant45'
-   *  Constant: '<S3>/Constant46'
-   *  Constant: '<S3>/Constant47'
-   *  Constant: '<S3>/Constant48'
-   *  Constant: '<S3>/Constant49'
-   *  Constant: '<S3>/Constant5'
-   *  Constant: '<S3>/Constant50'
-   *  Constant: '<S3>/Constant51'
-   *  Constant: '<S3>/Constant52'
-   *  Constant: '<S3>/Constant53'
-   *  Constant: '<S3>/Constant54'
-   *  Constant: '<S3>/Constant55'
-   *  Constant: '<S3>/Constant56'
-   *  Constant: '<S3>/Constant57'
-   *  Constant: '<S3>/Constant58'
-   *  Constant: '<S3>/Constant59'
-   *  Constant: '<S3>/Constant6'
-   *  Constant: '<S3>/Constant60'
-   *  Constant: '<S3>/Constant61'
-   *  Constant: '<S3>/Constant62'
-   *  Constant: '<S3>/Constant63'
-   *  Constant: '<S3>/Constant64'
-   *  Constant: '<S3>/Constant65'
-   *  Constant: '<S3>/Constant66'
-   *  Constant: '<S3>/Constant67'
-   *  Constant: '<S3>/Constant68'
-   *  Constant: '<S3>/Constant69'
-   *  Constant: '<S3>/Constant7'
-   *  Constant: '<S3>/Constant70'
-   *  Constant: '<S3>/Constant71'
-   *  Constant: '<S3>/Constant72'
-   *  Constant: '<S3>/Constant73'
-   *  Constant: '<S3>/Constant74'
-   *  Constant: '<S3>/Constant75'
-   *  Constant: '<S3>/Constant76'
-   *  Constant: '<S3>/Constant77'
-   *  Constant: '<S3>/Constant78'
-   *  Constant: '<S3>/Constant79'
-   *  Constant: '<S3>/Constant8'
-   *  Constant: '<S3>/Constant80'
-   *  Constant: '<S3>/Constant81'
-   *  Constant: '<S3>/Constant84'
-   *  Constant: '<S3>/Constant85'
-   *  Constant: '<S3>/Constant86'
-   *  Constant: '<S3>/Constant87'
-   *  Constant: '<S3>/Constant88'
-   *  Constant: '<S3>/Constant89'
-   *  Constant: '<S3>/Constant9'
-   *  Constant: '<S3>/Constant90'
-   *  Constant: '<S3>/Constant91'
-   *  Constant: '<S3>/Constant92'
-   *  Constant: '<S3>/Constant93'
-   *  Constant: '<S3>/Constant94'
-   *  Constant: '<S3>/Constant95'
-   *  Constant: '<S3>/Constant96'
-   *  Constant: '<S3>/Constant97'
-   *  Constant: '<S3>/Constant98'
-   *  Constant: '<S3>/Constant99'
-   */
-  rtb_TmpSignalConversionAtSFunct[0] = 2U;
-  rtb_TmpSignalConversionAtSFunct[1] = 2U;
-  rtb_TmpSignalConversionAtSFunct[2] = 2U;
-  rtb_TmpSignalConversionAtSFunct[3] = 2U;
-  rtb_TmpSignalConversionAtSFunct[4] = 4U;
-  rtb_TmpSignalConversionAtSFunct[5] = 0U;
-  rtb_TmpSignalConversionAtSFunct[6] = 0U;
-  rtb_TmpSignalConversionAtSFunct[7] = 0U;
-  rtb_TmpSignalConversionAtSFunct[8] = 0U;
-  rtb_TmpSignalConversionAtSFunct[9] = 0U;
-  rtb_TmpSignalConversionAtSFunct[10] = 5U;
-  rtb_TmpSignalConversionAtSFunct[11] = 5U;
-  rtb_TmpSignalConversionAtSFunct[12] = 2U;
-  rtb_TmpSignalConversionAtSFunct[13] = 5U;
-  rtb_TmpSignalConversionAtSFunct[14] = 3U;
-  rtb_TmpSignalConversionAtSFunct[15] = 0U;
-  rtb_TmpSignalConversionAtSFunct[16] = 0U;
-  rtb_TmpSignalConversionAtSFunct[17] = 0U;
-  rtb_TmpSignalConversionAtSFunct[18] = 0U;
-  rtb_TmpSignalConversionAtSFunct[19] = 0U;
-  rtb_TmpSignalConversionAtSFunct[20] = 5U;
-  rtb_TmpSignalConversionAtSFunct[21] = 4U;
-  rtb_TmpSignalConversionAtSFunct[22] = 2U;
-  rtb_TmpSignalConversionAtSFunct[23] = 4U;
-  rtb_TmpSignalConversionAtSFunct[24] = 2U;
-  rtb_TmpSignalConversionAtSFunct[25] = 3U;
-  rtb_TmpSignalConversionAtSFunct[26] = 3U;
-  rtb_TmpSignalConversionAtSFunct[27] = 3U;
-  rtb_TmpSignalConversionAtSFunct[28] = 3U;
-  rtb_TmpSignalConversionAtSFunct[29] = 5U;
-  rtb_TmpSignalConversionAtSFunct[30] = 2U;
-  rtb_TmpSignalConversionAtSFunct[31] = 4U;
-  rtb_TmpSignalConversionAtSFunct[32] = 0U;
-  rtb_TmpSignalConversionAtSFunct[33] = 0U;
-  rtb_TmpSignalConversionAtSFunct[34] = 0U;
-  rtb_TmpSignalConversionAtSFunct[35] = 0U;
-  rtb_TmpSignalConversionAtSFunct[36] = 0U;
-  rtb_TmpSignalConversionAtSFunct[37] = 0U;
-  rtb_TmpSignalConversionAtSFunct[38] = 0U;
-  rtb_TmpSignalConversionAtSFunct[39] = 0U;
-  rtb_TmpSignalConversionAtSFunct[40] = 0U;
-  rtb_TmpSignalConversionAtSFunct[41] = 0U;
-  rtb_TmpSignalConversionAtSFunct[42] = 0U;
-  rtb_TmpSignalConversionAtSFunct[43] = 0U;
-  rtb_TmpSignalConversionAtSFunct[44] = 0U;
-  rtb_TmpSignalConversionAtSFunct[45] = 0U;
-  rtb_TmpSignalConversionAtSFunct[46] = 0U;
-  rtb_TmpSignalConversionAtSFunct[47] = 0U;
-  rtb_TmpSignalConversionAtSFunct[48] = 0U;
-  rtb_TmpSignalConversionAtSFunct[49] = 0U;
-  rtb_TmpSignalConversionAtSFunct[50] = 2U;
-  rtb_TmpSignalConversionAtSFunct[51] = 4U;
-  rtb_TmpSignalConversionAtSFunct[52] = 4U;
-  rtb_TmpSignalConversionAtSFunct[53] = 4U;
-  rtb_TmpSignalConversionAtSFunct[54] = 4U;
-  rtb_TmpSignalConversionAtSFunct[55] = 4U;
-  rtb_TmpSignalConversionAtSFunct[56] = 4U;
-  rtb_TmpSignalConversionAtSFunct[57] = 2U;
-  rtb_TmpSignalConversionAtSFunct[58] = 2U;
-  rtb_TmpSignalConversionAtSFunct[59] = 3U;
-  rtb_TmpSignalConversionAtSFunct[60] = 0U;
-  rtb_TmpSignalConversionAtSFunct[61] = 0U;
-  rtb_TmpSignalConversionAtSFunct[62] = 0U;
-  rtb_TmpSignalConversionAtSFunct[63] = 0U;
-  rtb_TmpSignalConversionAtSFunct[64] = 0U;
-  rtb_TmpSignalConversionAtSFunct[65] = 0U;
-  rtb_TmpSignalConversionAtSFunct[66] = 0U;
-  rtb_TmpSignalConversionAtSFunct[67] = 0U;
-  rtb_TmpSignalConversionAtSFunct[68] = 0U;
-  rtb_TmpSignalConversionAtSFunct[69] = 0U;
-  rtb_TmpSignalConversionAtSFunct[70] = 4U;
-  rtb_TmpSignalConversionAtSFunct[71] = 2U;
-  rtb_TmpSignalConversionAtSFunct[72] = 0U;
-  rtb_TmpSignalConversionAtSFunct[73] = 0U;
-  rtb_TmpSignalConversionAtSFunct[74] = 0U;
-  rtb_TmpSignalConversionAtSFunct[75] = 0U;
-  rtb_TmpSignalConversionAtSFunct[76] = 0U;
-  rtb_TmpSignalConversionAtSFunct[77] = 0U;
-  rtb_TmpSignalConversionAtSFunct[78] = 0U;
-  rtb_TmpSignalConversionAtSFunct[79] = 0U;
-  rtb_TmpSignalConversionAtSFunct[80] = 4U;
-  rtb_TmpSignalConversionAtSFunct[81] = 3U;
-  rtb_TmpSignalConversionAtSFunct[82] = 4U;
-  rtb_TmpSignalConversionAtSFunct[83] = 3U;
-  rtb_TmpSignalConversionAtSFunct[84] = 3U;
-  rtb_TmpSignalConversionAtSFunct[85] = 2U;
-  rtb_TmpSignalConversionAtSFunct[86] = 4U;
-  rtb_TmpSignalConversionAtSFunct[87] = 3U;
-  rtb_TmpSignalConversionAtSFunct[88] = 4U;
-  rtb_TmpSignalConversionAtSFunct[89] = 3U;
-  rtb_TmpSignalConversionAtSFunct[90] = 0U;
-  rtb_TmpSignalConversionAtSFunct[91] = 0U;
-  rtb_TmpSignalConversionAtSFunct[92] = 0U;
-  rtb_TmpSignalConversionAtSFunct[93] = 0U;
-  rtb_TmpSignalConversionAtSFunct[94] = 0U;
-  rtb_TmpSignalConversionAtSFunct[95] = 0U;
-  rtb_TmpSignalConversionAtSFunct[96] = 0U;
-  rtb_TmpSignalConversionAtSFunct[97] = 0U;
-  rtb_TmpSignalConversionAtSFunct[98] = 0U;
-  rtb_TmpSignalConversionAtSFunct[99] = 0U;
-  rtb_TmpSignalConversionAtSFunct[100] = 4U;
-  rtb_TmpSignalConversionAtSFunct[101] = 3U;
-  rtb_TmpSignalConversionAtSFunct[102] = 4U;
-  rtb_TmpSignalConversionAtSFunct[103] = 3U;
-  rtb_TmpSignalConversionAtSFunct[104] = 3U;
-  rtb_TmpSignalConversionAtSFunct[105] = 1U;
-  rtb_TmpSignalConversionAtSFunct[106] = 4U;
-  rtb_TmpSignalConversionAtSFunct[107] = 3U;
-  rtb_TmpSignalConversionAtSFunct[108] = 4U;
-  rtb_TmpSignalConversionAtSFunct[109] = 3U;
-  rtb_TmpSignalConversionAtSFunct[110] = 4U;
-  rtb_TmpSignalConversionAtSFunct[111] = 3U;
-  rtb_TmpSignalConversionAtSFunct[112] = 4U;
-  rtb_TmpSignalConversionAtSFunct[113] = 3U;
-  rtb_TmpSignalConversionAtSFunct[114] = 4U;
-  rtb_TmpSignalConversionAtSFunct[115] = 3U;
-  rtb_TmpSignalConversionAtSFunct[116] = 1U;
-  rtb_TmpSignalConversionAtSFunct[117] = 1U;
-  rtb_TmpSignalConversionAtSFunct[118] = 0U;
-  rtb_TmpSignalConversionAtSFunct[119] = 0U;
-  rtb_TmpSignalConversionAtSFunct[120] = 0U;
-  rtb_TmpSignalConversionAtSFunct[121] = 0U;
-  rtb_TmpSignalConversionAtSFunct[122] = 0U;
-  rtb_TmpSignalConversionAtSFunct[123] = 0U;
-  rtb_TmpSignalConversionAtSFunct[124] = 0U;
-  rtb_TmpSignalConversionAtSFunct[125] = 0U;
-  rtb_TmpSignalConversionAtSFunct[126] = 0U;
-  rtb_TmpSignalConversionAtSFunct[127] = 0U;
-  rtb_TmpSignalConversionAtSFunct[128] = 0U;
-  rtb_TmpSignalConversionAtSFunct[129] = 0U;
-  rtb_TmpSignalConversionAtSFunct[130] = 4U;
-  rtb_TmpSignalConversionAtSFunct[131] = 4U;
-  rtb_TmpSignalConversionAtSFunct[132] = 3U;
-  rtb_TmpSignalConversionAtSFunct[133] = 0U;
-  rtb_TmpSignalConversionAtSFunct[134] = 0U;
-  rtb_TmpSignalConversionAtSFunct[135] = 0U;
-  rtb_TmpSignalConversionAtSFunct[136] = 0U;
-  rtb_TmpSignalConversionAtSFunct[137] = 0U;
-  rtb_TmpSignalConversionAtSFunct[138] = 0U;
-  rtb_TmpSignalConversionAtSFunct[139] = 0U;
-  rtb_TmpSignalConversionAtSFunct[140] = 3U;
-  rtb_TmpSignalConversionAtSFunct[141] = 0U;
-  rtb_TmpSignalConversionAtSFunct[142] = 0U;
-  rtb_TmpSignalConversionAtSFunct[143] = 0U;
-  rtb_TmpSignalConversionAtSFunct[144] = 0U;
-  rtb_TmpSignalConversionAtSFunct[145] = 0U;
-  rtb_TmpSignalConversionAtSFunct[146] = 0U;
-  rtb_TmpSignalConversionAtSFunct[147] = 0U;
-  rtb_TmpSignalConversionAtSFunct[148] = 0U;
-  rtb_TmpSignalConversionAtSFunct[149] = 0U;
-  rtb_TmpSignalConversionAtSFunct[150] = 2U;
-  rtb_TmpSignalConversionAtSFunct[151] = 2U;
-  rtb_TmpSignalConversionAtSFunct[152] = 2U;
-  rtb_TmpSignalConversionAtSFunct[153] = 1U;
-  rtb_TmpSignalConversionAtSFunct[154] = 1U;
-
-  /* SignalConversion generated from: '<S5>/ SFunction ' incorporates:
-   *  Chart: '<S3>/FltCodeArry'
-   *  Constant: '<S3>/Constant156'
-   *  Constant: '<S3>/Constant161'
-   *  Constant: '<S3>/Constant162'
-   *  Constant: '<S3>/Constant163'
-   *  Constant: '<S3>/Constant164'
-   *  Constant: '<S3>/Constant165'
-   *  Constant: '<S3>/Constant166'
-   *  Constant: '<S3>/Constant167'
-   *  Constant: '<S3>/Constant168'
-   *  Constant: '<S3>/Constant169'
-   *  Constant: '<S3>/Constant170'
-   *  Constant: '<S3>/Constant171'
-   *  Constant: '<S3>/Constant172'
-   *  Constant: '<S3>/Constant173'
-   *  Constant: '<S3>/Constant174'
-   *  Constant: '<S3>/Constant175'
-   *  Constant: '<S3>/Constant176'
-   *  Constant: '<S3>/Constant177'
-   *  Constant: '<S3>/Constant178'
-   *  Constant: '<S3>/Constant179'
-   *  Constant: '<S3>/Constant180'
-   *  Constant: '<S3>/Constant181'
-   *  Constant: '<S3>/Constant182'
-   *  Constant: '<S3>/Constant183'
-   *  Constant: '<S3>/Constant184'
-   *  Constant: '<S3>/Constant185'
-   *  Constant: '<S3>/Constant186'
-   *  Constant: '<S3>/Constant187'
-   *  Constant: '<S3>/Constant188'
-   *  Constant: '<S3>/Constant189'
-   *  Constant: '<S3>/Constant190'
-   *  Constant: '<S3>/Constant191'
-   *  Constant: '<S3>/Constant192'
-   *  Constant: '<S3>/Constant193'
-   *  Constant: '<S3>/Constant194'
-   *  Constant: '<S3>/Constant195'
-   *  Constant: '<S3>/Constant196'
-   *  Constant: '<S3>/Constant197'
-   *  Constant: '<S3>/Constant198'
-   *  Constant: '<S3>/Constant199'
-   *  Constant: '<S3>/Constant200'
-   *  Constant: '<S3>/Constant201'
-   *  Constant: '<S3>/Constant202'
-   *  Constant: '<S3>/Constant203'
-   *  Constant: '<S3>/Constant204'
-   *  Constant: '<S3>/Constant205'
-   *  Constant: '<S3>/Constant206'
-   *  Constant: '<S3>/Constant207'
-   *  Constant: '<S3>/Constant208'
-   *  Constant: '<S3>/Constant209'
-   *  Constant: '<S3>/Constant210'
-   *  Constant: '<S3>/Constant211'
-   *  Constant: '<S3>/Constant212'
-   *  Constant: '<S3>/Constant213'
-   *  Constant: '<S3>/Constant214'
-   *  Constant: '<S3>/Constant215'
-   *  Constant: '<S3>/Constant216'
-   *  Constant: '<S3>/Constant217'
-   *  Constant: '<S3>/Constant218'
-   *  Constant: '<S3>/Constant219'
-   *  Constant: '<S3>/Constant220'
-   *  Constant: '<S3>/Constant221'
-   *  Constant: '<S3>/Constant222'
-   *  Constant: '<S3>/Constant223'
-   *  Constant: '<S3>/Constant224'
-   *  Constant: '<S3>/Constant225'
-   *  Constant: '<S3>/Constant226'
-   *  Constant: '<S3>/Constant227'
-   *  Constant: '<S3>/Constant228'
-   *  Constant: '<S3>/Constant229'
-   *  Constant: '<S3>/Constant230'
-   *  Constant: '<S3>/Constant231'
-   *  Constant: '<S3>/Constant232'
-   *  Constant: '<S3>/Constant233'
-   *  Constant: '<S3>/Constant234'
-   *  Constant: '<S3>/Constant235'
-   *  Constant: '<S3>/Constant236'
-   *  Constant: '<S3>/Constant237'
-   *  Constant: '<S3>/Constant238'
-   *  Constant: '<S3>/Constant239'
-   *  Constant: '<S3>/Constant240'
-   *  Constant: '<S3>/Constant241'
-   *  Constant: '<S3>/Constant242'
-   *  Constant: '<S3>/Constant243'
-   *  Constant: '<S3>/Constant244'
-   *  Constant: '<S3>/Constant245'
-   *  Constant: '<S3>/Constant246'
-   *  Constant: '<S3>/Constant247'
-   *  Constant: '<S3>/Constant248'
-   *  Constant: '<S3>/Constant249'
-   *  Constant: '<S3>/Constant250'
-   *  Constant: '<S3>/Constant251'
-   *  Constant: '<S3>/Constant252'
-   *  Constant: '<S3>/Constant253'
-   *  Constant: '<S3>/Constant254'
-   *  Constant: '<S3>/Constant255'
-   *  Constant: '<S3>/Constant256'
-   *  Constant: '<S3>/Constant257'
-   *  Constant: '<S3>/Constant258'
-   *  Constant: '<S3>/Constant259'
-   *  Constant: '<S3>/Constant260'
-   *  Constant: '<S3>/Constant261'
-   *  Constant: '<S3>/Constant262'
-   *  Constant: '<S3>/Constant263'
-   *  Constant: '<S3>/Constant264'
-   *  Constant: '<S3>/Constant265'
-   *  Constant: '<S3>/Constant266'
-   *  Constant: '<S3>/Constant267'
-   *  Constant: '<S3>/Constant268'
-   *  Constant: '<S3>/Constant269'
-   *  Constant: '<S3>/Constant270'
-   *  Constant: '<S3>/Constant271'
-   *  Constant: '<S3>/Constant272'
-   *  Constant: '<S3>/Constant273'
-   *  Constant: '<S3>/Constant274'
-   *  Constant: '<S3>/Constant275'
-   *  Constant: '<S3>/Constant276'
-   *  Constant: '<S3>/Constant277'
-   *  Constant: '<S3>/Constant278'
-   *  Constant: '<S3>/Constant279'
-   *  Constant: '<S3>/Constant280'
-   *  Constant: '<S3>/Constant281'
-   *  Constant: '<S3>/Constant282'
-   *  Constant: '<S3>/Constant283'
-   *  Constant: '<S3>/Constant284'
-   *  Constant: '<S3>/Constant285'
-   *  Constant: '<S3>/Constant286'
-   *  Constant: '<S3>/Constant287'
-   *  Constant: '<S3>/Constant288'
-   *  Constant: '<S3>/Constant289'
-   *  Constant: '<S3>/Constant290'
-   *  Constant: '<S3>/Constant291'
-   *  Constant: '<S3>/Constant292'
-   *  Constant: '<S3>/Constant293'
-   *  Constant: '<S3>/Constant294'
-   *  Constant: '<S3>/Constant295'
-   *  Constant: '<S3>/Constant296'
-   *  Constant: '<S3>/Constant297'
-   *  Constant: '<S3>/Constant298'
-   *  Constant: '<S3>/Constant299'
-   *  Constant: '<S3>/Constant300'
-   *  Constant: '<S3>/Constant301'
-   *  Constant: '<S3>/Constant302'
-   *  Constant: '<S3>/Constant303'
-   *  Constant: '<S3>/Constant304'
-   *  Constant: '<S3>/Constant305'
-   *  Constant: '<S3>/Constant306'
-   *  Constant: '<S3>/Constant307'
-   *  Constant: '<S3>/Constant308'
-   *  Constant: '<S3>/Constant309'
-   *  Constant: '<S3>/Constant310'
-   *  Constant: '<S3>/Constant311'
-   *  Constant: '<S3>/Constant312'
-   *  Constant: '<S3>/Constant313'
-   *  Constant: '<S3>/Constant314'
-   */
-  rtb_TmpSignalConversionAtSFun_l[0] = 2U;
-  rtb_TmpSignalConversionAtSFun_l[1] = 2U;
-  rtb_TmpSignalConversionAtSFun_l[2] = 2U;
-  rtb_TmpSignalConversionAtSFun_l[3] = 2U;
-  rtb_TmpSignalConversionAtSFun_l[4] = 34U;
-  rtb_TmpSignalConversionAtSFun_l[5] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[6] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[7] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[8] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[9] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[10] = 254U;
-  rtb_TmpSignalConversionAtSFun_l[11] = 254U;
-  rtb_TmpSignalConversionAtSFun_l[12] = 2U;
-  rtb_TmpSignalConversionAtSFun_l[13] = 254U;
-  rtb_TmpSignalConversionAtSFun_l[14] = 1U;
-  rtb_TmpSignalConversionAtSFun_l[15] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[16] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[17] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[18] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[19] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[20] = 254U;
-  rtb_TmpSignalConversionAtSFun_l[21] = 106U;
-  rtb_TmpSignalConversionAtSFun_l[22] = 2U;
-  rtb_TmpSignalConversionAtSFun_l[23] = 106U;
-  rtb_TmpSignalConversionAtSFun_l[24] = 2U;
-  rtb_TmpSignalConversionAtSFun_l[25] = 18U;
-  rtb_TmpSignalConversionAtSFun_l[26] = 18U;
-  rtb_TmpSignalConversionAtSFun_l[27] = 18U;
-  rtb_TmpSignalConversionAtSFun_l[28] = 18U;
-  rtb_TmpSignalConversionAtSFun_l[29] = 250U;
-  rtb_TmpSignalConversionAtSFun_l[30] = 2U;
-  rtb_TmpSignalConversionAtSFun_l[31] = 106U;
-  rtb_TmpSignalConversionAtSFun_l[32] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[33] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[34] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[35] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[36] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[37] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[38] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[39] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[40] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[41] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[42] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[43] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[44] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[45] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[46] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[47] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[48] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[49] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[50] = 2U;
-  rtb_TmpSignalConversionAtSFun_l[51] = 234U;
-  rtb_TmpSignalConversionAtSFun_l[52] = 122U;
-  rtb_TmpSignalConversionAtSFun_l[53] = 66U;
-  rtb_TmpSignalConversionAtSFun_l[54] = 34U;
-  rtb_TmpSignalConversionAtSFun_l[55] = 66U;
-  rtb_TmpSignalConversionAtSFun_l[56] = 34U;
-  rtb_TmpSignalConversionAtSFun_l[57] = 2U;
-  rtb_TmpSignalConversionAtSFun_l[58] = 2U;
-  rtb_TmpSignalConversionAtSFun_l[59] = 18U;
-  rtb_TmpSignalConversionAtSFun_l[60] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[61] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[62] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[63] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[64] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[65] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[66] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[67] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[68] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[69] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[70] = 122U;
-  rtb_TmpSignalConversionAtSFun_l[71] = 2U;
-  rtb_TmpSignalConversionAtSFun_l[72] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[73] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[74] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[75] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[76] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[77] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[78] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[79] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[80] = 66U;
-  rtb_TmpSignalConversionAtSFun_l[81] = 66U;
-  rtb_TmpSignalConversionAtSFun_l[82] = 234U;
-  rtb_TmpSignalConversionAtSFun_l[83] = 131U;
-  rtb_TmpSignalConversionAtSFun_l[84] = 3U;
-  rtb_TmpSignalConversionAtSFun_l[85] = 2U;
-  rtb_TmpSignalConversionAtSFun_l[86] = 66U;
-  rtb_TmpSignalConversionAtSFun_l[87] = 66U;
-  rtb_TmpSignalConversionAtSFun_l[88] = 162U;
-  rtb_TmpSignalConversionAtSFun_l[89] = 131U;
-  rtb_TmpSignalConversionAtSFun_l[90] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[91] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[92] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[93] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[94] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[95] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[96] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[97] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[98] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[99] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[100] = 250U;
-  rtb_TmpSignalConversionAtSFun_l[101] = 145U;
-  rtb_TmpSignalConversionAtSFun_l[102] = 234U;
-  rtb_TmpSignalConversionAtSFun_l[103] = 3U;
-  rtb_TmpSignalConversionAtSFun_l[104] = 3U;
-  rtb_TmpSignalConversionAtSFun_l[105] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[106] = 250U;
-  rtb_TmpSignalConversionAtSFun_l[107] = 19U;
-  rtb_TmpSignalConversionAtSFun_l[108] = 250U;
-  rtb_TmpSignalConversionAtSFun_l[109] = 19U;
-  rtb_TmpSignalConversionAtSFun_l[110] = 106U;
-  rtb_TmpSignalConversionAtSFun_l[111] = 3U;
-  rtb_TmpSignalConversionAtSFun_l[112] = 106U;
-  rtb_TmpSignalConversionAtSFun_l[113] = 3U;
-  rtb_TmpSignalConversionAtSFun_l[114] = 250U;
-  rtb_TmpSignalConversionAtSFun_l[115] = 146U;
-  rtb_TmpSignalConversionAtSFun_l[116] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[117] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[118] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[119] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[120] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[121] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[122] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[123] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[124] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[125] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[126] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[127] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[128] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[129] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[130] = 66U;
-  rtb_TmpSignalConversionAtSFun_l[131] = 34U;
-  rtb_TmpSignalConversionAtSFun_l[132] = 18U;
-  rtb_TmpSignalConversionAtSFun_l[133] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[134] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[135] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[136] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[137] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[138] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[139] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[140] = 131U;
-  rtb_TmpSignalConversionAtSFun_l[141] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[142] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[143] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[144] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[145] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[146] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[147] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[148] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[149] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[150] = 2U;
-  rtb_TmpSignalConversionAtSFun_l[151] = 2U;
-  rtb_TmpSignalConversionAtSFun_l[152] = 2U;
-  rtb_TmpSignalConversionAtSFun_l[153] = 0U;
-  rtb_TmpSignalConversionAtSFun_l[154] = 0U;
-
-  /* Chart: '<S3>/FltCodeArry' incorporates:
-   *  Constant: '<S3>/Constant'
-   *  Constant: '<S3>/Constant266'
-   *  Constant: '<S3>/Constant315'
-   *  Constant: '<S3>/Constant317'
-   *  Constant: '<S3>/Constant53'
-   *  SignalConversion generated from: '<S5>/ SFunction '
-   */
-  avrgU = 0U;
-  sfmd_num_fltNum = 0U;
-  for (i_0 = 0; i_0 < 20; i_0++) {
-    FltCodeArr[i_0] = 0U;
-    rtb_FltLevelArr[i_0] = 0U;
-    rtb_FltActArr[i_0] = 0U;
-    FltCodeArrS[i_0] = 0U;
-  }
-
-  while (avrgU < 155) {
-    if (rtb_TmpSignalConversionAtSFun_a[avrgU] && (sfmd_num_fltNum <
-         sfmc_num_fltNumMax)) {
-      FltCodeArr[sfmd_num_fltNum] = (uint16_T)(avrgU + 1);
-      rtb_FltLevelArr[sfmd_num_fltNum] = rtb_TmpSignalConversionAtSFunct[avrgU];
-      rtb_FltActArr[sfmd_num_fltNum] = rtb_TmpSignalConversionAtSFun_l[avrgU];
-      sfmd_num_fltNum = (uint16_T)(sfmd_num_fltNum + 1);
-      if (avrgU == 51) {
-        for (k = 0U; k < cmnc_num_cellUNum; k++) {
-          if (SFM_B.ErrFlg[k]) {
-            FltCodeArr[sfmd_num_fltNum] = (uint16_T)(k + 2001);
-            rtb_FltLevelArr[sfmd_num_fltNum] = 4U;
-            rtb_FltActArr[sfmd_num_fltNum] = 234U;
-            i_0 = sfmd_num_fltNum + 1;
-            if (sfmd_num_fltNum + 1 > 65535) {
-              i_0 = 65535;
-            }
-
-            sfmd_num_fltNum = (uint16_T)i_0;
-          }
-        }
-      }
-    }
-
-    avrgU++;
-  }
-
-  for (avrgU = 0U; avrgU < sfmd_num_fltNum; avrgU++) {
-    i_0 = rtb_FltLevelArr[avrgU] * 10000 + FltCodeArr[avrgU];
-    if (i_0 > 65535) {
-      i_0 = 65535;
-    }
-
-    FltCodeArrS[avrgU] = (uint16_T)i_0;
-  }
-
-  for (avrgU = 0U; avrgU < sfmd_num_fltNum; avrgU++) {
-    for (k = 0U; k < (sfmd_num_fltNum - avrgU) - 1; k++) {
-      tmp_3 = FltCodeArrS[k + 1];
-      if (FltCodeArrS[k] < tmp_3) {
-        temp = FltCodeArrS[k];
-        FltCodeArrS[k] = tmp_3;
-        FltCodeArrS[k + 1] = temp;
-      }
-    }
-  }
-
-  if ((SFM_DW.Cntl > 4) || (SFM_DW.Cntl >= sfmd_num_fltNum)) {
-    SFM_DW.Cntl = 0U;
-  }
-
-  avrgU = FltCodeArrS[SFM_DW.Cntl];
-  i_0 = SFM_DW.Cntl + 1;
-  if (SFM_DW.Cntl + 1 > 65535) {
-    i_0 = 65535;
-  }
-
-  SFM_DW.Cntl = (uint16_T)i_0;
-
-  /* S-Function (sfix_bitop): '<S3>/Bitwise Operator1' */
-  sfmd_st_fltAct = rtb_FltActArr[0];
-
-  /* MinMax: '<S3>/MinMax' */
-  sfmd_N_fltLevel = rtb_FltLevelArr[0];
-  for (i_0 = 0; i_0 < 19; i_0++) {
-    /* S-Function (sfix_bitop): '<S3>/Bitwise Operator1' */
-    sfmd_st_fltAct = (uint8_T)(rtb_FltActArr[i_0 + 1] | sfmd_st_fltAct);
-
-    /* MinMax: '<S3>/MinMax' */
-    i = rtb_FltLevelArr[i_0 + 1];
-    if (sfmd_N_fltLevel <= i) {
-      sfmd_N_fltLevel = i;
-    }
-  }
-
-  /* Math: '<S3>/Rem1' */
-  sfmd_idx_fltCode = (uint16_T)(avrgU % 10000);
-
-  /* Chart: '<S13>/Chart' incorporates:
-   *  Constant: '<S13>/Constant'
-   */
-  qY_0 = cmnc_num_cellUNum == 0U ? MAX_uint32_T : rtb_SumU / cmnc_num_cellUNum;
-  if (qY_0 > 65535U) {
-    qY_0 = 65535U;
-  }
-
-  /* SignalConversion generated from: '<S13>/Chart' incorporates:
-   *  Chart: '<S13>/Chart'
-   */
-  sfmd_V_cellUAvrg = (uint16_T)qY_0;
-
-  /* Product: '<S23>/Product' incorporates:
-   *  Inport: '<Root>/ihd_L_urtRecv'
-   *  RelationalOperator: '<S9>/Relational Operator'
-   *  UnitDelay: '<S23>/Time_Delay'
-   */
-  SFM_DW.Time_Delay_DSTATE = (uint16_T)(ihd_L_urtRecv == 0 ? (int32_T)
-    rtb_Saturation : 0);
-  for (i_0 = 0; i_0 < 6; i_0++) {
-    /* SignalConversion: '<S15>/Signal Conversion' incorporates:
-     *  Inport: '<Root>/ihv_T_modT'
-     */
-    sfmv_T_modT[i_0] = ihv_T_modT[i_0];
-  }
-}
-
-/* Model initialize function */
-void SFM_initialize(const char_T **rt_errorStatus)
-{
-  RT_MODEL_SFM_T *const SFM_M = &(SFM_MdlrefDW.rtm);
-
-  /* Registration code */
-
-  /* initialize error status */
-  rtmSetErrorStatusPointer(SFM_M, rt_errorStatus);
-}
-
-/*
- * File trailer for generated code.
- *
- * [EOF]
- */

+ 636 - 1983
src/EmbeddedCoder_src/SOC.c

@@ -1,2036 +1,689 @@
-/*
- * File: SOC.c
- *
- * Code generated for Simulink model 'SOC'.
- *
- * Model version                  : 1.51
- * Simulink Coder version         : 9.4 (R2020b) 29-Jul-2020
- * C/C++ source code generated on : Thu Sep  9 17:18:48 2021
- *
- * Target selection: ert.tlc
- * Embedded hardware selection: Intel->x86-64 (Windows64)
- * Code generation objectives: Unspecified
- * Validation result: Not run
- */
-
 #include "SOC.h"
-#include "SOC_private.h"
-#include "div_nde_s32_floor.h"
-#include "div_repeat_s16s32_floor.h"
-#include "div_repeat_u32.h"
 #include "look1_is16lu16n16tu16_binlcase.h"
 #include "look1_iu16lu16n16tu16_binlcase.h"
-#include "mul_u32_hiSR_near.h"
-
-MdlrefDW_SOC_T SOC_MdlrefDW;
-
-/* Block signals (default storage) */
-B_SOC_c_T SOC_B;
-
-/* Block states (default storage) */
-DW_SOC_f_T SOC_DW;
-
-/* Previous zero-crossings (trigger) states */
-ZCE_SOC_T SOC_PrevZCX;
-
-/*
- * Output and update for atomic system:
- *    '<S21>/MATLAB Function'
- *    '<S30>/MATLAB Function'
- */
-void SOC_MATLABFunction(real_T rtu_x, real_T *rty_y)
-{
-  *rty_y = ((((((-2.8104E-13 * pow(rtu_x, 7.0) + 1.0283E-10 * pow(rtu_x, 6.0)) +
-                -1.5072E-8 * pow(rtu_x, 5.0)) + 1.1295E-6 * pow(rtu_x, 4.0)) +
-              -4.588E-5 * pow(rtu_x, 3.0)) + rtu_x * rtu_x * 0.000993) +
-            -0.010548 * rtu_x) + 0.04876;
-}
-
-/*
- * Output and update for action system:
- *    '<S37>/If Action Subsystem'
- *    '<S42>/If Action Subsystem'
- */
-void SOC_IfActionSubsystem(uint16_T rtu_SOC, uint16_T rtu_SOCfit, uint16_T
-  *rty_Out1, uint16_T rtp_m)
-{
-  int32_T tmp;
 
-  /* MinMax: '<S38>/Min1' incorporates:
-   *  Constant: '<S38>/Constant4'
-   *  Sum: '<S38>/Add4'
-   */
-  tmp = (int16_T)(rtu_SOC - rtu_SOCfit);
-  if (tmp >= rtp_m) {
-    tmp = rtp_m;
-  }
 
-  /* Sum: '<S38>/Add3' incorporates:
-   *  MinMax: '<S38>/Min1'
-   */
-  *rty_Out1 = (uint16_T)((uint32_T)(uint16_T)tmp + rtu_SOCfit);
-}
-
-/*
- * Output and update for action system:
- *    '<S37>/If Action Subsystem1'
- *    '<S42>/If Action Subsystem1'
- */
-void SOC_IfActionSubsystem1(uint16_T rtu_SOC, uint16_T rtu_SOCfit, uint16_T
-  *rty_Out1)
-{
-  int16_T rtb_Add4_o;
-
-  /* Sum: '<S39>/Add4' */
-  rtb_Add4_o = (int16_T)(rtu_SOC - rtu_SOCfit);
-
-  /* MinMax: '<S39>/Min1' incorporates:
-   *  Constant: '<S39>/Constant4'
-   *  Sum: '<S39>/Add4'
-   */
-  if (rtb_Add4_o <= -1) {
-    rtb_Add4_o = -1;
-  }
+boolean_T FirstRun_SOC;
 
-  /* End of MinMax: '<S39>/Min1' */
 
-  /* Sum: '<S39>/Add3' */
-  *rty_Out1 = (uint16_T)(rtb_Add4_o + rtu_SOCfit);
-}
-
-/* System initialize for referenced model: 'SOC' */
+//---------------SOC初始化-----------------------------------------------
 void SOC_Init(void)
-{
-  /* Start for If: '<S7>/If' */
-  SOC_DW.If_ActiveSubsystem = -1;
-
-  /* InitializeConditions for UnitDelay: '<S1>/FirstDelay' */
-  SOC_DW.FirstDelay_DSTATE = true;
-
-  /* InitializeConditions for UnitDelay: '<S14>/Frist' */
-  SOC_DW.Frist_DSTATE = true;
-
-  /* InitializeConditions for UnitDelay: '<S23>/Frist' */
-  SOC_DW.Frist_DSTATE_h = true;
-
-  /* InitializeConditions for UnitDelay: '<S12>/P_Delay' */
-  SOC_DW.P_Delay_DSTATE[0] = 1000.0;
-
-  /* InitializeConditions for UnitDelay: '<S13>/P_Delay' */
-  SOC_DW.P_Delay_DSTATE_m[0] = 1000.0;
-
-  /* InitializeConditions for UnitDelay: '<S12>/P_Delay' */
-  SOC_DW.P_Delay_DSTATE[1] = 0.0;
-
-  /* InitializeConditions for UnitDelay: '<S13>/P_Delay' */
-  SOC_DW.P_Delay_DSTATE_m[1] = 0.0;
-
-  /* InitializeConditions for UnitDelay: '<S12>/P_Delay' */
-  SOC_DW.P_Delay_DSTATE[2] = 0.0;
-
-  /* InitializeConditions for UnitDelay: '<S13>/P_Delay' */
-  SOC_DW.P_Delay_DSTATE_m[2] = 0.0;
-
-  /* InitializeConditions for UnitDelay: '<S12>/P_Delay' */
-  SOC_DW.P_Delay_DSTATE[3] = 1000.0;
-
-  /* InitializeConditions for UnitDelay: '<S13>/P_Delay' */
-  SOC_DW.P_Delay_DSTATE_m[3] = 1000.0;
-
-  /* InitializeConditions for UnitDelay: '<S4>/  ' */
-  SOC_DW._DSTATE = 10;
-
-  /* InitializeConditions for UnitDelay: '<S6>/First_Delay' */
-  SOC_DW.First_Delay_DSTATE = true;
-
-  /* InitializeConditions for UnitDelay: '<S6>/ihd_st_chrgSta_Delay' */
-  SOC_DW.ihd_st_chrgSta_Delay_DSTATE = 1U;
-
-  /* InitializeConditions for UnitDelay: '<S6>/Unit Delay7' */
-  SOC_DW.UnitDelay7_DSTATE = 10U;
-
-  /* InitializeConditions for UnitDelay: '<S35>/Time_Delay' */
-  SOC_DW.Time_Delay_DSTATE = 1U;
-
-  /* InitializeConditions for UnitDelay: '<S6>/socd_pct_battSoc0_Delay' */
-  SOC_DW.socd_pct_battSoc0_Delay_DSTATE = 10U;
-
-  /* InitializeConditions for UnitDelay: '<S6>/First_Delay1' */
-  SOC_DW.First_Delay1_DSTATE = true;
-
-  /* InitializeConditions for UnitDelay: '<S6>/socd_pct_bcusocDelay' */
-  SOC_DW.socd_pct_bcusocDelay_DSTATE = 10U;
-
-  /* InitializeConditions for Switch: '<S6>/Switch2' incorporates:
-   *  UnitDelay: '<S6>/socd_pct_bcuSoc0_Delay'
-   */
-  SOC_DW.socd_pct_bcuSoc0_Delay_DSTATE = 10U;
-
-  /* SystemInitialize for IfAction SubSystem: '<S7>/chrgCCV' */
-  /* InitializeConditions for UnitDelay: '<S59>/Time_Delay' */
-  SOC_DW.Time_Delay_DSTATE_g = 1U;
+{   
+    FirstRun_SOC = true;
 
-  /* InitializeConditions for UnitDelay: '<S57>/socn_pct_estsoc_Delay' */
-  SOC_DW.socn_pct_estsoc_Delay_DSTATE = 10U;
-
-  /* InitializeConditions for UnitDelay: '<S58>/Time_Delay' */
-  SOC_DW.Time_Delay_DSTATE_f = 1U;
-
-  /* End of SystemInitialize for SubSystem: '<S7>/chrgCCV' */
-
-  /* SystemInitialize for IfAction SubSystem: '<S7>/disChrgCCV' */
-  /* InitializeConditions for UnitDelay: '<S61>/Time_Delay' */
-  SOC_DW.Time_Delay_DSTATE_e = 1U;
-
-  /* End of SystemInitialize for SubSystem: '<S7>/disChrgCCV' */
-
-  /* SystemInitialize for IfAction SubSystem: '<S7>/If Action Subsystem' */
-  /* InitializeConditions for UnitDelay: '<S52>/Unit Delay1' */
-  SOC_DW.UnitDelay1_DSTATE = true;
-
-  /* InitializeConditions for UnitDelay: '<S53>/Unit Delay1' */
-  SOC_DW.UnitDelay1_DSTATE_p = true;
-
-  /* End of SystemInitialize for SubSystem: '<S7>/If Action Subsystem' */
-
-  /* SystemInitialize for IfAction SubSystem: '<S6>/Subsystem2' */
-  /* InitializeConditions for UnitDelay: '<S37>/socfit_Delay' */
-  SOC_DW.socfit_Delay_DSTATE_n = 2000U;
-  SOC_DW.fulFLg_reset_DSTATE=0;
-  SOC_DW.overFlg_reset_DSTATE=0;
-  SOC_DW.lowFLg_Delay_DSTATE=0;
-
-  /* End of SystemInitialize for SubSystem: '<S6>/Subsystem2' */
-}
-
-/* Disable for referenced model: 'SOC' */
-void SOC_Disable(void)
-{
-  /* Disable for If: '<S7>/If' */
-  SOC_DW.If_ActiveSubsystem = -1;
 }
+//-------------------------------------------------------------------------
 
-/* Output and update for referenced model: 'SOC' */
 void SOC(void)
 {
-  real_T rtb_MatrixConcatenate[4];
-  real_T rtb_P_Delay[4];
-  real_T tmp[4];
-  real_T rtb_Divide[2];
-  real_T rtb_Product2_i[2];
-  real_T rtb_TmpSignalConversionAtProduc[2];
-  real_T tmp_0[2];
-  real_T P_Delay_DSTATE_tmp_0;
-  real_T rtb_Abs;
-  real_T rtb_Add1;
-  real_T rtb_Add1_h;
-  real_T rtb_Add1_tmp_tmp;
-  real_T rtb_Add_l;
-  real_T rtb_Divide_d;
-  real_T rtb_Gain1_m;
-  real_T rtb_MathFunction;
-  real_T rtb_TmpSignalConversionAtProd_0;
-  real_T tmp_1;
-  int32_T P_Delay_DSTATE_tmp;
-  int32_T i;
-  uint32_T tmp_2;
-  int16_T rtb_Add1_a;
-  int16_T rtb_Saturation_k;
-  uint16_T rtb_Merge;
-  uint16_T rtb_socd_pct_bcuSoc0_Delay;
-  uint16_T rtb_uDLookupTable3;
-  int8_T rtPrevAction;
-  boolean_T rtb_LogicalOperator1_j;
-
-  /* Outputs for Enabled SubSystem: '<S1>/Inti_correct' incorporates:
-   *  EnablePort: '<S5>/Enable'
-   */
-  /* Outputs for Enabled SubSystem: '<S1>/EEcheck' incorporates:
-   *  EnablePort: '<S2>/Enable'
-   */
-  /* UnitDelay: '<S1>/FirstDelay' */
-  if (SOC_DW.FirstDelay_DSTATE) {
-    /* If: '<S2>/If' incorporates:
-     *  Inport: '<Root>/socd_pct_battSocEi'
-     *  Inport: '<Root>/socd_pct_bcuSocEi'
-     *  Logic: '<S10>/Logical Operator'
-     *  RelationalOperator: '<S10>/Relational Operator'
-     *  RelationalOperator: '<S10>/Relational Operator1'
-     */
-    if ((socd_pct_battSocEi > 1000) || (socd_pct_bcuSocEi > 1000)) {
-      /* Outputs for IfAction SubSystem: '<S2>/If Action Subsystem' incorporates:
-       *  ActionPort: '<S8>/Action Port'
-       */
-      /* Lookup_n-D: '<S8>/OCV-SOC' incorporates:
-       *  Inport: '<Root>/sfmd_V_cellUAvrg'
-       */
-      SOC_B.Switch = look1_iu16lu16n16tu16_binlcase(sfmd_V_cellUAvrg,
-        (&(cmnm_V_ocv[0])), (&(cmnm_pct_soc[0])), 12U);
-
-      /* Merge: '<S2>/socn_pct_bcuSocEE_Merge' incorporates:
-       *  Lookup_n-D: '<S8>/OCV-SOC'
-       *  SignalConversion: '<S8>/Signal Conversion1'
-       */
-      SOC_B.socn_pct_bcuSocEE_Merge = SOC_B.Switch;
-
-      /* End of Outputs for SubSystem: '<S2>/If Action Subsystem' */
-    } else {
-      /* Outputs for IfAction SubSystem: '<S2>/If Action Subsystem1' incorporates:
-       *  ActionPort: '<S9>/Action Port'
-       */
-      /* Lookup_n-D: '<S8>/OCV-SOC' incorporates:
-       *  Inport: '<S9>/socd_pct_battSocEi'
-       *  Merge: '<S2>/socn_pct_battSocEE_Merge'
-       */
-      SOC_B.Switch = socd_pct_battSocEi;
-
-      /* Merge: '<S2>/socn_pct_bcuSocEE_Merge' incorporates:
-       *  Inport: '<S9>/socd_pct_bcuSocEi'
-       */
-      SOC_B.socn_pct_bcuSocEE_Merge = socd_pct_bcuSocEi;
-
-      /* End of Outputs for SubSystem: '<S2>/If Action Subsystem1' */
+    static uint16_T socn_pct_battSocEE;
+    static uint16_T socn_pct_bcuSocEE;
+    static uint16_T socn_Q_cap;
+    //
+    uint16_T EKFSOCMin;
+    uint16_T EKFSOCMax;
+    boolean_T  socn_flg_ekfInvalidMin;
+    boolean_T  socn_flg_ekfInvalidMax;
+    boolean_T  socn_flg_ekfInvalid;
+    real_T  ocv;
+    real_T  Ro;
+    real_T  Rp;
+    real_T  C;
+	real_T  deltU;
+    real_T A[4];
+    real_T B[2];
+    real_T H[2];
+    real_T K[2];
+	real_T P1[4];
+    static real_T P_Min_Delay[4];
+    static real_T P_Max_Delay[4];
+    real_T soc1;
+    static real_T soc_Min_Delay;
+    static real_T soc_Max_Delay;
+    real_T Up1;
+    static real_T Up_Min_Delay;
+    static real_T Up_Max_Delay;
+    real_T docv;
+    real_T Q;
+    real_T battcurr;
+    real_T UL;
+    uint16_T factor;
+    uint32_T temp;
+    //
+    static real_T ahDelay;
+    int16_T ahSoc;
+    //
+    static uint16_T ekfInvalidCntl;
+    static boolean_T onceFlg_est;
+    static int16_T ahSoc0_est;
+    static uint16_T ekfSoc0_est;
+    //
+    static boolean_T overFlg;
+    static boolean_T fulFlg;
+    static uint16_T overCntl;
+    static uint16_T fulCntl; 
+    static boolean_T onceFlg_utrckOver;
+    static int16_T ahSoc0_utrckOver;
+    static uint16_T estSoc0_utrckOver;
+    static uint16_T Soc_Delay;
+    static boolean_T lowFlg;
+    static uint16_T lowCntl;
+    static boolean_T onceFlg_utrckLow;
+    static int16_T ahSoc0_utrckLow;
+    static uint16_T estSoc0_utrckLow;
+    uint16_T socn_pct_utrackSoc;
+	uint16_T socTemp;
+	static uint16_T chrgCntl;
+	static uint16_T disChrgCntl;
+    //
+    static uint16_T socd_pct_battSoc_Delay;
+    //
+    static uint16_T  statCntl;
+    static boolean_T statFlg;
+    static uint8_T ihd_st_chrgSta_Delay;
+    static uint16_T socn_pct_utrackSoc_Delay;
+    static uint16_T socd_pct_battSoc0;
+    static uint16_T socd_pct_bcuSoc0;
+    static uint16_T socd_pct_bcuSoc_Delay;
+    uint16_T delSOC;
+    uint16_T bcuSoc;
+    int16_T coinSoc;
+    uint16_T x[3];
+    uint16_T y[3];
+	boolean_T Flg;
+    static uint16_T SocFitChrg_Delay;
+    static uint16_T SocFitdisChrg_Delay;
+    static boolean_T onceFlg_chrg;
+    static boolean_T onceFlg_dischrg;
+    uint16_T SocFitChrg;
+    uint16_T SocFitdisChrg;
+	//
+
+    if(FirstRun_SOC)
+    { 
+      onceFlg_est  = true;
+      ekfInvalidCntl = 0;
+      overCntl = 0;
+      fulCntl = 0;
+      lowCntl = 0;
+      overFlg = false;
+      fulFlg = false;
+      lowFlg = false;
+      onceFlg_utrckOver = true;
+      onceFlg_utrckLow = true;
+      ihd_st_chrgSta_Delay = 0;
+      socn_pct_utrackSoc_Delay = 0;
+      onceFlg_chrg    = true;
+      onceFlg_dischrg = true;
+	  socd_pct_battSoc_Delay = 0;
     }
-
-    /* End of If: '<S2>/If' */
-
-    /* Switch: '<S5>/Switch' incorporates:
-     *  Constant: '<S5>/Constant'
-     *  Inport: '<Root>/ihd_tm_packTime'
-     *  RelationalOperator: '<S5>/Relational Operator'
-     */
-    if (ihd_tm_parkTime > cmnc_tm_parkTime) {
-      /* Lookup_n-D: '<S8>/OCV-SOC' incorporates:
-       *  Inport: '<Root>/sfmd_V_cellUAvrg'
-       *  Lookup_n-D: '<S5>/OCV-SOC'
-       *  Switch: '<S5>/Switch'
-       */
-      SOC_B.Switch = look1_iu16lu16n16tu16_binlcase(sfmd_V_cellUAvrg,
-        (&(cmnm_V_ocv[0])), (&(cmnm_pct_soc[0])), 12U);
+	
+    //=====================================================================
+    ////////////////////////初始值获取//////////////////////////////////////
+    //=====================================================================
+    if(FirstRun_SOC)
+    {   //
+        if ((socd_pct_battSocEi > 1000) || (socd_pct_bcuSocEi > 1000) || (socd_pct_bcuSocEi == 0 && socd_pct_battSocEi == 0))
+        {
+            socn_pct_battSocEE =  look1_iu16lu16n16tu16_binlcase(sfmd_V_cellUAvrg,(&(cmnm_V_ocv[0])), (&(cmnm_pct_soc[0])), 12U);
+            socn_pct_bcuSocEE  =  look1_iu16lu16n16tu16_binlcase(sfmd_V_cellUAvrg,(&(cmnm_V_ocv[0])), (&(cmnm_pct_soc[0])), 12U);
+        }
+        else
+        {
+            socn_pct_battSocEE = socd_pct_battSocEi;
+            socn_pct_bcuSocEE  = socd_pct_bcuSocEi;
+        }
+        //
+        if (ihd_tm_parkTime > cmnc_tm_parkTime)
+        {
+            socn_pct_battSocEE =  look1_iu16lu16n16tu16_binlcase(sfmd_V_cellUAvrg,(&(cmnm_V_ocv[0])), (&(cmnm_pct_soc[0])), 12U);
+        }
+		socn_Q_cap = (uint16_T)((uint16_T)((uint32_T)sohd_pct_bcuSoh *cmnc_Q_ratedCp / 2000U) << 1);
     }
-
-    /* End of Switch: '<S5>/Switch' */
-
-    /* Product: '<S5>/Divide' incorporates:
-     *  Constant: '<S5>/Constant2'
-     *  Inport: '<Root>/sohd_pct_bcuSoh'
-     *  Product: '<S5>/Product'
-     */
-    SOC_B.Divide = (uint16_T)((uint16_T)((uint32_T)sohd_pct_bcuSoh *
-      cmnc_Q_ratedCp / 2000U) << 1);
-  }
-
-  /* End of UnitDelay: '<S1>/FirstDelay' */
-  /* End of Outputs for SubSystem: '<S1>/EEcheck' */
-  /* End of Outputs for SubSystem: '<S1>/Inti_correct' */
-
-  /* Switch: '<S14>/Switch' incorporates:
-   *  UnitDelay: '<S14>/Frist'
-   */
-  if (SOC_DW.Frist_DSTATE) {
-    /* Switch: '<S14>/Switch' incorporates:
-     *  Switch: '<S5>/Switch'
-     */
-    SOC_DW.SOCk_Delay_DSTATE = (real_T)SOC_B.Switch * 0.1;
-  }
-
-  /* End of Switch: '<S14>/Switch' */
-
-  /* Product: '<S20>/Divide2' incorporates:
-   *  Constant: '<S20>/Constant'
-   *  Inport: '<Root>/sfmd_I_curr'
-   *  Product: '<S19>/Product'
-   *  Product: '<S19>/Product2'
-   *  Product: '<S28>/Product'
-   *  Product: '<S28>/Product2'
-   *  Product: '<S29>/Divide2'
-   */
-  rtb_Add1_tmp_tmp = (real_T)sfmd_I_curr * 0.1;
-  rtb_Add1_h = rtb_Add1_tmp_tmp / 36000.0;
-
-  /* Sum: '<S20>/Add1' incorporates:
-   *  Gain: '<S20>/Gain4'
-   *  Product: '<S20>/Divide'
-   *  Product: '<S20>/Divide2'
-   *  Product: '<S5>/Divide'
-   */
-  rtb_Add1 = rtb_Add1_h / ((real_T)SOC_B.Divide * 0.1) * 100.0 +
-    SOC_DW.SOCk_Delay_DSTATE;
-
-  /* MATLAB Function: '<S21>/MATLAB Function' */
-  SOC_MATLABFunction(rtb_Add1, &rtb_Add_l);
-
-  /* SignalConversion generated from: '<S21>/Math Function1' incorporates:
-   *  Constant: '<S21>/Constant'
-   */
-  rtb_TmpSignalConversionAtProduc[0] = rtb_Add_l;
-  rtb_TmpSignalConversionAtProduc[1] = 1.0;
-
-  /* SignalConversion generated from: '<S21>/Matrix Concatenate' */
-  rtb_MatrixConcatenate[0] = 1.0;
-  rtb_MatrixConcatenate[1] = 0.0;
-
-  /* DataTypeConversion: '<S20>/Data Type Conversion' incorporates:
-   *  Lookup_n-D: '<S20>/1-D Lookup Table3'
-   */
-  tmp_1 = fmod(floor(rtb_Add1 / 0.1), 65536.0);
-  rtb_uDLookupTable3 = (uint16_T)(tmp_1 < 0.0 ? (int32_T)(uint16_T)-(int16_T)
-    (uint16_T)-tmp_1 : (int32_T)(uint16_T)tmp_1);
-
-  /* Gain: '<S20>/Gain1' incorporates:
-   *  DataTypeConversion: '<S20>/Data Type Conversion3'
-   *  Lookup_n-D: '<S20>/1-D Lookup Table3'
-   *  Lookup_n-D: '<S20>/1-D Lookup Table4'
-   */
-  rtb_Add1 = (real_T)look1_iu16lu16n16tu16_binlcase(rtb_uDLookupTable3,
-    (&(cmnm_pct_soc[0])), (&(cmnm_R_polar[0])), 12U) * 0.001 * 0.001;
-
-  /* Math: '<S21>/Math Function' incorporates:
-   *  Constant: '<S21>/Constant1'
-   *  DataTypeConversion: '<S20>/Data Type Conversion4'
-   *  Gain: '<S20>/Gain5'
-   *  Lookup_n-D: '<S20>/1-D Lookup Table3'
-   *  Lookup_n-D: '<S20>/1-D Lookup Table5'
-   *  Product: '<S20>/Divide1'
-   *  Product: '<S21>/Divide1'
-   *
-   * About '<S21>/Math Function':
-   *  Operator: exp
-   */
-  rtb_MathFunction = exp(-0.1 / ((real_T)look1_iu16lu16n16tu16_binlcase
-    (rtb_uDLookupTable3, (&(cmnm_pct_soc[0])), (&(cmnm_F_polar[0])), 12U) *
-    0.001 * 1000.0 * rtb_Add1));
-
-  /* SignalConversion generated from: '<S21>/Matrix Concatenate' incorporates:
-   *  Constant: '<S21>/Constant3'
-   */
-  rtb_MatrixConcatenate[2] = 0.0;
-  rtb_MatrixConcatenate[3] = rtb_MathFunction;
-
-  /* Product: '<S16>/Product' incorporates:
-   *  Math: '<S16>/Math Function1'
-   *  SignalConversion generated from: '<S21>/Matrix Concatenate'
-   *  UnitDelay: '<S12>/P_Delay'
-   */
-  for (i = 0; i < 2; i++) {
-    tmp[i] = 0.0;
-    tmp[i] += SOC_DW.P_Delay_DSTATE[i];
-    tmp[i + 2] = 0.0;
-    tmp[i + 2] += SOC_DW.P_Delay_DSTATE[i + 2] * rtb_MathFunction;
-  }
-
-  /* Product: '<S17>/Product1' */
-  rtb_TmpSignalConversionAtProd_0 = 0.0;
-  for (i = 0; i < 2; i++) {
-    /* Sum: '<S16>/Add' incorporates:
-     *  Concatenate: '<S21>/Matrix Concatenate'
-     *  Constant: '<S12>/Constant'
-     *  Product: '<S16>/Product'
-     *  UnitDelay: '<S13>/P_Delay'
-     */
-    tmp_1 = rtb_MatrixConcatenate[i + 2];
-    P_Delay_DSTATE_tmp_0 = tmp_1 * tmp[1] + rtb_MatrixConcatenate[i] * tmp[0];
-    rtb_P_Delay[i] = P_Delay_DSTATE_tmp_0 + 0.001;
-
-    /* Product: '<S17>/Product1' incorporates:
-     *  Constant: '<S12>/Constant'
-     *  SignalConversion generated from: '<S21>/Math Function1'
-     *  Sum: '<S16>/Add'
-     */
-    rtb_Divide_d = (P_Delay_DSTATE_tmp_0 + 0.001) * rtb_Add_l;
-
-    /* Sum: '<S16>/Add' incorporates:
-     *  Concatenate: '<S21>/Matrix Concatenate'
-     *  Constant: '<S12>/Constant'
-     *  Product: '<S16>/Product'
-     *  UnitDelay: '<S13>/P_Delay'
-     */
-    P_Delay_DSTATE_tmp_0 = tmp_1 * tmp[3] + rtb_MatrixConcatenate[i] * tmp[2];
-    rtb_P_Delay[i + 2] = P_Delay_DSTATE_tmp_0 + 0.001;
-    rtb_Divide_d += P_Delay_DSTATE_tmp_0 + 0.001;
-
-    /* Product: '<S17>/Product1' incorporates:
-     *  Product: '<S17>/Product'
-     *  SignalConversion generated from: '<S19>/Product2'
-     */
-    rtb_TmpSignalConversionAtProd_0 += rtb_TmpSignalConversionAtProduc[i] *
-      rtb_Divide_d;
-    rtb_Divide[i] = rtb_Divide_d;
-  }
-
-  /* Product: '<S17>/Divide' incorporates:
-   *  Constant: '<S12>/Constant1'
-   *  Product: '<S17>/Product'
-   *  Product: '<S17>/Product1'
-   *  Sum: '<S17>/Add'
-   */
-  rtb_Divide[0] /= rtb_TmpSignalConversionAtProd_0 + 0.5;
-
-  /* Product: '<S17>/Divide' incorporates:
-   *  Constant: '<S12>/Constant1'
-   *  Product: '<S17>/Product'
-   *  Product: '<S17>/Product1'
-   *  Sum: '<S17>/Add'
-   */
-  k2 = rtb_Divide[1] / (rtb_TmpSignalConversionAtProd_0 + 0.5);
-
-  /* Sum: '<S15>/Add' incorporates:
-   *  Product: '<S15>/Product1'
-   *  Product: '<S17>/Divide'
-   *  SignalConversion generated from: '<S21>/Math Function1'
-   */
-  tmp_1 = 1.0 - rtb_Divide[0] * rtb_Add_l;
-  rtb_Add_l = 0.0 - k2 * rtb_Add_l;
-  rtb_TmpSignalConversionAtProd_0 = 0.0 - rtb_Divide[0];
-
-  /* Product: '<S15>/Product' incorporates:
-   *  Sum: '<S15>/Add'
-   *  UnitDelay: '<S12>/P_Delay'
-   *  UnitDelay: '<S13>/P_Delay'
-   */
-  for (i = 0; i < 2; i++) {
-    P_Delay_DSTATE_tmp = i << 1;
-    SOC_DW.P_Delay_DSTATE[P_Delay_DSTATE_tmp] = 0.0;
-    P_Delay_DSTATE_tmp_0 = rtb_P_Delay[P_Delay_DSTATE_tmp];
-    SOC_DW.P_Delay_DSTATE[P_Delay_DSTATE_tmp] += P_Delay_DSTATE_tmp_0 * tmp_1;
-    rtb_Divide_d = rtb_P_Delay[P_Delay_DSTATE_tmp + 1];
-    SOC_DW.P_Delay_DSTATE[P_Delay_DSTATE_tmp] += rtb_Divide_d *
-      rtb_TmpSignalConversionAtProd_0;
-    SOC_DW.P_Delay_DSTATE[P_Delay_DSTATE_tmp + 1] = 0.0;
-    SOC_DW.P_Delay_DSTATE[P_Delay_DSTATE_tmp + 1] += P_Delay_DSTATE_tmp_0 *
-      rtb_Add_l;
-    SOC_DW.P_Delay_DSTATE[P_Delay_DSTATE_tmp + 1] += rtb_Divide_d * (1.0 - k2);
-  }
-
-  /* End of Product: '<S15>/Product' */
-
-  /* Switch: '<S23>/Switch' incorporates:
-   *  UnitDelay: '<S23>/Frist'
-   */
-  if (SOC_DW.Frist_DSTATE_h) {
-    /* Sum: '<S19>/Add' incorporates:
-     *  Switch: '<S5>/Switch'
-     */
-    SOC_DW.SOCk_Delay_DSTATE_e = (real_T)SOC_B.Switch * 0.1;
-  }
-
-  /* End of Switch: '<S23>/Switch' */
-
-  /* Product: '<S29>/Divide' incorporates:
-   *  Gain: '<S30>/Gain'
-   *  Product: '<S30>/Divide2'
-   *  Product: '<S5>/Divide'
-   */
-  rtb_Divide_d = (real_T)SOC_B.Divide * 0.1;
-
-  /* Sum: '<S29>/Add1' incorporates:
-   *  Gain: '<S29>/Gain4'
-   *  Product: '<S29>/Divide'
-   */
-  rtb_Add1_h = rtb_Add1_h / rtb_Divide_d * 100.0 + SOC_DW.SOCk_Delay_DSTATE_e;
-
-  /* MATLAB Function: '<S30>/MATLAB Function' */
-  SOC_MATLABFunction(rtb_Add1_h, &rtb_Add_l);
-
-  /* SignalConversion generated from: '<S30>/Math Function1' incorporates:
-   *  Constant: '<S30>/Constant'
-   */
-  rtb_TmpSignalConversionAtProduc[0] = rtb_Add_l;
-  rtb_TmpSignalConversionAtProduc[1] = 1.0;
-
-  /* SignalConversion generated from: '<S30>/Matrix Concatenate' */
-  rtb_P_Delay[0] = 1.0;
-  rtb_P_Delay[1] = 0.0;
-
-  /* DataTypeConversion: '<S29>/Data Type Conversion' incorporates:
-   *  UnitDelay: '<S6>/socd_pct_bcuSoc0_Delay'
-   */
-  tmp_1 = fmod(floor(rtb_Add1_h / 0.1), 65536.0);
-  rtb_socd_pct_bcuSoc0_Delay = (uint16_T)(tmp_1 < 0.0 ? (int32_T)(uint16_T)
-    -(int16_T)(uint16_T)-tmp_1 : (int32_T)(uint16_T)tmp_1);
-
-  /* Gain: '<S29>/Gain1' incorporates:
-   *  DataTypeConversion: '<S29>/Data Type Conversion3'
-   *  Lookup_n-D: '<S29>/1-D Lookup Table4'
-   *  UnitDelay: '<S6>/socd_pct_bcuSoc0_Delay'
-   */
-  rtb_Gain1_m = (real_T)look1_iu16lu16n16tu16_binlcase
-    (rtb_socd_pct_bcuSoc0_Delay, (&(cmnm_pct_soc[0])), (&(cmnm_R_polar[0])), 12U)
-    * 0.001 * 0.001;
-
-  /* Math: '<S30>/Math Function' incorporates:
-   *  Constant: '<S30>/Constant1'
-   *  DataTypeConversion: '<S29>/Data Type Conversion4'
-   *  Gain: '<S29>/Gain5'
-   *  Lookup_n-D: '<S29>/1-D Lookup Table5'
-   *  Product: '<S29>/Divide1'
-   *  Product: '<S30>/Divide1'
-   *  UnitDelay: '<S6>/socd_pct_bcuSoc0_Delay'
-   *
-   * About '<S30>/Math Function':
-   *  Operator: exp
-   */
-  rtb_Abs = exp(-0.1 / ((real_T)look1_iu16lu16n16tu16_binlcase
-                        (rtb_socd_pct_bcuSoc0_Delay, (&(cmnm_pct_soc[0])),
-    (&(cmnm_F_polar[0])), 12U) * 0.001 * 1000.0 * rtb_Gain1_m));
-
-  /* SignalConversion generated from: '<S30>/Matrix Concatenate' incorporates:
-   *  Constant: '<S30>/Constant3'
-   */
-  rtb_P_Delay[2] = 0.0;
-  rtb_P_Delay[3] = rtb_Abs;
-
-  /* Product: '<S25>/Product' incorporates:
-   *  Math: '<S25>/Math Function1'
-   *  SignalConversion generated from: '<S30>/Matrix Concatenate'
-   *  UnitDelay: '<S13>/P_Delay'
-   */
-  for (i = 0; i < 2; i++) {
-    tmp[i] = 0.0;
-    tmp[i] += SOC_DW.P_Delay_DSTATE_m[i];
-    tmp[i + 2] = 0.0;
-    tmp[i + 2] += SOC_DW.P_Delay_DSTATE_m[i + 2] * rtb_Abs;
-  }
-
-  /* Product: '<S26>/Product1' */
-  rtb_TmpSignalConversionAtProd_0 = 0.0;
-  for (i = 0; i < 2; i++) {
-    /* Sum: '<S25>/Add' incorporates:
-     *  Concatenate: '<S30>/Matrix Concatenate'
-     *  Constant: '<S13>/Constant'
-     *  Product: '<S25>/Product'
-     */
-    tmp_1 = rtb_P_Delay[i + 2];
-    P_Delay_DSTATE_tmp_0 = tmp_1 * tmp[1] + rtb_P_Delay[i] * tmp[0];
-    rtb_MatrixConcatenate[i] = P_Delay_DSTATE_tmp_0 + 0.001;
-
-    /* Product: '<S26>/Product1' incorporates:
-     *  Constant: '<S13>/Constant'
-     *  SignalConversion generated from: '<S30>/Math Function1'
-     *  Sum: '<S25>/Add'
-     */
-    rtb_Add1_h = (P_Delay_DSTATE_tmp_0 + 0.001) * rtb_Add_l;
-
-    /* Sum: '<S25>/Add' incorporates:
-     *  Concatenate: '<S30>/Matrix Concatenate'
-     *  Constant: '<S13>/Constant'
-     *  Product: '<S25>/Product'
-     */
-    P_Delay_DSTATE_tmp_0 = tmp_1 * tmp[3] + rtb_P_Delay[i] * tmp[2];
-    rtb_MatrixConcatenate[i + 2] = P_Delay_DSTATE_tmp_0 + 0.001;
-    rtb_Add1_h += P_Delay_DSTATE_tmp_0 + 0.001;
-
-    /* Product: '<S26>/Product1' incorporates:
-     *  Product: '<S26>/Product'
-     *  SignalConversion generated from: '<S19>/Product2'
-     */
-    rtb_TmpSignalConversionAtProd_0 += rtb_TmpSignalConversionAtProduc[i] *
-      rtb_Add1_h;
-    rtb_Product2_i[i] = rtb_Add1_h;
-  }
-
-  /* Product: '<S26>/Divide' incorporates:
-   *  Constant: '<S13>/Constant1'
-   *  Product: '<S19>/Product2'
-   *  Product: '<S26>/Product'
-   *  Product: '<S26>/Product1'
-   *  Sum: '<S26>/Add'
-   */
-  rtb_Product2_i[0] /= rtb_TmpSignalConversionAtProd_0 + 0.5;
-  rtb_Add1_h = rtb_Product2_i[1] / (rtb_TmpSignalConversionAtProd_0 + 0.5);
-
-  /* Sum: '<S24>/Add' incorporates:
-   *  Product: '<S19>/Product2'
-   *  Product: '<S24>/Product1'
-   *  SignalConversion generated from: '<S30>/Math Function1'
-   */
-  tmp[0] = 1.0 - rtb_Product2_i[0] * rtb_Add_l;
-  tmp[1] = 0.0 - rtb_Add1_h * rtb_Add_l;
-  tmp[2] = 0.0 - rtb_Product2_i[0];
-  tmp[3] = 1.0 - rtb_Add1_h;
-
-  /* Switch: '<S23>/Switch1' incorporates:
-   *  UnitDelay: '<S23>/Frist'
-   */
-  if (SOC_DW.Frist_DSTATE_h) {
-    /* SignalConversion generated from: '<S28>/Product1' incorporates:
-     *  Constant: '<S23>/Up'
-     */
-    SOC_DW.Up_Delay_DSTATE = 0.0;
-  }
-
-  /* End of Switch: '<S23>/Switch1' */
-
-  /* Product: '<S28>/Product2' incorporates:
-   *  Constant: '<S30>/Constant4'
-   *  Constant: '<S30>/Constant5'
-   *  Gain: '<S30>/Gain'
-   *  Product: '<S19>/Product2'
-   *  Product: '<S30>/Divide2'
-   *  Product: '<S30>/Product'
-   *  Sum: '<S30>/Add'
-   */
-  tmp_1 = 0.1 / rtb_Divide_d * 0.027777777777777776 * rtb_Add1_tmp_tmp;
-  tmp_0[0] = tmp_1;
-  tmp_0[1] = (1.0 - rtb_Abs) * rtb_Gain1_m * rtb_Add1_tmp_tmp;
-  for (i = 0; i < 2; i++) {
-    /* Product: '<S24>/Product' incorporates:
-     *  Sum: '<S25>/Add'
-     *  UnitDelay: '<S13>/P_Delay'
-     */
-    SOC_DW.P_Delay_DSTATE_m[i] = 0.0;
-    SOC_DW.P_Delay_DSTATE_m[i] += tmp[i] * rtb_MatrixConcatenate[0];
-    rtb_Add_l = tmp[i + 2];
-    SOC_DW.P_Delay_DSTATE_m[i] += rtb_Add_l * rtb_MatrixConcatenate[1];
-    SOC_DW.P_Delay_DSTATE_m[i + 2] = 0.0;
-    SOC_DW.P_Delay_DSTATE_m[i + 2] += tmp[i] * rtb_MatrixConcatenate[2];
-    SOC_DW.P_Delay_DSTATE_m[i + 2] += rtb_Add_l * rtb_MatrixConcatenate[3];
-
-    /* Sum: '<S28>/Add1' incorporates:
-     *  Concatenate: '<S30>/Matrix Concatenate'
-     *  Product: '<S28>/Product1'
-     *  SignalConversion generated from: '<S28>/Product1'
-     */
-    rtb_TmpSignalConversionAtProduc[i] = (rtb_P_Delay[i + 2] *
-      SOC_DW.Up_Delay_DSTATE + rtb_P_Delay[i] * SOC_DW.SOCk_Delay_DSTATE_e) +
-      tmp_0[i];
-  }
-
-  /* Lookup_n-D: '<S29>/1-D Lookup Table2' incorporates:
-   *  UnitDelay: '<S32>/socd_flg_EEsave_Delay'
-   *  UnitDelay: '<S6>/socd_pct_bcuSoc0_Delay'
-   */
-  rtb_Merge = look1_iu16lu16n16tu16_binlcase(rtb_socd_pct_bcuSoc0_Delay,
-    (&(cmnm_pct_soc[0])), (&(cmnm_V_ocv[0])), 12U);
-
-  /* Lookup_n-D: '<S29>/1-D Lookup Table3' incorporates:
-   *  UnitDelay: '<S6>/socd_pct_bcuSoc0_Delay'
-   */
-  rtb_socd_pct_bcuSoc0_Delay = look1_iu16lu16n16tu16_binlcase
-    (rtb_socd_pct_bcuSoc0_Delay, (&(cmnm_pct_soc[0])), (&(cmnm_R_ohm[0])), 12U);
-
-  /* Sum: '<S27>/Add1' incorporates:
-   *  DataTypeConversion: '<S29>/Data Type Conversion1'
-   *  DataTypeConversion: '<S29>/Data Type Conversion2'
-   *  Gain: '<S29>/Gain2'
-   *  Inport: '<Root>/sfmd_V_cellUMax'
-   *  Product: '<S28>/Product'
-   *  Sum: '<S13>/Add'
-   *  Sum: '<S28>/Add'
-   *  UnitDelay: '<S32>/socd_flg_EEsave_Delay'
-   *  UnitDelay: '<S6>/socd_pct_bcuSoc0_Delay'
-   */
-  rtb_Add_l = (real_T)sfmd_V_cellUMax * 0.001 - (((real_T)
-    rtb_socd_pct_bcuSoc0_Delay * 0.001 * 0.001 * rtb_Add1_tmp_tmp + (real_T)
-    rtb_Merge * 0.001) + rtb_TmpSignalConversionAtProduc[1]);
-
-  /* Sum: '<S27>/Add' incorporates:
-   *  Product: '<S19>/Product2'
-   *  Product: '<S27>/Product'
-   *  Sum: '<S27>/Add1'
-   */
-  rtb_Product2_i[0] = rtb_Product2_i[0] * rtb_Add_l +
-    rtb_TmpSignalConversionAtProduc[0];
-
-  /* Switch: '<S14>/Switch1' incorporates:
-   *  Constant: '<S14>/Up'
-   *  UnitDelay: '<S14>/Frist'
-   */
-  if (SOC_DW.Frist_DSTATE) {
-    SOC_DW.Up_Delay_DSTATE_h = 0.0;
-  }
-
-  /* End of Switch: '<S14>/Switch1' */
-
-  /* DataTypeConversion: '<S20>/Data Type Conversion1' incorporates:
-   *  Lookup_n-D: '<S20>/1-D Lookup Table2'
-   *  Lookup_n-D: '<S20>/1-D Lookup Table3'
-   */
-  OCV = (real_T)look1_iu16lu16n16tu16_binlcase(rtb_uDLookupTable3,
-    (&(cmnm_pct_soc[0])), (&(cmnm_V_ocv[0])), 12U) * 0.001;
-
-  /* Lookup_n-D: '<S20>/1-D Lookup Table3' */
-  rtb_uDLookupTable3 = look1_iu16lu16n16tu16_binlcase(rtb_uDLookupTable3,
-    (&(cmnm_pct_soc[0])), (&(cmnm_R_ohm[0])), 12U);
-
-  /* Sum: '<S19>/Add1' incorporates:
-   *  Constant: '<S21>/Constant5'
-   *  Product: '<S19>/Product1'
-   *  Product: '<S19>/Product2'
-   *  Product: '<S21>/Product'
-   *  SignalConversion generated from: '<S21>/Matrix Concatenate'
-   *  Sum: '<S21>/Add'
-   */
-  rtb_Add1 = (1.0 - rtb_MathFunction) * rtb_Add1 * rtb_Add1_tmp_tmp +
-    rtb_MathFunction * SOC_DW.Up_Delay_DSTATE_h;
-
-  /* Sum: '<S18>/Add1' incorporates:
-   *  DataTypeConversion: '<S20>/Data Type Conversion2'
-   *  Gain: '<S20>/Gain2'
-   *  Inport: '<Root>/sfmd_V_cellUMin'
-   *  Lookup_n-D: '<S20>/1-D Lookup Table3'
-   *  Product: '<S19>/Product'
-   *  Sum: '<S12>/Add'
-   *  Sum: '<S19>/Add'
-   *  Sum: '<S19>/Add1'
-   */
-  deltaU = (real_T)sfmd_V_cellUMin * 0.001 - (((real_T)rtb_uDLookupTable3 *
-    0.001 * 0.001 * rtb_Add1_tmp_tmp + OCV) + rtb_Add1);
-
-  /* Sum: '<S18>/Add' incorporates:
-   *  Product: '<S17>/Divide'
-   *  Product: '<S18>/Product'
-   *  SignalConversion generated from: '<S19>/Product1'
-   *  Sum: '<S18>/Add1'
-   *  Sum: '<S19>/Add1'
-   */
-  rtb_TmpSignalConversionAtProduc[0] = (tmp_1 + SOC_DW.SOCk_Delay_DSTATE) +
-    rtb_Divide[0] * deltaU;
-
-  /* Sum: '<S19>/Add' incorporates:
-   *  Saturate: '<S12>/Saturation'
-   *  Saturate: '<S13>/Saturation'
-   */
-  SOC_DW.SOCk_Delay_DSTATE_e = (real_T)socc_pct_battSocLow * 0.1;
-
-  /* Saturate: '<S12>/Saturation' incorporates:
-   *  Saturate: '<S13>/Saturation'
-   */
-  rtb_Add1_tmp_tmp = (real_T)socc_pct_battSocUp * 0.1;
-  if (rtb_TmpSignalConversionAtProduc[0] > rtb_Add1_tmp_tmp) {
-    /* Switch: '<S14>/Switch' */
-    SOC_DW.SOCk_Delay_DSTATE = rtb_Add1_tmp_tmp;
-  } else if (rtb_TmpSignalConversionAtProduc[0] < SOC_DW.SOCk_Delay_DSTATE_e) {
-    /* Switch: '<S14>/Switch' */
-    SOC_DW.SOCk_Delay_DSTATE = SOC_DW.SOCk_Delay_DSTATE_e;
-  } else {
-    /* Switch: '<S14>/Switch' */
-    SOC_DW.SOCk_Delay_DSTATE = rtb_TmpSignalConversionAtProduc[0];
-  }
-
-  /* DataTypeConversion: '<S3>/Data Type Conversion' incorporates:
-   *  UnitDelay: '<S12>/SOCk_Delay'
-   */
-  rtb_MathFunction = SOC_DW.SOCk_Delay_DSTATE / 0.1;
-  tmp_1 = fabs(rtb_MathFunction);
-  if (tmp_1 < 4.503599627370496E+15) {
-    if (tmp_1 >= 0.5) {
-      rtb_MathFunction = floor(rtb_MathFunction + 0.5);
-    } else {
-      rtb_MathFunction = 0.0;
+	//printf("1----  battSocEi:%d,bcuSocEi:%d,battSocEE:%d,bcuSocEE:%d\n",socd_pct_battSocEi,socd_pct_bcuSocEi,socn_pct_battSocEE,socn_pct_bcuSocEE);
+    //======================================================================
+    ////////////////////////EKFSOC//////////////////////////////////////////
+    //======================================================================
+    battcurr = (real_T)sfmd_I_curr * 0.1;
+    Q =        (real_T) socn_Q_cap * 0.1;
+	
+    //-------------------------EKFmin---------------------------------------
+    if (FirstRun_SOC)
+    {
+        soc_Min_Delay = (real_T)socn_pct_battSocEE * 0.1;
+        Up_Min_Delay  = 0;
+        P_Min_Delay[0]=1000;
+		P_Min_Delay[1]=0;
+		P_Min_Delay[2]=0;
+		P_Min_Delay[3]=1000;
     }
-  }
-
-  tmp_1 = fmod(rtb_MathFunction, 65536.0);
-  rtb_uDLookupTable3 = (uint16_T)(tmp_1 < 0.0 ? (int32_T)(uint16_T)-(int16_T)
-    (uint16_T)-tmp_1 : (int32_T)(uint16_T)tmp_1);
-
-  /* End of DataTypeConversion: '<S3>/Data Type Conversion' */
-
-  /* Saturate: '<S13>/Saturation' */
-  if (rtb_Product2_i[0] > rtb_Add1_tmp_tmp) {
-    /* Sum: '<S19>/Add' */
-    SOC_DW.SOCk_Delay_DSTATE_e = rtb_Add1_tmp_tmp;
-  } else {
-    if (rtb_Product2_i[0] >= SOC_DW.SOCk_Delay_DSTATE_e) {
-      /* Sum: '<S19>/Add' */
-      SOC_DW.SOCk_Delay_DSTATE_e = rtb_Product2_i[0];
+    //参数查表
+    ocv = (real_T)look1_iu16lu16n16tu16_binlcase((uint16_T)(soc_Min_Delay * 10),(&(cmnm_pct_soc[0])), (&(cmnm_V_ocv[0])), 12U) * 0.001;
+    Ro  = (real_T)look1_iu16lu16n16tu16_binlcase((uint16_T)(soc_Min_Delay * 10),(&(cmnm_pct_soc[0])), (&(cmnm_R_ohm[0])),  12U) * 0.001 * 0.001;
+    Rp  = (real_T)look1_iu16lu16n16tu16_binlcase((uint16_T)(soc_Min_Delay * 10),(&(cmnm_pct_soc[0])), (&(cmnm_R_polar[0])), 12U) * 0.001 * 0.001;
+    C   = (real_T)look1_iu16lu16n16tu16_binlcase((uint16_T)(soc_Min_Delay * 10),(&(cmnm_pct_soc[0])), (&(cmnm_F_polar[0])), 12U) * 0.001 * 1000;
+    A[0] = 1;
+    A[1] = 0;
+    A[2] = 0;
+    A[3] = exp(-0.1/( Rp * C));
+	
+    B[0] = 0.1/Q/3600 * 100;
+    B[1] = Rp * (1- exp(-0.1/(Rp * C)));
+	
+    docvmath(soc_Min_Delay ,&docv);
+    H[0] = docv;
+    H[1] = 1;
+	
+    //先验
+    soc1 = soc_Min_Delay * A[0] + B[0] * battcurr;
+    Up1  = Up_Min_Delay  * A[3] + B[1] * battcurr;
+    UL= ocv + battcurr * Ro + Up1;
+    P1[0] = P_Min_Delay[0] + 0.002;
+    P1[1] = P_Min_Delay[1] * A[3] +0.002;
+    P1[2] = P_Min_Delay[2] * A[3] +0.002;
+    P1[3] = P_Min_Delay[3] * A[3] * A[3] +0.002;
+	
+    //增益
+    K[0] = (P1[0] * H[0] + P1[2])/( H[0] * P1[0] * H[0] + P1[1] * H[0] + H[0] * P1[2] + P1[3] +0.5 );
+    K[1] = (P1[1] * H[0] + P1[3])/( H[0] * P1[0] * H[0] + P1[1] * H[0] + H[0] * P1[2] + P1[3] +0.5 );
+	
+    //后验
+    deltU  = (real_T)sfmd_V_cellUMin * 0.001 - UL;
+    soc_Min_Delay = soc1 + K[0] * deltU;
+    if (soc_Min_Delay < (real_T)socc_pct_battSocLow * 0.1)
+    {
+        soc_Min_Delay=  (real_T)socc_pct_battSocLow * 0.1;
     }
-  }
-
-  /* DataTypeConversion: '<S3>/Data Type Conversion1' incorporates:
-   *  UnitDelay: '<S13>/SOCk_Delay'
-   */
-  rtb_MathFunction = SOC_DW.SOCk_Delay_DSTATE_e / 0.1;
-  tmp_1 = fabs(rtb_MathFunction);
-  if (tmp_1 < 4.503599627370496E+15) {
-    if (tmp_1 >= 0.5) {
-      rtb_MathFunction = floor(rtb_MathFunction + 0.5);
-    } else {
-      rtb_MathFunction = 0.0;
+    if (soc_Min_Delay > (real_T)socc_pct_battSocUp * 0.1)
+    {
+        soc_Min_Delay=  (real_T)socc_pct_battSocUp * 0.1;
     }
-  }
-
-  tmp_1 = fmod(rtb_MathFunction, 65536.0);
-  rtb_socd_pct_bcuSoc0_Delay = (uint16_T)(tmp_1 < 0.0 ? (int32_T)(uint16_T)
-    -(int16_T)(uint16_T)-tmp_1 : (int32_T)(uint16_T)tmp_1);
-
-  /* End of DataTypeConversion: '<S3>/Data Type Conversion1' */
-
-  /* Switch: '<S11>/Switch' incorporates:
-   *  Constant: '<S11>/Constant6'
-   *  DataTypeConversion: '<S3>/Data Type Conversion'
-   *  DataTypeConversion: '<S3>/Data Type Conversion1'
-   *  RelationalOperator: '<S11>/Relational Operator'
-   *  RelationalOperator: '<S11>/Relational Operator1'
-   *  Switch: '<S11>/Switch1'
-   *  UnitDelay: '<S32>/socd_flg_EEsave_Delay'
-   */
-  if (rtb_socd_pct_bcuSoc0_Delay >= 800) {
-    rtb_Merge = 100U;
-  } else if (200 >= rtb_uDLookupTable3) {
-    /* UnitDelay: '<S32>/socd_flg_EEsave_Delay' incorporates:
-     *  Constant: '<S11>/Constant8'
-     *  Switch: '<S11>/Switch1'
-     */
-    rtb_Merge = 0U;
-  } else {
-    /* Product: '<S11>/Divide' incorporates:
-     *  Constant: '<S11>/Constant1'
-     *  Constant: '<S11>/Constant2'
-     *  Constant: '<S11>/Constant3'
-     *  DataTypeConversion: '<S3>/Data Type Conversion'
-     *  Sum: '<S11>/Add2'
-     *  Sum: '<S11>/Add3'
-     *  Sum: '<S11>/Add4'
-     *  Sum: '<S11>/Add5'
-     *  Switch: '<S11>/Switch1'
-     */
-    i = (uint16_T)((uint16_T)(800 - (uint16_T)(rtb_socd_pct_bcuSoc0_Delay -
-      rtb_uDLookupTable3)) - 200);
-    rtb_Merge = (uint16_T)(((uint16_T)((uint32_T)i == 0U ? MAX_uint32_T :
-      ((uint32_T)(rtb_uDLookupTable3 - 200) << 6) / i) * 25U) >> 4);
-
-    /* MinMax: '<S11>/Max' incorporates:
-     *  Product: '<S11>/Divide'
-     *  Switch: '<S11>/Switch1'
-     */
-    if (rtb_Merge <= 0) {
-      /* UnitDelay: '<S32>/socd_flg_EEsave_Delay' incorporates:
-       *  Constant: '<S11>/Constant4'
-       */
-      rtb_Merge = 0U;
+	
+    Up_Min_Delay  = Up1 + K[1] * deltU;
+    //Up_Min_Delay  = (Up_Min_Delay > 0 ? Up_Min_Delay : 0);
+	
+    //P更新
+    P_Min_Delay[0] = (1 - K[0] * H[0]) * P1[0] -K[0]* P1[1];
+    P_Min_Delay[1] = -K[1] * H[0] * P1[0] + P1[1] * (1 - K[1]);
+    P_Min_Delay[2] = (1 - K[0] * H[0]) * P1[2] -K[0]* P1[3];
+    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]);
+    //------------------------EKFSOCmax-----------------------------------
+    
+    if (FirstRun_SOC)
+    {
+        soc_Max_Delay = (real_T)socn_pct_battSocEE * 0.1;
+        Up_Max_Delay  = 0;
+        P_Max_Delay[0]=1000;
+		P_Max_Delay[1]=0;
+		P_Max_Delay[2]=0;
+		P_Max_Delay[3]=1000;
     }
-
-    /* End of MinMax: '<S11>/Max' */
-  }
-
-  /* End of Switch: '<S11>/Switch' */
-
-  /* Sum: '<S11>/Add' incorporates:
-   *  Constant: '<S11>/Constant'
-   *  DataTypeConversion: '<S3>/Data Type Conversion'
-   *  DataTypeConversion: '<S3>/Data Type Conversion1'
-   *  Product: '<S11>/Product'
-   *  Product: '<S11>/Product1'
-   *  Sum: '<S11>/Add1'
-   *  UnitDelay: '<S32>/socd_flg_EEsave_Delay'
-   */
-  tmp_2 = mul_u32_hiSR_near((uint32_T)(uint16_T)(100 - rtb_Merge) *
-    rtb_uDLookupTable3, 2748779069U, 1U) + mul_u32_hiSR_near((uint32_T)
-    rtb_socd_pct_bcuSoc0_Delay * rtb_Merge, 2748779069U, 1U);
-
-  /* Sum: '<S11>/Add' */
-  socd_pct_ekfSoc = (uint16_T)(((tmp_2 & 16U) != 0U) + (tmp_2 >> 5));
-
-  /* Sum: '<S4>/Add' incorporates:
-   *  Inport: '<Root>/sfmd_I_curr'
-   *  UnitDelay: '<S4>/  '
-   */
-  SOC_DW._DSTATE += sfmd_I_curr;
-
-  /* Sum: '<S4>/Add1' incorporates:
-   *  Constant: '<S4>/Constant1'
-   *  Product: '<S4>/Divide'
-   *  Product: '<S4>/Divide1'
-   *  Product: '<S4>/Divide2'
-   *  Product: '<S5>/Divide'
-   *  Sum: '<S4>/Add'
-   *  Switch: '<S5>/Switch'
-   *  UnitDelay: '<S4>/  '
-   */
-  rtb_Add1_a = (int16_T)((int16_T)(((((int16_T)((div_repeat_s16s32_floor
-    (div_nde_s32_floor(SOC_DW._DSTATE, 36000), SOC_B.Divide, 9U) * 125) >> 6) *
-    25) >> 5) * 5243) >> 12) + SOC_B.Switch);
-
-  /* Outputs for Atomic SubSystem: '<S7>/Time++' */
-  /* Sum: '<S49>/Add' incorporates:
-   *  Constant: '<S49>/Constant'
-   *  UnitDelay: '<S49>/Time_reset'
-   */
-  SOC_DW.Time_reset_DSTATE++;
-
-  /* End of Outputs for SubSystem: '<S7>/Time++' */
-
-  /* If: '<S7>/If' incorporates:
-   *  Inport: '<Root>/ihd_st_workStat'
-   *  Inport: '<S48>/socn_pct_socekf'
-   *  Inport: '<S56>/in'
-   *  Inport: '<S60>/in'
-   *  Merge: '<S7>/Merge'
-   *  Sum: '<S11>/Add'
-   *  Sum: '<S4>/Add1'
-   *  UnitDelay: '<S49>/Time_reset'
-   */
-  rtPrevAction = SOC_DW.If_ActiveSubsystem;
-  if ((ihd_st_workStat == 2) && (SOC_DW.Time_reset_DSTATE >= 20)) {
-    SOC_DW.If_ActiveSubsystem = 0;
-  } else if ((ihd_st_workStat != 2) && (SOC_DW.Time_reset_DSTATE >= 20)) {
-    SOC_DW.If_ActiveSubsystem = 1;
-  } else {
-    SOC_DW.If_ActiveSubsystem = 2;
-  }
-
-  switch (SOC_DW.If_ActiveSubsystem) {
-   case 0:
-    if (SOC_DW.If_ActiveSubsystem != rtPrevAction) {
-      /* InitializeConditions for IfAction SubSystem: '<S7>/chrgCCV' incorporates:
-       *  ActionPort: '<S50>/Action Port'
-       */
-      /* InitializeConditions for If: '<S7>/If' incorporates:
-       *  UnitDelay: '<S50>/fulFLg_reset'
-       *  UnitDelay: '<S50>/overFlg_reset'
-       *  UnitDelay: '<S57>/socn_pct_estsoc_Delay'
-       *  UnitDelay: '<S58>/Time_Delay'
-       *  UnitDelay: '<S59>/Time_Delay'
-       */
-      SOC_DW.Time_Delay_DSTATE_g = 1U;
-      SOC_DW.overFlg_reset_DSTATE = false;
-      SOC_DW.socn_pct_estsoc_Delay_DSTATE = 10U;
-      SOC_DW.Time_Delay_DSTATE_f = 1U;
-      SOC_DW.fulFLg_reset_DSTATE = false;
-
-      /* End of InitializeConditions for SubSystem: '<S7>/chrgCCV' */
+    // 参数查表
+    ocv = (real_T)look1_iu16lu16n16tu16_binlcase((uint16_T)(soc_Max_Delay * 10),(&(cmnm_pct_soc[0])), (&(cmnm_V_ocv[0])), 12U) * 0.001;
+    Ro  = (real_T)look1_iu16lu16n16tu16_binlcase((uint16_T)(soc_Max_Delay * 10),(&(cmnm_pct_soc[0])), (&(cmnm_R_ohm[0])),  12U) * 0.001 * 0.001;
+    Rp  = (real_T)look1_iu16lu16n16tu16_binlcase((uint16_T)(soc_Max_Delay * 10),(&(cmnm_pct_soc[0])), (&(cmnm_R_polar[0])), 12U) * 0.001 * 0.001;
+    C   = (real_T)look1_iu16lu16n16tu16_binlcase((uint16_T)(soc_Max_Delay * 10),(&(cmnm_pct_soc[0])), (&(cmnm_F_polar[0])), 12U) * 0.001 * 1000;
+    A[0] = 1;
+    A[1] = 0;
+    A[2] = 0;
+    A[3] = exp(-0.1/( Rp * C));
+	
+    B[0] = 0.1/Q/3600 * 100;
+    B[1] = Rp * (1- exp(-0.1/(Rp * C)));
+	
+    docvmath(soc_Max_Delay ,&docv);
+    H[0] = docv;
+    H[1] = 1;
+	
+    //先验
+    soc1 = soc_Max_Delay * A[0] + B[0] * battcurr;
+    Up1  = Up_Max_Delay  * A[3] + B[1] * battcurr;
+    UL= ocv + battcurr * Ro + Up1;
+    P1[0] = P_Max_Delay[0] + 0.002;
+    P1[1] = P_Max_Delay[1] * A[3] +0.002;
+    P1[2] = P_Max_Delay[2] * A[3] +0.002;
+    P1[3] = P_Max_Delay[3] * A[3] * A[3] +0.002;
+	
+    //增益
+    K[0] = (P1[0] * H[0] + P1[2])/( H[0] * P1[0] * H[0] + P1[1] * H[0] + H[0] * P1[2] + P1[3] +0.5 );
+    K[1] = (P1[1] * H[0] + P1[3])/( H[0] * P1[0] * H[0] + P1[1] * H[0] + H[0] * P1[2] + P1[3] +0.5 );
+	
+    //后验
+    deltU  = (real_T)sfmd_V_cellUMax * 0.001 - UL;
+    soc_Max_Delay = soc1 + K[0] * deltU;
+    if (soc_Max_Delay <(real_T)socc_pct_battSocLow * 0.1)
+    {
+        soc_Max_Delay=  (real_T)socc_pct_battSocLow * 0.1;
     }
-
-    /* Outputs for IfAction SubSystem: '<S7>/chrgCCV' incorporates:
-     *  ActionPort: '<S50>/Action Port'
-     */
-    /* Saturate: '<S59>/Saturation' incorporates:
-     *  Constant: '<S59>/Constant'
-     *  Sum: '<S59>/Add'
-     *  UnitDelay: '<S59>/Time_Delay'
-     */
-    if ((uint16_T)(SOC_DW.Time_Delay_DSTATE_g + 1U) < 60000) {
-      rtb_Merge = (uint16_T)(SOC_DW.Time_Delay_DSTATE_g + 1U);
-    } else {
-      rtb_Merge = 60000U;
+    if (soc_Max_Delay > (real_T)socc_pct_battSocUp * 0.1)
+    {
+        soc_Max_Delay=  (real_T)socc_pct_battSocUp * 0.1;
     }
-
-    /* End of Saturate: '<S59>/Saturation' */
-
-    /* Product: '<S59>/Product' incorporates:
-     *  Inport: '<Root>/sfmd_I_curr'
-     *  Inport: '<Root>/sfmd_V_cellUMax'
-     *  Lookup_n-D: '<S50>/1-D Lookup Table'
-     *  RelationalOperator: '<S50>/Relational Operator'
-     *  UnitDelay: '<S59>/Time_Delay'
-     */
-    SOC_DW.Time_Delay_DSTATE_g = (uint16_T)(sfmd_V_cellUMax >=
-      look1_is16lu16n16tu16_binlcase(sfmd_I_curr, (&(socm_I_chrgCor[0])),
-      (&(socm_V_chrgCor[0])), 3U) ? (int32_T)rtb_Merge : 0);
-
-    /* Logic: '<S50>/Logical Operator1' incorporates:
-     *  Constant: '<S59>/para'
-     *  RelationalOperator: '<S59>/Relational Operator1'
-     *  UnitDelay: '<S50>/overFlg_reset'
-     */
-    rtb_LogicalOperator1_j = ((rtb_Merge > 20) || SOC_DW.overFlg_reset_DSTATE);
-
-    /* Outputs for Triggered SubSystem: '<S50>/Subsystem2' incorporates:
-     *  TriggerPort: '<S56>/Trigger'
-     */
-    if (rtb_LogicalOperator1_j && (SOC_PrevZCX.Subsystem2_Trig_ZCE_k != 1)) {
-      SOC_B.in_c = rtb_Add1_a;
+    Up_Max_Delay  = Up1 + K[1] * deltU;
+    //Up_Max_Delay  = (Up_Max_Delay > 0 ? Up_Max_Delay : 0);
+	
+    //P更新
+    P_Max_Delay[0] = (1 - K[0] * H[0]) * P1[0] -K[0]* P1[1];
+    P_Max_Delay[1] = -K[1] * H[0] * P1[0] + P1[1] * (1 - K[1]);
+    P_Max_Delay[2] = (1 - K[0] * H[0]) * P1[2] -K[0]* P1[3];
+    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);
+	//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;
+    if(EKFSOCMax > 800)
+    {
+        factor=100;
     }
-
-    SOC_PrevZCX.Subsystem2_Trig_ZCE_k = rtb_LogicalOperator1_j;
-
-    /* End of Outputs for SubSystem: '<S50>/Subsystem2' */
-
-    /* Switch: '<S50>/Switch' incorporates:
-     *  Constant: '<S50>/Constant'
-     *  Inport: '<S56>/in'
-     *  Saturate: '<S50>/Saturation'
-     *  Sum: '<S11>/Add'
-     *  Sum: '<S4>/Add1'
-     *  Sum: '<S50>/Add1'
-     *  Sum: '<S50>/Add2'
-     */
-    if (rtb_LogicalOperator1_j) {
-      rtb_Merge = (uint16_T)((int16_T)(rtb_Add1_a - SOC_B.in_c) + 950);
-    } else if (socd_pct_ekfSoc < 950) {
-      /* Saturate: '<S50>/Saturation' incorporates:
-       *  Sum: '<S11>/Add'
-       */
-      rtb_Merge = socd_pct_ekfSoc;
-    } else {
-      rtb_Merge = 950U;
+    else if(EKFSOCMin<200)
+    {
+        factor=0;
     }
-
-    /* End of Switch: '<S50>/Switch' */
-
-    /* Sum: '<S57>/Add4' incorporates:
-     *  Saturate: '<S57>/Saturation'
-     *  UnitDelay: '<S57>/socn_pct_estsoc_Delay'
-     */
-    rtb_Saturation_k = (int16_T)(rtb_Merge - SOC_DW.socn_pct_estsoc_Delay_DSTATE);
-
-    /* Saturate: '<S57>/Saturation' */
-    if (rtb_Saturation_k > 1000) {
-      rtb_Saturation_k = 1000;
-    } else {
-      if (rtb_Saturation_k < 0) {
-        rtb_Saturation_k = 0;
-      }
+    else
+    {
+        factor=(uint16_T)(((uint16_T)((  (uint32_T)  (EKFSOCMin - 200)  << 6) / (800 - (EKFSOCMax-EKFSOCMin) - 200)) * 25U) >> 4);
     }
-
-    /* End of Saturate: '<S57>/Saturation' */
-
-    /* Sum: '<S57>/Add3' incorporates:
-     *  Saturate: '<S57>/Saturation'
-     *  UnitDelay: '<S57>/socn_pct_estsoc_Delay'
-     */
-    SOC_DW.socn_pct_estsoc_Delay_DSTATE += rtb_Saturation_k;
-
-    /* Saturate: '<S58>/Saturation' incorporates:
-     *  Constant: '<S58>/Constant'
-     *  Sum: '<S58>/Add'
-     *  UnitDelay: '<S58>/Time_Delay'
-     */
-    if ((uint16_T)(SOC_DW.Time_Delay_DSTATE_f + 1U) < 60000) {
-      rtb_uDLookupTable3 = (uint16_T)(SOC_DW.Time_Delay_DSTATE_f + 1U);
-    } else {
-      rtb_uDLookupTable3 = 60000U;
+	socd_pct_ekfSoc = (uint16_T)( (  (1 - (real_T)(factor * 0.01)) * (real_T) (EKFSOCMin * 0.1) +  (real_T)(factor * 0.01) * (real_T)( EKFSOCMax * 0.1)  ) * 10); 
+    if (socd_pct_ekfSoc < socc_pct_battSocLow)
+    {
+        socd_pct_ekfSoc=  socc_pct_battSocLow ;
     }
-
-    /* End of Saturate: '<S58>/Saturation' */
-
-    /* UnitDelay: '<S50>/fulFLg_reset' incorporates:
-     *  UnitDelay: '<S50>/overFlg_reset'
-     */
-    SOC_DW.overFlg_reset_DSTATE = SOC_DW.fulFLg_reset_DSTATE;
-
-    /* Logic: '<S50>/Logical Operator' incorporates:
-     *  Constant: '<S58>/para'
-     *  RelationalOperator: '<S58>/Relational Operator1'
-     *  UnitDelay: '<S50>/fulFLg_reset'
-     *  UnitDelay: '<S50>/overFlg_reset'
-     */
-    SOC_DW.fulFLg_reset_DSTATE = ((rtb_uDLookupTable3 > 20) ||
-      SOC_DW.overFlg_reset_DSTATE);
-
-    /* Switch: '<S50>/Switch6' incorporates:
-     *  Constant: '<S50>/Constant14'
-     *  Merge: '<S7>/Merge'
-     *  Saturate: '<S50>/unFul'
-     *  Sum: '<S57>/Add3'
-     *  UnitDelay: '<S50>/fulFLg_reset'
-     *  UnitDelay: '<S57>/socn_pct_estsoc_Delay'
-     */
-    if (SOC_DW.fulFLg_reset_DSTATE) {
-      rtb_Merge = 1000U;
-    } else if (SOC_DW.socn_pct_estsoc_Delay_DSTATE < 999) {
-      /* Saturate: '<S50>/unFul' incorporates:
-       *  Merge: '<S7>/Merge'
-       *  Sum: '<S57>/Add3'
-       *  UnitDelay: '<S57>/socn_pct_estsoc_Delay'
-       */
-      rtb_Merge = SOC_DW.socn_pct_estsoc_Delay_DSTATE;
-    } else {
-      rtb_Merge = 999U;
+    if (socd_pct_ekfSoc > socc_pct_battSocUp)
+    {
+        socd_pct_ekfSoc=  socc_pct_battSocUp ;
     }
 
-    /* End of Switch: '<S50>/Switch6' */
-
-    /* Product: '<S58>/Product' incorporates:
-     *  Constant: '<S50>/Constant1'
-     *  Inport: '<Root>/sfmd_V_cellUMax'
-     *  RelationalOperator: '<S50>/Relational Operator1'
-     *  UnitDelay: '<S58>/Time_Delay'
-     */
-    SOC_DW.Time_Delay_DSTATE_f = (uint16_T)(sfmd_V_cellUMax >= socc_V_chrgFulV ?
-      (int32_T)rtb_uDLookupTable3 : 0);
-
-    /* Update for UnitDelay: '<S50>/overFlg_reset' */
-    SOC_DW.overFlg_reset_DSTATE = rtb_LogicalOperator1_j;
-
-    /* End of Outputs for SubSystem: '<S7>/chrgCCV' */
-    break;
-
-   case 1:
-    if (SOC_DW.If_ActiveSubsystem != rtPrevAction) {
-      /* InitializeConditions for IfAction SubSystem: '<S7>/disChrgCCV' incorporates:
-       *  ActionPort: '<S51>/Action Port'
-       */
-      /* InitializeConditions for If: '<S7>/If' incorporates:
-       *  Logic: '<S51>/Logical Operator'
-       *  UnitDelay: '<S51>/lowFLg_Delay'
-       *  UnitDelay: '<S61>/Time_Delay'
-       */
-      SOC_DW.Time_Delay_DSTATE_e = 1U;
-      SOC_DW.lowFLg_Delay_DSTATE = false;
-
-      /* End of InitializeConditions for SubSystem: '<S7>/disChrgCCV' */
+	//printf("4----factor:%d,socd_pct_ekfSoc:%d,EKFSOCMax:%d,EKFSOCMin:%d,\n",factor,socd_pct_ekfSoc,EKFSOCMax,EKFSOCMin);
+    //======================================================================
+    ////////////////////////AhSOC//////////////////////////////////////////
+    //======================================================================
+    if (FirstRun_SOC)
+    {
+        ahDelay = (real_T)(socn_pct_battSocEE * 0.1);
     }
-
-    /* Outputs for IfAction SubSystem: '<S7>/disChrgCCV' incorporates:
-     *  ActionPort: '<S51>/Action Port'
-     */
-    /* Saturate: '<S61>/Saturation' incorporates:
-     *  Constant: '<S61>/Constant'
-     *  Sum: '<S61>/Add'
-     *  UnitDelay: '<S61>/Time_Delay'
-     */
-    if ((uint16_T)(SOC_DW.Time_Delay_DSTATE_e + 1U) < 60000) {
-      rtb_Merge = (uint16_T)(SOC_DW.Time_Delay_DSTATE_e + 1U);
-    } else {
-      rtb_Merge = 60000U;
+    else
+    {
+          ahDelay = ahDelay +  battcurr / (real_T)(cmnc_Q_ratedCp *0.1) /360.0;
+     }
+    ahSoc =(int16_T)(ahDelay *10);
+    if (ahSoc >= socc_pct_battSocUp)
+    {
+        socd_pct_ahSoc = socc_pct_battSocUp;
     }
-
-    /* End of Saturate: '<S61>/Saturation' */
-
-    /* Product: '<S61>/Product' incorporates:
-     *  Inport: '<Root>/sfmd_I_curr'
-     *  Inport: '<Root>/sfmd_V_cellUMin'
-     *  Lookup_n-D: '<S51>/1-D Lookup Table'
-     *  RelationalOperator: '<S51>/Relational Operator'
-     *  UnitDelay: '<S61>/Time_Delay'
-     */
-    SOC_DW.Time_Delay_DSTATE_e = (uint16_T)(sfmd_V_cellUMin <=
-      look1_is16lu16n16tu16_binlcase(sfmd_I_curr, (&(socm_I_disChrgCor[0])),
-      (&(socm_V_disChrgCor[0])), 2U) ? (int32_T)rtb_Merge : 0);
-
-    /* Logic: '<S51>/Logical Operator' incorporates:
-     *  Constant: '<S61>/para'
-     *  RelationalOperator: '<S61>/Relational Operator1'
-     *  UnitDelay: '<S51>/lowFLg_Delay'
-     */
-    SOC_DW.lowFLg_Delay_DSTATE = ((rtb_Merge > 20) || SOC_DW.lowFLg_Delay_DSTATE);
-
-    /* Outputs for Triggered SubSystem: '<S51>/Subsystem2' incorporates:
-     *  TriggerPort: '<S60>/Trigger'
-     */
-    if (SOC_DW.lowFLg_Delay_DSTATE && (SOC_PrevZCX.Subsystem2_Trig_ZCE != 1)) {
-      SOC_B.in_d = rtb_Add1_a;
+    else if (ahSoc <= socc_pct_battSocLow)
+    {
+        socd_pct_ahSoc = socc_pct_battSocLow;
     }
-
-    SOC_PrevZCX.Subsystem2_Trig_ZCE = SOC_DW.lowFLg_Delay_DSTATE;
-
-    /* End of Outputs for SubSystem: '<S51>/Subsystem2' */
-
-    /* Switch: '<S51>/Switch1' incorporates:
-     *  Inport: '<S60>/in'
-     *  Merge: '<S7>/Merge'
-     *  Saturate: '<S51>/Saturation'
-     *  Sum: '<S11>/Add'
-     *  Sum: '<S4>/Add1'
-     */
-    if (SOC_DW.lowFLg_Delay_DSTATE) {
-      /* Sum: '<S51>/Add2' incorporates:
-       *  Constant: '<S51>/Constant1'
-       *  Sum: '<S51>/Add1'
-       */
-      rtb_Saturation_k = (int16_T)((int16_T)(rtb_Add1_a - SOC_B.in_d) + 50);
-
-      /* Saturate: '<S51>/Saturation1' incorporates:
-       *  Merge: '<S7>/Merge'
-       *  Sum: '<S51>/Add2'
-       */
-      if (rtb_Saturation_k > 0) {
-        rtb_Merge = (uint16_T)rtb_Saturation_k;
-      } else {
-        rtb_Merge = 0U;
-      }
-
-      /* End of Saturate: '<S51>/Saturation1' */
-    } else if (socd_pct_ekfSoc > 1000) {
-      /* Saturate: '<S51>/Saturation' incorporates:
-       *  Merge: '<S7>/Merge'
-       */
-      rtb_Merge = 1000U;
-    } else if (socd_pct_ekfSoc < 50) {
-      /* Saturate: '<S51>/Saturation' incorporates:
-       *  Merge: '<S7>/Merge'
-       */
-      rtb_Merge = 50U;
-    } else {
-      rtb_Merge = socd_pct_ekfSoc;
+    else
+    {
+        socd_pct_ahSoc = (uint16_T)ahSoc;
     }
-
-    /* End of Switch: '<S51>/Switch1' */
-    /* End of Outputs for SubSystem: '<S7>/disChrgCCV' */
-    break;
-
-   default:
-    /* Outputs for IfAction SubSystem: '<S7>/If Action Subsystem2' incorporates:
-     *  ActionPort: '<S48>/Action Port'
-     */
-    rtb_Merge = socd_pct_ekfSoc;
-
-    /* End of Outputs for SubSystem: '<S7>/If Action Subsystem2' */
-    break;
-  }
-
-  /* End of If: '<S7>/If' */
-
-  /* If: '<S7>/If1' incorporates:
-   *  Abs: '<S12>/Abs'
-   *  Abs: '<S13>/Abs'
-   *  Constant: '<S12>/Constant2'
-   *  Constant: '<S13>/Constant2'
-   *  Inport: '<S54>/in'
-   *  Inport: '<S55>/in'
-   *  Logic: '<S3>/Logical Operator'
-   *  Merge: '<S7>/Merge'
-   *  RelationalOperator: '<S12>/Relational Operator'
-   *  RelationalOperator: '<S13>/Relational Operator'
-   *  Sum: '<S4>/Add1'
-   *  UnitDelay: '<S52>/Unit Delay1'
-   *  UnitDelay: '<S53>/Unit Delay1'
-   */
-  if ((fabs(deltaU) > 0.005) || (fabs(rtb_Add_l) > 0.005)) {
-    /* Outputs for IfAction SubSystem: '<S7>/If Action Subsystem' incorporates:
-     *  ActionPort: '<S46>/Action Port'
-     */
-    /* Outputs for Enabled SubSystem: '<S52>/Subsystem3' incorporates:
-     *  EnablePort: '<S54>/Enable'
-     */
-    if (SOC_DW.UnitDelay1_DSTATE) {
-      SOC_B.in_f = rtb_Add1_a;
+	// printf("5----ahDelay:%f,ahSoc:%d,battcurr:%f,sfmd_I_curr:%d\n",ahDelay,ahSoc,battcurr,sfmd_I_curr);
+    //======================================================================
+    ///////////////////////estSOC//////////////////////////////////////////
+    //======================================================================
+    if(!socn_flg_ekfInvalid)
+    {
+        ekfInvalidCntl = ( (ekfInvalidCntl + 1) > 60000 ? 60000 :(ekfInvalidCntl + 1));
     }
-
-    /* End of Outputs for SubSystem: '<S52>/Subsystem3' */
-
-    /* Outputs for Enabled SubSystem: '<S53>/Subsystem3' incorporates:
-     *  EnablePort: '<S55>/Enable'
-     */
-    if (SOC_DW.UnitDelay1_DSTATE_p) {
-      SOC_B.in = rtb_Merge;
+    else
+    {
+        ekfInvalidCntl = 0;
     }
-
-    /* End of Outputs for SubSystem: '<S53>/Subsystem3' */
-
-    /* Sum: '<S46>/Add1' incorporates:
-     *  Inport: '<S54>/in'
-     *  Inport: '<S55>/in'
-     *  Merge: '<S7>/Merge'
-     *  Sum: '<S46>/Add'
-     *  Sum: '<S4>/Add1'
-     *  UnitDelay: '<S32>/socd_flg_EEsave_Delay'
-     *  UnitDelay: '<S52>/Unit Delay1'
-     *  UnitDelay: '<S53>/Unit Delay1'
-     */
-    rtb_Merge = (uint16_T)((int16_T)(rtb_Add1_a - SOC_B.in_f) + SOC_B.in);
-
-    /* Update for UnitDelay: '<S52>/Unit Delay1' incorporates:
-     *  Constant: '<S52>/Constant1'
-     */
-    SOC_DW.UnitDelay1_DSTATE = false;
-
-    /* Update for UnitDelay: '<S53>/Unit Delay1' incorporates:
-     *  Constant: '<S53>/Constant1'
-     */
-    SOC_DW.UnitDelay1_DSTATE_p = false;
-
-    /* End of Outputs for SubSystem: '<S7>/If Action Subsystem' */
-  }
-
-  /* End of If: '<S7>/If1' */
-
-  /* Saturate: '<S7>/Saturation' incorporates:
-   *  UnitDelay: '<S32>/socd_flg_EEsave_Delay'
-   */
-  if (rtb_Merge > socc_pct_battSocUp) {
-    /* Saturate: '<S7>/Saturation' */
-    socd_pct_battSoc = socc_pct_battSocUp;
-  } else if (rtb_Merge < socc_pct_battSocLow) {
-    /* Saturate: '<S7>/Saturation' */
-    socd_pct_battSoc = socc_pct_battSocLow;
-  } else {
-    /* Saturate: '<S7>/Saturation' */
-    socd_pct_battSoc = rtb_Merge;
-  }
-
-  /* End of Saturate: '<S7>/Saturation' */
-
-  /* UnitDelay: '<S6>/First_Delay' incorporates:
-   *  UnitDelay: '<S23>/Frist'
-   */
-  SOC_DW.Frist_DSTATE_h = SOC_DW.First_Delay_DSTATE;
-
-  /* Sum: '<S6>/Add' incorporates:
-   *  Abs: '<S32>/Abs1'
-   *  Saturate: '<S7>/Saturation'
-   *  UnitDelay: '<S6>/Unit Delay7'
-   */
-  rtb_Saturation_k = (int16_T)(socd_pct_battSoc - SOC_DW.UnitDelay7_DSTATE);
-
-  /* Abs: '<S6>/Abs' incorporates:
-   *  Abs: '<S32>/Abs1'
-   */
-  if (rtb_Saturation_k < 0) {
-    rtb_Saturation_k = (int16_T)-rtb_Saturation_k;
-  }
-
-  /* End of Abs: '<S6>/Abs' */
-
-  /* RelationalOperator: '<S6>/Relational Operator6' incorporates:
-   *  Abs: '<S32>/Abs1'
-   *  UnitDelay: '<S14>/Frist'
-   */
-  SOC_DW.Frist_DSTATE = (rtb_Saturation_k > 20);
-
-  /* Saturate: '<S35>/Saturation' incorporates:
-   *  Constant: '<S35>/Constant'
-   *  Sum: '<S35>/Add'
-   *  UnitDelay: '<S35>/Time_Delay'
-   */
-  if ((uint16_T)(SOC_DW.Time_Delay_DSTATE + 1U) < 60000) {
-    rtb_Merge = (uint16_T)(SOC_DW.Time_Delay_DSTATE + 1U);
-  } else {
-    rtb_Merge = 60000U;
-  }
-
-  /* End of Saturate: '<S35>/Saturation' */
-
-  /* Logic: '<S6>/Logical Operator' incorporates:
-   *  Constant: '<S35>/para'
-   *  Constant: '<S6>/Constant3'
-   *  Constant: '<S6>/Constant4'
-   *  Constant: '<S6>/Constant5'
-   *  Constant: '<S6>/Constant6'
-   *  Inport: '<Root>/ihd_st_workStat'
-   *  Logic: '<S6>/Logical Operator1'
-   *  Logic: '<S6>/Logical Operator2'
-   *  RelationalOperator: '<S35>/Relational Operator1'
-   *  RelationalOperator: '<S6>/Relational Operator1'
-   *  RelationalOperator: '<S6>/Relational Operator2'
-   *  RelationalOperator: '<S6>/Relational Operator3'
-   *  RelationalOperator: '<S6>/Relational Operator4'
-   *  UnitDelay: '<S14>/Frist'
-   *  UnitDelay: '<S23>/Frist'
-   *  UnitDelay: '<S6>/ihd_st_chrgSta_Delay'
-   */
-  SOC_DW.Frist_DSTATE_h = (SOC_DW.Frist_DSTATE_h ||
-    ((SOC_DW.ihd_st_chrgSta_Delay_DSTATE == 2) && (ihd_st_workStat != 2)) ||
-    ((SOC_DW.ihd_st_chrgSta_Delay_DSTATE != 2) && (ihd_st_workStat == 2)) ||
-    SOC_DW.Frist_DSTATE || (rtb_Merge > 20));
-
-  /* Switch: '<S6>/Switch1' incorporates:
-   *  Saturate: '<S7>/Saturation'
-   *  Switch: '<S6>/Switch2'
-   *  UnitDelay: '<S23>/Frist'
-   *  UnitDelay: '<S6>/socd_pct_battSoc0_Delay'
-   */
-  if (SOC_DW.Frist_DSTATE_h) {
-    SOC_DW.socd_pct_battSoc0_Delay_DSTATE = socd_pct_battSoc;
-
-    /* Switch: '<S6>/Switch4' incorporates:
-     *  Saturate: '<S7>/Saturation'
-     *  Switch: '<S6>/Switch1'
-     *  UnitDelay: '<S6>/First_Delay1'
-     *  UnitDelay: '<S6>/socd_pct_battSoc0_Delay'
-     */
-    if (SOC_DW.First_Delay1_DSTATE) {
-      /* Switch: '<S6>/Switch2' incorporates:
-       *  Merge: '<S2>/socn_pct_bcuSocEE_Merge'
-       */
-      SOC_DW.socd_pct_bcuSoc0_Delay_DSTATE = SOC_B.socn_pct_bcuSocEE_Merge;
-    } else {
-      /* Switch: '<S6>/Switch2' incorporates:
-       *  UnitDelay: '<S6>/socd_pct_bcusocDelay'
-       */
-      SOC_DW.socd_pct_bcuSoc0_Delay_DSTATE = SOC_DW.socd_pct_bcusocDelay_DSTATE;
+    
+    if (ekfInvalidCntl < 200)
+    {
+        if (onceFlg_est)
+        {
+            ahSoc0_est  = ahSoc;
+            ekfSoc0_est = socd_pct_ekfSoc;
+        }
+        socd_pct_estSoc = (((int16_T)(ahSoc - ahSoc0_est) + ekfSoc0_est)>0 ? (uint16_T)((int16_T)(ahSoc - ahSoc0_est) + ekfSoc0_est) : 0);
+        onceFlg_est = false;
     }
-
-    /* End of Switch: '<S6>/Switch4' */
-  }
-
-  /* End of Switch: '<S6>/Switch1' */
-
-  /* If: '<S6>/If' incorporates:
-   *  Constant: '<S6>/Constant1'
-   *  Inport: '<Root>/ihd_st_workStat'
-   *  RelationalOperator: '<S41>/Relational Operator11'
-   *  RelationalOperator: '<S41>/Relational Operator12'
-   *  RelationalOperator: '<S6>/Relational Operator7'
-   *  Saturate: '<S7>/Saturation'
-   *  Switch: '<S41>/Switch7'
-   *  Switch: '<S41>/Switch8'
-   *  Switch: '<S6>/Switch1'
-   *  UnitDelay: '<S6>/socd_pct_battSoc0_Delay'
-   */
-  if (ihd_st_workStat == 2) {
-    /* Outputs for IfAction SubSystem: '<S6>/Subsystem2' incorporates:
-     *  ActionPort: '<S33>/Action Port'
-     */
-    /* Switch: '<S36>/Switch7' incorporates:
-     *  RelationalOperator: '<S36>/Relational Operator11'
-     *  RelationalOperator: '<S36>/Relational Operator12'
-     *  Saturate: '<S7>/Saturation'
-     *  Switch: '<S36>/Switch8'
-     *  Switch: '<S6>/Switch1'
-     *  Switch: '<S6>/Switch2'
-     *  UnitDelay: '<S6>/socd_pct_battSoc0_Delay'
-     */
-    if (socd_pct_battSoc <= SOC_DW.socd_pct_battSoc0_Delay_DSTATE) {
-      rtb_uDLookupTable3 = SOC_DW.socd_pct_bcuSoc0_Delay_DSTATE;
-    } else if (socd_pct_battSoc >= 1000) {
-      /* Switch: '<S36>/Switch7' incorporates:
-       *  Constant: '<S33>/Constant8'
-       *  Switch: '<S36>/Switch8'
-       */
-      rtb_uDLookupTable3 = 1000U;
-    } else {
-      /* Sum: '<S33>/Add4' incorporates:
-       *  Sum: '<S33>/Add3'
-       *  Switch: '<S36>/Switch8'
-       *  Switch: '<S6>/Switch2'
-       */
-      rtb_Saturation_k = (int16_T)(SOC_DW.socd_pct_battSoc0_Delay_DSTATE -
-        SOC_DW.socd_pct_bcuSoc0_Delay_DSTATE);
-
-      /* Abs: '<S33>/Abs4' incorporates:
-       *  Sum: '<S33>/Add3'
-       *  Switch: '<S36>/Switch8'
-       */
-      if (rtb_Saturation_k < 0) {
-        rtb_Saturation_k = (int16_T)-rtb_Saturation_k;
-      }
-
-      /* End of Abs: '<S33>/Abs4' */
-
-      /* MinMax: '<S33>/Max8' incorporates:
-       *  Constant: '<S33>/Constant23'
-       *  Sum: '<S33>/Add3'
-       *  Switch: '<S36>/Switch8'
-       */
-      if (50 < rtb_Saturation_k) {
-        rtb_Saturation_k = 50;
-      }
-
-      /* End of MinMax: '<S33>/Max8' */
-
-      /* MinMax: '<S33>/Max6' incorporates:
-       *  Switch: '<S36>/Switch8'
-       *  Switch: '<S6>/Switch2'
-       */
-      if (SOC_DW.socd_pct_battSoc0_Delay_DSTATE >
-          SOC_DW.socd_pct_bcuSoc0_Delay_DSTATE) {
-        rtb_uDLookupTable3 = SOC_DW.socd_pct_battSoc0_Delay_DSTATE;
-      } else {
-        rtb_uDLookupTable3 = SOC_DW.socd_pct_bcuSoc0_Delay_DSTATE;
-      }
-
-      /* End of MinMax: '<S33>/Max6' */
-
-      /* MinMax: '<S33>/Max7' incorporates:
-       *  Sum: '<S33>/Add3'
-       *  Switch: '<S36>/Switch8'
-       */
-      i = (int16_T)(rtb_Saturation_k + rtb_uDLookupTable3);
-      if (999 < i) {
-        rtb_uDLookupTable3 = 999U;
-      } else {
-        rtb_uDLookupTable3 = (uint16_T)i;
-      }
-
-      /* End of MinMax: '<S33>/Max7' */
-
-      /* Switch: '<S36>/Switch9' incorporates:
-       *  MinMax: '<S33>/Max7'
-       *  RelationalOperator: '<S36>/Relational Operator13'
-       *  Switch: '<S36>/Switch8'
-       */
-      if (socd_pct_battSoc > rtb_uDLookupTable3) {
-        /* Switch: '<S36>/Switch7' incorporates:
-         *  Constant: '<S33>/Constant8'
-         *  Constant: '<S33>/Constant9'
-         *  Product: '<S36>/Divide1'
-         *  Product: '<S36>/Product1'
-         *  Sum: '<S36>/Add10'
-         *  Sum: '<S36>/Add11'
-         *  Sum: '<S36>/Add8'
-         *  Sum: '<S36>/Add9'
-         */
-        rtb_uDLookupTable3 = (uint16_T)(((((uint16_T)(((uint16_T)div_repeat_u32
-          ((uint32_T)(uint16_T)(socd_pct_battSoc - rtb_uDLookupTable3) * (1000 -
-          rtb_uDLookupTable3), (uint16_T)(1000 - rtb_uDLookupTable3), 3U) * 5U) >>
-          2) * 52429U) >> 4) + ((uint32_T)rtb_uDLookupTable3 << 15)) >> 15);
-      } else {
-        /* Sum: '<S36>/Add6' incorporates:
-         *  Sum: '<S36>/Add5'
-         */
-        rtb_socd_pct_bcuSoc0_Delay = (uint16_T)(rtb_uDLookupTable3 -
-          SOC_DW.socd_pct_battSoc0_Delay_DSTATE);
-
-        /* MinMax: '<S36>/Max' incorporates:
-         *  Constant: '<S36>/Constant'
-         *  Sum: '<S36>/Add5'
-         */
-        if (1 > rtb_socd_pct_bcuSoc0_Delay) {
-          rtb_socd_pct_bcuSoc0_Delay = 1U;
+    else
+    {   
+        onceFlg_est = true;
+        socd_pct_estSoc = socd_pct_ekfSoc;
+    }
+    
+    if (socd_pct_estSoc >= socc_pct_battSocUp)
+    {
+        socd_pct_estSoc = socc_pct_battSocUp;
+    }
+    if (socd_pct_estSoc <= socc_pct_battSocLow)
+    {
+        socd_pct_estSoc = socc_pct_battSocLow;
+    }
+	//printf("6----ahSoc0_est:%d,ekfSoc0_est:%d,socd_pct_estSoc:%d\n",ahSoc0_est,ekfSoc0_est,socd_pct_estSoc);
+    //======================================================================
+    ////////////////////////UtrackSOC//////////////////////////////////////////
+    //======================================================================
+    if (ihd_st_workStat == 2)
+    {
+        disChrgCntl=0;
+		chrgCntl = ((chrgCntl+1) >60000 ? 60000 : (chrgCntl+1));
+		lowCntl=0;
+        lowFlg = 0;
+        if(sfmd_V_cellUMax >= look1_is16lu16n16tu16_binlcase(sfmd_I_curr, (&(socm_I_chrgCor[0])),(&(socm_V_chrgCor[0])), 3U))
+        {
+            overCntl = ( (overCntl + 1) > 60000 ? 60000 : (overCntl + 1));
         }
-
-        /* End of MinMax: '<S36>/Max' */
-
-        /* Switch: '<S36>/Switch7' incorporates:
-         *  Product: '<S36>/Divide'
-         *  Product: '<S36>/Product'
-         *  Sum: '<S36>/Add4'
-         *  Sum: '<S36>/Add5'
-         *  Sum: '<S36>/Add7'
-         *  Switch: '<S6>/Switch2'
-         */
-        rtb_uDLookupTable3 = (uint16_T)(((((uint16_T)(((uint16_T)div_repeat_u32
-          ((uint32_T)(uint16_T)(socd_pct_battSoc -
-          SOC_DW.socd_pct_battSoc0_Delay_DSTATE) * (uint16_T)(rtb_uDLookupTable3
-          - SOC_DW.socd_pct_bcuSoc0_Delay_DSTATE), rtb_socd_pct_bcuSoc0_Delay,
-           3U) * 5U) >> 2) * 52429U) >> 4) + ((uint32_T)
-          SOC_DW.socd_pct_bcuSoc0_Delay_DSTATE << 15)) >> 15);
-      }
-
-      /* End of Switch: '<S36>/Switch9' */
+        else
+        {
+            overCntl=0;
+        }
+        if(overCntl > 20 || overFlg)
+        {
+            overFlg = 1;
+        }
+        //
+        if(sfmd_V_cellUMax >= socc_V_chrgFulV)
+        {
+            fulCntl = ( (fulCntl + 1) > 60000 ? 60000 : (fulCntl + 1));
+        }
+        else
+        {
+            fulCntl=0;
+        }
+        if(fulCntl > 20 || fulFlg)
+        {
+            fulFlg = 1;
+        }
+        
+        //
+        if (overFlg)
+        {
+            if (onceFlg_utrckOver)
+            {
+                ahSoc0_utrckOver  = ahSoc;
+                estSoc0_utrckOver = socd_pct_estSoc;
+            }
+            estSoc0_utrckOver = (estSoc0_utrckOver > 950 ? estSoc0_utrckOver : 950);
+            socTemp = (uint16_T)((int16_T)(ahSoc - ahSoc0_utrckOver) + estSoc0_utrckOver);
+            onceFlg_utrckOver = false;
+        }
+        else  if (chrgCntl >20)
+        {   
+           
+            onceFlg_utrckOver = true;
+            socTemp = (socd_pct_estSoc > 950 ? 950 : socd_pct_estSoc);
+        }
+		else
+        {
+            socTemp = socd_pct_estSoc;
+        }
+		
+        socn_pct_utrackSoc = Soc_Delay + ( (int16_T) (socTemp - Soc_Delay) > 0 ?  (socTemp - Soc_Delay) :0);
+        Soc_Delay = socn_pct_utrackSoc;
+        socn_pct_utrackSoc =(socn_pct_utrackSoc > 999 ? 999 : socn_pct_utrackSoc);
+        if (fulFlg)
+        {
+            socn_pct_utrackSoc= 1000;
+        }
+		
+		//printf("7----overCntl:%d,overFlg:%d,fulCntl:%d,fulFlg:%d,ahSoc0_utrckOver:%d,estSoc0_utrckOver:%d,socn_pct_utrackSoc:%d\n",overCntl,overFlg,fulCntl,fulFlg,ahSoc0_utrckOver,estSoc0_utrckOver,socn_pct_utrackSoc);
     }
-
-    /* End of Switch: '<S36>/Switch7' */
-
-    /* Saturate: '<S33>/Saturation1' incorporates:
-     *  Switch: '<S36>/Switch7'
-     */
-    if (rtb_uDLookupTable3 >= 999) {
-      rtb_uDLookupTable3 = 999U;
+    else
+    {   chrgCntl=0;
+		disChrgCntl = ((disChrgCntl+1) >60000 ? 60000 : (disChrgCntl+1));
+        Soc_Delay = 0;
+        overCntl = 0;
+        overFlg  = 0;
+        fulFlg   = 0;
+        fulCntl  = 0;
+        if(sfmd_V_cellUMin <=look1_is16lu16n16tu16_binlcase(sfmd_I_curr, (&(socm_I_disChrgCor[0])),(&(socm_V_disChrgCor[0])), 2U))
+        {
+            lowCntl = ( (lowCntl + 1) > 60000 ? 60000 : (lowCntl + 1));
+        }
+        else
+        {
+            lowCntl=0;
+        }
+        if(lowCntl > 20 || lowFlg)
+        {
+            lowFlg = 1;
+        }
+        //
+        if (lowFlg)
+        {
+            if (onceFlg_utrckLow)
+            {
+                ahSoc0_utrckLow  = ahSoc;
+                estSoc0_utrckLow = socd_pct_estSoc;
+            }
+            estSoc0_utrckLow = (estSoc0_utrckLow < 50 ? estSoc0_utrckLow : 50);
+            socn_pct_utrackSoc = (((int16_T)(ahSoc - ahSoc0_utrckLow) + estSoc0_utrckLow)>0 ? (uint16_T)((int16_T)(ahSoc - ahSoc0_utrckLow) + estSoc0_utrckLow) : 0);
+            onceFlg_utrckLow = false;
+        }
+        else if(disChrgCntl > 20)
+        {
+            onceFlg_utrckLow = true;
+            socn_pct_utrackSoc = (socd_pct_estSoc < 50 ? 50 :socd_pct_estSoc);
+        }
+		else
+		{
+		    socn_pct_utrackSoc = socd_pct_estSoc;
+		}
+	// printf("8----lowCntl:%d,lowFlg:%d,ahSoc0_utrckLow:%d,estSoc0_utrckLow:%d,socn_pct_utrackSoc:%d\n",lowCntl,lowFlg,ahSoc0_utrckLow,estSoc0_utrckLow,socn_pct_utrackSoc);
     }
-
-    /* End of Saturate: '<S33>/Saturation1' */
-
-    /* Sum: '<S37>/Add6' incorporates:
-     *  Saturate: '<S33>/Saturation1'
-     *  UnitDelay: '<S37>/socfit_Delay'
-     */
-    rtb_Saturation_k = (int16_T)(rtb_uDLookupTable3 -
-      SOC_DW.socfit_Delay_DSTATE_n);
-
-    /* Switch: '<S37>/Switch' incorporates:
-     *  If: '<S37>/If'
-     *  Logic: '<S37>/Logical Operator'
-     *  RelationalOperator: '<S37>/Relational Operator'
-     *  RelationalOperator: '<S37>/Relational Operator1'
-     *  RelationalOperator: '<S37>/Relational Operator2'
-     *  Sum: '<S37>/Add6'
-     */
-    if (rtb_Saturation_k > 1) {
-      /* Outputs for IfAction SubSystem: '<S37>/If Action Subsystem' incorporates:
-       *  ActionPort: '<S38>/Action Port'
-       */
-      /* If: '<S37>/If' incorporates:
-       *  UnitDelay: '<S37>/socfit_Delay'
-       */
-      SOC_IfActionSubsystem(rtb_uDLookupTable3, SOC_DW.socfit_Delay_DSTATE_n,
-                            &SOC_DW.socfit_Delay_DSTATE_n, 1);
-
-      /* End of Outputs for SubSystem: '<S37>/If Action Subsystem' */
-    } else if ((rtb_Saturation_k < -1) && (rtb_Saturation_k > -1000)) {
-      /* Outputs for IfAction SubSystem: '<S37>/If Action Subsystem1' incorporates:
-       *  ActionPort: '<S39>/Action Port'
-       */
-      /* If: '<S37>/If' incorporates:
-       *  UnitDelay: '<S37>/socfit_Delay'
-       */
-      SOC_IfActionSubsystem1(rtb_uDLookupTable3, SOC_DW.socfit_Delay_DSTATE_n,
-        &SOC_DW.socfit_Delay_DSTATE_n);
-
-      /* End of Outputs for SubSystem: '<S37>/If Action Subsystem1' */
-    } else {
-      /* Outputs for IfAction SubSystem: '<S37>/If Action Subsystem2' incorporates:
-       *  ActionPort: '<S40>/Action Port'
-       */
-      /* If: '<S37>/If' incorporates:
-       *  Inport: '<S40>/In1'
-       *  Merge: '<S37>/Merge'
-       *  Saturate: '<S33>/Saturation1'
-       *  UnitDelay: '<S37>/socfit_Delay'
-       */
-      SOC_DW.socfit_Delay_DSTATE_n = rtb_uDLookupTable3;
-
-      /* End of Outputs for SubSystem: '<S37>/If Action Subsystem2' */
+     //===================================================================
+     //------------------EEsave
+     //==================================================================
+     socd_pct_battSoc = socn_pct_utrackSoc;
+     socd_pct_battSocEo = socn_pct_utrackSoc;
+     if ( (int16_T)(socd_pct_battSoc - socd_pct_battSoc_Delay) > 10 || (int16_T)(socd_pct_battSoc - socd_pct_battSoc_Delay) <- 10 )
+     {
+         socd_flg_EEsave =1;
+	     socd_pct_battSoc_Delay = socd_pct_battSoc;
+     }
+	 else
+	 {
+	     socd_flg_EEsave=0;
+	 }
+	 
+	//=====================================================================
+    //////////////////////////////BCUSOC///////////////////////////////////
+    //=====================================================================
+
+    
+    if(sfmd_I_curr < 100 && sfmd_I_curr > -100)
+    {
+        statCntl= (statCntl >60000 ? 60000 :statCntl);
     }
-
-    /* End of Switch: '<S37>/Switch' */
-
-    /* Switch: '<S33>/Switch6' incorporates:
-     *  Constant: '<S33>/Constant14'
-     *  Merge: '<S37>/Merge'
-     *  Merge: '<S6>/Merge'
-     *  UnitDelay: '<S37>/socfit_Delay'
-     *  UnitDelay: '<S50>/fulFLg_reset'
-     *  UnitDelay: '<S6>/socd_pct_bcusocDelay'
-     */
-    if (SOC_DW.fulFLg_reset_DSTATE) {
-      SOC_DW.socd_pct_bcusocDelay_DSTATE = 1000U;
-    } else {
-      SOC_DW.socd_pct_bcusocDelay_DSTATE = SOC_DW.socfit_Delay_DSTATE_n;
+    else
+    {
+        statCntl=0;
     }
-
-    /* End of Switch: '<S33>/Switch6' */
-    /* End of Outputs for SubSystem: '<S6>/Subsystem2' */
-  } else {
-    /* Outputs for IfAction SubSystem: '<S6>/Subsystem3' incorporates:
-     *  ActionPort: '<S34>/Action Port'
-     */
-    if (socd_pct_battSoc <= 0) {
-      /* Switch: '<S41>/Switch7' incorporates:
-       *  Constant: '<S34>/Constant30'
-       */
-      rtb_uDLookupTable3 = 0U;
-    } else if (socd_pct_battSoc >= SOC_DW.socd_pct_battSoc0_Delay_DSTATE) {
-      /* Switch: '<S41>/Switch7' incorporates:
-       *  Switch: '<S41>/Switch8'
-       *  Switch: '<S6>/Switch2'
-       */
-      rtb_uDLookupTable3 = SOC_DW.socd_pct_bcuSoc0_Delay_DSTATE;
-    } else {
-      /* Sum: '<S34>/Add4' incorporates:
-       *  Sum: '<S34>/Add2'
-       *  Switch: '<S41>/Switch7'
-       *  Switch: '<S41>/Switch8'
-       *  Switch: '<S6>/Switch1'
-       *  Switch: '<S6>/Switch2'
-       *  UnitDelay: '<S6>/socd_pct_battSoc0_Delay'
-       */
-      rtb_Saturation_k = (int16_T)(SOC_DW.socd_pct_battSoc0_Delay_DSTATE -
-        SOC_DW.socd_pct_bcuSoc0_Delay_DSTATE);
-
-      /* Abs: '<S34>/Abs4' incorporates:
-       *  Sum: '<S34>/Add2'
-       *  Switch: '<S41>/Switch7'
-       *  Switch: '<S41>/Switch8'
-       */
-      if (rtb_Saturation_k < 0) {
-        rtb_Saturation_k = (int16_T)-rtb_Saturation_k;
-      }
-
-      /* End of Abs: '<S34>/Abs4' */
-
-      /* MinMax: '<S34>/Max4' incorporates:
-       *  Switch: '<S41>/Switch7'
-       *  Switch: '<S41>/Switch8'
-       *  Switch: '<S6>/Switch1'
-       *  Switch: '<S6>/Switch2'
-       *  UnitDelay: '<S6>/socd_pct_battSoc0_Delay'
-       */
-      if (SOC_DW.socd_pct_battSoc0_Delay_DSTATE <
-          SOC_DW.socd_pct_bcuSoc0_Delay_DSTATE) {
-        rtb_uDLookupTable3 = SOC_DW.socd_pct_battSoc0_Delay_DSTATE;
-      } else {
-        rtb_uDLookupTable3 = SOC_DW.socd_pct_bcuSoc0_Delay_DSTATE;
-      }
-
-      /* End of MinMax: '<S34>/Max4' */
-
-      /* MinMax: '<S34>/Max8' incorporates:
-       *  Constant: '<S34>/Constant23'
-       *  Sum: '<S34>/Add2'
-       *  Switch: '<S41>/Switch7'
-       *  Switch: '<S41>/Switch8'
-       */
-      if (50 < rtb_Saturation_k) {
-        rtb_Saturation_k = 50;
-      }
-
-      /* End of MinMax: '<S34>/Max8' */
-
-      /* MinMax: '<S34>/Max2' incorporates:
-       *  Sum: '<S34>/Add2'
-       *  Switch: '<S41>/Switch7'
-       *  Switch: '<S41>/Switch8'
-       */
-      i = (int16_T)(rtb_uDLookupTable3 - rtb_Saturation_k);
-      if (i > 1) {
-        rtb_uDLookupTable3 = (uint16_T)i;
-      } else {
-        rtb_uDLookupTable3 = 1U;
-      }
-
-      /* End of MinMax: '<S34>/Max2' */
-
-      /* Switch: '<S41>/Switch9' incorporates:
-       *  MinMax: '<S34>/Max2'
-       *  RelationalOperator: '<S41>/Relational Operator13'
-       *  Saturate: '<S7>/Saturation'
-       *  Switch: '<S41>/Switch7'
-       *  Switch: '<S41>/Switch8'
-       */
-      if (socd_pct_battSoc > rtb_uDLookupTable3) {
-        /* Sum: '<S41>/Add10' incorporates:
-         *  Product: '<S41>/Divide1'
-         *  Switch: '<S6>/Switch1'
-         *  UnitDelay: '<S6>/socd_pct_battSoc0_Delay'
-         */
-        rtb_socd_pct_bcuSoc0_Delay = (uint16_T)
-          (SOC_DW.socd_pct_battSoc0_Delay_DSTATE - rtb_uDLookupTable3);
-
-        /* MinMax: '<S41>/Max1' incorporates:
-         *  Constant: '<S41>/Constant1'
-         *  Product: '<S41>/Divide1'
-         */
-        if (1 > rtb_socd_pct_bcuSoc0_Delay) {
-          rtb_socd_pct_bcuSoc0_Delay = 1U;
+    statFlg = statCntl > 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;
+    //
+    if(Flg)
+    {
+        socd_pct_battSoc0 = socd_pct_battSoc;
+        if(FirstRun_SOC)
+        {
+            socd_pct_bcuSoc0 = socn_pct_bcuSocEE;
+        }
+        else
+        {
+            socd_pct_bcuSoc0 = socd_pct_bcuSoc_Delay;
         }
-
-        /* End of MinMax: '<S41>/Max1' */
-
-        /* Switch: '<S41>/Switch7' incorporates:
-         *  Product: '<S41>/Divide1'
-         *  Product: '<S41>/Product1'
-         *  Sum: '<S41>/Add11'
-         *  Sum: '<S41>/Add8'
-         *  Sum: '<S41>/Add9'
-         *  Switch: '<S6>/Switch2'
-         */
-        rtb_uDLookupTable3 = (uint16_T)(((((uint16_T)(((uint16_T)div_repeat_u32
-          ((uint32_T)(uint16_T)(socd_pct_battSoc - rtb_uDLookupTable3) *
-           (uint16_T)(SOC_DW.socd_pct_bcuSoc0_Delay_DSTATE - rtb_uDLookupTable3),
-           rtb_socd_pct_bcuSoc0_Delay, 3U) * 5U) >> 2) * 52429U) >> 4) +
-          ((uint32_T)rtb_uDLookupTable3 << 15)) >> 15);
-      } else {
-        /* Switch: '<S41>/Switch7' incorporates:
-         *  Product: '<S41>/Divide'
-         *  Product: '<S41>/Product'
-         *  Sum: '<S41>/Add4'
-         *  Sum: '<S41>/Add5'
-         *  Sum: '<S41>/Add6'
-         *  Sum: '<S41>/Add7'
-         */
-        rtb_uDLookupTable3 = (uint16_T)(((uint16_T)(((uint16_T)div_repeat_u32
-          ((uint32_T)socd_pct_battSoc * rtb_uDLookupTable3, rtb_uDLookupTable3,
-           3U) * 5U) >> 2) * 52429U) >> 19);
-      }
-
-      /* End of Switch: '<S41>/Switch9' */
     }
-
-    /* Sum: '<S42>/Add6' incorporates:
-     *  RelationalOperator: '<S41>/Relational Operator12'
-     *  Saturate: '<S7>/Saturation'
-     *  Switch: '<S41>/Switch7'
-     *  Switch: '<S41>/Switch8'
-     *  Switch: '<S6>/Switch1'
-     *  UnitDelay: '<S42>/socfit_Delay'
-     *  UnitDelay: '<S6>/socd_pct_battSoc0_Delay'
-     */
-    rtb_Saturation_k = (int16_T)(rtb_uDLookupTable3 - SOC_DW.socfit_Delay_DSTATE);
-
-    /* Switch: '<S42>/Switch' incorporates:
-     *  If: '<S42>/If'
-     *  Logic: '<S42>/Logical Operator'
-     *  RelationalOperator: '<S42>/Relational Operator'
-     *  RelationalOperator: '<S42>/Relational Operator1'
-     *  RelationalOperator: '<S42>/Relational Operator2'
-     *  Sum: '<S42>/Add6'
-     */
-    if (rtb_Saturation_k > 1) {
-      /* Outputs for IfAction SubSystem: '<S42>/If Action Subsystem' incorporates:
-       *  ActionPort: '<S43>/Action Port'
-       */
-      /* If: '<S42>/If' incorporates:
-       *  UnitDelay: '<S42>/socfit_Delay'
-       */
-      SOC_IfActionSubsystem(rtb_uDLookupTable3, SOC_DW.socfit_Delay_DSTATE,
-                            &SOC_DW.socfit_Delay_DSTATE, 1);
-
-      /* End of Outputs for SubSystem: '<S42>/If Action Subsystem' */
-    } else if ((rtb_Saturation_k < -1) && (rtb_Saturation_k > -1000)) {
-      /* Outputs for IfAction SubSystem: '<S42>/If Action Subsystem1' incorporates:
-       *  ActionPort: '<S44>/Action Port'
-       */
-      /* If: '<S42>/If' incorporates:
-       *  UnitDelay: '<S42>/socfit_Delay'
-       */
-      SOC_IfActionSubsystem1(rtb_uDLookupTable3, SOC_DW.socfit_Delay_DSTATE,
-        &SOC_DW.socfit_Delay_DSTATE);
-
-      /* End of Outputs for SubSystem: '<S42>/If Action Subsystem1' */
-    } else {
-      /* Outputs for IfAction SubSystem: '<S42>/If Action Subsystem2' incorporates:
-       *  ActionPort: '<S45>/Action Port'
-       */
-      /* If: '<S42>/If' incorporates:
-       *  Inport: '<S45>/In1'
-       *  Merge: '<S42>/Merge'
-       *  Switch: '<S41>/Switch7'
-       *  UnitDelay: '<S42>/socfit_Delay'
-       */
-      SOC_DW.socfit_Delay_DSTATE = rtb_uDLookupTable3;
-
-      /* End of Outputs for SubSystem: '<S42>/If Action Subsystem2' */
+	//printf("9------socd_pct_battSoc:%d\n",socd_pct_battSoc);
+	//printf("9----statCntl:%d,statFlg:%d,Flg:%d,socd_pct_bcuSoc0:%d,socd_pct_bcuSoc0:%d\n",statCntl,statFlg,Flg,socd_pct_bcuSoc0,socd_pct_bcuSoc0);
+    //
+    if(ihd_st_workStat == 2)
+    {
+        delSOC =  ((int16_T) (socd_pct_battSoc0 - socd_pct_bcuSoc0) > 0 ? (socd_pct_battSoc0 - socd_pct_bcuSoc0) : (socd_pct_bcuSoc0 - socd_pct_battSoc0));
+        coinSoc = (int16_T)(socd_pct_battSoc0 > socd_pct_bcuSoc0 ? socd_pct_battSoc0 : socd_pct_bcuSoc0) + (delSOC > 50 ? 50 : delSOC);
+		
+		x[0] = socd_pct_battSoc0;
+		x[1] = (coinSoc> 1000 ? 1000 : (uint16_T)coinSoc);;
+		x[2] = 1000;
+		y[0] = socd_pct_bcuSoc0;
+		y[1] = (coinSoc> 1000 ? 1000 : (uint16_T)coinSoc);;
+		y[2] = 1000;
+		
+        SOC_LookUp( socd_pct_battSoc, &x[0], &y[0], &bcuSoc);
+
+
+		//
+        onceFlg_dischrg = true;
+        if (onceFlg_chrg)
+        {
+            SocFitChrg_Delay = 2000;
+        }
+		//printf("onceFlg_chrg:%d,SocFitChrg_Delay:%d\n",onceFlg_chrg,SocFitChrg_Delay);
+        onceFlg_chrg =false;
+        if ((int16_T)(bcuSoc - SocFitChrg_Delay ) > 1)
+        {
+            SOCfit_IfActionSubsystem1( bcuSoc,  SocFitChrg_Delay,  &SocFitChrg, 1);
+        }
+        if ((int16_T)(bcuSoc - SocFitChrg_Delay ) <-1 && (int16_T)(bcuSoc - SocFitChrg_Delay ) > -1000)
+        {
+            SOCfit_IfActionSubsystem2( bcuSoc,  SocFitChrg_Delay,  &SocFitChrg, 1);
+        }
+		if (((int16_T)(bcuSoc - SocFitChrg_Delay ) <=1 &&(int16_T)(bcuSoc - SocFitChrg_Delay ) >=-1 )||((int16_T)(bcuSoc - SocFitChrg_Delay ) <=-1000))
+		{
+
+		    SocFitChrg = bcuSoc;
+		}
+        SocFitChrg_Delay =  SocFitChrg;
+		
+        //
+        if (fulFlg)
+        {
+            socd_pct_bcuSoc =1000;
+        }
+        else
+        {
+            socd_pct_bcuSoc =(SocFitChrg > 999 ? 999 : SocFitChrg);
+        }
+		//printf("10-----x:[%d-%d-%d],y:[%d-%d-%d],bcusoc:%d,SocFitChrg:%d,socd_pct_bcuSoc:%d\n",x[0],x[1],x[2],y[0],y[1],y[2],bcuSoc,SocFitChrg,socd_pct_bcuSoc);
     }
+    else
+    {
+    
+        //
+        delSOC = ((int16_T) (socd_pct_battSoc0 - socd_pct_bcuSoc0) > 0 ? (socd_pct_battSoc0 - socd_pct_bcuSoc0) : (socd_pct_bcuSoc0 - socd_pct_battSoc0));
+        coinSoc =(int16_T)((socd_pct_battSoc0 < socd_pct_bcuSoc0 ? socd_pct_battSoc0 : socd_pct_bcuSoc0) - (delSOC > 50 ? 50 : delSOC));
+        
+      	x[0] = 0;
+		x[1] = (coinSoc > 0 ? (uint16_T)coinSoc : 0);
+		x[2] = socd_pct_battSoc0;
+		y[0] = 0;
+		y[1] = (coinSoc > 0 ? (uint16_T)coinSoc : 0);
+		y[2] = socd_pct_bcuSoc0;
+        SOC_LookUp( socd_pct_battSoc,  &x[0], &y[0], &bcuSoc);
+		
+
+
+		//
+		onceFlg_chrg = true;
+        if (onceFlg_dischrg)
+        {
+            SocFitdisChrg_Delay = 2000;
+        }
+        onceFlg_dischrg =false;
 
-    /* End of Switch: '<S42>/Switch' */
-
-    /* SignalConversion: '<S42>/Signal Conversion' incorporates:
-     *  Merge: '<S42>/Merge'
-     *  Merge: '<S6>/Merge'
-     *  UnitDelay: '<S42>/socfit_Delay'
-     *  UnitDelay: '<S6>/socd_pct_bcusocDelay'
-     */
-    SOC_DW.socd_pct_bcusocDelay_DSTATE = SOC_DW.socfit_Delay_DSTATE;
-
-    /* End of Outputs for SubSystem: '<S6>/Subsystem3' */
-  }
-
-  /* End of If: '<S6>/If' */
-
-  /* Abs: '<S6>/Abs2' incorporates:
-   *  Inport: '<Root>/sfmd_I_curr'
-   */
-  if (sfmd_I_curr < 0) {
-    rtb_Saturation_k = (int16_T)-sfmd_I_curr;
-  } else {
-    rtb_Saturation_k = sfmd_I_curr;
-  }
-
-  /* End of Abs: '<S6>/Abs2' */
-
-  /* RelationalOperator: '<S6>/Relational Operator8' incorporates:
-   *  UnitDelay: '<S23>/Frist'
-   */
-  SOC_DW.Frist_DSTATE_h = (rtb_Saturation_k < 10);
-
-  /* Product: '<S35>/Product' incorporates:
-   *  UnitDelay: '<S23>/Frist'
-   *  UnitDelay: '<S35>/Time_Delay'
-   */
-  SOC_DW.Time_Delay_DSTATE = (uint16_T)(SOC_DW.Frist_DSTATE_h ? (int32_T)
-    rtb_Merge : 0);
-
-  /* Sum: '<S32>/Add1' incorporates:
-   *  Abs: '<S32>/Abs1'
-   *  Saturate: '<S7>/Saturation'
-   *  UnitDelay: '<S32>/socd_flg_EEsave_Delay'
-   */
-  rtb_Saturation_k = (int16_T)(socd_pct_battSoc -
-    SOC_DW.socd_flg_EEsave_Delay_DSTATE);
-
-  /* Abs: '<S32>/Abs1' */
-  if (rtb_Saturation_k < 0) {
-    rtb_Saturation_k = (int16_T)-rtb_Saturation_k;
-  }
-
-  /* End of Abs: '<S32>/Abs1' */
-
-  /* RelationalOperator: '<S32>/Relational Operator7' incorporates:
-   *  Abs: '<S32>/Abs1'
-   *  Constant: '<S32>/Constant19'
-   */
-  socd_flg_EEsave = ((real_T)rtb_Saturation_k * 0.1 > 1.0);
-
-  /* Switch: '<S32>/Switch6' incorporates:
-   *  Saturate: '<S7>/Saturation'
-   *  UnitDelay: '<S32>/socd_flg_EEsave_Delay'
-   */
-  if (socd_flg_EEsave) {
-    SOC_DW.socd_flg_EEsave_Delay_DSTATE = socd_pct_battSoc;
-  }
-
-  /* End of Switch: '<S32>/Switch6' */
-
-  /* SignalConversion: '<S6>/Signal Conversion1' incorporates:
-   *  Saturate: '<S7>/Saturation'
-   */
-  socd_pct_battSocEo = socd_pct_battSoc;
-
-  /* Saturate: '<S1>/Saturation' incorporates:
-   *  Sum: '<S4>/Add1'
-   */
-  if (rtb_Add1_a >= 1000) {
-    /* Saturate: '<S1>/Saturation' */
-    socd_pct_ahSoc = 1000U;
-  } else if (rtb_Add1_a <= 0) {
-    /* Saturate: '<S1>/Saturation' */
-    socd_pct_ahSoc = 0U;
-  } else {
-    /* Saturate: '<S1>/Saturation' */
-    socd_pct_ahSoc = (uint16_T)rtb_Add1_a;
-  }
-
-  /* End of Saturate: '<S1>/Saturation' */
-
-  /* SignalConversion: '<S12>/Signal Conversion2' */
-  k1 = rtb_Divide[0];
-
-  /* SignalConversion: '<S6>/Signal Conversion2' incorporates:
-   *  Merge: '<S6>/Merge'
-   *  UnitDelay: '<S6>/socd_pct_bcusocDelay'
-   */
-  socd_pct_bcuSoc = SOC_DW.socd_pct_bcusocDelay_DSTATE;
-
-  /* SignalConversion: '<S6>/Signal Conversion3' incorporates:
-   *  Merge: '<S6>/Merge'
-   *  UnitDelay: '<S6>/socd_pct_bcusocDelay'
-   */
-  socd_pct_bcuSocEo = SOC_DW.socd_pct_bcusocDelay_DSTATE;
-
-  /* Update for UnitDelay: '<S1>/FirstDelay' incorporates:
-   *  Constant: '<S1>/Constant'
-   */
-  SOC_DW.FirstDelay_DSTATE = false;
-
-  /* Update for UnitDelay: '<S14>/Frist' incorporates:
-   *  Constant: '<S14>/Constant'
-   */
-  SOC_DW.Frist_DSTATE = false;
-
-  /* Update for UnitDelay: '<S23>/Frist' incorporates:
-   *  Constant: '<S23>/Constant'
-   */
-  SOC_DW.Frist_DSTATE_h = false;
-
-  /* Update for SignalConversion generated from: '<S28>/Product1' incorporates:
-   *  Product: '<S19>/Product2'
-   *  Product: '<S27>/Product'
-   *  Sum: '<S27>/Add'
-   *  Sum: '<S27>/Add1'
-   *  UnitDelay: '<S13>/Up_Delay'
-   */
-  SOC_DW.Up_Delay_DSTATE = rtb_Add1_h * rtb_Add_l +
-    rtb_TmpSignalConversionAtProduc[1];
+		
+        if ((int16_T)(bcuSoc - SocFitdisChrg_Delay ) > 1)
+        {
+            SOCfit_IfActionSubsystem1( bcuSoc,  SocFitdisChrg_Delay,  &SocFitdisChrg, 1);
+        }
+        if ((int16_T)(bcuSoc - SocFitdisChrg_Delay ) <-1 && (int16_T)(bcuSoc - SocFitdisChrg_Delay ) > -1000)
+        {
+            SOCfit_IfActionSubsystem2( bcuSoc,  SocFitdisChrg_Delay,  &SocFitdisChrg, 1);
+        }
+		if (((int16_T)(bcuSoc - SocFitdisChrg_Delay ) <=1 &&(int16_T)(bcuSoc - SocFitdisChrg_Delay ) >=-1 )||((int16_T)(bcuSoc - SocFitdisChrg_Delay ) <=-1000))
+		{
 
-  /* Update for Switch: '<S14>/Switch1' incorporates:
-   *  Product: '<S18>/Product'
-   *  Sum: '<S18>/Add'
-   *  Sum: '<S18>/Add1'
-   *  UnitDelay: '<S12>/Up_Delay'
-   */
-  SOC_DW.Up_Delay_DSTATE_h = rtb_Add1 + k2 * deltaU;
+		    SocFitdisChrg = bcuSoc;
+		}
+        SocFitdisChrg_Delay = SocFitdisChrg;
 
-  /* Update for UnitDelay: '<S6>/First_Delay' incorporates:
-   *  Constant: '<S6>/Constant2'
-   */
-  SOC_DW.First_Delay_DSTATE = false;
 
-  /* Update for UnitDelay: '<S6>/ihd_st_chrgSta_Delay' incorporates:
-   *  Inport: '<Root>/ihd_st_workStat'
-   */
-  SOC_DW.ihd_st_chrgSta_Delay_DSTATE = ihd_st_workStat;
+		socd_pct_bcuSoc = SocFitdisChrg;
+		//printf("11-----x:[%d-%d-%d],y:[%d-%d-%d],bcusoc:%d,socd_pct_bcuSoc:%d\n",x[0],x[1],x[2],y[0],y[1],y[2],bcuSoc,socd_pct_bcuSoc);
+	    
+    }
+    //
+    socd_pct_bcuSocEo = socd_pct_bcuSoc;
+    socd_pct_bcuSoc_Delay = socd_pct_bcuSoc; 
+    FirstRun_SOC= false;
+    
+}
 
-  /* Update for UnitDelay: '<S6>/Unit Delay7' incorporates:
-   *  Saturate: '<S7>/Saturation'
-   */
-  SOC_DW.UnitDelay7_DSTATE = socd_pct_battSoc;
 
-  /* Update for UnitDelay: '<S6>/First_Delay1' incorporates:
-   *  Constant: '<S6>/Constant12'
-   */
-  SOC_DW.First_Delay1_DSTATE = false;
+//-------------------------------------------------------------------------
+void docvmath(real_T soc ,real_T *docv)
+{
+    *docv = ((((((-2.8104E-13 * pow(soc, 7.0) + 1.0283E-10 * pow(soc, 6.0)) +
+            -1.5072E-8 * pow(soc, 5.0)) + 1.1295E-6 * pow(soc, 4.0)) +
+            -4.588E-5 * pow(soc, 3.0)) + soc * soc * 0.000993) +
+            -0.010548 * soc) + 0.04876;
 }
-
-/* Model initialize function */
-void SOC_initialize(const char_T **rt_errorStatus)
+////
+void SOC_LookUp(uint16_T battsoc, uint16_T x[], uint16_T y[],uint16_T *bcusoc)
 {
-  RT_MODEL_SOC_T *const SOC_M = &(SOC_MdlrefDW.rtm);
-
-  /* Registration code */
+    //
+    if (battsoc <= x[0])
+    {
+        *bcusoc = y[0];
+    }
+	//
+    if (battsoc >= x[2])
+    {
+        *bcusoc = y[2];
+    }
+	//
+    if (battsoc > x[0] && battsoc < x[1])   //(x-x0)*(y1-y0)/(x1-x0)+y0
+    {
 
-  /* initialize error status */
-  rtmSetErrorStatusPointer(SOC_M, rt_errorStatus);
-  SOC_PrevZCX.Subsystem2_Trig_ZCE_k = POS_ZCSIG;
-  SOC_PrevZCX.Subsystem2_Trig_ZCE = POS_ZCSIG;
+	   *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)(((((uint16_T)(((uint16_T)div_repeat_u32((uint32_T)(uint16_T)(battsoc - x[0]) * (y[1] - y[0]),(uint16_T)(x[1] - x[0]), 3U) * 5U)>> 2) * 52429U) >> 4) + ((uint32_T)y[0] << 15)) >>15);
+    }
+	//
+    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)(((((uint16_T)(((uint16_T)div_repeat_u32((uint32_T)(uint16_T)(battsoc - x[1]) * (y[2] - y[1]),(uint16_T)(x[2] - x[1]), 3U) * 5U)>> 2) * 52429U) >> 4) + ((uint32_T)y[1] << 15)) >>15);
+    }
 }
+//-------------------------------------------------------------------------
 
-/*
- * File trailer for generated code.
- *
- * [EOF]
- */
+void SOCfit_IfActionSubsystem1(uint16_T SOC, uint16_T SOCfit_Delay, uint16_T *SOCfit, uint16_T m)
+{
+    if ((int16_T)(SOC - SOCfit_Delay) > m)
+    {
+        *SOCfit=SOCfit_Delay+m;
+    }
+    else
+    {
+        *SOCfit=SOC;
+    }
+}
+//-------------------------------------------------------------------------
+void SOCfit_IfActionSubsystem2(uint16_T SOC, uint16_T SOCfit_Delay, uint16_T *SOCfit, uint16_T m)
+{
+    if ((int16_T)(SOC - SOCfit_Delay) < -m)
+    {
+        *SOCfit=SOCfit_Delay-m;
+    }
+    else
+    {
+        *SOCfit=SOC;
+    }
+}

+ 233 - 754
src/EmbeddedCoder_src/SOH.c

@@ -1,772 +1,251 @@
-/*
- * File: SOH.c
- *
- * Code generated for Simulink model 'SOH'.
- *
- * Model version                  : 1.38
- * Simulink Coder version         : 9.4 (R2020b) 29-Jul-2020
- * C/C++ source code generated on : Thu Sep  9 18:12:51 2021
- *
- * Target selection: ert.tlc
- * Embedded hardware selection: Intel->x86-64 (Windows64)
- * Code generation objectives: Unspecified
- * Validation result: Not run
- */
-
 #include "SOH.h"
-#include "SOH_private.h"
-#include "div_nde_s32_floor.h"
 #include "look1_iu16lu16n16tu16_binlcase.h"
 
-MdlrefDW_SOH_T SOH_MdlrefDW;
-
-/* Block signals (default storage) */
-B_SOH_c_T SOH_B;
-
-/* Block states (default storage) */
-DW_SOH_f_T SOH_DW;
-
-/*
- * System initialize for atomic system:
- *    '<S14>/Min'
- *    '<S14>/Min1'
- *    '<S23>/Min1'
- */
-void SOH_Min_Init(uint16_T *rty_Min)
-{
-  /* SystemInitialize for Chart: '<S16>/ArrMin' */
-  *rty_Min = 0U;
-}
-
-/*
- * Output and update for atomic system:
- *    '<S14>/Min'
- *    '<S14>/Min1'
- *    '<S23>/Min1'
- */
-uint16_T SOH_Min(const uint16_T rtu_Arry[28])
-{
-  uint16_T rty_Min_0;
-  uint8_T i;
-
-  /* Chart: '<S16>/ArrMin' incorporates:
-   *  Constant: '<S16>/Constant'
-   */
-  i = 0U;
-  rty_Min_0 = rtu_Arry[0];
-  while (i < cmnc_num_cellUNum) {
-    if (rty_Min_0 > rtu_Arry[i]) {
-      rty_Min_0 = rtu_Arry[i];
-    }
 
-    i++;
-  }
+boolean_T FirstRun_SOH;
 
-  /* End of Chart: '<S16>/ArrMin' */
-  return rty_Min_0;
-}
-
-/* System initialize for referenced model: 'SOH' */
 void SOH_Init(void)
 {
-  /* local block i/o variables */
-  uint16_T rtb_Min;
-  uint16_T rtb_Min_o;
-  uint16_T rtb_Min_g;
-
-  /* InitializeConditions for UnitDelay: '<S21>/Unit Delay1' */
-  SOH_DW.UnitDelay1_DSTATE = true;
-
-  /* InitializeConditions for UnitDelay: '<S6>/Unit Delay' */
-  SOH_DW.UnitDelay_DSTATE = 1U;
-
-  /* SystemInitialize for Atomic SubSystem: '<S23>/Min1' */
-  SOH_Min_Init(&rtb_Min);
-
-  /* End of SystemInitialize for SubSystem: '<S23>/Min1' */
-
-  /* SystemInitialize for Enabled SubSystem: '<S3>/Subsystem' */
-  /* InitializeConditions for UnitDelay: '<S15>/Unit Delay1' */
-  SOH_DW.UnitDelay1_DSTATE_g = true;
-
-  /* SystemInitialize for Atomic SubSystem: '<S14>/Min' */
-  SOH_Min_Init(&rtb_Min_g);
-
-  /* End of SystemInitialize for SubSystem: '<S14>/Min' */
-
-  /* SystemInitialize for Atomic SubSystem: '<S14>/Min1' */
-  SOH_Min_Init(&rtb_Min_o);
-
-  /* End of SystemInitialize for SubSystem: '<S14>/Min1' */
-  /* End of SystemInitialize for SubSystem: '<S3>/Subsystem' */
-
-  /* SystemInitialize for Chart: '<S3>/Chart' */
-  SOH_DW.Fflg = true;
-
-  /* SystemInitialize for Enabled SubSystem: '<S6>/Resettable Subsystem' */
-  /* InitializeConditions for UnitDelay: '<S9>/Time_Delay' */
-  SOH_DW.Time_Delay_DSTATE = 1U;
-  SOH_DW.Ahincr_reset_DSTATE=0;
-  SOH_DW.reset_DSTATE=0;
-  SOH_DW.ResettableSubsystem_MODE=0;
-  SOH_DW.ResettableSubsystem_MODE_i=0;
-  SOH_DW.reset_DSTATE_b=0;
-  SOH_DW.sohd_flg_chrgEndEo_reset_DSTATE=0;
-  SOH_DW.sohd_tm_chrgStartSta_Delay_DSTA=0;
-
-  /* End of SystemInitialize for SubSystem: '<S6>/Resettable Subsystem' */
-}
-
-/* Disable for referenced model: 'SOH' */
-void SOH_Disable(void)
-{
-  /* Disable for Enabled SubSystem: '<S6>/Resettable Subsystem' */
-  SOH_DW.ResettableSubsystem_MODE_i = false;
-
-  /* End of Disable for SubSystem: '<S6>/Resettable Subsystem' */
-
-  /* Disable for Enabled SubSystem: '<S7>/Enabled Subsystem' */
-  SOH_DW.EnabledSubsystem_MODE = false;
-
-  /* End of Disable for SubSystem: '<S7>/Enabled Subsystem' */
-
-  /* Disable for Enabled SubSystem: '<S8>/Resettable Subsystem' */
-  SOH_DW.ResettableSubsystem_MODE = false;
-
-  /* End of Disable for SubSystem: '<S8>/Resettable Subsystem' */
+    FirstRun_SOH = true ;
 }
 
-/* Output and update for referenced model: 'SOH' */
 void SOH(void)
 {
-  /* local block i/o variables */
-  uint16_T rtb_Min;
-  uint16_T rtb_Min_o;
-  uint16_T rtb_Min_g;
-  int32_T i_0;
-  int32_T tmp;
-  int16_T rtb_Divide1;
-  uint16_T rtb_SOC2[28];
-  uint16_T rtb_sohn_V_chrgStartStatEE_Merg[28];
-  uint16_T rtb_sohn_Q_packCapArrEE_Merge[10];
-  uint16_T maxV;
-  uint16_T minV;
-  uint16_T rtb_Max;
-  uint16_T rtb_sohn_Q_chrgEE_Merge;
-  uint8_T i;
-  boolean_T rtb_LogicalOperator_g;
-  boolean_T rtb_RelationalOperator2_l;
-
-  /* Outputs for Atomic SubSystem: '<S23>/Min1' */
-  /* Inport: '<Root>/sohv_Q_cellCapArrEi 1' */
-  rtb_Min = SOH_Min((&(sohv_Q_cellCapArrEi[0])));
-
-  /* End of Outputs for SubSystem: '<S23>/Min1' */
-
-  /* Outputs for Atomic SubSystem: '<S23>/Max' */
-  /* Chart: '<S26>/ArrMin' incorporates:
-   *  Constant: '<S26>/Constant'
-   *  Inport: '<Root>/sohv_Q_cellCapArrEi 1'
-   */
-  i = 0U;
-  rtb_Max = sohv_Q_cellCapArrEi[0];
-  while (i < cmnc_num_cellUNum) {
-    if (rtb_Max < sohv_Q_cellCapArrEi[i]) {
-      rtb_Max = sohv_Q_cellCapArrEi[i];
-    }
-
-    i++;
-  }
-
-  /* End of Chart: '<S26>/ArrMin' */
-  /* End of Outputs for SubSystem: '<S23>/Max' */
-
-  /* MinMax: '<S23>/Min' incorporates:
-   *  Inport: '<Root>/sohv_Q_packCapArrEi '
-   */
-  minV = sohv_Q_packCapArrEi[0];
-
-  /* MinMax: '<S23>/Min2' incorporates:
-   *  Inport: '<Root>/sohv_Q_packCapArrEi '
-   */
-  maxV = sohv_Q_packCapArrEi[0];
-  for (i_0 = 0; i_0 < 9; i_0++) {
-    /* MinMax: '<S23>/Min' incorporates:
-     *  Inport: '<Root>/sohv_Q_packCapArrEi '
-     *  MinMax: '<S23>/Min2'
-     */
-    rtb_sohn_Q_chrgEE_Merge = sohv_Q_packCapArrEi[i_0 + 1];
-    if (minV >= rtb_sohn_Q_chrgEE_Merge) {
-      minV = sohv_Q_packCapArrEi[i_0 + 1];
-    }
-
-    /* MinMax: '<S23>/Min2' incorporates:
-     *  Inport: '<Root>/sohv_Q_packCapArrEi '
-     *  MinMax: '<S23>/Min'
-     */
-    if (maxV <= rtb_sohn_Q_chrgEE_Merge) {
-      maxV = rtb_sohn_Q_chrgEE_Merge;
-    }
-  }
-
-  /* If: '<S5>/If' incorporates:
-   *  Constant: '<S23>/C'
-   *  Constant: '<S23>/C1'
-   *  Constant: '<S23>/C2'
-   *  Inport: '<Root>/sohd_Q_chrgEi '
-   *  Inport: '<Root>/sohd_flg_chrgEndEi '
-   *  Inport: '<Root>/sohv_Q_cellCapArrEi 1'
-   *  Inport: '<Root>/sohv_Q_packCapArrEi '
-   *  Inport: '<Root>/sohv_V_chrgStartStatEi '
-   *  Inport: '<S25>/sohd_Q_chrgEi '
-   *  Inport: '<S25>/sohd_flg_chrgEndEi '
-   *  Inport: '<S25>/sohv_Q_cellCapArrEi'
-   *  Inport: '<S25>/sohv_Q_packCapArrEi '
-   *  Inport: '<S25>/sohv_V_chrgStartStatEi '
-   *  Logic: '<S23>/Logical Operator3'
-   *  Merge: '<S5>/sohn_Q_chrgEE_Merge'
-   *  Merge: '<S5>/sohn_Q_packCapArrEE_Merge'
-   *  Merge: '<S5>/sohn_V_chrgStartStatEE_Merge'
-   *  MinMax: '<S23>/Min'
-   *  MinMax: '<S23>/Min2'
-   *  RelationalOperator: '<S23>/Relational Operator1'
-   *  RelationalOperator: '<S23>/Relational Operator2'
-   *  RelationalOperator: '<S23>/Relational Operator3'
-   *  RelationalOperator: '<S23>/Relational Operator4'
-   *  RelationalOperator: '<S23>/Relational Operator5'
-   *  UnitDelay: '<S6>/sohv_V_chrgStartEo_Delay'
-   */
-  if ((sohd_Q_chrgEi < cmnc_Q_ratedCp) && (rtb_Min >= 10) && (rtb_Max <=
-       cmnc_Q_ratedCp) && (minV >= 10) && (maxV <= cmnc_Q_ratedCp)) {
-    /* Outputs for IfAction SubSystem: '<S5>/TureAction' incorporates:
-     *  ActionPort: '<S25>/Action Port'
-     */
-    rtb_LogicalOperator_g = sohd_flg_chrgEndEi;
-    for (i_0 = 0; i_0 < 28; i_0++) {
-      rtb_sohn_V_chrgStartStatEE_Merg[i_0] = sohv_V_chrgStartStatEi[i_0];
-    }
-
-    rtb_sohn_Q_chrgEE_Merge = sohd_Q_chrgEi;
-    for (i_0 = 0; i_0 < 10; i_0++) {
-      rtb_sohn_Q_packCapArrEE_Merge[i_0] = sohv_Q_packCapArrEi[i_0];
-    }
-
-    for (i_0 = 0; i_0 < 28; i_0++) {
-      sohv_Q_cellCapArrEo[i_0] = sohv_Q_cellCapArrEi[i_0];
-    }
-
-    /* End of Outputs for SubSystem: '<S5>/TureAction' */
-  } else {
-    /* Outputs for IfAction SubSystem: '<S5>/FalseAction' incorporates:
-     *  ActionPort: '<S24>/Action Port'
-     */
-    for (i_0 = 0; i_0 < 28; i_0++) {
-      /* SignalConversion generated from: '<S24>/sohn_V_chrgStartStatEE1' incorporates:
-       *  Merge: '<S5>/sohn_V_chrgStartStatEE_Merge'
-       */
-      rtb_sohn_V_chrgStartStatEE_Merg[i_0] = 0U;
-
-      /* Product: '<S24>/Product1' incorporates:
-       *  Constant: '<S24>/Constant7'
-       *  UnitDelay: '<S6>/sohv_V_chrgStartEo_Delay'
-       */
-      sohv_Q_cellCapArrEo[i_0] = (uint16_T)((((5U * cmnc_Q_ratedCp) >> 3) *
-        52429U) >> 15);
-    }
-
-    /* Product: '<S24>/Product' incorporates:
-     *  Constant: '<S24>/Constant5'
-     *  Merge: '<S5>/sohn_Q_packCapArrEE_Merge'
-     */
-    for (i_0 = 0; i_0 < 10; i_0++) {
-      rtb_sohn_Q_packCapArrEE_Merge[i_0] = (uint16_T)((((5U * cmnc_Q_ratedCp) >>
-        3) * 52429U) >> 15);
-    }
-
-    /* End of Product: '<S24>/Product' */
-
-    /* SignalConversion generated from: '<S24>/sohn_flg_chrgEndEE1' incorporates:
-     *  Constant: '<S24>/Constant'
-     */
-    rtb_LogicalOperator_g = false;
-
-    /* SignalConversion generated from: '<S24>/sohn_Q_chrgEE1' incorporates:
-     *  Constant: '<S24>/Constant3'
-     *  Merge: '<S5>/sohn_Q_chrgEE_Merge'
-     */
-    rtb_sohn_Q_chrgEE_Merge = 0U;
-
-    /* End of Outputs for SubSystem: '<S5>/FalseAction' */
-  }
-
-  /* End of If: '<S5>/If' */
-
-  /* Outputs for Enabled SubSystem: '<S21>/Subsystem3' incorporates:
-   *  EnablePort: '<S22>/Enable'
-   */
-  /* UnitDelay: '<S21>/Unit Delay1' incorporates:
-   *  Inport: '<Root>/sfmd_flg_volFlt '
-   *  Inport: '<S22>/in'
-   *  Logic: '<S4>/Logical Operator1'
-   */
-  if (SOH_DW.UnitDelay1_DSTATE) {
-    SOH_B.in_g = !sfmd_flg_volFlt;
-  }
-
-  /* End of UnitDelay: '<S21>/Unit Delay1' */
-  /* End of Outputs for SubSystem: '<S21>/Subsystem3' */
-
-  /* Logic: '<S4>/Logical Operator' incorporates:
-   *  Constant: '<S4>/Constant1'
-   *  Inport: '<Root>/ihd_tm_parkTime'
-   *  Merge: '<S5>/sohn_Q_chrgEE_Merge'
-   *  RelationalOperator: '<S4>/Relational Operator'
-   *  RelationalOperator: '<S4>/Relational Operator1'
-   */
-  rtb_LogicalOperator_g = ((ihd_tm_parkTime >= cmnc_tm_parkTime) && SOH_B.in_g &&
-    rtb_LogicalOperator_g && (rtb_sohn_Q_chrgEE_Merge >= 150));
-
-  /* Outputs for Enabled SubSystem: '<S3>/Subsystem' incorporates:
-   *  EnablePort: '<S14>/Enable'
-   */
-  if (rtb_LogicalOperator_g) {
-    /* Outputs for Enabled SubSystem: '<S15>/Subsystem3' incorporates:
-     *  EnablePort: '<S18>/Enable'
-     */
-    for (i_0 = 0; i_0 < 28; i_0++) {
-      /* UnitDelay: '<S15>/Unit Delay1' incorporates:
-       *  Inport: '<Root>/sfmv_V_cellU'
-       *  Inport: '<S18>/in'
-       *  Lookup_n-D: '<S14>/SOC2'
-       */
-      if (SOH_DW.UnitDelay1_DSTATE_g) {
-        SOH_B.in[i_0] = look1_iu16lu16n16tu16_binlcase(sfmv_V_cellU[i_0],
-          (&(cmnm_V_ocv[0])), (&(cmnm_pct_soc[0])), 12U);
-      }
-
-      /* End of UnitDelay: '<S15>/Unit Delay1' */
-
-      /* Lookup_n-D: '<S14>/SOC1' incorporates:
-       *  Merge: '<S5>/sohn_V_chrgStartStatEE_Merge'
-       *  Sum: '<S14>/Add1'
-       */
-      SOH_B.d[i_0] = look1_iu16lu16n16tu16_binlcase
-        (rtb_sohn_V_chrgStartStatEE_Merg[i_0], (&(cmnm_V_ocv[0])),
-         (&(cmnm_pct_soc[0])), 12U);
-
-      /* Product: '<S14>/d' incorporates:
-       *  Inport: '<S18>/in'
-       *  Product: '<S14>/Divide4'
-       *  Sum: '<S14>/Add'
-       *  Sum: '<S14>/Add1'
-       */
-      tmp = (int32_T)((((uint32_T)(uint16_T)(SOH_B.in[i_0] - SOH_B.d[i_0]) << 6)
-                       / 125U * 125U) >> 6);
-
-      /* Product: '<S14>/d' incorporates:
-       *  Inport: '<S18>/in'
-       *  Merge: '<S5>/sohn_Q_chrgEE_Merge'
-       *  Sum: '<S14>/Add'
-       */
-      SOH_B.d[i_0] = (uint16_T)(((uint16_T)((uint32_T)tmp == 0U ? MAX_uint32_T :
-        ((uint32_T)rtb_sohn_Q_chrgEE_Merge << 9) / tmp) * 125U) >> 6);
-
-      /* Product: '<S14>/Divide5' incorporates:
-       *  Inport: '<S18>/in'
-       */
-      rtb_Max = (uint16_T)((((uint32_T)SOH_B.in[i_0] << 6) / 125U * 125U) >> 6);
-
-      /* Lookup_n-D: '<S14>/SOC2' incorporates:
-       *  Constant: '<S14>/Constant3'
-       *  Product: '<S14>/Divide3'
-       *  Product: '<S14>/d'
-       *  Sum: '<S14>/Add1'
-       */
-      rtb_SOC2[i_0] = (uint16_T)(((uint16_T)(((uint32_T)(uint16_T)(1000 -
-        rtb_Max) * SOH_B.d[i_0]) >> 10) * 16777U) >> 14);
-
-      /* Product: '<S14>/Divide5' incorporates:
-       *  Product: '<S14>/Divide2'
-       *  Product: '<S14>/d'
-       */
-      rtb_sohn_V_chrgStartStatEE_Merg[i_0] = (uint16_T)(((uint16_T)(((uint32_T)
-        SOH_B.d[i_0] * rtb_Max) >> 10) * 16777U) >> 14);
-    }
-
-    /* End of Outputs for SubSystem: '<S15>/Subsystem3' */
-
-    /* Outputs for Atomic SubSystem: '<S14>/Min' */
-    rtb_Min_g = SOH_Min(rtb_SOC2);
-
-    /* End of Outputs for SubSystem: '<S14>/Min' */
-
-    /* Outputs for Atomic SubSystem: '<S14>/Min1' */
-    rtb_Min_o = SOH_Min(rtb_sohn_V_chrgStartStatEE_Merg);
-
-    /* End of Outputs for SubSystem: '<S14>/Min1' */
-
-    /* Sum: '<S14>/Add2' */
-    SOH_B.Add2 = (uint16_T)((uint32_T)rtb_Min_g + rtb_Min_o);
-
-    /* Update for UnitDelay: '<S15>/Unit Delay1' incorporates:
-     *  Constant: '<S15>/Constant1'
-     */
-    SOH_DW.UnitDelay1_DSTATE_g = false;
-  }
-
-  /* End of Outputs for SubSystem: '<S3>/Subsystem' */
-  for (i_0 = 0; i_0 < 28; i_0++) {
-    /* Switch: '<S3>/Switch' */
-    if (rtb_LogicalOperator_g) {
-      /* Switch: '<S3>/Switch' incorporates:
-       *  Product: '<S14>/d'
-       */
-      sohv_Q_cellCapArrEo[i_0] = SOH_B.d[i_0];
-    }
-
-    /* End of Switch: '<S3>/Switch' */
-
-    /* SignalConversion: '<S3>/Signal Conversion' incorporates:
-     *  Switch: '<S3>/Switch'
-     */
-    sohv_Q_cellCap[i_0] = sohv_Q_cellCapArrEo[i_0];
-  }
-
-  /* Chart: '<S3>/Chart' incorporates:
-   *  Merge: '<S5>/sohn_Q_packCapArrEE_Merge'
-   *  Sum: '<S14>/Add2'
-   */
-  i = 0U;
-  if (SOH_DW.Fflg) {
-    for (i_0 = 0; i_0 < 10; i_0++) {
-      SOH_B.sohn_Q_packCapArrEo[i_0] = rtb_sohn_Q_packCapArrEE_Merge[i_0];
-    }
-
-    tmp = rtb_sohn_Q_packCapArrEE_Merge[9] - SOH_B.Add2;
-    if (tmp < 0) {
-      tmp = -tmp;
-    }
-
-    if (rtb_LogicalOperator_g && (tmp < 50)) {
-      while (i < 9) {
-        SOH_B.sohn_Q_packCapArrEo[i] = rtb_sohn_Q_packCapArrEE_Merge[i + 1];
-        i++;
-      }
-
-      SOH_B.sohn_Q_packCapArrEo[9] = SOH_B.Add2;
-    }
-
-    i = 0U;
-    rtb_sohn_Q_chrgEE_Merge = 0U;
-    while (i < 10) {
-      tmp = rtb_sohn_Q_chrgEE_Merge + SOH_B.sohn_Q_packCapArrEo[i];
-      if (tmp > 65535) {
-        tmp = 65535;
-      }
-
-      rtb_sohn_Q_chrgEE_Merge = (uint16_T)tmp;
-      i++;
-    }
-
-    SOH_B.Qavrg = (uint16_T)(rtb_sohn_Q_chrgEE_Merge / 10U);
-  }
-
-  SOH_DW.Fflg = false;
-
-  /* End of Chart: '<S3>/Chart' */
-  for (i_0 = 0; i_0 < 10; i_0++) {
-    /* SignalConversion generated from: '<S3>/Chart' */
-    sohv_Q_packCapArrEo[i_0] = SOH_B.sohn_Q_packCapArrEo[i_0];
-  }
-
-  /* Sum: '<S6>/Add1' incorporates:
-   *  Constant: '<S3>/Constant2'
-   *  Product: '<S3>/Divide'
-   *  Product: '<S3>/Product'
-   */
-  sohd_pct_bcuSoh = (uint16_T)(((uint16_T)(cmnc_Q_ratedCp == 0U ? MAX_uint32_T :
-    ((uint32_T)(uint16_T)(((uint16_T)((SOH_B.Qavrg * 125U) >> 1) * 52429U) >> 15)
-     << 3) / cmnc_Q_ratedCp) * 5U) >> 2);
-
-  /* Saturate: '<S3>/Saturation' incorporates:
-   *  Sum: '<S6>/Add1'
-   */
-  if (sohd_pct_bcuSoh >= 1000) {
-    /* Saturate: '<S3>/Saturation' */
-    sohd_pct_bcuSoh = 1000U;
-  }
-
-  /* End of Saturate: '<S3>/Saturation' */
-
-  /* Logic: '<S6>/Logical Operator' incorporates:
-   *  Constant: '<S6>/Constant'
-   *  Constant: '<S6>/Constant1'
-   *  Inport: '<Root>/ihd_st_ChrgStat '
-   *  RelationalOperator: '<S6>/Relational Operator'
-   *  RelationalOperator: '<S6>/Relational Operator1'
-   *  UnitDelay: '<S6>/Unit Delay'
-   */
-  rtb_LogicalOperator_g = ((SOH_DW.UnitDelay_DSTATE != 2) && (ihd_st_workStat ==
-    2));
-
-  /* Abs: '<S6>/Abs' incorporates:
-   *  Inport: '<Root>/sfmd_I_curr'
-   */
-  if (sfmd_I_curr < 0) {
-    rtb_Divide1 = (int16_T)-sfmd_I_curr;
-  } else {
-    rtb_Divide1 = sfmd_I_curr;
-  }
-
-  /* End of Abs: '<S6>/Abs' */
-
-  /* RelationalOperator: '<S6>/Relational Operator2' */
-  rtb_RelationalOperator2_l = (rtb_Divide1 <= 10);
-
-  /* Outputs for Enabled SubSystem: '<S6>/Resettable Subsystem1' incorporates:
-   *  EnablePort: '<S10>/Enable'
-   */
-  for (i_0 = 0; i_0 < 28; i_0++) {
-    if (rtb_RelationalOperator2_l) {
-      /* Inport: '<S10>/ihv_V_CellU' incorporates:
-       *  Inport: '<Root>/sfmv_V_cellU'
-       */
-      SOH_B.ihv_V_CellU[i_0] = sfmv_V_cellU[i_0];
-    }
-
-    /* Switch: '<S6>/Switch' */
-    if (rtb_LogicalOperator_g) {
-      /* Switch: '<S6>/Switch' incorporates:
-       *  Inport: '<S10>/ihv_V_CellU'
-       */
-      sohv_V_chrgStartStatEo[i_0] = SOH_B.ihv_V_CellU[i_0];
-    }
-
-    /* End of Switch: '<S6>/Switch' */
-  }
-
-  /* End of Outputs for SubSystem: '<S6>/Resettable Subsystem1' */
-
-  /* Outputs for Enabled SubSystem: '<S6>/Resettable Subsystem' incorporates:
-   *  EnablePort: '<S9>/Enable'
-   */
-  if (rtb_RelationalOperator2_l) {
-    if (!SOH_DW.ResettableSubsystem_MODE_i) {
-      /* InitializeConditions for UnitDelay: '<S9>/Time_Delay' */
-      SOH_DW.Time_Delay_DSTATE = 1U;
-      SOH_DW.ResettableSubsystem_MODE_i = true;
-    }
-
-    /* Sum: '<S9>/Add' incorporates:
-     *  Constant: '<S9>/Constant'
-     *  UnitDelay: '<S9>/Time_Delay'
-     */
-    SOH_DW.Time_Delay_DSTATE++;
-
-    /* Product: '<S9>/Divide' incorporates:
-     *  Constant: '<S9>/Constant1'
-     *  UnitDelay: '<S9>/Time_Delay'
-     */
-    SOH_B.Divide = (uint16_T)(SOH_DW.Time_Delay_DSTATE / 10U);
-  } else {
-    SOH_DW.ResettableSubsystem_MODE_i = false;
-  }
-
-  /* End of Outputs for SubSystem: '<S6>/Resettable Subsystem' */
-
-  /* Logic: '<S6>/Logical Operator1' incorporates:
-   *  Logic: '<S6>/Logical Operator2'
-   *  UnitDelay: '<S6>/reset'
-   */
-  SOH_DW.reset_DSTATE = ((!rtb_RelationalOperator2_l) || SOH_DW.reset_DSTATE);
-
-  /* Switch: '<S6>/Switch2' incorporates:
-   *  Sum: '<S6>/Add'
-   *  UnitDelay: '<S6>/sohd_tm_chrgStartSta_Delay'
-   */
-  if (rtb_LogicalOperator_g) {
-    /* Switch: '<S6>/Switch1' incorporates:
-     *  Constant: '<S6>/Constant3'
-     *  Inport: '<Root>/ihd_tm_parkTime'
-     *  UnitDelay: '<S6>/reset'
-     */
-    if (SOH_DW.reset_DSTATE) {
-      rtb_sohn_Q_chrgEE_Merge = 0U;
-    } else {
-      rtb_sohn_Q_chrgEE_Merge = ihd_tm_parkTime;
-    }
-
-    /* End of Switch: '<S6>/Switch1' */
-    SOH_DW.sohd_tm_chrgStartSta_Delay_DSTA = (uint16_T)((uint32_T)SOH_B.Divide +
-      rtb_sohn_Q_chrgEE_Merge);
-  }
-
-  /* End of Switch: '<S6>/Switch2' */
-
-  /* Saturate: '<S6>/Saturation1' incorporates:
-   *  UnitDelay: '<S6>/sohd_tm_chrgStartSta_Delay'
-   */
-  if (SOH_DW.sohd_tm_chrgStartSta_Delay_DSTA > 60) {
-    rtb_sohn_Q_chrgEE_Merge = SOH_DW.sohd_tm_chrgStartSta_Delay_DSTA;
-  } else {
-    rtb_sohn_Q_chrgEE_Merge = 60U;
-  }
-
-  /* End of Saturate: '<S6>/Saturation1' */
-
-  /* Saturate: '<S6>/Saturation' incorporates:
-   *  Constant: '<S6>/Constant4'
-   *  Sum: '<S6>/Add1'
-   */
-  sohd_tm_chrgStartStatEo = (uint16_T)(rtb_sohn_Q_chrgEE_Merge - 60);
-
-  /* UnitDelay: '<S7>/Unit Delay' incorporates:
-   *  UnitDelay: '<S6>/Unit Delay'
-   */
-  SOH_DW.UnitDelay_DSTATE = SOH_DW.UnitDelay_DSTATE_g;
-
-  /* RelationalOperator: '<S7>/Relational Operator' incorporates:
-   *  Constant: '<S7>/Constant'
-   *  UnitDelay: '<S6>/Unit Delay'
-   */
-  rtb_LogicalOperator_g = (SOH_DW.UnitDelay_DSTATE == 2);
-
-  /* Outputs for Enabled SubSystem: '<S7>/Enabled Subsystem' incorporates:
-   *  EnablePort: '<S11>/Enable'
-   */
-  if (rtb_LogicalOperator_g) {
-    if (!SOH_DW.EnabledSubsystem_MODE) {
-      /* InitializeConditions for UnitDelay: '<S11>/reset' */
-      SOH_DW.reset_DSTATE_b = false;
-      SOH_DW.EnabledSubsystem_MODE = true;
-    }
-
-    /* Logic: '<S11>/Logical Operator' incorporates:
-     *  Inport: '<Root>/sfmd_flg_currFlt'
-     *  UnitDelay: '<S11>/reset'
-     */
-    SOH_DW.reset_DSTATE_b = (sfmd_flg_currFlt || SOH_DW.reset_DSTATE_b);
-  } else {
-    SOH_DW.EnabledSubsystem_MODE = false;
-  }
-
-  /* End of Outputs for SubSystem: '<S7>/Enabled Subsystem' */
-
-  /* Switch: '<S7>/Switch' incorporates:
-   *  Constant: '<S7>/Constant1'
-   *  Inport: '<Root>/ihd_st_ChrgStat '
-   *  Logic: '<S7>/Logical Operator'
-   *  RelationalOperator: '<S7>/Relational Operator1'
-   *  UnitDelay: '<S7>/sohd_flg_chrgEndEo_reset'
-   */
-  rtb_LogicalOperator_g = ((rtb_LogicalOperator_g && (ihd_st_workStat != 2)) ||
-    SOH_DW.sohd_flg_chrgEndEo_reset_DSTATE);
-
-  /* Logic: '<S7>/Logical Operator1' incorporates:
-   *  Logic: '<S7>/Logical Operator2'
-   *  UnitDelay: '<S11>/reset'
-   */
-  sohd_flg_chrgEndEo = ((!SOH_DW.reset_DSTATE_b) && rtb_LogicalOperator_g);
-
-  /* Abs: '<S7>/Abs' incorporates:
-   *  Inport: '<Root>/sfmd_I_curr'
-   */
-  if (sfmd_I_curr < 0) {
-    rtb_Divide1 = (int16_T)-sfmd_I_curr;
-  } else {
-    rtb_Divide1 = sfmd_I_curr;
-  }
-
-  /* End of Abs: '<S7>/Abs' */
-
-  /* Logic: '<S7>/Logical Operator3' incorporates:
-   *  RelationalOperator: '<S7>/Relational Operator3'
-   *  UnitDelay: '<S7>/sohd_flg_chrgEndEo_reset'
-   */
-  SOH_DW.sohd_flg_chrgEndEo_reset_DSTATE = (rtb_LogicalOperator_g &&
-    (rtb_Divide1 < 10));
-
-  /* Outputs for Enabled SubSystem: '<S8>/Resettable Subsystem' incorporates:
-   *  EnablePort: '<S12>/Enable'
-   */
-  /* RelationalOperator: '<S8>/Relational Operator1' incorporates:
-   *  Constant: '<S8>/Constant1'
-   *  Inport: '<Root>/ihd_st_ChrgStat '
-   */
-  if (ihd_st_workStat == 2) {
-    if (!SOH_DW.ResettableSubsystem_MODE) {
-      /* InitializeConditions for UnitDelay: '<S12>/Ahincr_reset' */
-      SOH_DW.Ahincr_reset_DSTATE = 0;
-      SOH_DW.ResettableSubsystem_MODE = true;
-    }
-
-    /* Sum: '<S12>/Add' incorporates:
-     *  Inport: '<Root>/sfmd_I_curr'
-     *  UnitDelay: '<S12>/Ahincr_reset'
-     */
-    SOH_DW.Ahincr_reset_DSTATE += sfmd_I_curr * 10;
+    uint16_T i;
+    uint16_T cellCapArr_Min;
+    uint16_T cellCapArr_Max;
+    uint16_T packCapArr_Min;
+    uint16_T packCapArr_Max;
+    static uint16_T sohn_V_chrgStartStatEE[28];
+    static uint16_T sohn_Q_cellCapArrEE[28];
+    static uint16_T sohn_Q_packCapArrEE[10];
+    static uint16_T sohn_Q_chrgEE;
+    static uint16_T sohn_tm_chrgStartStatEE;
+    static uint16_T sohn_flg_chrgEndEE;
+    //
+    boolean_T sohn_flg_countEn;
+    uint16_T soc1[28];
+    uint16_T soc2[28];
+    uint16_T deltSoc[28];
+    uint16_T temp[28];
+    uint16_T chrgCellCapArr[28];
+    uint16_T disChrgCellCapArr[28];
+    boolean_T sohn_flg_update;
+    uint16_T chrgCap_Min;
+    uint16_T disChrgCap_Min;
+    uint16_T SumQ;
+    //
+    static uint16_T sohn_V_chrgStartStat[28];
+    static uint8_T ihd_st_workStat_Delay;
+    static boolean_T sohn_flg_chrgEnd_Delay;
+    boolean_T sohn_flg_chrgEnd;
+    //
+    static real_T Ahincr;
+    int32_T  tmp_0; 
+    static boolean_T sfmn_flg_currFlt_keep;
+    static boolean_T sohn_flg_currFlt;
+    
+    
+    if(FirstRun_SOH)
+    {   
+        sohn_flg_update = true;
+        sfmn_flg_currFlt_keep = false;
+        sohn_flg_currFlt = false;
+        Ahincr = 0;
+        ihd_st_workStat_Delay = 0;
+        sohn_flg_chrgEnd_Delay = false;
+    }
+	
+    if(FirstRun_SOH)
+    {
+        //=======================================================================================
+        //--------------------------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);
+        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));
+			for(i=0 ; i < cmnc_num_cellUNum;i++)
+			{
+			   sohn_Q_cellCapArrEE[i] = cmnc_Q_ratedCp;
+			}
+			for(i=0 ; i < 10;i++)
+			{
+			   sohn_Q_packCapArrEE[i] = cmnc_Q_ratedCp;
+			}
+   
+            sohn_Q_chrgEE =0;
+            sohn_tm_chrgStartStatEE =0;
+            sohn_flg_chrgEndEE =0;
+        }
+        else
+        {
+            memcpy(sohn_V_chrgStartStatEE,sohv_V_chrgStartStatEi, sizeof(sohv_V_chrgStartStatEi));
+            memcpy(sohn_Q_cellCapArrEE,sohv_Q_cellCapArrEi, sizeof(sohv_Q_cellCapArrEi));
+            memcpy(sohn_Q_packCapArrEE,sohv_Q_packCapArrEi, sizeof(sohv_Q_packCapArrEi));
+            sohn_Q_chrgEE = sohd_Q_chrgEi;
+            sohn_tm_chrgStartStatEE = sohd_tm_chrgStartStatEi;
+            sohn_flg_chrgEndEE = sohd_flg_chrgEndEi;
+        }
+
+ 		//=======================================================================================
+        //--------------------------计算使能-------------------------------------------------------
+        //=======================================================================================
+        if(ihd_tm_parkTime > cmnc_tm_parkTime && sohn_flg_chrgEndEE && sohn_Q_chrgEE > 15 && !sfmd_flg_volFlt )
+        {
+            sohn_flg_countEn = true;
+        }
+        else
+        {
+            sohn_flg_countEn = false;
+        }
+
+		//=======================================================================================
+        //------------------------SOH 计算-------------------------------------------------------
+        //=======================================================================================
+        if(sohn_flg_countEn)
+        {
+            sohn_flg_update = true;
+            for(i = 0;i < cmnc_num_cellUNum;i++)
+            {
+                soc2[i] =  look1_iu16lu16n16tu16_binlcase(sfmv_V_cellU[i],(&(cmnm_V_ocv[0])), (&(cmnm_pct_soc[0])), 12U);
+                soc1[i] =  look1_iu16lu16n16tu16_binlcase(sohn_V_chrgStartStatEE[i],(&(cmnm_V_ocv[0])), (&(cmnm_pct_soc[0])), 12U);
+                deltSoc[i] = soc2[i] - soc1[i];
+                sohv_Q_cellCapArrEo[i] = (uint16_T)( (real_T)(sohn_Q_chrgEE * 0.1) / (real_T)(deltSoc[i]  * 0.1/100)  * 10);
+				
+                if( (int16_T)(sohv_Q_cellCapArrEo[i]) -sohn_Q_cellCapArrEE[i] > 50  ||  (int16_T)(sohv_Q_cellCapArrEo[i]) -sohn_Q_cellCapArrEE[i] < -50  )
+                {
+                    sohn_flg_update = false;
+                    break;
+                }
+            }
+
+			//===================
+            if(sohn_flg_update)
+            {   
+				for(i = 0;i < cmnc_num_cellUNum;i++)
+ 				{
+ 				     temp[i] = (real_T) (soc2[i] * 0.1) /100;
+                     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);
+                 for(i = 0; i < 9;i++)
+                 {
+                     sohv_Q_packCapArrEo[i] = sohn_Q_packCapArrEE[i+1];
+                 }
+                 sohv_Q_packCapArrEo[9] = chrgCap_Min + disChrgCap_Min;
+             }
+             else  //计算但结果偏差较大
+             {
+                 memcpy(sohv_Q_packCapArrEo,sohn_Q_packCapArrEE, sizeof(sohv_Q_packCapArrEo));
+                 memcpy(sohv_Q_cellCapArrEo,sohn_Q_cellCapArrEE, sizeof(sohv_Q_cellCapArrEo));
+             }   	
+         }
+         else  // 不计算
+         {
+             memcpy(sohv_Q_packCapArrEo,sohn_Q_packCapArrEE, sizeof(sohv_Q_packCapArrEo));
+             memcpy(sohv_Q_cellCapArrEo,sohn_Q_cellCapArrEE, sizeof(sohv_Q_cellCapArrEo));
+         }
+ 
+ 
+         SumQ=0;
+         for(i = 0; i < 10;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);
+	  }
+ 	 
+     //=======================================================================================
+     //----------------------充电前信息-------------------------------------------------------
+     //=======================================================================================
+     if (FirstRun_SOH)
+     {
+     	memcpy(sohn_V_chrgStartStat,appv_V_cellU, sizeof(appv_V_cellU));
+     }
+     
+     if(sfmd_I_curr < 10 && sfmd_I_curr > -10)
+     {
+         memcpy(sohn_V_chrgStartStat,sfmv_V_cellU, sizeof(sfmv_V_cellU));
+     }
+     //
+     if((ihd_st_workStat == 2) && (ihd_st_workStat_Delay != 2))
+     {
+        memcpy(sohv_V_chrgStartStatEo,sohn_V_chrgStartStat, sizeof(sohv_V_chrgStartStatEo));
+     }
+    //printf("sohv_V_chrgStartStatEo[16]:%d\n",sohv_V_chrgStartStatEo[16]);
+    //=======================================================================================
+    //----------------------充电中信息-------------------------------------------------------
+    //=======================================================================================
+    if(ihd_st_workStat == 2)
+    {
+        Ahincr = Ahincr + (real_T)sfmd_I_curr * 0.1;
+        tmp_0 = (int16_T)(Ahincr/36000 *10);
+		
+        sohd_Q_chrgEo =(tmp_0 > 0 ? (uint16_T)tmp_0 : 0);  
+        if(sfmd_flg_currFlt)
+        {
+            sfmn_flg_currFlt_keep = true;
+        }
+        sohn_flg_currFlt = sfmn_flg_currFlt_keep;
+        
+    }
+    else
+    {
+        sfmn_flg_currFlt_keep = false;
+        Ahincr = 0;
+    }
+	//printf("sohd_Q_chrgEo:%d\n",sohd_Q_chrgEo);
+	 //=======================================================================================
+    //----------------------充电结速信息------------------------------------------------------
+    //=======================================================================================
+    if((ihd_st_workStat != 2) && (ihd_st_workStat_Delay == 2))
+    {
+       sohn_flg_chrgEnd = true; 
+    }
+    else
+    {
+      sohn_flg_chrgEnd = ( sfmd_I_curr < 10 && sfmd_I_curr > -10) && sohn_flg_chrgEnd_Delay;
+    }
+	
+    sohn_flg_chrgEnd_Delay = sohn_flg_chrgEnd;
+    sohd_flg_chrgEndEo =  !sohn_flg_currFlt && sohn_flg_chrgEnd;
+    ihd_st_workStat_Delay = ihd_st_workStat;
+	FirstRun_SOH = false;	
+	//printf("sohd_flg_chrgEndEo:%d\n",sohd_flg_chrgEndEo);
+}
 
-    /* Product: '<S12>/Divide1' incorporates:
-     *  Product: '<S12>/Divide'
-     *  Sum: '<S12>/Add'
-     *  UnitDelay: '<S12>/Ahincr_reset'
-     */
-    rtb_Divide1 = (int16_T)(((int16_T)div_nde_s32_floor(div_nde_s32_floor
-      (SOH_DW.Ahincr_reset_DSTATE, 200) << 1, 4500) * 5) >> 2);
 
-    /* Saturate: '<S12>/Saturation' incorporates:
-     *  Product: '<S12>/Divide1'
-     */
-    if (rtb_Divide1 > 0) {
-      /* Saturate: '<S12>/Saturation' */
-      SOH_B.Saturation = (uint16_T)rtb_Divide1;
-    } else {
-      /* Saturate: '<S12>/Saturation' */
-      SOH_B.Saturation = 0U;
+////////////////////////////////////////////////////////////////
+void  ArrMax(uint16_T *Data,uint16_T *Max, uint16_T m)
+{
+    uint16_T i;
+    *Max = Data[0];
+    for(i = 0; i < m; i++)
+    {
+        if (*Max < Data[i])
+        {
+            *Max = Data[i];
+        }
     }
-
-    /* End of Saturate: '<S12>/Saturation' */
-  } else {
-    SOH_DW.ResettableSubsystem_MODE = false;
-  }
-
-  /* End of RelationalOperator: '<S8>/Relational Operator1' */
-  /* End of Outputs for SubSystem: '<S8>/Resettable Subsystem' */
-
-  /* SignalConversion generated from: '<S8>/Resettable Subsystem' incorporates:
-   *  Saturate: '<S12>/Saturation'
-   */
-  sohd_Q_chrgEo = SOH_B.Saturation;
-
-  /* Update for UnitDelay: '<S21>/Unit Delay1' incorporates:
-   *  Constant: '<S21>/Constant1'
-   */
-  SOH_DW.UnitDelay1_DSTATE = false;
-
-  /* Update for UnitDelay: '<S6>/Unit Delay' incorporates:
-   *  Inport: '<Root>/ihd_st_ChrgStat '
-   */
-  SOH_DW.UnitDelay_DSTATE = ihd_st_workStat;
-
-  /* Update for UnitDelay: '<S7>/Unit Delay' incorporates:
-   *  Inport: '<Root>/ihd_st_ChrgStat '
-   */
-  SOH_DW.UnitDelay_DSTATE_g = ihd_st_workStat;
 }
 
-/* Model initialize function */
-void SOH_initialize(const char_T **rt_errorStatus)
+///////////////////////////////////////////////////////////////////
+void  ArrMin(uint16_T *Data,uint16_T *Min, uint16_T m)
 {
-  RT_MODEL_SOH_T *const SOH_M = &(SOH_MdlrefDW.rtm);
-
-  /* Registration code */
-
-  /* initialize error status */
-  rtmSetErrorStatusPointer(SOH_M, rt_errorStatus);
+    uint16_T i;
+    *Min = Data[0];
+    for(i = 0; i < m; i++)
+    {
+        if (*Min > Data[i])
+        {
+            *Min = Data[i];
+        }
+    }
 }
-
-/*
- * File trailer for generated code.
- *
- * [EOF]
- */

+ 0 - 599
src/EmbeddedCoder_src/SOH1.c

@@ -1,599 +0,0 @@
-/*
- * File: SOH.c
- *
- * Code generated for Simulink model 'SOH'.
- *
- * Model version                  : 1.28
- * Simulink Coder version         : 9.4 (R2020b) 29-Jul-2020
- * C/C++ source code generated on : Wed Sep  1 19:07:37 2021
- *
- * Target selection: ert.tlc
- * Embedded hardware selection: Intel->x86-64 (Windows64)
- * Code generation objectives: Unspecified
- * Validation result: Not run
- */
-
-#include "SOH.h"
-#include "SOH_private.h"
-#include "div_nde_s32_floor.h"
-#include "look1_iu16lu16n16tu16_binlcase.h"
-
-MdlrefDW_SOH_T SOH_MdlrefDW;
-
-/* Block signals (default storage) */
-B_SOH_c_T SOH_B;
-
-/* Block states (default storage) */
-DW_SOH_f_T SOH_DW;
-
-/*
- * System initialize for atomic system:
- *    '<S14>/ArrMin'
- *    '<S15>/ArrMin'
- */
-void SOH_ArrMin_Init(uint16_T *rty_minCap)
-{
-  *rty_minCap = 0U;
-}
-
-/*
- * Output and update for atomic system:
- *    '<S14>/ArrMin'
- *    '<S15>/ArrMin'
- */
-void SOH_ArrMin(const uint16_T rtu_sohn_Q_cellCap[28], uint8_T rtu_N, uint16_T
-                *rty_minCap)
-{
-  uint8_T i;
-
-  /* Chart: '<S14>/ArrMin' */
-  i = 0U;
-  *rty_minCap = 1000U;
-  while (i < rtu_N) {
-    if (*rty_minCap > rtu_sohn_Q_cellCap[i]) {
-      *rty_minCap = rtu_sohn_Q_cellCap[i];
-    }
-
-    i++;
-  }
-
-  /* End of Chart: '<S14>/ArrMin' */
-}
-
-/* System initialize for referenced model: 'SOH' */
-void SOH_Init(void)
-{
-  /* local block i/o variables */
-  uint16_T rtb_minCap;
-  uint16_T rtb_minCap_g;
-
-  /* InitializeConditions for UnitDelay: '<S4>/First_Delay' */
-  SOH_DW.First_Delay_DSTATE = true;
-
-  /* InitializeConditions for UnitDelay: '<S6>/Unit Delay' */
-  SOH_DW.UnitDelay_DSTATE = 1U;
-
-  /* SystemInitialize for Enabled SubSystem: '<S3>/Subsystem' */
-
-  /* SystemInitialize for Chart: '<S14>/ArrMin' */
-  SOH_ArrMin_Init(&rtb_minCap_g);
-
-  /* SystemInitialize for Chart: '<S15>/ArrMin' */
-  SOH_ArrMin_Init(&rtb_minCap);
-
-  /* End of SystemInitialize for SubSystem: '<S3>/Subsystem' */
-
-  /* SystemInitialize for Chart: '<S3>/Chart' */
-  SOH_DW.Fflg = true;
-  //
-  SOH_B.Divide1=0;
-  SOH_DW.ResettableSubsystem_MODE=false;
-  SOH_DW.UnitDelay1_DSTATE=false;
-  SOH_DW.statflg_Delay_DSTATE=false;
-  SOH_DW.Time_Delay_DSTATE=0;
-  SOH_DW.sohd_tm_chrgStartSta_Delay_DSTA=0;
-}
-
-/* Disable for referenced model: 'SOH' */
-void SOH_Disable(void)
-{
-  /* Disable for Enabled SubSystem: '<S8>/Resettable Subsystem' */
-  SOH_DW.ResettableSubsystem_MODE = false;
-
-  /* End of Disable for SubSystem: '<S8>/Resettable Subsystem' */
-}
-
-/* Output and update for referenced model: 'SOH' */
-void SOH(void)
-{
-  /* local block i/o variables */
-  uint16_T rtb_minCap;
-  uint16_T rtb_minCap_g;
-  int32_T i_0;
-  int32_T i_1;
-  uint32_T rtb_Switch3_0;
-  int16_T tmp;
-  uint16_T rtb_sohn_V_chrgStartStatEE_Merg[28];
-  uint16_T rtb_sohn_Q_packCapArrEE_Merge[10];
-  uint16_T rtb_sohn_Q_chrgEE_Merge;
-  uint16_T tmp_0;
-  uint8_T i;
-  boolean_T rtb_RelationalOperator2_l;
-  boolean_T sohn_flg_countEn;
-  boolean_T rtb_sohn_flg_chrgEndEE_Merge;
-  uint16_T sohv_Q_packCapMin;
-  uint16_T sohv_Q_packCapMax;
-  /* MinMax: '<S18>/Min' incorporates:
-   *  Inport: '<Root>/sohv_Q_packCapArrEi '
-   */
-  sohv_Q_packCapMax = sohv_Q_packCapArrEi[0];
-  sohv_Q_packCapMin = sohv_Q_packCapArrEi[0];
-  for (i_0 = 0; i_0 < 9; i_0++) {
-   if(sohv_Q_packCapArrEi[i_0]>sohv_Q_packCapMax)
-   	{
-   	sohv_Q_packCapMax=sohv_Q_packCapArrEi[i_0];
-   	}
-      if(sohv_Q_packCapArrEi[i_0]<sohv_Q_packCapMin)
-   	{
-   	sohv_Q_packCapMin=sohv_Q_packCapArrEi[i_0];
-   	}
-  }
-
-  /* If: '<S5>/If' incorporates:
-   *  Constant: '<S18>/C'
-   *  Constant: '<S18>/Constant'
-   *  Inport: '<Root>/sohd_Q_chrgEi '
-   *  Inport: '<Root>/sohd_flg_chrgEndEi '
-   *  Inport: '<Root>/sohv_Q_cellCapArrEi 1'
-   *  Inport: '<Root>/sohv_Q_packCapArrEi '
-   *  Inport: '<Root>/sohv_V_chrgStartStatEi '
-   *  Inport: '<S20>/sohd_Q_chrgEi '
-   *  Inport: '<S20>/sohd_flg_chrgEndEi '
-   *  Inport: '<S20>/sohv_Q_cellCapArrEi'
-   *  Inport: '<S20>/sohv_Q_packCapArrEi '
-   *  Inport: '<S20>/sohv_V_chrgStartStatEi '
-   *  Logic: '<S18>/Logical Operator3'
-   *  Merge: '<S5>/sohn_Q_chrgEE_Merge'
-   *  Merge: '<S5>/sohn_Q_packCapArrEE_Merge'
-   *  Merge: '<S5>/sohn_V_chrgStartStatEE_Merge'
-   *  MinMax: '<S18>/Min'
-   *  RelationalOperator: '<S18>/Relational Operator1'
-   *  RelationalOperator: '<S18>/Relational Operator2'
-   *  UnitDelay: '<S6>/sohv_V_chrgStartEo_Delay'
-   */
-  if ((sohd_Q_chrgEi < cmnc_Q_ratedCp) && (sohv_Q_packCapMax <= cmnc_Q_ratedCp && sohv_Q_packCapMin > 1)) {
-    /* Outputs for IfAction SubSystem: '<S5>/TureAction' incorporates:
-     *  ActionPort: '<S20>/Action Port'
-     */
-    rtb_sohn_flg_chrgEndEE_Merge = sohd_flg_chrgEndEi;
-    for (i_0 = 0; i_0 < 28; i_0++) {
-      rtb_sohn_V_chrgStartStatEE_Merg[i_0] = sohv_V_chrgStartStatEi[i_0];
-    }
-
-    rtb_sohn_Q_chrgEE_Merge = sohd_Q_chrgEi;
-    for (i_0 = 0; i_0 < 10; i_0++) {
-      rtb_sohn_Q_packCapArrEE_Merge[i_0] = sohv_Q_packCapArrEi[i_0];
-    }
-
-    for (i_0 = 0; i_0 < 28; i_0++) {
-      sohv_Q_cellCapArrEo[i_0] = sohv_Q_cellCapArrEi[i_0];
-    }
-
-    /* End of Outputs for SubSystem: '<S5>/TureAction' */
-  } else {
-    /* Outputs for IfAction SubSystem: '<S5>/FalseAction' incorporates:
-     *  ActionPort: '<S19>/Action Port'
-     */
-    for (i_0 = 0; i_0 < 28; i_0++) {
-      /* SignalConversion generated from: '<S19>/sohn_V_chrgStartStatEE1' incorporates:
-       *  Merge: '<S5>/sohn_V_chrgStartStatEE_Merge'
-       */
-      rtb_sohn_V_chrgStartStatEE_Merg[i_0] = 0U;
-
-      /* Product: '<S19>/Product1' incorporates:
-       *  Constant: '<S19>/Constant7'
-       *  UnitDelay: '<S6>/sohv_V_chrgStartEo_Delay'
-       */
-      sohv_Q_cellCapArrEo[i_0] = cmnc_Q_ratedCp;
-    }
-
-    /* Product: '<S19>/Product' incorporates:
-     *  Constant: '<S19>/Constant5'
-     *  Merge: '<S5>/sohn_Q_packCapArrEE_Merge'
-     */
-    for (i_0 = 0; i_0 < 10; i_0++) {
-      rtb_sohn_Q_packCapArrEE_Merge[i_0] =  cmnc_Q_ratedCp;
-
-    }
-
-    /* End of Product: '<S19>/Product' */
-
-    /* SignalConversion generated from: '<S19>/sohn_flg_chrgEndEE1' incorporates:
-     *  Constant: '<S19>/Constant'
-     */
-    rtb_sohn_flg_chrgEndEE_Merge = false;
-
-    /* SignalConversion generated from: '<S19>/sohn_Q_chrgEE1' incorporates:
-     *  Constant: '<S19>/Constant3'
-     *  Merge: '<S5>/sohn_Q_chrgEE_Merge'
-     */
-    rtb_sohn_Q_chrgEE_Merge = 0U;
-
-    /* End of Outputs for SubSystem: '<S5>/FalseAction' */
-  }
-
-  /* End of If: '<S5>/If' */
-
-  /* Logic: '<S4>/Logical Operator' incorporates:
-   *  Constant: '<S4>/Constant1'
-   *  Inport: '<Root>/ihd_tm_parkTime'
-   *  Merge: '<S5>/sohn_Q_chrgEE_Merge'
-   *  RelationalOperator: '<S4>/Relational Operator'
-   *  RelationalOperator: '<S4>/Relational Operator1'
-   *  UnitDelay: '<S4>/First_Delay'
-   */
-  sohn_flg_countEn = ((ihd_tm_parkTime >= cmnc_tm_parkTime) &&
-    rtb_sohn_flg_chrgEndEE_Merge && (rtb_sohn_Q_chrgEE_Merge >= 150) &&
-    SOH_DW.First_Delay_DSTATE);
-
-  /* Outputs for Enabled SubSystem: '<S3>/Subsystem' incorporates:
-   *  EnablePort: '<S13>/Enable'
-   */
-  if (sohn_flg_countEn) {
-    for (i_0 = 0; i_0 < 28; i_0++) {
-      /* Lookup_n-D: '<S13>/SOC2' incorporates:
-       *  Inport: '<Root>/ihv_V_cellU'
-       */
-      SOC2[i_0] = look1_iu16lu16n16tu16_binlcase(ihv_V_cellU[i_0],
-        (&(cmnm_V_ocv[0])), (&(cmnm_pct_soc[0])), 12U);
-
-      /* Lookup_n-D: '<S13>/SOC1' incorporates:
-       *  Merge: '<S5>/sohn_V_chrgStartStatEE_Merge'
-       */
-      SOC1[i_0] = look1_iu16lu16n16tu16_binlcase
-        (rtb_sohn_V_chrgStartStatEE_Merg[i_0], (&(cmnm_V_ocv[0])),
-         (&(cmnm_pct_soc[0])), 12U);
-
-      /* Product: '<S13>/Divide4' incorporates:
-       *  Lookup_n-D: '<S13>/SOC1'
-       *  Lookup_n-D: '<S13>/SOC2'
-       *  Sum: '<S13>/Add'
-       */
-      deltaSoc[i_0] = SOC2[i_0] - SOC1[i_0] ;
-      /* Product: '<S13>/sohn_Q_CellCap' incorporates:
-       *  Product: '<S13>/Divide4'
-       */
-      i_1 = deltaSoc[i_0];
-
-      /* Product: '<S13>/sohn_Q_CellCap' incorporates:
-       *  Merge: '<S5>/sohn_Q_chrgEE_Merge'
-       */
-      SOH_B.sohn_Q_CellCap[i_0] = (uint16_T)(((uint16_T)((uint32_T)i_1 == 0U ?
-        MAX_uint32_T : ((uint32_T)rtb_sohn_Q_chrgEE_Merge << 9) / i_1) * 125U) >>
-        6);
-
-      /* Product: '<S13>/Divide5' incorporates:
-       *  Lookup_n-D: '<S13>/SOC2'
-       */
-      minDischrg[i_0] = (uint16_T)((((uint32_T)SOC2[i_0] << 6) / 125U * 125U) >>
-        6);
-
-      /* Product: '<S13>/Divide3' incorporates:
-       *  Constant: '<S13>/Constant3'
-       *  Product: '<S13>/Divide5'
-       *  Product: '<S13>/sohn_Q_CellCap'
-       *  Sum: '<S13>/Add1'
-       */
-      minChrg[i_0] = (uint16_T)(((uint16_T)(((uint32_T)(uint16_T)(1000 -
-        minDischrg[i_0]) * SOH_B.sohn_Q_CellCap[i_0]) >> 10) * 16777U) >> 14);
-
-      /* Product: '<S13>/Divide2' incorporates:
-       *  Product: '<S13>/Divide5'
-       *  Product: '<S13>/sohn_Q_CellCap'
-       */
-      minDischrg[i_0] = (uint16_T)(((uint16_T)(((uint32_T)
-        SOH_B.sohn_Q_CellCap[i_0] * minDischrg[i_0]) >> 10) * 16777U) >> 14);
-    }
-
-    /* Chart: '<S14>/ArrMin' incorporates:
-     *  Constant: '<S14>/Constant'
-     */
-    SOH_ArrMin((&(minChrg[0])), cmnc_num_cellUnum, &rtb_minCap_g);
-
-    /* Chart: '<S15>/ArrMin' incorporates:
-     *  Constant: '<S15>/Constant'
-     */
-    SOH_ArrMin((&(minDischrg[0])), cmnc_num_cellUnum, &rtb_minCap);
-
-    /* Sum: '<S13>/Add2' */
-    SOH_B.Add2 = (uint16_T)((uint32_T)rtb_minCap_g + rtb_minCap);
-  }
-
-  /* End of Outputs for SubSystem: '<S3>/Subsystem' */
-  for (i_0 = 0; i_0 < 28; i_0++) {
-    /* SignalConversion generated from: '<S3>/Subsystem' incorporates:
-     *  Product: '<S13>/sohn_Q_CellCap'
-     */
-    
-
-    /* Switch: '<S3>/Switch' */
-    if (sohn_flg_countEn) {
-      /* Switch: '<S3>/Switch' incorporates:
-       *  SignalConversion generated from: '<S3>/Subsystem'
-       */
-      sohv_Q_cellCapArrEo[i_0] = SOH_B.sohn_Q_CellCap[i_0];
-    }
-	sohv_Q_cellCap[i_0] = sohv_Q_cellCapArrEo[i_0];
-
-    /* End of Switch: '<S3>/Switch' */
-  }
-
-  /* Chart: '<S3>/Chart' incorporates:
-   *  Merge: '<S5>/sohn_Q_packCapArrEE_Merge'
-   *  Sum: '<S13>/Add2'
-   */
-  i = 0U;
-  if (SOH_DW.Fflg) {
-    for (i_0 = 0; i_0 < 10; i_0++) {
-      SOH_B.sohn_Q_packCapArrEo[i_0] = rtb_sohn_Q_packCapArrEE_Merge[i_0];
-    }
-
-    i_1 = rtb_sohn_Q_packCapArrEE_Merge[9] - SOH_B.Add2;
-    if (i_1 < 0) {
-      i_1 = -i_1;
-    }
-
-    if (sohn_flg_countEn && (i_1 < 50)) {
-      while (i < 9) {
-        SOH_B.sohn_Q_packCapArrEo[i] = rtb_sohn_Q_packCapArrEE_Merge[i + 1];
-        i++;
-      }
-
-      SOH_B.sohn_Q_packCapArrEo[9] = SOH_B.Add2;
-    }
-
-    i = 0U;
-    rtb_sohn_Q_chrgEE_Merge = 0U;
-    while (i < 10) {
-      i_1 = rtb_sohn_Q_chrgEE_Merge + SOH_B.sohn_Q_packCapArrEo[i];
-      if (i_1 > 65535) {
-        i_1 = 65535;
-      }
-
-      rtb_sohn_Q_chrgEE_Merge = (uint16_T)i_1;
-      i++;
-    }
-
-    SOH_B.Qavrg = (uint16_T)(rtb_sohn_Q_chrgEE_Merge / 10U);
-  }
-
-  SOH_DW.Fflg = false;
-
-  /* End of Chart: '<S3>/Chart' */
-  for (i_0 = 0; i_0 < 10; i_0++) {
-    /* SignalConversion generated from: '<S3>/Chart' */
-    sohv_Q_packCapArrEo[i_0] = SOH_B.sohn_Q_packCapArrEo[i_0];
-  }
-
-  /* UnitDelay: '<S7>/Unit Delay1' incorporates:
-   *  Constant: '<S3>/Constant2'
-   *  Product: '<S3>/Divide'
-   *  Product: '<S3>/Product'
-   */
-  sohd_pct_bcuSoh = (uint16_T)(((uint16_T)(cmnc_Q_ratedCp == 0U ? MAX_uint32_T :
-    ((uint32_T)(uint16_T)(((uint16_T)((SOH_B.Qavrg * 125U) >> 1) * 52429U) >> 15)
-     << 3) / cmnc_Q_ratedCp) * 5U) >> 2);
-
-  /* Saturate: '<S3>/Saturation' incorporates:
-   *  UnitDelay: '<S7>/Unit Delay1'
-   */
-  if (sohd_pct_bcuSoh >= 1000) {
-    /* Saturate: '<S3>/Saturation' */
-    sohd_pct_bcuSoh = 1000U;
-  }
-
-  /* End of Saturate: '<S3>/Saturation' */
-
-  /* Logic: '<S6>/Logical Operator' incorporates:
-   *  Constant: '<S6>/Constant'
-   *  Constant: '<S6>/Constant1'
-   *  Inport: '<Root>/ihd_st_ChrgStat '
-   *  RelationalOperator: '<S6>/Relational Operator'
-   *  RelationalOperator: '<S6>/Relational Operator1'
-   *  UnitDelay: '<S6>/Unit Delay'
-   */
-  rtb_sohn_flg_chrgEndEE_Merge = ((SOH_DW.UnitDelay_DSTATE != 2) &&
-    (ihd_st_workStat == 2));
-
-  /* Switch: '<S6>/Switch' */
-  if (rtb_sohn_flg_chrgEndEE_Merge) {
-    /* Switch: '<S6>/Switch' incorporates:
-     *  Inport: '<Root>/ihv_V_cellU'
-     */
-    for (i_1 = 0; i_1 < 28; i_1++) {
-      sohv_V_chrgStartStatEo[i_1] = ihv_V_cellU[i_1];
-    }
-
-    /* End of Switch: '<S6>/Switch' */
-  }
-
-  /* End of Switch: '<S6>/Switch' */
-
-  /* Abs: '<S6>/Abs' incorporates:
-   *  Inport: '<Root>/ihd_I_curr'
-   */
-  if (ihd_I_curr < 0) {
-    tmp = (int16_T)-ihd_I_curr;
-  } else {
-    tmp = ihd_I_curr;
-  }
-
-  /* End of Abs: '<S6>/Abs' */
-
-  /* RelationalOperator: '<S6>/Relational Operator2' */
-  rtb_RelationalOperator2_l = (tmp >= 20);
-
-  /* Outputs for Resettable SubSystem: '<S6>/Resettable Subsystem' incorporates:
-   *  ResetPort: '<S9>/Reset'
-   */
-  if (rtb_RelationalOperator2_l) {
-    /* InitializeConditions for UnitDelay: '<S9>/Time_Delay' */
-    SOH_DW.Time_Delay_DSTATE = 0U;
-  }
-
-  /* Sum: '<S9>/Add' incorporates:
-   *  Constant: '<S9>/Constant'
-   *  UnitDelay: '<S9>/Time_Delay'
-   */
-  SOH_DW.Time_Delay_DSTATE++;
-
-  /* End of Outputs for SubSystem: '<S6>/Resettable Subsystem' */
-
-  /* Switch: '<S10>/Switch3' incorporates:
-   *  UnitDelay: '<S10>/statflg_Delay'
-   */
-  SOH_DW.statflg_Delay_DSTATE = (rtb_RelationalOperator2_l ||
-    SOH_DW.statflg_Delay_DSTATE);
-
-  /* Switch: '<S6>/Switch2' incorporates:
-   *  Constant: '<S9>/Constant1'
-   *  Product: '<S9>/Divide'
-   *  Sum: '<S6>/Add'
-   *  UnitDelay: '<S6>/sohd_tm_chrgStartSta_Delay'
-   *  UnitDelay: '<S9>/Time_Delay'
-   */
-  if (rtb_sohn_flg_chrgEndEE_Merge) {
-    /* Switch: '<S6>/Switch1' incorporates:
-     *  Constant: '<S6>/Constant3'
-     *  Inport: '<Root>/ihd_tm_parkTime'
-     */
-    if (SOH_DW.statflg_Delay_DSTATE) {
-      rtb_Switch3_0 = 0U;
-    } else {
-      rtb_Switch3_0 = ihd_tm_parkTime;
-    }
-
-    /* End of Switch: '<S6>/Switch1' */
-
-    /* Outputs for Resettable SubSystem: '<S6>/Resettable Subsystem' incorporates:
-     *  ResetPort: '<S9>/Reset'
-     */
-    SOH_DW.sohd_tm_chrgStartSta_Delay_DSTA = (uint16_T)(SOH_DW.Time_Delay_DSTATE
-      / 10U + rtb_Switch3_0);
-
-    /* End of Outputs for SubSystem: '<S6>/Resettable Subsystem' */
-  }
-
-  /* End of Switch: '<S6>/Switch2' */
-
-  /* Saturate: '<S6>/Saturation' incorporates:
-   *  UnitDelay: '<S6>/sohd_tm_chrgStartSta_Delay'
-   */
-  sohd_tm_chrgStartStatEo = SOH_DW.sohd_tm_chrgStartSta_Delay_DSTA;
-  /* UnitDelay: '<S7>/Unit Delay' incorporates:
-   *  UnitDelay: '<S6>/Unit Delay'
-   */
-  SOH_DW.UnitDelay_DSTATE = SOH_DW.UnitDelay_DSTATE_g;
-
-  /* Switch: '<S7>/Switch' incorporates:
-   *  Constant: '<S7>/Constant'
-   *  Constant: '<S7>/Constant1'
-   *  Inport: '<Root>/ihd_st_ChrgStat '
-   *  Logic: '<S7>/Logical Operator'
-   *  RelationalOperator: '<S7>/Relational Operator'
-   *  RelationalOperator: '<S7>/Relational Operator1'
-   *  UnitDelay: '<S6>/Unit Delay'
-   *  UnitDelay: '<S7>/Unit Delay1'
-   */
-  sohd_flg_chrgEndEo = (((SOH_DW.UnitDelay_DSTATE == 2) && (ihd_st_workStat != 2))
-                        || (SOH_DW.UnitDelay1_DSTATE != 0));
-
-  /* Outputs for Enabled SubSystem: '<S8>/Resettable Subsystem' incorporates:
-   *  EnablePort: '<S11>/Enable'
-   */
-  /* RelationalOperator: '<S8>/Relational Operator1' incorporates:
-   *  Constant: '<S8>/Constant1'
-   *  Inport: '<Root>/ihd_st_ChrgStat '
-   */
-  if (ihd_st_workStat == 2) {
-    if (!SOH_DW.ResettableSubsystem_MODE) {
-      /* InitializeConditions for UnitDelay: '<S11>/curr_icr_Delay' */
-      SOH_DW.curr_icr_Delay_DSTATE = 0;
-      SOH_DW.ResettableSubsystem_MODE = true;
-    }
-
-    /* Sum: '<S11>/Add' incorporates:
-     *  Inport: '<Root>/ihd_I_curr'
-     *  UnitDelay: '<S11>/curr_icr_Delay'
-     */
-    SOH_DW.curr_icr_Delay_DSTATE += ihd_I_curr * 10;
-
-    /* Product: '<S11>/Divide1' incorporates:
-     *  Product: '<S11>/Divide'
-     *  Sum: '<S11>/Add'
-     *  UnitDelay: '<S11>/curr_icr_Delay'
-     */
-    SOH_B.Divide1 = (uint16_T)(((uint16_T)(((uint32_T)div_nde_s32_floor
-      (SOH_DW.curr_icr_Delay_DSTATE, 200) << 1) / 4500U) * 5U) >> 2);
-  } else {
-    SOH_DW.ResettableSubsystem_MODE = false;
-  }
-
-  /* End of RelationalOperator: '<S8>/Relational Operator1' */
-  /* End of Outputs for SubSystem: '<S8>/Resettable Subsystem' */
-
-  /* SignalConversion generated from: '<S8>/Resettable Subsystem' incorporates:
-   *  Product: '<S11>/Divide1'
-   */
-  sohd_Q_chrgEo = SOH_B.Divide1;
-
-  /* Update for UnitDelay: '<S4>/First_Delay' incorporates:
-   *  Constant: '<S4>/Constant2'
-   */
-  SOH_DW.First_Delay_DSTATE = false;
-
-  /* Update for UnitDelay: '<S6>/Unit Delay' incorporates:
-   *  Inport: '<Root>/ihd_st_ChrgStat '
-   */
-  SOH_DW.UnitDelay_DSTATE = ihd_st_workStat;
-
-  /* Update for UnitDelay: '<S7>/Unit Delay' incorporates:
-   *  Inport: '<Root>/ihd_st_ChrgStat '
-   */
-  SOH_DW.UnitDelay_DSTATE_g = ihd_st_workStat;
-
-  /* Abs: '<S7>/Abs' incorporates:
-   *  Inport: '<Root>/ihd_I_curr'
-   */
-  if (ihd_I_curr < 0) {
-    tmp = (int16_T)-ihd_I_curr;
-  } else {
-    tmp = ihd_I_curr;
-  }
-
-  /* End of Abs: '<S7>/Abs' */
-
-  /* Update for UnitDelay: '<S7>/Unit Delay1' incorporates:
-   *  Logic: '<S7>/Logical Operator1'
-   *  Product: '<S7>/Product'
-   *  RelationalOperator: '<S7>/Relational Operator3'
-   */
-  SOH_DW.UnitDelay1_DSTATE = (uint16_T)(sohd_flg_chrgEndEo ? tmp < 20 : 0);
-}
-
-/* Model initialize function */
-void SOH_initialize(const char_T **rt_errorStatus)
-{
-  RT_MODEL_SOH_T *const SOH_M = &(SOH_MdlrefDW.rtm);
-
-  /* Registration code */
-
-  /* initialize error status */
-  rtmSetErrorStatusPointer(SOH_M, rt_errorStatus);
-}
-
-/*
- * File trailer for generated code.
- *
- * [EOF]
- */

+ 29 - 147
src/EmbeddedCoder_src/SPM.c

@@ -1,165 +1,47 @@
-/*
- * File: SPM.c
- *
- * Code generated for Simulink model 'SPM'.
- *
- * Model version                  : 1.31
- * Simulink Coder version         : 9.4 (R2020b) 29-Jul-2020
- * C/C++ source code generated on : Thu Sep  9 18:13:23 2021
- *
- * Target selection: ert.tlc
- * Embedded hardware selection: Intel->x86-64 (Windows64)
- * Code generation objectives: Unspecified
- * Validation result: Not run
- */
-
 #include "SPM.h"
-#include "SPM_private.h"
 
-MdlrefDW_SPM_T SPM_MdlrefDW;
 
-/* System initialize for referenced model: 'SPM' */
+boolean_T FirstRun_SPM;
+
 void SPM_Init(void)
 {
-  /* SystemInitialize for ModelReference: '<Root>/SOH' incorporates:
-   *  Inport: '<Root>/<sfmd_flg_currFlt>'
-   *  Inport: '<Root>/ihd_st_workStat'
-   *  Inport: '<Root>/ihd_tm_packTime'
-   *  Inport: '<Root>/sfmd_I_curr '
-   *  Inport: '<Root>/sfmd_flg_volFlt'
-   *  Inport: '<Root>/sfmv_V_cellU'
-   *  Inport: '<Root>/sohd_Q_chrgEi '
-   *  Inport: '<Root>/sohd_flg_chrgEndEi '
-   *  Inport: '<Root>/sohd_tm_chrgStartStatEi '
-   *  Inport: '<Root>/sohv_Q_cellCapArrEi 1'
-   *  Inport: '<Root>/sohv_Q_packCapArrEi '
-   *  Inport: '<Root>/sohv_V_chrgStartStatEi '
-   */
   SOH_Init();
-
-  /* SystemInitialize for ModelReference: '<Root>/BLC' incorporates:
-   *  Inport: '<Root>/blcv_Q_reqCpEi'
-   *  Inport: '<Root>/blcv_Q_totalCpEi'
-   *  Inport: '<Root>/ihd_T_bdtemp'
-   *  Inport: '<Root>/ihd_tm_packTime'
-   *  Inport: '<Root>/sfmd_V_cellUMin'
-   *  Inport: '<Root>/sfmd_flg_volFlt'
-   *  Inport: '<Root>/sfmd_st_fltAct'
-   *  Inport: '<Root>/sfmv_V_cellU'
-   */
   BLC_Init();
-
-  /* SystemInitialize for ModelReference: '<Root>/SOC' incorporates:
-   *  Inport: '<Root>/ihd_st_workStat'
-   *  Inport: '<Root>/ihd_tm_packTime'
-   *  Inport: '<Root>/sfmd_I_curr '
-   *  Inport: '<Root>/sfmd_V_cellUAvrg'
-   *  Inport: '<Root>/sfmd_V_cellUMax'
-   *  Inport: '<Root>/sfmd_V_cellUMin'
-   *  Inport: '<Root>/socd_pct_battSocEi'
-   *  Inport: '<Root>/socd_pct_bcuSocEi'
-   */
   SOC_Init();
+  FirstRun_SPM = true;
 }
 
-/* Disable for referenced model: 'SPM' */
-void SPM_Disable(void)
-{
-  /* Disable for ModelReference: '<Root>/SOH' incorporates:
-   *  Inport: '<Root>/<sfmd_flg_currFlt>'
-   *  Inport: '<Root>/ihd_st_workStat'
-   *  Inport: '<Root>/ihd_tm_packTime'
-   *  Inport: '<Root>/sfmd_I_curr '
-   *  Inport: '<Root>/sfmd_flg_volFlt'
-   *  Inport: '<Root>/sfmv_V_cellU'
-   *  Inport: '<Root>/sohd_Q_chrgEi '
-   *  Inport: '<Root>/sohd_flg_chrgEndEi '
-   *  Inport: '<Root>/sohd_tm_chrgStartStatEi '
-   *  Inport: '<Root>/sohv_Q_cellCapArrEi 1'
-   *  Inport: '<Root>/sohv_Q_packCapArrEi '
-   *  Inport: '<Root>/sohv_V_chrgStartStatEi '
-   */
-  SOH_Disable();
 
-  /* Disable for ModelReference: '<Root>/SOC' incorporates:
-   *  Inport: '<Root>/ihd_st_workStat'
-   *  Inport: '<Root>/ihd_tm_packTime'
-   *  Inport: '<Root>/sfmd_I_curr '
-   *  Inport: '<Root>/sfmd_V_cellUAvrg'
-   *  Inport: '<Root>/sfmd_V_cellUMax'
-   *  Inport: '<Root>/sfmd_V_cellUMin'
-   *  Inport: '<Root>/socd_pct_battSocEi'
-   *  Inport: '<Root>/socd_pct_bcuSocEi'
-   */
-  SOC_Disable();
-}
-
-/* Output and update for referenced model: 'SPM' */
 void SPM(void)
 {
-  /* ModelReference: '<Root>/SOH' incorporates:
-   *  Inport: '<Root>/<sfmd_flg_currFlt>'
-   *  Inport: '<Root>/ihd_st_workStat'
-   *  Inport: '<Root>/ihd_tm_packTime'
-   *  Inport: '<Root>/sfmd_I_curr '
-   *  Inport: '<Root>/sfmd_flg_volFlt'
-   *  Inport: '<Root>/sfmv_V_cellU'
-   *  Inport: '<Root>/sohd_Q_chrgEi '
-   *  Inport: '<Root>/sohd_flg_chrgEndEi '
-   *  Inport: '<Root>/sohd_tm_chrgStartStatEi '
-   *  Inport: '<Root>/sohv_Q_cellCapArrEi 1'
-   *  Inport: '<Root>/sohv_Q_packCapArrEi '
-   *  Inport: '<Root>/sohv_V_chrgStartStatEi '
-   */
-  SOH();
 
-  /* ModelReference: '<Root>/BLC' incorporates:
-   *  Inport: '<Root>/blcv_Q_reqCpEi'
-   *  Inport: '<Root>/blcv_Q_totalCpEi'
-   *  Inport: '<Root>/ihd_T_bdtemp'
-   *  Inport: '<Root>/ihd_tm_packTime'
-   *  Inport: '<Root>/sfmd_V_cellUMin'
-   *  Inport: '<Root>/sfmd_flg_volFlt'
-   *  Inport: '<Root>/sfmd_st_fltAct'
-   *  Inport: '<Root>/sfmv_V_cellU'
-   */
+  static uint16_T spmd_Nr_cellNr;
+
+  
+  if (FirstRun_SPM)
+  {
+      spmd_Nr_cellNr =0;
+  }
+  spmd_Nr_cellNr = spmd_Nr_cellNr + 1;
+  if (spmd_Nr_cellNr >= cmnc_num_cellUNum * 10)
+  {
+     spmd_Nr_cellNr = 0;
+  }
+  cand_Nr_cellNr = (uint16_T)(spmd_Nr_cellNr * 0.1) +1;
+  
+  SOH();
   BLC();
-
-  /* ModelReference: '<Root>/SOC' incorporates:
-   *  Inport: '<Root>/ihd_st_workStat'
-   *  Inport: '<Root>/ihd_tm_packTime'
-   *  Inport: '<Root>/sfmd_I_curr '
-   *  Inport: '<Root>/sfmd_V_cellUAvrg'
-   *  Inport: '<Root>/sfmd_V_cellUMax'
-   *  Inport: '<Root>/sfmd_V_cellUMin'
-   *  Inport: '<Root>/socd_pct_battSocEi'
-   *  Inport: '<Root>/socd_pct_bcuSocEi'
-   */
-  SOC();
+  if (ihd_L_urtRecv)
+  {
+    SOC();
+  }
+
+  
+  cand_Q_cellCap = sohv_Q_cellCap[cand_Nr_cellNr-1];
+  cand_V_chrgStartStat=sohv_V_chrgStartStatEo[cand_Nr_cellNr-1];
+  cand_Q_reqCp   = blcv_Q_reqCpEo[cand_Nr_cellNr-1];
+  cand_Q_totalCp = blcv_Q_totalCpEo[cand_Nr_cellNr-1];
+  FirstRun_SPM =false;
 }
 
-/* Model initialize function */
-void SPM_initialize(const char_T **rt_errorStatus)
-{
-  RT_MODEL_SPM_T *const SPM_M = &(SPM_MdlrefDW.rtm);
-
-  /* Registration code */
-
-  /* initialize error status */
-  rtmSetErrorStatusPointer(SPM_M, rt_errorStatus);
-
-  /* Model Initialize function for ModelReference Block: '<Root>/BLC' */
-  BLC_initialize(rtmGetErrorStatusPointer(SPM_M));
-
-  /* Model Initialize function for ModelReference Block: '<Root>/SOC' */
-  SOC_initialize(rtmGetErrorStatusPointer(SPM_M));
-
-  /* Model Initialize function for ModelReference Block: '<Root>/SOH' */
-  SOH_initialize(rtmGetErrorStatusPointer(SPM_M));
-}
 
-/*
- * File trailer for generated code.
- *
- * [EOF]
- */

+ 47 - 0
src/EmbeddedCoder_src/div_repeat_s32_floor.c

@@ -0,0 +1,47 @@
+/*
+ * File: div_repeat_s32_floor.c
+ *
+ * Code generated for Simulink model 'SOC'.
+ *
+ * Model version                  : 1.52
+ * Simulink Coder version         : 9.4 (R2020b) 29-Jul-2020
+ * C/C++ source code generated on : Tue Sep 14 16:42:25 2021
+ */
+
+#include "rtwtypes.h"
+#include "div_nzp_repeat_u32.h"
+#include "div_nzp_repeat_u32_ceiling.h"
+#include "div_repeat_s32_floor.h"
+
+int32_T div_repeat_s32_floor(int32_T numerator, int32_T denominator, uint32_T
+  nRepeatSub)
+{
+  int32_T quotient;
+  uint32_T absDenominator;
+  uint32_T absNumerator;
+  if (denominator == 0) {
+    quotient = numerator >= 0 ? MAX_int32_T : MIN_int32_T;
+
+    /* Divide by zero handler */
+  } else {
+    absNumerator = numerator < 0 ? ~(uint32_T)numerator + 1U : (uint32_T)
+      numerator;
+    absDenominator = denominator < 0 ? ~(uint32_T)denominator + 1U : (uint32_T)
+      denominator;
+    if ((numerator < 0) != (denominator < 0)) {
+      quotient = -(int32_T)div_nzp_repeat_u32_ceiling(absNumerator,
+        absDenominator, nRepeatSub);
+    } else {
+      quotient = (int32_T)div_nzp_repeat_u32(absNumerator, absDenominator,
+        nRepeatSub);
+    }
+  }
+
+  return quotient;
+}
+
+/*
+ * File trailer for generated code.
+ *
+ * [EOF]
+ */

+ 50 - 0
src/EmbeddedCoder_src/div_s32_floor.c

@@ -0,0 +1,50 @@
+/*
+ * File: div_s32_floor.c
+ *
+ * Code generated for Simulink model 'SOC'.
+ *
+ * Model version                  : 1.52
+ * Simulink Coder version         : 9.4 (R2020b) 29-Jul-2020
+ * C/C++ source code generated on : Tue Sep 14 16:42:25 2021
+ */
+
+#include "rtwtypes.h"
+#include "div_s32_floor.h"
+
+int32_T div_s32_floor(int32_T numerator, int32_T denominator)
+{
+  int32_T quotient;
+  uint32_T absDenominator;
+  uint32_T absNumerator;
+  uint32_T tempAbsQuotient;
+  boolean_T quotientNeedsNegation;
+  if (denominator == 0) {
+    quotient = numerator >= 0 ? MAX_int32_T : MIN_int32_T;
+
+    /* Divide by zero handler */
+  } else {
+    absNumerator = numerator < 0 ? ~(uint32_T)numerator + 1U : (uint32_T)
+      numerator;
+    absDenominator = denominator < 0 ? ~(uint32_T)denominator + 1U : (uint32_T)
+      denominator;
+    quotientNeedsNegation = ((numerator < 0) != (denominator < 0));
+    tempAbsQuotient = absNumerator / absDenominator;
+    if (quotientNeedsNegation) {
+      absNumerator %= absDenominator;
+      if (absNumerator > 0U) {
+        tempAbsQuotient++;
+      }
+    }
+
+    quotient = quotientNeedsNegation ? -(int32_T)tempAbsQuotient : (int32_T)
+      tempAbsQuotient;
+  }
+
+  return quotient;
+}
+
+/*
+ * File trailer for generated code.
+ *
+ * [EOF]
+ */

+ 28 - 0
src/EmbeddedCoder_src/mul_s32_loSR.c

@@ -0,0 +1,28 @@
+/*
+ * File: mul_s32_loSR.c
+ *
+ * Code generated for Simulink model 'SOC'.
+ *
+ * Model version                  : 1.52
+ * Simulink Coder version         : 9.4 (R2020b) 29-Jul-2020
+ * C/C++ source code generated on : Tue Sep 14 16:42:25 2021
+ */
+
+#include "rtwtypes.h"
+#include "mul_wide_s32.h"
+#include "mul_s32_loSR.h"
+
+int32_T mul_s32_loSR(int32_T a, int32_T b, uint32_T aShift)
+{
+  uint32_T u32_chi;
+  uint32_T u32_clo;
+  mul_wide_s32(a, b, &u32_chi, &u32_clo);
+  u32_clo = u32_chi << /*MW:OvBitwiseOk*/ (32U - aShift) | u32_clo >> aShift;
+  return (int32_T)u32_clo;
+}
+
+/*
+ * File trailer for generated code.
+ *
+ * [EOF]
+ */

+ 27 - 0
src/EmbeddedCoder_src/mul_s32_sr32_ceil.c

@@ -0,0 +1,27 @@
+/*
+ * File: mul_s32_sr32_ceil.c
+ *
+ * Code generated for Simulink model 'SOC'.
+ *
+ * Model version                  : 1.52
+ * Simulink Coder version         : 9.4 (R2020b) 29-Jul-2020
+ * C/C++ source code generated on : Tue Sep 14 16:42:25 2021
+ */
+
+#include "rtwtypes.h"
+#include "mul_wide_s32.h"
+#include "mul_s32_sr32_ceil.h"
+
+int32_T mul_s32_sr32_ceil(int32_T a, int32_T b)
+{
+  uint32_T u32_chi;
+  uint32_T u32_clo;
+  mul_wide_s32(a, b, &u32_chi, &u32_clo);
+  return (int32_T)((u32_clo != 0U) + u32_chi);
+}
+
+/*
+ * File trailer for generated code.
+ *
+ * [EOF]
+ */

+ 0 - 1
src/hal_module_adapter.c

@@ -260,7 +260,6 @@ void UTCToBeijing(UTC8TimeType* UTC8Time,unsigned int UTCyear,unsigned char UTCm
 	UTC8Time->minute = UTCminute;
 	UTC8Time->second = UTCsecond;
 }
-#include <stdarg.h>
 #ifdef DEBUGLOG
 static osMutexId_t DebugFileMux;
 static void Debug_Write_Logfile(UINT8 * buf)