bms_magene.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. #include "bms_magene.h"
  2. #include "remain_distance.h"
  3. //全局变量
  4. BMS_Magene_TPDOInfo_Struct BMS_Magene_TPDOInfo_Main, BMS_Magene_TPDOInfo_Back; //电池主动上报数据
  5. BMS_Magene_RPDOInfo_Struct BMS_Magene_RPDOInfo_Main, BMS_Magene_RPDOInfo_Back; //电池控制参数
  6. BMS_Magene_OnLineCheck_Struct BMS_Magene_OnLineCheck_Main, BMS_Magene_OnLineCheck_Back; //电池在线检测
  7. BMS_Magene_CanData_Struct_t BMS_Magene_CanData; //电池报文数据
  8. //局部函数
  9. /*BMS数据更新*/
  10. void BMS_InfoUpdate(void)
  11. {
  12. static uint32_t PeriodCnt = 0;
  13. if((HAL_GetTick() - PeriodCnt <= 1000))
  14. return;
  15. else
  16. PeriodCnt = HAL_GetTick();
  17. //仅主电池打开
  18. if((BMS_Magene_TPDOInfo_Main.BatStInfo.State == 1) && (BMS_Magene_TPDOInfo_Back.BatStInfo.State == 0))
  19. {
  20. //运行信息
  21. BMS_RunInfo.Voltage = BMS_Magene_TPDOInfo_Main.BaseInfo.Voltage;
  22. BMS_RunInfo.Current = BMS_Magene_TPDOInfo_Main.BaseInfo.Current;
  23. BMS_RunInfo.RC = BMS_Magene_TPDOInfo_Main.CapInfo.RemainCapcity;
  24. BMS_RunInfo.FCC = BMS_Magene_TPDOInfo_Main.CapInfo.FullCapcity;
  25. BMS_RunInfo.Cell_NTC = BMS_Magene_TPDOInfo_Main.BaseInfo.Temperature;
  26. BMS_RunInfo.SOC = BMS_Magene_TPDOInfo_Main.CapInfo.SOC;
  27. BMS_RunInfo.Status.Status = (BMS_Magene_TPDOInfo_Main.BaseInfo.WorkState == 3) ? 0x01 : 0x00;
  28. BMS_RunInfo.SOH = BMS_Magene_TPDOInfo_Main.CapInfo.SOH;
  29. BMS_RunInfo.CycleCount = BMS_Magene_TPDOInfo_Main.CycInfo.CycleCount;
  30. if(BMS_Magene_TPDOInfo_Main.BaseInfo.Current >= 100)
  31. BMS_RunInfo.RemainChgTime = (BMS_Magene_TPDOInfo_Main.CapInfo.FullCapcity - BMS_Magene_TPDOInfo_Main.CapInfo.RemainCapcity) * 60 / BMS_Magene_TPDOInfo_Main.BaseInfo.Current;
  32. else
  33. BMS_RunInfo.RemainChgTime = 0;
  34. //电芯电压
  35. BMS_CellVol.Cell1 = BMS_Magene_TPDOInfo_Main.CellInfo1.CellVol[0];
  36. BMS_CellVol.Cell2 = BMS_Magene_TPDOInfo_Main.CellInfo1.CellVol[1];
  37. BMS_CellVol.Cell3 = BMS_Magene_TPDOInfo_Main.CellInfo1.CellVol[2];
  38. BMS_CellVol.Cell4 = BMS_Magene_TPDOInfo_Main.CellInfo2.CellVol[0];
  39. BMS_CellVol.Cell5 = BMS_Magene_TPDOInfo_Main.CellInfo2.CellVol[1];
  40. BMS_CellVol.Cell6 = BMS_Magene_TPDOInfo_Main.CellInfo2.CellVol[2];
  41. BMS_CellVol.Cell7 = BMS_Magene_TPDOInfo_Main.CellInfo3.CellVol[0];
  42. BMS_CellVol.Cell8 = BMS_Magene_TPDOInfo_Main.CellInfo3.CellVol[1];
  43. BMS_CellVol.Cell9 = BMS_Magene_TPDOInfo_Main.CellInfo3.CellVol[2];
  44. BMS_CellVol.Cell10 = BMS_Magene_TPDOInfo_Main.CellInfo4.CellVol[0];
  45. BMS_CellVol.Cell11 = BMS_Magene_TPDOInfo_Main.CellInfo4.CellVol[1];
  46. BMS_CellVol.Cell12 = BMS_Magene_TPDOInfo_Main.CellInfo4.CellVol[2];
  47. BMS_CellVol.Cell13 = BMS_Magene_TPDOInfo_Main.CellInfo5.CellVol[0];
  48. BMS_CellVol.Cell14 = BMS_Magene_TPDOInfo_Main.CellInfo5.CellVol[1];
  49. BMS_CellVol.Cell15 = BMS_Magene_TPDOInfo_Main.CellInfo5.CellVol[2];
  50. BMS_CellVol.Cell16 = 0;
  51. //故障码
  52. BMS_ErrorCode.Code = 0; //BMS故障时无法放电,不处理
  53. //设计信息
  54. BMS_DesignInfo.Capacity = BMS_Magene_TPDOInfo_Main.CycInfo.DesignCapcity;
  55. BMS_DesignInfo.Voltage = BMS_Magene_TPDOInfo_Main.RtcInfo.DesignVol;
  56. strcpy(BMS_DesignInfo.CellMode, "NONE ");
  57. BMS_DesignInfo.CellNum = 0;
  58. //版本信息
  59. strcpy(BMS_VerInfo.Mode, "MAGENE ");
  60. strcpy(BMS_VerInfo.SN_Num, "");
  61. strcpy(BMS_VerInfo.HW_Version, "");
  62. strcpy(BMS_VerInfo.FW_Version, "");
  63. //生产信息
  64. strcpy(BMS_MacInfo.Manufacturer, "MAGENE ");
  65. strcpy(BMS_MacInfo.MacAddr, "");
  66. strcpy(BMS_MacInfo.MacDate, "");
  67. strcpy(BMS_MacInfo.ProductTag, "");
  68. //使用记录
  69. BMS_UsrLog.Max_Tmp = BMS_Magene_TPDOInfo_Main.TmpInfo.CellT_Max;
  70. BMS_UsrLog.Min_Tmp = BMS_Magene_TPDOInfo_Main.TmpInfo.CellT_Min;
  71. BMS_UsrLog.LastChgTime = BMS_Magene_TPDOInfo_Main.StaInfo.LastChargeTime;
  72. BMS_UsrLog.MaxChgTime = BMS_Magene_TPDOInfo_Main.StaInfo.MaxChargeTime;
  73. }
  74. //仅副电池打开
  75. else if((BMS_Magene_TPDOInfo_Main.BatStInfo.State == 0) && (BMS_Magene_TPDOInfo_Back.BatStInfo.State == 1))
  76. {
  77. //运行信息
  78. BMS_RunInfo.Voltage = BMS_Magene_TPDOInfo_Back.BaseInfo.Voltage;
  79. BMS_RunInfo.Current = BMS_Magene_TPDOInfo_Back.BaseInfo.Current;
  80. BMS_RunInfo.RC = BMS_Magene_TPDOInfo_Back.CapInfo.RemainCapcity;
  81. BMS_RunInfo.FCC = BMS_Magene_TPDOInfo_Back.CapInfo.FullCapcity;
  82. BMS_RunInfo.Cell_NTC = BMS_Magene_TPDOInfo_Back.BaseInfo.Temperature;
  83. BMS_RunInfo.SOC = BMS_Magene_TPDOInfo_Back.CapInfo.SOC;
  84. BMS_RunInfo.Status.Status = (BMS_Magene_TPDOInfo_Back.BaseInfo.WorkState == 3) ? 0x01 : 0x00;
  85. BMS_RunInfo.SOH = BMS_Magene_TPDOInfo_Back.CapInfo.SOH;
  86. BMS_RunInfo.CycleCount = BMS_Magene_TPDOInfo_Back.CycInfo.CycleCount;
  87. if(BMS_Magene_TPDOInfo_Back.BaseInfo.Current >= 100)
  88. BMS_RunInfo.RemainChgTime = (BMS_Magene_TPDOInfo_Back.CapInfo.FullCapcity - BMS_Magene_TPDOInfo_Back.CapInfo.RemainCapcity) * 60 / BMS_Magene_TPDOInfo_Back.BaseInfo.Current;
  89. else
  90. BMS_RunInfo.RemainChgTime = 0;
  91. //电芯电压
  92. BMS_CellVol.Cell1 = BMS_Magene_TPDOInfo_Back.CellInfo1.CellVol[0];
  93. BMS_CellVol.Cell2 = BMS_Magene_TPDOInfo_Back.CellInfo1.CellVol[1];
  94. BMS_CellVol.Cell3 = BMS_Magene_TPDOInfo_Back.CellInfo1.CellVol[2];
  95. BMS_CellVol.Cell4 = BMS_Magene_TPDOInfo_Back.CellInfo2.CellVol[0];
  96. BMS_CellVol.Cell5 = BMS_Magene_TPDOInfo_Back.CellInfo2.CellVol[1];
  97. BMS_CellVol.Cell6 = BMS_Magene_TPDOInfo_Back.CellInfo2.CellVol[2];
  98. BMS_CellVol.Cell7 = BMS_Magene_TPDOInfo_Back.CellInfo3.CellVol[0];
  99. BMS_CellVol.Cell8 = BMS_Magene_TPDOInfo_Back.CellInfo3.CellVol[1];
  100. BMS_CellVol.Cell9 = BMS_Magene_TPDOInfo_Back.CellInfo3.CellVol[2];
  101. BMS_CellVol.Cell10 = BMS_Magene_TPDOInfo_Back.CellInfo4.CellVol[0];
  102. BMS_CellVol.Cell11 = BMS_Magene_TPDOInfo_Back.CellInfo4.CellVol[1];
  103. BMS_CellVol.Cell12 = BMS_Magene_TPDOInfo_Back.CellInfo4.CellVol[2];
  104. BMS_CellVol.Cell13 = BMS_Magene_TPDOInfo_Back.CellInfo5.CellVol[0];
  105. BMS_CellVol.Cell14 = BMS_Magene_TPDOInfo_Back.CellInfo5.CellVol[1];
  106. BMS_CellVol.Cell15 = BMS_Magene_TPDOInfo_Back.CellInfo5.CellVol[2];
  107. BMS_CellVol.Cell16 = 0;
  108. //故障码
  109. BMS_ErrorCode.Code = 0; //BMS故障时无法放电,不处理
  110. //设计信息
  111. BMS_DesignInfo.Capacity = BMS_Magene_TPDOInfo_Back.CycInfo.DesignCapcity;
  112. BMS_DesignInfo.Voltage = BMS_Magene_TPDOInfo_Back.RtcInfo.DesignVol;
  113. strcpy(BMS_DesignInfo.CellMode, "NONE ");
  114. BMS_DesignInfo.CellNum = 0;
  115. //版本信息
  116. strcpy(BMS_VerInfo.Mode, "MAGENE ");
  117. strcpy(BMS_VerInfo.SN_Num, "");
  118. strcpy(BMS_VerInfo.HW_Version, "");
  119. strcpy(BMS_VerInfo.FW_Version, "");
  120. //生产信息
  121. strcpy(BMS_MacInfo.Manufacturer, "MAGENE ");
  122. strcpy(BMS_MacInfo.MacAddr, "");
  123. strcpy(BMS_MacInfo.MacDate, "");
  124. strcpy(BMS_MacInfo.ProductTag, "");
  125. //使用记录
  126. BMS_UsrLog.Max_Tmp = BMS_Magene_TPDOInfo_Back.TmpInfo.CellT_Max;
  127. BMS_UsrLog.Min_Tmp = BMS_Magene_TPDOInfo_Back.TmpInfo.CellT_Min;
  128. BMS_UsrLog.LastChgTime = BMS_Magene_TPDOInfo_Back.StaInfo.LastChargeTime;
  129. BMS_UsrLog.MaxChgTime = BMS_Magene_TPDOInfo_Back.StaInfo.MaxChargeTime;
  130. }
  131. //主副电池同时打开
  132. else if((BMS_Magene_TPDOInfo_Main.BatStInfo.State == 1) && (BMS_Magene_TPDOInfo_Back.BatStInfo.State == 1))
  133. {
  134. //暂不考虑
  135. }
  136. }
  137. /*BMS开关控制*/
  138. void BMS_SwitchCtl(void)
  139. {
  140. //暂时只考虑单电池,电池需要先打开
  141. }
  142. /*BMS在线检测*/
  143. void BMS_OnLineCheck(void)
  144. {
  145. //主电池检测
  146. if((HAL_GetTick() - BMS_Magene_OnLineCheck_Main.TimeCnt) > 3000)
  147. {
  148. BMS_Magene_OnLineCheck_Main.OnLineFlag = 0;
  149. }
  150. //备电池检测
  151. if((HAL_GetTick() - BMS_Magene_OnLineCheck_Back.TimeCnt) > 3000)
  152. {
  153. BMS_Magene_OnLineCheck_Back.OnLineFlag = 0;
  154. }
  155. }
  156. /*BMS数据解析*/
  157. void BMS_CanProcess(BMS_Magene_CanData_Struct_t* CanData)
  158. {
  159. if(CanData->RefreshFlag == 1)
  160. {
  161. if(CanData->ID == (BMS_MAGENE_BASE_TPDO + BMS_MAGENE_ADDRESS_MAIN)) //主电池
  162. {
  163. if(CanData->Data[0] == BMS_MAGENE_STATUS_PAGE_ID) //识别PageID
  164. {
  165. memcpy((uint8_t*)CanData->Data + 2, (uint8_t*)&BMS_Magene_TPDOInfo_Main.BaseInfo.PageID + (CanData->Data[1] - 9) * 8 + 2, 6);
  166. }
  167. BMS_Magene_OnLineCheck_Main.OnLineFlag = 1;
  168. BMS_Magene_OnLineCheck_Main.TimeCnt = HAL_GetTick();
  169. }
  170. else if(CanData->ID == (BMS_MAGENE_BASE_TPDO + BMS_MAGENE_ADDRESS_BACK)) //备电池
  171. {
  172. if(CanData->Data[0] == BMS_MAGENE_STATUS_PAGE_ID) //识别PageID
  173. {
  174. memcpy((uint8_t*)CanData->Data + 2, (uint8_t*)&BMS_Magene_TPDOInfo_Back.BaseInfo.PageID + (CanData->Data[1] - 9) * 8 + 2, 6);
  175. }
  176. BMS_Magene_OnLineCheck_Back.OnLineFlag = 1;
  177. BMS_Magene_OnLineCheck_Back.TimeCnt = HAL_GetTick();
  178. }
  179. //电池通信正常标志置位,用于续航计算
  180. RemainDis.IsBMS_ComOK_Flag = TRUE;
  181. RemainDis.BMS_Com_DelayTimeCnt = HAL_GetTick();
  182. //BMS通信正常标志置位
  183. IsComOK_BMS.IsOK_Flag = TRUE;
  184. IsComOK_BMS.OK_TrigTime = HAL_GetTick();
  185. CanData->RefreshFlag = 0;
  186. }
  187. }
  188. //全局函数
  189. /*参数初始化*/
  190. void BMS_Magene_VarInit(void)
  191. {
  192. BMS_Magene_TPDOInfo_Main.BaseInfo.PageID = BMS_MAGENE_STATUS_PAGE_ID;
  193. BMS_Magene_TPDOInfo_Main.BaseInfo.Code = BMS_MAGENE_FUC_CODE_BASE_INFO;
  194. BMS_Magene_TPDOInfo_Main.CapInfo.PageID = BMS_MAGENE_STATUS_PAGE_ID;
  195. BMS_Magene_TPDOInfo_Main.CapInfo.Code = BMS_MAGENE_FUC_CODE_CAP_INFO;
  196. BMS_Magene_TPDOInfo_Main.CycInfo.PageID = BMS_MAGENE_STATUS_PAGE_ID;
  197. BMS_Magene_TPDOInfo_Main.CycInfo.Code = BMS_MAGENE_FUC_CODE_CYC_INFO;
  198. BMS_Magene_TPDOInfo_Main.StaInfo.PageID = BMS_MAGENE_STATUS_PAGE_ID;
  199. BMS_Magene_TPDOInfo_Main.StaInfo.Code = BMS_MAGENE_FUC_CODE_STA_INFO;
  200. BMS_Magene_TPDOInfo_Main.RtcInfo.PageID = BMS_MAGENE_STATUS_PAGE_ID;
  201. BMS_Magene_TPDOInfo_Main.RtcInfo.Code = BMS_MAGENE_FUC_CODE_RTC_INFO;
  202. BMS_Magene_TPDOInfo_Main.CellInfo1.PageID = BMS_MAGENE_STATUS_PAGE_ID;
  203. BMS_Magene_TPDOInfo_Main.CellInfo1.Code = BMS_MAGENE_FUC_CODE_CELL1_INFO;
  204. BMS_Magene_TPDOInfo_Main.CellInfo2.PageID = BMS_MAGENE_STATUS_PAGE_ID;
  205. BMS_Magene_TPDOInfo_Main.CellInfo2.Code = BMS_MAGENE_FUC_CODE_CELL2_INFO;
  206. BMS_Magene_TPDOInfo_Main.CellInfo3.PageID = BMS_MAGENE_STATUS_PAGE_ID;
  207. BMS_Magene_TPDOInfo_Main.CellInfo3.Code = BMS_MAGENE_FUC_CODE_CELL3_INFO;
  208. BMS_Magene_TPDOInfo_Main.CellInfo4.PageID = BMS_MAGENE_STATUS_PAGE_ID;
  209. BMS_Magene_TPDOInfo_Main.CellInfo4.Code = BMS_MAGENE_FUC_CODE_CELL4_INFO;
  210. BMS_Magene_TPDOInfo_Main.CellInfo5.PageID = BMS_MAGENE_STATUS_PAGE_ID;
  211. BMS_Magene_TPDOInfo_Main.CellInfo5.Code = BMS_MAGENE_FUC_CODE_CELL5_INFO;
  212. BMS_Magene_TPDOInfo_Main.TmpInfo.PageID = BMS_MAGENE_STATUS_PAGE_ID;
  213. BMS_Magene_TPDOInfo_Main.TmpInfo.Code = BMS_MAGENE_FUC_CODE_TMP_INFO;
  214. BMS_Magene_TPDOInfo_Main.BatStInfo.PageID = BMS_MAGENE_STATUS_PAGE_ID;
  215. BMS_Magene_TPDOInfo_Main.BatStInfo.Code = BMS_MAGENE_FUC_CODE_SW_INFO;
  216. BMS_Magene_TPDOInfo_Back.BaseInfo.PageID = BMS_MAGENE_STATUS_PAGE_ID;
  217. BMS_Magene_TPDOInfo_Back.BaseInfo.Code = BMS_MAGENE_FUC_CODE_BASE_INFO;
  218. BMS_Magene_TPDOInfo_Back.CapInfo.PageID = BMS_MAGENE_STATUS_PAGE_ID;
  219. BMS_Magene_TPDOInfo_Back.CapInfo.Code = BMS_MAGENE_FUC_CODE_CAP_INFO;
  220. BMS_Magene_TPDOInfo_Back.CycInfo.PageID = BMS_MAGENE_STATUS_PAGE_ID;
  221. BMS_Magene_TPDOInfo_Back.CycInfo.Code = BMS_MAGENE_FUC_CODE_CYC_INFO;
  222. BMS_Magene_TPDOInfo_Back.StaInfo.PageID = BMS_MAGENE_STATUS_PAGE_ID;
  223. BMS_Magene_TPDOInfo_Back.StaInfo.Code = BMS_MAGENE_FUC_CODE_STA_INFO;
  224. BMS_Magene_TPDOInfo_Back.RtcInfo.PageID = BMS_MAGENE_STATUS_PAGE_ID;
  225. BMS_Magene_TPDOInfo_Back.RtcInfo.Code = BMS_MAGENE_FUC_CODE_RTC_INFO;
  226. BMS_Magene_TPDOInfo_Back.CellInfo1.PageID = BMS_MAGENE_STATUS_PAGE_ID;
  227. BMS_Magene_TPDOInfo_Back.CellInfo1.Code = BMS_MAGENE_FUC_CODE_CELL1_INFO;
  228. BMS_Magene_TPDOInfo_Back.CellInfo2.PageID = BMS_MAGENE_STATUS_PAGE_ID;
  229. BMS_Magene_TPDOInfo_Back.CellInfo2.Code = BMS_MAGENE_FUC_CODE_CELL2_INFO;
  230. BMS_Magene_TPDOInfo_Back.CellInfo3.PageID = BMS_MAGENE_STATUS_PAGE_ID;
  231. BMS_Magene_TPDOInfo_Back.CellInfo3.Code = BMS_MAGENE_FUC_CODE_CELL3_INFO;
  232. BMS_Magene_TPDOInfo_Back.CellInfo4.PageID = BMS_MAGENE_STATUS_PAGE_ID;
  233. BMS_Magene_TPDOInfo_Back.CellInfo4.Code = BMS_MAGENE_FUC_CODE_CELL4_INFO;
  234. BMS_Magene_TPDOInfo_Back.CellInfo5.PageID = BMS_MAGENE_STATUS_PAGE_ID;
  235. BMS_Magene_TPDOInfo_Back.CellInfo5.Code = BMS_MAGENE_FUC_CODE_CELL5_INFO;
  236. BMS_Magene_TPDOInfo_Back.TmpInfo.PageID = BMS_MAGENE_STATUS_PAGE_ID;
  237. BMS_Magene_TPDOInfo_Back.TmpInfo.Code = BMS_MAGENE_FUC_CODE_TMP_INFO;
  238. BMS_Magene_TPDOInfo_Back.BatStInfo.PageID = BMS_MAGENE_STATUS_PAGE_ID;
  239. BMS_Magene_TPDOInfo_Back.BatStInfo.Code = BMS_MAGENE_FUC_CODE_SW_INFO;
  240. BMS_Magene_CanData.RefreshFlag = 0;
  241. }
  242. /*BMS处理主循环*/
  243. void BMS_Magene_Loop(void)
  244. {
  245. BMS_CanProcess(&BMS_Magene_CanData);
  246. BMS_OnLineCheck();
  247. BMS_SwitchCtl();
  248. BMS_InfoUpdate();
  249. }