BCU.c 9.6 KB

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