bms_magene.c 13 KB

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