BLC.c 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. #include "BLC.h"
  2. #include "look1_iu16lu16n16tu16_binlcase.h"
  3. boolean_T FirstRun_BLC;
  4. ////////////////////////////////////////////////////////////////////////////
  5. void BLC_Init(void)
  6. {
  7. FirstRun_BLC = true;
  8. }
  9. ///////////////////////////////////////////////////////////////////////////
  10. void BLC(void)
  11. {
  12. uint16_T i;
  13. static uint16_T blcn_Q_reqCpEE[28];
  14. static uint32_T blcn_Q_totalCpEE[28];
  15. uint16_T MaxCp;
  16. boolean_T blcn_flg_judge;
  17. boolean_T blcn_flg_enable;
  18. static boolean_T sfmd_flg_volFlt_keep;
  19. uint16_T blcn_pct_cellSoc[28];
  20. uint16_T blcn_pct_cellSocMin;
  21. static uint16_T blcn_Q_reqCpNow[28];
  22. real_T Qmin;
  23. real_T QL;
  24. real_T reqCp;
  25. static uint16_T blcn_Q_reqCpEo_Delay[28];
  26. boolean_T blcn_flg_stop[28];
  27. boolean_T blcn_flg_pause[28];
  28. static real_T temp[28];
  29. uint16_T blcn_Q_impleCp[28];
  30. if(FirstRun_BLC)
  31. {
  32. for (i = 0; i < cmnc_num_cellUNum; i++)
  33. {
  34. temp[i] = 0;
  35. blcn_Q_reqCpEo_Delay[i] = 0;
  36. blcn_Q_reqCpNow[i] = 0;
  37. }
  38. }
  39. //=========================================================================
  40. //---------------------------------EE校验----------------------------------
  41. //=========================================================================
  42. if(FirstRun_BLC)
  43. {
  44. ArrMax(&blcv_Q_reqCpEi[0],&MaxCp, cmnc_num_cellUNum);
  45. if(MaxCp > cmnc_Q_ratedCp * 100)
  46. {
  47. memset(blcn_Q_reqCpEE,0, sizeof(blcn_Q_reqCpEE));
  48. memset(blcn_Q_totalCpEE,0, sizeof(blcn_Q_totalCpEE));
  49. }
  50. else
  51. {
  52. memcpy(blcn_Q_reqCpEE,blcv_Q_reqCpEi, sizeof(blcv_Q_reqCpEi));
  53. memcpy(blcn_Q_totalCpEE,blcv_Q_totalCpEi, sizeof(blcn_Q_totalCpEE));
  54. }
  55. }
  56. //=========================================================================
  57. //---------------------------------使能判断--------------------------------
  58. //=========================================================================
  59. if(FirstRun_BLC)
  60. {
  61. sfmd_flg_volFlt_keep = sfmd_flg_cellUDisable;
  62. }
  63. blcn_flg_judge = (ihd_tm_parkTime > cmnc_tm_parkTime)&& !sfmd_flg_volFlt_keep;
  64. blcn_flg_enable = ((sfmd_st_fltAct >> 7) & 0x01) != 1;
  65. //=========================================================================
  66. //---------------------------------需求计算--------------------------------
  67. //=========================================================================
  68. if(FirstRun_BLC)
  69. {
  70. //压差法
  71. if(blcn_flg_judge)
  72. {
  73. blcn_pct_cellSocMin = look1_iu16lu16n16tu16_binlcase(sfmd_V_cellUMin,(&(cmnm_V_ocv[0])), (&(cmnm_pct_soc[0])), 12U);
  74. for (i = 0; i < cmnc_num_cellUNum; i++)
  75. {
  76. blcn_pct_cellSoc[i] = look1_iu16lu16n16tu16_binlcase(sfmv_V_cellU[i], ( &(cmnm_V_ocv[0])), (&(cmnm_pct_soc[0])), 12U);
  77. }
  78. for (i = 0; i < cmnc_num_cellUNum; i++)
  79. {
  80. if(sfmv_V_cellU[i] - sfmd_V_cellUMin > blcc_V_low)
  81. {
  82. 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);
  83. }
  84. else
  85. {
  86. blcn_Q_reqCpNow[i] = 0;
  87. }
  88. }
  89. }
  90. else
  91. {
  92. memcpy(blcn_Q_reqCpNow,blcn_Q_reqCpEE, sizeof(blcn_Q_reqCpEE));
  93. }
  94. /*/ 最大化容量法
  95. if(blcn_flg_judge)
  96. {
  97. Qmin = (real_T)(sohv_Q_cellCap[0] * 0.1) * (real_T)(blcn_pct_cellSoc[0] * 0.1)/100;
  98. for(i = 0; i < cmnc_num_cellUNum; i++)
  99. {
  100. if (Qmin > (real_T)(sohv_Q_cellCap[i] * 0.1) * (real_T)(blcn_pct_cellSoc[i] * 0.1)/100)
  101. {
  102. Qmin = (real_T)(sohv_Q_cellCap[i] * 0.1) * (real_T)(blcn_pct_cellSoc[i] * 0.1)/100;
  103. QL = (real_T)(sohv_Q_cellCap[i] * 0.1) - Qmin;
  104. }
  105. }
  106. for(i = 0; i < cmnc_num_cellUNum; i++)
  107. {
  108. reqCp = QL- (real_T)(sohv_Q_cellCap[i] * 0.1)*(real_T)(blcn_pct_cellSoc[i] * 0.1)/100;
  109. if (reqCp >0.001)
  110. {
  111. blcn_Q_reqCpNow[i] =uint16_T(reqCp * 1000);
  112. }
  113. }
  114. }
  115. else
  116. {
  117. memcpy(blcn_Q_reqCpNow,blcn_Q_reqCpEE, sizeof(blcn_Q_reqCpEE));
  118. } */
  119. }
  120. //=========================================================================
  121. //---------------------------------stop计算--------------------------------
  122. //=========================================================================
  123. for(i = 0; i < cmnc_num_cellUNum; i++)
  124. {
  125. if(blcn_Q_reqCpEo_Delay[i] > 0)
  126. {
  127. blcn_flg_stop[i] = false;
  128. }
  129. else
  130. {
  131. blcn_flg_stop[i] = true;
  132. }
  133. }
  134. //=========================================================================
  135. //---------------------------------pause计算-------------------------------
  136. //=========================================================================
  137. for(i = 0; i < cmnc_num_cellUNum; i++)
  138. {
  139. blcn_flg_pause[i] = false;
  140. }
  141. //=========================================================================
  142. //--------------------------------指令及实际均衡容量计算--------------------
  143. //=========================================================================
  144. for(i = 0; i < cmnc_num_cellUNum; i++)
  145. {
  146. if(blcn_flg_enable && !blcn_flg_pause[i] && ! blcn_flg_stop[i])
  147. {
  148. blcv_flg_excute[i] = true ;
  149. temp[i] = temp[i] + (real_T) (sfmv_V_cellU[i] * 0.001) / (real_T) (blcc_R_esr * 0.1);
  150. }
  151. else
  152. {
  153. blcv_flg_excute[i] = false ;
  154. }
  155. blcn_Q_impleCp[i] = (uint16_T) (temp[i] /36000 * 1000);
  156. blcv_Q_reqCpEo[i] = ( (int16_T)(blcn_Q_reqCpNow[i] - blcn_Q_impleCp[i]) < 0 ? 0 :blcn_Q_reqCpNow[i] - blcn_Q_impleCp[i]);
  157. blcv_Q_totalCpEo[i] = (uint32_T) (blcn_Q_totalCpEE[i] + blcn_Q_impleCp[i]);
  158. }
  159. //
  160. FirstRun_BLC = false;
  161. memcpy(blcn_Q_reqCpEo_Delay,blcv_Q_reqCpEo, sizeof(blcn_Q_reqCpEE));
  162. }