soft_bms.c 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729
  1. #include "soft_bms.h"
  2. #include "main.h"
  3. #include "soft_engine.h"
  4. #include "soft_bms.h"
  5. #include "soft_okcell.h"
  6. #include "soft_tattu.h"
  7. #include "soft_poweramp.h"
  8. #include "string.h"
  9. #include "stdio.h"
  10. #include "stdlib.h"
  11. #include "soft_herewin.h"
  12. #include "soft_crc.h"
  13. #include "soft_p_2_c.h"
  14. #include "soft_seed_device.h"
  15. #include "soft_version.h"
  16. #include "qingxie_bms.h"
  17. Vkbms_Device Device1 = {.Vkbms_Link.connect_status = COMP_NOEXIST};
  18. Vkbms_Device Device2 = {.Vkbms_Link.connect_status = COMP_NOEXIST};
  19. struct BMS_DATA bms_data = {.bms_ss = 0xFFFF}, bms_data2 = {.bms_ss = 0xFFFF};
  20. /**
  21. * @file update_bms_data
  22. * @brief 更新电池信息
  23. * @param none
  24. * @details
  25. * @author Zhang Sir
  26. **/
  27. void update_bms_data( void )
  28. {
  29. //正方电池
  30. Check_dev_link(&okcell_device1.Okcell_Link,5000,(char *)&okcell_device1.okcell_inf,sizeof(_CELL_INF));
  31. Check_dev_link(&okcell_device2.Okcell_Link,5000,(char *)&okcell_device2.okcell_inf,sizeof(_CELL_INF));
  32. //格式电池
  33. Check_dev_link(&tattu_device1.Tattu_Link,5000,(char *)&tattu_device1.ttu_inf,sizeof(_TATTU_INFO));
  34. Check_dev_link(&tattu_device2.Tattu_Link,5000,(char *)&tattu_device2.ttu_inf,sizeof(_TATTU_INFO));
  35. //极目电池
  36. check_poweramp_link();
  37. //海盈电池
  38. Check_dev_link(&Herewin_Link,5000,(char *)&herewin_info,sizeof(herewin_bms));
  39. //VK电池
  40. Check_dev_link(&Device1.Vkbms_Link,5000,(char *)&Device1,sizeof(Vkbms_Device));
  41. Check_dev_link(&Device2.Vkbms_Link,5000,(char *)&Device2,sizeof(Vkbms_Device));
  42. if ( okcell_device1.Okcell_Link.connect_status == COMP_NORMAL || okcell_device2.Okcell_Link.connect_status == COMP_NORMAL )
  43. {
  44. Dev.Bms_Link.connect_status = COMP_NORMAL;
  45. //第一组电池
  46. if ( okcell_device1.Okcell_Link.connect_status == COMP_NORMAL )
  47. {
  48. bms_data.bms_cycle = okcell_device1.okcell_inf.cell_D3.cell_d3[4];
  49. if(okcell_device1.okcell_inf.cell_D0.cell_d0[6] >= 18) //正方超18S电池10mv发送
  50. {
  51. bms_data.bms_volt = okcell_device1.okcell_inf.cell_D0.cell_d0[0];
  52. }
  53. else
  54. {
  55. bms_data.bms_volt = okcell_device1.okcell_inf.cell_D0.cell_d0[0] / 10;
  56. }
  57. bms_data.bms_temp = okcell_device1.okcell_inf.cell_D0.cell_d0[2];
  58. bms_data.bms_vs = okcell_device1.okcell_inf.cell_D0.cell_d0[3];
  59. //正方电池只关心飞控对接异常不让解锁,不关心异常5
  60. bms_data.bms_ss = ( ( okcell_device1.okcell_inf.cell_D0.cell_d0[5] >> 8 ) != 5 ) ? ( okcell_device1.okcell_inf.cell_D0.cell_d0[5] >> 8 ) : 0;
  61. bms_data.bms_num = okcell_device1.okcell_inf.cell_D0.cell_d0[6];
  62. bms_data.bms_v1 = okcell_device1.okcell_inf.cell_D0.cell_d0[7];
  63. bms_data.bms_v2 = okcell_device1.okcell_inf.cell_D0.cell_d0[8];
  64. bms_data.bms_v3 = okcell_device1.okcell_inf.cell_D0.cell_d0[9];
  65. bms_data.bms_v4 = okcell_device1.okcell_inf.cell_D0.cell_d0[10];
  66. bms_data.bms_v5 = okcell_device1.okcell_inf.cell_D0.cell_d0[11];
  67. bms_data.bms_v6 = okcell_device1.okcell_inf.cell_D0.cell_d0[12];
  68. bms_data.bms_v7 = okcell_device1.okcell_inf.cell_D0.cell_d0[13];
  69. bms_data.bms_v8 = okcell_device1.okcell_inf.cell_D0.cell_d0[14];
  70. bms_data.bms_v9 = okcell_device1.okcell_inf.cell_D0.cell_d0[15];
  71. bms_data.bms_v10 = okcell_device1.okcell_inf.cell_D0.cell_d0[16];
  72. bms_data.bms_v11 = okcell_device1.okcell_inf.cell_D0.cell_d0[17];
  73. bms_data.bms_v12 = okcell_device1.okcell_inf.cell_D0.cell_d0[18];
  74. bms_data.bms_v13 = okcell_device1.okcell_inf.cell_D0.cell_d0[19];
  75. bms_data.bms_v14 = okcell_device1.okcell_inf.cell_D0.cell_d0[20];
  76. bms_data.bms_v15 = okcell_device1.okcell_inf.cell_D0.cell_d0[21];
  77. bms_data.bms_v16 = okcell_device1.okcell_inf.cell_D0.cell_d0[22];
  78. bms_data.bms_v17 = okcell_device1.okcell_inf.cell_D0.cell_d0[23];
  79. bms_data.bms_v18 = okcell_device1.okcell_inf.cell_D0.cell_d0[24];
  80. bms_data.bms_v19 = okcell_device1.okcell_inf.cell_D0.cell_d0[25];
  81. bms_data.bms_v20 = okcell_device1.okcell_inf.cell_D0.cell_d0[26];
  82. bms_data.bms_v21 = okcell_device1.okcell_inf.cell_D0.cell_d0[27];
  83. bms_data.bms_v22 = okcell_device1.okcell_inf.cell_D0.cell_d0[28];
  84. bms_data.bms_v23 = okcell_device1.okcell_inf.cell_D0.cell_d0[29];
  85. bms_data.bms_v24 = okcell_device1.okcell_inf.cell_D0.cell_d0[30];
  86. bms_data.bms_v25 = okcell_device1.okcell_inf.cell_D0.cell_d0[31];
  87. bms_data.bms_v26 = okcell_device1.okcell_inf.cell_D0.cell_d0[32];
  88. bms_data.bms_ids[0] = okcell_device1.okcell_inf.cell_P3.cell_p3[0];
  89. bms_data.bms_ids[1] = okcell_device1.okcell_inf.cell_P3.cell_p3[1];
  90. for(int i = 1; i< 11; i++){
  91. // bms_data.bms_ids[2*i] = ((okcell_device1.okcell_inf.cell_P3.cell_p3[2 + i] >> 4) & 0xf) + '0';
  92. // bms_data.bms_ids[2*i+1] = (okcell_device1.okcell_inf.cell_P3.cell_p3[2 + i] & 0xf )+ '0';
  93. bms_data.bms_ids[2*i] = ((okcell_device1.okcell_inf.cell_P3.cell_p3[1 + i] >> 4) & 0xf) + '0';
  94. bms_data.bms_ids[2*i+1] = (okcell_device1.okcell_inf.cell_P3.cell_p3[1 + i] & 0xf )+ '0';
  95. }
  96. //memcpy( bms_data.bms_ids, "okcell", 6 );
  97. bms_data.bms_ac = okcell_device1.okcell_inf.cell_D0.cell_d0[1];
  98. bms_data.serial_num = FAC_OKCELL;
  99. //注册
  100. if(StrArrayNull( &bms_data.bms_ids[0], sizeof( bms_data.bms_ids ) ) == false && dev_bms1.regist.sn == false)
  101. regist_dev_info(&dev_bms1,DEVICE_BMS1,false,(char *)bms_data.bms_ids,32,NULL,0,NULL,0,"okcell1",8);
  102. }
  103. else
  104. {
  105. memset( &bms_data, 0, sizeof( bms_data ) );
  106. }
  107. //第二组电池
  108. if ( okcell_device2.Okcell_Link.connect_status == COMP_NORMAL )
  109. {
  110. bms_data2.bms_cycle = okcell_device2.okcell_inf.cell_D3.cell_d3[4];
  111. if(okcell_device2.okcell_inf.cell_D0.cell_d0[6] >= 18)
  112. {
  113. bms_data2.bms_volt = okcell_device2.okcell_inf.cell_D0.cell_d0[0];
  114. }
  115. else
  116. {
  117. bms_data2.bms_volt = okcell_device2.okcell_inf.cell_D0.cell_d0[0] / 10;
  118. }
  119. bms_data2.bms_temp = okcell_device2.okcell_inf.cell_D0.cell_d0[2];
  120. bms_data2.bms_vs = okcell_device2.okcell_inf.cell_D0.cell_d0[3];
  121. //正方电池只关心飞控对接异常不让解锁,不关心异常5
  122. bms_data2.bms_ss = ( ( okcell_device2.okcell_inf.cell_D0.cell_d0[5] >> 8 ) != 5 ) ? ( okcell_device2.okcell_inf.cell_D0.cell_d0[5] >> 8 ) : 0;
  123. bms_data2.bms_num = okcell_device2.okcell_inf.cell_D0.cell_d0[6];
  124. bms_data2.bms_v1 = okcell_device2.okcell_inf.cell_D0.cell_d0[7];
  125. bms_data2.bms_v2 = okcell_device2.okcell_inf.cell_D0.cell_d0[8];
  126. bms_data2.bms_v3 = okcell_device2.okcell_inf.cell_D0.cell_d0[9];
  127. bms_data2.bms_v4 = okcell_device2.okcell_inf.cell_D0.cell_d0[10];
  128. bms_data2.bms_v5 = okcell_device2.okcell_inf.cell_D0.cell_d0[11];
  129. bms_data2.bms_v6 = okcell_device2.okcell_inf.cell_D0.cell_d0[12];
  130. bms_data2.bms_v7 = okcell_device2.okcell_inf.cell_D0.cell_d0[13];
  131. bms_data2.bms_v8 = okcell_device2.okcell_inf.cell_D0.cell_d0[14];
  132. bms_data2.bms_v9 = okcell_device2.okcell_inf.cell_D0.cell_d0[15];
  133. bms_data2.bms_v10 = okcell_device2.okcell_inf.cell_D0.cell_d0[16];
  134. bms_data2.bms_v11 = okcell_device2.okcell_inf.cell_D0.cell_d0[17];
  135. bms_data2.bms_v12 = okcell_device2.okcell_inf.cell_D0.cell_d0[18];
  136. bms_data2.bms_v13 = okcell_device2.okcell_inf.cell_D0.cell_d0[19];
  137. bms_data2.bms_v14 = okcell_device2.okcell_inf.cell_D0.cell_d0[20];
  138. bms_data2.bms_v15 = okcell_device2.okcell_inf.cell_D0.cell_d0[21];
  139. bms_data2.bms_v16 = okcell_device2.okcell_inf.cell_D0.cell_d0[22];
  140. bms_data2.bms_v17 = okcell_device2.okcell_inf.cell_D0.cell_d0[23];
  141. bms_data2.bms_v18 = okcell_device2.okcell_inf.cell_D0.cell_d0[24];
  142. bms_data2.bms_v19 = okcell_device2.okcell_inf.cell_D0.cell_d0[25];
  143. bms_data2.bms_v20 = okcell_device2.okcell_inf.cell_D0.cell_d0[26];
  144. bms_data2.bms_v21 = okcell_device2.okcell_inf.cell_D0.cell_d0[27];
  145. bms_data2.bms_v22 = okcell_device2.okcell_inf.cell_D0.cell_d0[28];
  146. bms_data2.bms_v23 = okcell_device2.okcell_inf.cell_D0.cell_d0[29];
  147. bms_data2.bms_v24 = okcell_device2.okcell_inf.cell_D0.cell_d0[30];
  148. bms_data2.bms_v25 = okcell_device2.okcell_inf.cell_D0.cell_d0[31];
  149. bms_data2.bms_v26 = okcell_device2.okcell_inf.cell_D0.cell_d0[32];
  150. bms_data2.bms_ids[0] = okcell_device1.okcell_inf.cell_P3.cell_p3[0];
  151. bms_data2.bms_ids[1] = okcell_device1.okcell_inf.cell_P3.cell_p3[1];
  152. for(int i = 1; i< 11; i++){
  153. bms_data2.bms_ids[2*i] = ((okcell_device2.okcell_inf.cell_P3.cell_p3[1 + i] >> 4) & 0xf) + '0';
  154. bms_data2.bms_ids[2*i+1] = (okcell_device2.okcell_inf.cell_P3.cell_p3[1 + i] & 0xf )+ '0';
  155. }
  156. //memcpy( bms_data2.bms_ids, "okcell2", 7 );
  157. bms_data2.bms_ac = okcell_device2.okcell_inf.cell_D0.cell_d0[1];
  158. bms_data2.serial_num = FAC_OKCELL;
  159. if(StrArrayNull( &bms_data2.bms_ids[0], sizeof( bms_data2.bms_ids ) ) == false && dev_bms2.regist.sn == false)
  160. regist_dev_info(&dev_bms2,DEVICE_BMS2,false,(char *)bms_data2.bms_ids,32,NULL,0,NULL,0,"okcell2",8);
  161. }
  162. else
  163. {
  164. memset( &bms_data2, 0, sizeof( bms_data2 ) );
  165. }
  166. }
  167. else if(tattu_device1.Tattu_Link.connect_status == COMP_NORMAL || tattu_device2.Tattu_Link.connect_status == COMP_NORMAL)
  168. {
  169. Dev.Bms_Link.connect_status = COMP_NORMAL;
  170. if(tattu_device1.Tattu_Link.connect_status == COMP_NORMAL)
  171. {
  172. group_num = 1;
  173. bms_data.bms_cycle = tattu_device1.ttu_inf.tattu_cycle;
  174. bms_data.bms_volt = tattu_device1.ttu_inf.tattu_volt /10;
  175. bms_data.bms_temp = tattu_device1.ttu_inf.tattu_temp * 10;
  176. bms_data.bms_vs = tattu_device1.ttu_inf.tattu_perc;
  177. bms_data.bms_ss = 0;//ttu_inf.def_info[24] & 0xc00;//格式电池只关心部分报警不让解锁
  178. bms_data.bms_num = tattu_device1.ttu_inf.tattu_cnum;
  179. bms_data.bms_v1 = tattu_device1.ttu_inf.tattu_v1;
  180. bms_data.bms_v2 = tattu_device1.ttu_inf.tattu_v2;
  181. bms_data.bms_v3 = tattu_device1.ttu_inf.tattu_v3;
  182. bms_data.bms_v4 = tattu_device1.ttu_inf.tattu_v4;
  183. bms_data.bms_v5 = tattu_device1.ttu_inf.tattu_v5;
  184. bms_data.bms_v6 = tattu_device1.ttu_inf.tattu_v6;
  185. bms_data.bms_v7 = tattu_device1.ttu_inf.tattu_v7;
  186. bms_data.bms_v8 = tattu_device1.ttu_inf.tattu_v8;
  187. bms_data.bms_v9 = tattu_device1.ttu_inf.tattu_v9;
  188. bms_data.bms_v10 = tattu_device1.ttu_inf.tattu_v10;
  189. bms_data.bms_v11 = tattu_device1.ttu_inf.tattu_v11;
  190. bms_data.bms_v12 = tattu_device1.ttu_inf.tattu_v12;
  191. bms_data.bms_v13 = tattu_device1.ttu_inf.tattu_v13;
  192. bms_data.bms_v14 = tattu_device1.ttu_inf.tattu_v14;
  193. memcpy(bms_data.bms_ids,&tattu_device1.ttu_inf.tuattu_id[0],16);
  194. //memcpy(bms_data.bms_ids, "Tattu1", 6);
  195. bms_data.bms_ac = tattu_device1.ttu_inf.tattu_cur;
  196. bms_data.serial_num = FAC_TATTU;
  197. if(StrArrayNull( &bms_data.bms_ids[0], sizeof( bms_data.bms_ids ) ) == false && dev_bms1.regist.sn == false)
  198. regist_dev_info(&dev_bms1,DEVICE_BMS1,false,(char *)bms_data.bms_ids,16,NULL,0,NULL,0,"tattu1",7);
  199. }
  200. else
  201. {
  202. memset( &bms_data, 0, sizeof(bms_data));
  203. }
  204. if(tattu_device2.Tattu_Link.connect_status == COMP_NORMAL)
  205. {
  206. group_num = 2;
  207. bms_data2.bms_cycle = tattu_device2.ttu_inf.tattu_cycle;
  208. bms_data2.bms_volt = tattu_device2.ttu_inf.tattu_volt / 10;
  209. bms_data2.bms_temp = tattu_device2.ttu_inf.tattu_temp * 10;
  210. bms_data2.bms_vs = tattu_device2.ttu_inf.tattu_perc;
  211. bms_data2.bms_ss = 0;//ttu_inf.def_info[24] & 0xc00;//格式电池只关心部分报警不让解锁
  212. bms_data2.bms_num = tattu_device2.ttu_inf.tattu_cnum;
  213. bms_data2.bms_v1 = tattu_device2.ttu_inf.tattu_v1;
  214. bms_data2.bms_v2 = tattu_device2.ttu_inf.tattu_v2;
  215. bms_data2.bms_v3 = tattu_device2.ttu_inf.tattu_v3;
  216. bms_data2.bms_v4 = tattu_device2.ttu_inf.tattu_v4;
  217. bms_data2.bms_v5 = tattu_device2.ttu_inf.tattu_v5;
  218. bms_data2.bms_v6 = tattu_device2.ttu_inf.tattu_v6;
  219. bms_data2.bms_v7 = tattu_device2.ttu_inf.tattu_v7;
  220. bms_data2.bms_v8 = tattu_device2.ttu_inf.tattu_v8;
  221. bms_data2.bms_v9 = tattu_device2.ttu_inf.tattu_v9;
  222. bms_data2.bms_v10 = tattu_device2.ttu_inf.tattu_v10;
  223. bms_data2.bms_v11 = tattu_device2.ttu_inf.tattu_v11;
  224. bms_data2.bms_v12 = tattu_device2.ttu_inf.tattu_v12;
  225. bms_data2.bms_v13 = tattu_device2.ttu_inf.tattu_v13;
  226. bms_data2.bms_v14 = tattu_device2.ttu_inf.tattu_v14;
  227. memcpy(bms_data2.bms_ids,&tattu_device2.ttu_inf.tuattu_id[0],16);
  228. //memcpy(bms_data2.bms_ids, "Tattu2", 6);
  229. bms_data2.bms_ac = tattu_device2.ttu_inf.tattu_cur;
  230. bms_data2.serial_num = FAC_TATTU;
  231. if(StrArrayNull( &bms_data2.bms_ids[0], sizeof( bms_data2.bms_ids ) ) == false && dev_bms2.regist.sn == false)
  232. regist_dev_info(&dev_bms2,DEVICE_BMS2,false,(char *)bms_data2.bms_ids,16,NULL,0,NULL,0,"tattu2",7);
  233. }
  234. else
  235. {
  236. memset( &bms_data2, 0, sizeof( bms_data2 ) );
  237. }
  238. }
  239. else if ( Poweramp_Link.connect_status == COMP_NORMAL )
  240. {
  241. Dev.Bms_Link.connect_status = COMP_NORMAL;
  242. group_num = 1;
  243. //ID不足12位的从buf[0]开始存放
  244. bms_data.bms_cycle = poweramp_sys.amp_cycle;
  245. bms_data.bms_volt = ((uint16_t)poweramp_inf.amp_data[0]) / 10;
  246. bms_data.bms_temp = poweramp_inf.amp_data[3];
  247. bms_data.bms_vs = poweramp_inf.amp_data[5] / 10;
  248. bms_data.bms_ss = poweramp_inf.amp_data[22];
  249. bms_data.bms_num = 13;
  250. bms_data.bms_v1 = poweramp_inf.amp_data[9];
  251. bms_data.bms_v2 = poweramp_inf.amp_data[10];
  252. bms_data.bms_v3 = poweramp_inf.amp_data[11];
  253. bms_data.bms_v4 = poweramp_inf.amp_data[12];
  254. bms_data.bms_v5 = poweramp_inf.amp_data[13];
  255. bms_data.bms_v6 = poweramp_inf.amp_data[14];
  256. bms_data.bms_v7 = poweramp_inf.amp_data[15];
  257. bms_data.bms_v8 = poweramp_inf.amp_data[16];
  258. bms_data.bms_v9 = poweramp_inf.amp_data[17];
  259. bms_data.bms_v10 = poweramp_inf.amp_data[18];
  260. bms_data.bms_v11 = poweramp_inf.amp_data[19];
  261. bms_data.bms_v12 = poweramp_inf.amp_data[20];
  262. bms_data.bms_v13 = poweramp_inf.amp_data[21];
  263. memcpy( bms_data.bms_ids, "poweramp", 8 );
  264. bms_data.bms_ac = poweramp_inf.amp_data[1];
  265. bms_data.serial_num = FAC_POWERAMP;
  266. if(dev_bms1.regist.dev == false)
  267. regist_dev_info(&dev_bms1,DEVICE_BMS1,false,NULL,0,NULL,0,NULL,0,"poweramp",9);
  268. }
  269. else if ( Herewin_Link.connect_status == COMP_NORMAL )
  270. {
  271. Dev.Bms_Link.connect_status = COMP_NORMAL;
  272. group_num = 1;
  273. bms_data.bms_cycle = herewin_info.circulation_num;
  274. bms_data.bms_volt = herewin_info.total_vol;
  275. if(herewin_info.get_temp_flag == true)
  276. bms_data.bms_temp = ( ( herewin_info.battery_temp[0] + herewin_info.battery_temp[1] + herewin_info.battery_temp[2] ) / 3 - 40 ) * 10;
  277. bms_data.bms_vs = herewin_info.SOC_info;
  278. bms_data.bms_ss = herewin_info.warn_info;
  279. bms_data.bms_num = herewin_info.battery_num;
  280. bms_data.bms_v1 = herewin_info.battery_vol[0];
  281. bms_data.bms_v2 = herewin_info.battery_vol[1];
  282. bms_data.bms_v3 = herewin_info.battery_vol[2];
  283. bms_data.bms_v4 = herewin_info.battery_vol[3];
  284. bms_data.bms_v5 = herewin_info.battery_vol[4];
  285. bms_data.bms_v6 = herewin_info.battery_vol[5];
  286. bms_data.bms_v7 = herewin_info.battery_vol[6];
  287. bms_data.bms_v8 = herewin_info.battery_vol[7];
  288. bms_data.bms_v9 = herewin_info.battery_vol[8];
  289. bms_data.bms_v10 = herewin_info.battery_vol[9];
  290. bms_data.bms_v11 = herewin_info.battery_vol[10];
  291. bms_data.bms_v12 = herewin_info.battery_vol[11];
  292. bms_data.bms_v13 = herewin_info.battery_vol[12];
  293. bms_data.bms_v14 = herewin_info.battery_vol[13];
  294. memcpy( bms_data.bms_ids, "herewin", 7 );
  295. bms_data.bms_ac = herewin_info.tolal_ele;
  296. bms_data.serial_num = FAC_HEREWIN;
  297. if(dev_bms1.regist.dev == false)
  298. regist_dev_info(&dev_bms1,DEVICE_BMS1,false,NULL,0,NULL,0,NULL,0,"herewin",8);
  299. }
  300. else if(Device1.Vkbms_Link.connect_status == COMP_NORMAL || Device2.Vkbms_Link.connect_status == COMP_NORMAL)
  301. {
  302. Dev.Bms_Link.connect_status = COMP_NORMAL;
  303. //第一组电池
  304. if ( Device1.Vkbms_Link.connect_status == COMP_NORMAL )
  305. {
  306. group_num = 1;
  307. bms_data.bms_cycle = Device1.vk_bms5.circulation_time;
  308. bms_data.bms_volt = Device1.vk_bms2.voltage;
  309. bms_data.bms_temp = Device1.vk_bms2.tempture;
  310. bms_data.bms_vs = Device1.vk_bms2.persent / 10;
  311. bms_data.bms_ss = Device1.vk_bms2.warn_flag;
  312. bms_data.bms_num = Device1.vk_bms2.bms_num;
  313. memcpy(&bms_data.bms_v1,&Device1.vk_bms2.bms_v1,26 * 2);
  314. memcpy(&bms_data.bms_ids[0],&Device1.vk_bms3.bms_id[0],20);
  315. // bms_data.bms_ids[0] = Device1.vk_bms3.bms_id[0];
  316. // bms_data.bms_ids[1] = Device1.vk_bms3.bms_id[1];
  317. // for(int i = 1; i< 11; i++){
  318. // bms_data.bms_ids[2*i] = ((Device1.vk_bms3.bms_id[1 + i] >> 4) & 0xf) + '0';
  319. // bms_data.bms_ids[2*i+1] = (Device1.vk_bms3.bms_id[1 + i] & 0xf )+ '0';
  320. // }
  321. bms_data.bms_ac = (short)(Device1.vk_bms2.current / 10);
  322. bms_data.serial_num = FAC_VK_BMS;
  323. // if( Device1.vk_bms3.bms_type_info[0] == 'S' && Device1.vk_bms3.bms_type_info[0] == 'H'
  324. // && Device1.vk_bms3.bms_type_info[0] == 'A' && Device1.vk_bms3.bms_type_info[0] == '1')
  325. // {
  326. // bms_data.serial_num = 11; //???
  327. // }
  328. //厂家还没加
  329. if(StrArrayNull( &bms_data.bms_ids[0], sizeof( bms_data.bms_ids ) ) == false && dev_bms1.regist.sn == false)
  330. regist_dev_info(&dev_bms1,DEVICE_BMS1,false,(char *)bms_data.bms_ids,32,NULL,0,NULL,0,"vk",3);
  331. }
  332. else
  333. {
  334. memset( &Device1, 0, sizeof( Device1 ) );
  335. }
  336. //第二组电池
  337. if ( Device2.Vkbms_Link.connect_status == COMP_NORMAL )
  338. {
  339. group_num = 2;
  340. bms_data2.bms_cycle = Device2.vk_bms5.circulation_time;
  341. bms_data2.bms_volt = Device2.vk_bms2.voltage;
  342. bms_data2.bms_temp = Device2.vk_bms2.tempture;
  343. bms_data2.bms_vs = Device2.vk_bms2.persent / 10;
  344. bms_data2.bms_ss = Device2.vk_bms2.warn_flag;
  345. bms_data2.bms_num = Device2.vk_bms2.bms_num;
  346. memcpy(&bms_data2.bms_v1,&Device2.vk_bms2.bms_v1,26 * 2);
  347. memcpy(&bms_data2.bms_ids[0],&Device2.vk_bms3.bms_id[0],20);
  348. bms_data2.bms_ac = (short)(Device2.vk_bms2.current / 10);
  349. bms_data2.serial_num = FAC_VK_BMS;
  350. // if( Device2.vk_bms3.bms_type_info[0] == 'S' && Device2.vk_bms3.bms_type_info[0] == 'H'
  351. // && Device2.vk_bms3.bms_type_info[0] == 'A' && Device2.vk_bms3.bms_type_info[0] == '1')
  352. // {
  353. // bms_data2.serial_num = 11; //???
  354. // }
  355. if(StrArrayNull( &bms_data2.bms_ids[0], sizeof( bms_data2.bms_ids ) ) == false && dev_bms2.regist.sn == false)
  356. regist_dev_info(&dev_bms2,DEVICE_BMS2,false,(char *)bms_data2.bms_ids,32,NULL,0,NULL,0,"vk",3);
  357. }
  358. else
  359. {
  360. memset( &bms_data2, 0, sizeof( bms_data2 ) );
  361. }
  362. }
  363. else
  364. {
  365. if ( Dev.Bms_Link.connect_status == COMP_NORMAL )
  366. {
  367. Dev.Bms_Link.connect_status = COMP_LOST;
  368. //memset(&bms_data, 0, sizeof(bms_data));
  369. //状态未置异常
  370. bms_data.bms_ss = 0xFFFF;
  371. }
  372. }
  373. }
  374. /**
  375. * @file Send_VKbms_info
  376. * @brief VK智能电池协议飞控端发送
  377. * @param none
  378. * @details
  379. * @author Zhang Sir
  380. **/
  381. uint8_t utc_send_time = 10;
  382. void send_msg_to_VKbms(void)
  383. {
  384. static uint8_t change_dev = 1;
  385. Vkbms_Device *ptr = NULL;
  386. //处理 有问题,如果不是同时上电,后上电的电池2无法读取电池设备信息。
  387. static uint32_t bms_heart_time = 0;;
  388. unsigned int can_id = 0;
  389. uint8_t len = 0, msg_id = 0,i = 0;
  390. uint8_t bms_can_buf[8] = {0};
  391. uint16_t crc = 0;
  392. if(change_dev == 1)
  393. {
  394. change_dev = 2;
  395. ptr = &Device1;
  396. }
  397. else if(change_dev == 2)
  398. {
  399. change_dev = 1;
  400. ptr = &Device2;
  401. }
  402. if(ptr->Vkbms_Link.connect_status != COMP_NORMAL)
  403. return;
  404. //握手应答
  405. if(ptr->ack_to_bms == true)
  406. {
  407. msg_id = 0x01;
  408. can_id = msg_id << 20 | 0x7 << 17 | ptr->source_id << 11 | 0x1 << 5 | 0x1 << 4 | 0x1 << 3 | 1;
  409. len = 2;
  410. bms_can_buf[0] = 0x56;
  411. bms_can_buf[1] = 0x31;
  412. can_send_msg_normal(&bms_can_buf[0], len, can_id);
  413. ptr->ack_to_bms = false;
  414. }
  415. if(ptr->get_bms3_ack == false)
  416. {
  417. len = 0;
  418. msg_id = 0x03;//canid 4083768 3E5039
  419. can_id = msg_id << 20 | 0x7 << 17 | ptr->source_id << 11 | 0x1 << 5 | 0x1 << 4 | 0x1 << 3 | 1;
  420. can_send_msg_normal(&bms_can_buf[0], len, can_id);
  421. }
  422. else if(ptr->get_bms4_ack == false)
  423. {
  424. len = 0;
  425. msg_id = 0x04; //canid 5132344 4E5039
  426. can_id = msg_id << 20 | 0x7 << 17 | ptr->source_id << 11 | 0x1 << 5 | 0x1 << 4 | 0x1 << 3 | 1;
  427. can_send_msg_normal(&bms_can_buf[0], len, can_id);
  428. }
  429. else if(ptr->get_bms5_ack == false)
  430. {
  431. len = 0;
  432. msg_id = 0x05;//canid 6180920 5E5039
  433. can_id = msg_id << 20 | 0x7 << 17 | ptr->source_id << 11 | 0x1 << 5 | 0x1 << 4 | 0x1 << 3 | 1;
  434. can_send_msg_normal(&bms_can_buf[0], len, can_id);
  435. }
  436. if(start_msg.key_to_bms == true)
  437. {
  438. msg_id = 0x07;
  439. crc = Get_Crc16(&start_msg.key_data[0],20);
  440. memcpy(&bms_can_buf[0],&crc,2);
  441. memcpy(&bms_can_buf[2],&start_msg.key_data[i],6);
  442. can_id = msg_id << 20 | 0x7 << 17 | ptr->source_id << 11 | 0x1 << 5 | 0x1 << 4 | 0x0 << 3 | 1;
  443. can_send_msg_normal(&bms_can_buf[0], 8, can_id);
  444. i += 6;
  445. can_id = msg_id << 20 | 0x7 << 17 | ptr->source_id << 11 | 0x1 << 5 | 0x0 << 4 | 0x0 << 3 | 2;
  446. can_send_msg_normal(&start_msg.key_data[i], 8, can_id);
  447. i += 8;
  448. can_id = msg_id << 20 | 0x7 << 17 | ptr->source_id << 11 | 0x1 << 5 | 0x0 << 4 | 0x1 << 3 | 3;
  449. can_send_msg_normal(&start_msg.key_data[i], 6, can_id);
  450. }
  451. //开启mos
  452. else if(start_msg.mos_status == true)
  453. {
  454. msg_id = 0x08;
  455. can_id = msg_id << 20 | 0x7 << 17 | ptr->source_id << 11 | 0x1 << 5 | 0x1 << 4 | 0x1 << 3 | 1;
  456. bms_can_buf[0] = 0x01;
  457. can_send_msg_normal(&bms_can_buf[0], 1, can_id);
  458. }
  459. else if(utc_time != 0 && utc_send_time > 0 )
  460. {
  461. msg_id = 0x09;
  462. can_id = msg_id << 20 | 0x7 << 17 | ptr->source_id << 11 | 0x1 << 5 | 0x1 << 4 | 0x1 << 3 | 1;
  463. memcpy(&bms_can_buf[0],&utc_time,4);
  464. can_send_msg_normal(&bms_can_buf[0], 4, can_id);
  465. utc_send_time--;
  466. }
  467. else if(HAL_GetTick() - bms_heart_time > 500)//实时信息应答包
  468. {
  469. msg_id = 0x02;
  470. can_id = msg_id << 20 | 0x7 << 17 | ptr->source_id << 11 | 0x1 << 5 | 0x1 << 4 | 0x1 << 3 | 1;
  471. can_send_msg_normal(&bms_can_buf[0], 0, can_id);
  472. bms_heart_time = HAL_GetTick();
  473. }
  474. }
  475. /**
  476. * @file bms_function
  477. * @brief 智能电池检测函数
  478. * @param none
  479. * @details
  480. * @author Zhang Sir
  481. **/
  482. void bms_function()
  483. {
  484. static uint32_t bms_time = 0;
  485. static uint32_t bms_5hz_time = 0;
  486. if(Check_Timer_Ready(&bms_time,_10_HZ_))
  487. {
  488. update_bms_data();
  489. send_msg_to_VKbms();//存在双电池 不同时发送 发送频率加快
  490. }
  491. if(Check_Timer_Ready(&bms_5hz_time,_5_HZ_))
  492. {
  493. //给智能电池发送上电信息
  494. send_msg_to_okcell();
  495. send_msg_to_herewin();
  496. send_msg_to_poweramp();
  497. send_info_to_Qx();
  498. }
  499. }
  500. #define max(a, b) ((a) > (b) ? (a) : (b))
  501. #define min(a, b) ((a) < (b) ? (a) : (b))
  502. /**
  503. * @file BMSCanRecvHookFunction
  504. * @brief VK智能电池协议
  505. * @param none
  506. * @details
  507. * @author Zhang Sir
  508. **/
  509. // uint16_t bms_test = 0;
  510. // uint16_t bms_re = 0;
  511. uint8_t fmu_send_vkbms_msgid = 0;
  512. void BMSCanRecvHookFunction(uint32_t CanID, uint8_t data[], uint8_t len)
  513. {
  514. uint32_t source_id = 0, msg_id = 0;
  515. uint8_t bms_SOF = 0, bms_EOF = 0, frame_num = 0;
  516. static uint32_t bms1_source_id = 0;
  517. static uint32_t pack_msg_id = 0;
  518. Vkbms_Device *Bmspointer = NULL;
  519. msg_id = (CanID & VK_MSG_MASK_ID) >> 20;
  520. source_id = (CanID & VK_SRC_MASK_ID) >> 5;
  521. bms_SOF = (CanID >> 4) & 0x1;
  522. bms_EOF = (CanID >> 3) & 0x1;
  523. frame_num = CanID & 0x7;
  524. if(source_id == bms1_source_id || bms1_source_id == 0)
  525. {
  526. bms1_source_id = source_id;
  527. Bmspointer = &Device1;
  528. Bmspointer->source_id = source_id;
  529. }
  530. else
  531. {
  532. Bmspointer = &Device2;
  533. Bmspointer->source_id = source_id;
  534. }
  535. Bmspointer->Vkbms_Link.connect_status = COMP_NORMAL;
  536. Bmspointer->Vkbms_Link.recv_time = HAL_GetTick();
  537. //单帧
  538. if(bms_SOF == 1 && bms_EOF == 1)
  539. {
  540. memcpy(&Bmspointer->bms_can_buf[0],&data[0],len);
  541. }
  542. //多帧 帧头
  543. else if(bms_SOF == 1 && bms_EOF == 0)
  544. {
  545. Bmspointer->mul_frame_i = 0;
  546. Bmspointer->mul_frame_num = 2;
  547. Bmspointer->if_mul_frame = true;
  548. Bmspointer->recv_mul_freme_complete = false;
  549. memcpy(&Bmspointer->bms_can_buf[Bmspointer->mul_frame_i],&data[0],len);
  550. Bmspointer->mul_frame_i += len;
  551. pack_msg_id = msg_id;
  552. }
  553. // 中间帧
  554. else if(Bmspointer->if_mul_frame == true && bms_SOF == 0 && bms_EOF == 0 && pack_msg_id == msg_id)
  555. {
  556. if(Bmspointer->mul_frame_num == frame_num || ( Bmspointer->mul_frame_num == 0 && frame_num == 1)
  557. /*&& ((Bmspointer->mul_frame_i + len) <= sizeof(vkbms2))*/ )
  558. {
  559. memcpy(&Bmspointer->bms_can_buf[Bmspointer->mul_frame_i],&data[0],len);
  560. if(( Bmspointer->mul_frame_num == 0 && frame_num == 1))
  561. {
  562. Bmspointer->mul_frame_num++;
  563. }
  564. Bmspointer->mul_frame_i += len;
  565. Bmspointer->mul_frame_num++;
  566. if(Bmspointer->mul_frame_num >= 8)
  567. {
  568. Bmspointer->mul_frame_num = 0;
  569. }
  570. }
  571. else
  572. {
  573. Bmspointer->if_mul_frame = false;
  574. }
  575. }
  576. //帧尾
  577. else if(bms_SOF == 0 && bms_EOF == 1 && Bmspointer->if_mul_frame == true && pack_msg_id == msg_id)
  578. {
  579. memcpy(&Bmspointer->bms_can_buf[Bmspointer->mul_frame_i],&data[0],len);
  580. Bmspointer->mul_frame_i += len;
  581. Bmspointer->if_mul_frame = false;
  582. //bms_test = Get_Crc16(&Bmspointer->bms_can_buf[2], Bmspointer->mul_frame_i - 2);
  583. //bms_re = Bmspointer->bms_can_buf[0] + (Bmspointer->bms_can_buf[1] << 8);
  584. if(Get_Crc16(&Bmspointer->bms_can_buf[2], Bmspointer->mul_frame_i - 2) == (Bmspointer->bms_can_buf[0] + (Bmspointer->bms_can_buf[1] << 8)))
  585. {
  586. Bmspointer->recv_mul_freme_complete = true;
  587. }
  588. }
  589. switch (msg_id)
  590. {
  591. case 0X01:
  592. if(Bmspointer->bms_can_buf[0] == 0x56 && Bmspointer->bms_can_buf[1] == 0x31)
  593. {
  594. Bmspointer->ack_to_bms = true;
  595. Bmspointer->source_id = source_id;
  596. }
  597. break;
  598. case 0X02:
  599. if(Bmspointer->recv_mul_freme_complete == true)
  600. {
  601. //兆源使用两块正方电池有问题,需要进一步排查
  602. memcpy(&Bmspointer->vk_bms2.voltage, &Bmspointer->bms_can_buf[2], min( Bmspointer->mul_frame_i - 2, sizeof(vkbms2)));
  603. Bmspointer->recv_mul_freme_complete = false;
  604. }
  605. break;
  606. case 0X03:
  607. if(Bmspointer->recv_mul_freme_complete == true)
  608. {
  609. memcpy(&Bmspointer->vk_bms3.bms_company_info, &Bmspointer->bms_can_buf[2], sizeof(vkbms3));
  610. Bmspointer->recv_mul_freme_complete = false;
  611. Bmspointer->get_bms3_ack = true;
  612. }
  613. break;
  614. case 0X04:
  615. memcpy(&Bmspointer->vk_bms4.capacity, &Bmspointer->bms_can_buf[0], sizeof(vkbms4));
  616. Bmspointer->recv_mul_freme_complete = false;
  617. Bmspointer->get_bms4_ack = true;
  618. break;
  619. case 0X05:
  620. if(Bmspointer->recv_mul_freme_complete == true)
  621. {
  622. memcpy(&Bmspointer->vk_bms5.health_percent, &Bmspointer->bms_can_buf[2], sizeof(vkbms5));
  623. Bmspointer->recv_mul_freme_complete = false;
  624. Bmspointer->get_bms5_ack = true;
  625. }
  626. break;
  627. //秘钥是否匹配
  628. case 0x07:
  629. start_msg.key_to_bms = false;
  630. if(Bmspointer->bms_can_buf[0] == 0)
  631. {
  632. start_msg.mos_status = true;
  633. start_msg.Id_content = 1;
  634. }
  635. else
  636. {
  637. start_msg.Id_content = 2;
  638. }
  639. start_msg.Id = 3;
  640. start_msg.key_info_checking = true;
  641. break;
  642. case 0x08:
  643. start_msg.Id = 4;
  644. start_msg.Id_content = Bmspointer->bms_can_buf[0];
  645. start_msg.key_info_checking = true;
  646. start_msg.mos_status = false;
  647. break;
  648. case 0x09:
  649. if(Bmspointer->bms_can_buf[0] == 0)
  650. {
  651. utc_send_time = 0;
  652. }
  653. break;
  654. default:
  655. break;
  656. }
  657. }