#include "BLC.h" #include "look1_iu16lu16n16tu16_binlcase.h" boolean_T FirstRun_BLC; //////////////////////////////////////////////////////////////////////////// void BLC_Init(void) { FirstRun_BLC = true; } /////////////////////////////////////////////////////////////////////////// void BLC(void) { 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)); } else { memcpy(blcn_Q_reqCpEE,blcv_Q_reqCpEi, sizeof(blcv_Q_reqCpEi)); memcpy(blcn_Q_totalCpEE,blcv_Q_totalCpEi, sizeof(blcn_Q_totalCpEE)); } } //========================================================================= //---------------------------------使能判断-------------------------------- //========================================================================= if(FirstRun_BLC) { sfmd_flg_volFlt_keep = sfmd_flg_cellUDisable; } 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; } } } else { memcpy(blcn_Q_reqCpNow,blcn_Q_reqCpEE, sizeof(blcn_Q_reqCpEE)); } /*/ 最大化容量法 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); } } } else { memcpy(blcn_Q_reqCpNow,blcn_Q_reqCpEE, sizeof(blcn_Q_reqCpEE)); } */ } //========================================================================= //---------------------------------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; } } //========================================================================= //---------------------------------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 ; } 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)); }