BCU.c 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. #include "BCU.h"
  2. static StaticTask_t gProcess_Bcu_Task_t;
  3. static UINT8 gProcess_Bcu_TaskStack[PROC_BCU_TASK_STACK_SIZE];
  4. static osThreadId_t BcuTaskId = NULL;
  5. static process_Bcu gProcess_Bcu_Task;
  6. #define PROC_BCU_STATE_SWITCH(a) (gProcess_Bcu_Task = a)
  7. //=========================================================================
  8. //=========================================================================
  9. //=========================================================================
  10. void BCU(void)
  11. {
  12. uint16_T i;
  13. uint16_T RecvCounter = 0;
  14. while (TRUE)
  15. {
  16. if (UartRecvFlag == 1 || RecvCounter >= 15)
  17. {
  18. RecvCounter = 0;
  19. break;
  20. }
  21. else
  22. {
  23. RecvCounter++;
  24. osDelay(1000);
  25. }
  26. // printf("RecvCounter:%d\n ",RecvCounter);
  27. }
  28. PROC_BCU_STATE_SWITCH(PROCESS_STATE_INIT);
  29. while (TRUE)
  30. {
  31. switch (gProcess_Bcu_Task)
  32. {
  33. //=========================初始化===============================
  34. case PROCESS_STATE_INIT:
  35. {
  36. BCU_Init();
  37. cmnc_num_cellUNum = AppDataInfo.BattCellCount; /* 电压采样点实际个数; */
  38. cmnc_num_modTNum = AppDataInfo.BattTempCount; /* 温度采样点实际个数; */
  39. memcpy(blcv_Q_totalCpEi, BcuDataInfo.blcv_Q_totalCpE, sizeof(blcv_Q_totalCpEi));
  40. memcpy(blcv_Q_reqCpEi, BcuDataInfo.blcv_Q_reqCpE, sizeof(blcv_Q_reqCpEi));
  41. socd_pct_bcuSocEi = BcuDataInfo.socd_pct_bcuSocE;
  42. socd_pct_battSocEi = BcuDataInfo.socd_pct_battSocE;
  43. sohd_tm_chrgStartStatEi = BcuDataInfo.sohd_tm_chrgStartStatE;
  44. sohd_flg_chrgEndEi = BcuDataInfo.sohd_flg_chrgEndE;
  45. memcpy(sohv_V_chrgStartStatEi, BcuDataInfo.sohv_V_chrgStartStatE, sizeof(sohv_V_chrgStartStatEi));
  46. sohd_Q_chrgEi = BcuDataInfo.sohd_Q_chrgE;
  47. memcpy(sohv_Q_packCapArrEi, BcuDataInfo.sohv_Q_packCapArrE, sizeof(sohv_Q_packCapArrEi));
  48. memcpy(sohv_Q_cellCapArrEi, BcuDataInfo.sohv_Q_cellCapArrE, sizeof(sohv_Q_cellCapArrEi));
  49. memcpy(iscv_Q_remainCpEi, BcuDataInfo.iscv_Q_remainCpE, sizeof(iscv_Q_remainCpEi));
  50. memcpy(sorv_ohm_cellREi, BcuDataInfo.sorv_ohm_cellRE, sizeof(sorv_ohm_cellREi));
  51. iscd_tm_totalEi = BcuDataInfo.iscd_tm_totalE;
  52. sfmd_flg_mainCirClosFltEi = BcuDataInfo.sfmd_flg_mainCirClosFltE;
  53. sfmd_flg_heatCirClosFltEi = BcuDataInfo.sfmd_flg_heatCirClosFltE;
  54. sfmd_flg_heatCirOpenFltEi = BcuDataInfo.sfmd_flg_heatCirOpenFltE;
  55. sfmd_flg_heatRunFltEi = BcuDataInfo.sfmd_flg_heatRunFltE;
  56. sfmd_flg_iscFltEi = BcuDataInfo.sfmd_flg_iscFltE;
  57. ihd_tm_parkTime = BcuDataInfo.ihd_tm_parkTimeE;
  58. ihd_st_EOLState = AppNVMData.EOLState;
  59. appd_st_preCyc = 1;
  60. PROC_BCU_STATE_SWITCH(PROCESS_STATE_WORK);
  61. break;
  62. }
  63. //============================工作模式==========================
  64. case PROCESS_STATE_WORK:
  65. {
  66. while (TRUE)
  67. {
  68. if (UartRecvFlag == 1 || RecvCounter >= 15)
  69. {
  70. RecvCounter = 0;
  71. break;
  72. }
  73. else
  74. {
  75. RecvCounter++;
  76. osDelay(1000);
  77. }
  78. }
  79. while (TRUE)
  80. {
  81. if (TimeCounter % 10 == 0)
  82. {
  83. if (gProcess_app == LISTEN)
  84. {
  85. PROC_BCU_STATE_SWITCH(PROCESS_STATE_SLEEP);
  86. break;
  87. }
  88. // printf("time:%d\n",ihd_tm_parkTime);
  89. //
  90. //数据获取
  91. ihd_st_reSet = SysResetFlag;
  92. ihd_I_curr = (int16_T)(-(battI - 10000));
  93. memcpy(ihv_V_cellU, battCellU, sizeof(battCellU));
  94. for (i = 0; i < cmnc_num_modTNum; i++)
  95. {
  96. ihv_T_modT[i] = battCellTemp[i];
  97. }
  98. ihd_T_mosT = MOSTemp;
  99. ihd_T_DCPlugT = fastChargeTemp;
  100. ihd_T_ACPlugT = normalChargeTemp;
  101. ihd_T_heatPanT1 = heatTemp1;
  102. ihd_T_heatPanT2 = heatTemp2;
  103. ihd_pct_soc = battSOC * 10;
  104. ihd_pct_soh = battSOH * 10;
  105. ihd_flg_HVILFlt = Lockstatus;
  106. ihd_st_workStat = BattWorkStateDelay;
  107. ihd_flg_urtRecFlt = UartErrorFlag;
  108. ihd_flg_urtRecFlg = UartRecvFlag;
  109. ihd_st_chrgConnect = chargerConnectState;
  110. ihd_flg_cellULowFlt = ((battWarningState)&0x01) == 1;
  111. ihd_flg_battULowFlt = ((battWarningState >> 1) & 0x01) == 1;
  112. ihd_flg_cellUOverFlt = ((battWarningState >> 2) & 0x01) == 1;
  113. ihd_flg_battUOverFlt = ((battWarningState >> 3) & 0x01) == 1;
  114. ihd_flg_disChrgCurrOverFlt = ((battWarningState >> 4) & 0x01) == 1;
  115. ihd_flg_chrgCurrOverFlt = ((battWarningState >> 5) & 0x01) == 1;
  116. ihd_flg_disChrgModTOverFlt = ((battWarningState >> 6) & 0x01) == 1;
  117. ihd_flg_chrgModTOverFlt = ((battWarningState >> 7) & 0x01) == 1;
  118. ihd_flg_chrgMosTOverFlt = ((battWarningState >> 11) & 0x01) == 1;
  119. ihd_flg_disChrgMosClosFlt = ((battWarningState >> 18) & 0x01) == 1;
  120. ihd_flg_chrgMosClosFlt = ((battWarningState >> 19) & 0x01) == 1;
  121. ihd_flg_disChrgModTLowFlt = ((battWarningState >> 22) & 0x01) == 1;
  122. ihd_flg_chrgModTLowFlt = ((battWarningState >> 23) & 0x01) == 1;
  123. ihd_flg_currOpenFlt = 0;
  124. ihd_st_heatForceControl = HeatForceControl;
  125. ihd_st_chrgMosControl = ChargeForbiddenControl == 0;
  126. ihd_st_disChrgMosControl = DisChargeForbiddenControl == 0;
  127. ihd_st_relayControl = RelayForbiddenControl == 0;
  128. // ihd_flg_DTCClear = 1; //////clear
  129. //调用算法
  130. SFM();
  131. TMS();
  132. CM();
  133. SPM();
  134. ISC();
  135. //实时存储
  136. if (socd_flg_EEsave == 1 || ihd_flg_DTCClear)
  137. {
  138. BCUEEDataSave();
  139. ihd_flg_DTCClear = false;
  140. }
  141. //
  142. if (BattWorkStateDelay == 0 && battI == 10000)
  143. {
  144. memcpy(appv_V_cellU, sfmv_V_cellU, sizeof(sfmv_V_cellU));
  145. }
  146. if (ihd_tm_parkTime < cmnc_tm_parkTime || battI != 10000)
  147. {
  148. appd_st_preCyc = 0;
  149. }
  150. BcuDataInfo.ihd_tm_parkTimeE = 0;
  151. BcuDataInfo.appDataModify = TRUE;
  152. }
  153. osDelay(100);
  154. }
  155. break;
  156. }
  157. //======================休眠模式===============================
  158. case PROCESS_STATE_SLEEP:
  159. {
  160. BCUEEDataSave();
  161. ihd_tm_parkTime = 0;
  162. while (TRUE)
  163. {
  164. if (TimeCounter % 10 == 0)
  165. {
  166. ihd_tm_parkTime++;
  167. //printf("time:%d\n",ihd_tm_parkTime);
  168. }
  169. if (TimeCounter % 1000 == 0)
  170. {
  171. BcuDataInfo.ihd_tm_parkTimeE = ihd_tm_parkTime;
  172. BcuDataInfo.appDataModify = TRUE;
  173. }
  174. if (gProcess_app == WORK)
  175. {
  176. BcuDataInfo.ihd_tm_parkTimeE = ihd_tm_parkTime;
  177. BcuDataInfo.appDataModify = TRUE;
  178. PROC_BCU_STATE_SWITCH(PROCESS_STATE_INIT);
  179. break;
  180. }
  181. osDelay(100);
  182. }
  183. break;
  184. }
  185. default:
  186. {
  187. PROC_BCU_STATE_SWITCH(PROCESS_STATE_INIT);
  188. break;
  189. }
  190. }
  191. }
  192. }
  193. //========================算法初始化========================================
  194. void BCU_Init(void)
  195. {
  196. SFM_Init();
  197. TMS_Init();
  198. CM_Init();
  199. SPM_Init();
  200. ISC_Init();
  201. }
  202. //==========================主线程调用======================================
  203. void AppTaskBcuInit(void *arg)
  204. {
  205. osThreadAttr_t task_attr;
  206. memset(&task_attr, 0, sizeof(task_attr));
  207. memset(gProcess_Bcu_TaskStack, 0xA5, PROC_BCU_TASK_STACK_SIZE);
  208. task_attr.name = "Bcu_Task";
  209. task_attr.stack_mem = gProcess_Bcu_TaskStack;
  210. task_attr.stack_size = PROC_BCU_TASK_STACK_SIZE;
  211. task_attr.priority = osPriorityBelowNormal7;
  212. task_attr.cb_mem = &gProcess_Bcu_Task_t;
  213. task_attr.cb_size = sizeof(StaticTask_t);
  214. BcuTaskId = osThreadNew(BCU, NULL, &task_attr);
  215. }
  216. //=========================数据存储========================================
  217. void BCUEEDataSave(void)
  218. {
  219. memcpy(BcuDataInfo.blcv_Q_totalCpE, blcv_Q_totalCpEo, sizeof(blcv_Q_totalCpEo));
  220. memcpy(BcuDataInfo.blcv_Q_reqCpE, blcv_Q_reqCpEo, sizeof(blcv_Q_reqCpEo));
  221. BcuDataInfo.socd_pct_bcuSocE = socd_pct_bcuSocEo;
  222. BcuDataInfo.socd_pct_battSocE = socd_pct_battSocEo;
  223. BcuDataInfo.sohd_tm_chrgStartStatE = sohd_tm_chrgStartStatEo;
  224. BcuDataInfo.sohd_flg_chrgEndE = sohd_flg_chrgEndEo;
  225. memcpy(BcuDataInfo.sohv_V_chrgStartStatE, sohv_V_chrgStartStatEo, sizeof(sohv_V_chrgStartStatEo));
  226. BcuDataInfo.sohd_Q_chrgE = sohd_Q_chrgEo;
  227. memcpy(BcuDataInfo.sohv_Q_packCapArrE, sohv_Q_packCapArrEo, sizeof(sohv_Q_packCapArrEo));
  228. memcpy(BcuDataInfo.sohv_Q_cellCapArrE, sohv_Q_cellCapArrEo, sizeof(sohv_Q_cellCapArrEo));
  229. memcpy(BcuDataInfo.iscv_Q_remainCpE, iscv_Q_remainCpEo, sizeof(iscv_Q_remainCpEo));
  230. memcpy(BcuDataInfo.sorv_ohm_cellRE, sorv_ohm_cellREo, sizeof(sorv_ohm_cellREo));
  231. BcuDataInfo.iscd_tm_totalE = iscd_tm_totalEo;
  232. BcuDataInfo.sfmd_flg_mainCirClosFltE = sfmd_flg_mainCirClosFltEo;
  233. BcuDataInfo.sfmd_flg_heatCirClosFltE = sfmd_flg_heatCirClosFltEo;
  234. BcuDataInfo.sfmd_flg_heatCirOpenFltE = sfmd_flg_heatCirOpenFltEo;
  235. BcuDataInfo.sfmd_flg_heatRunFltE = sfmd_flg_heatRunFltEo;
  236. BcuDataInfo.sfmd_flg_iscFltE = sfmd_flg_iscFltEo;
  237. BcuDataInfo.appDataModify = TRUE;
  238. }