BCU.c 8.3 KB

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