soft_bms.c 45 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087
  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,NULL,0);
  331. if(StrArrayNull( (uint8_t *)&Device1.vk_bms3.bms_company_info[0], sizeof( Device1.vk_bms3.bms_company_info ) ) == false && dev_bms1.regist.manu == false)
  332. regist_dev_info(&dev_bms1,DEVICE_BMS1,false,NULL,0,NULL,0,NULL,0,&Device1.vk_bms3.bms_company_info[0],16);
  333. }
  334. else
  335. {
  336. memset( &Device1, 0, sizeof( Device1 ) );
  337. }
  338. //第二组电池
  339. if ( Device2.Vkbms_Link.connect_status == COMP_NORMAL )
  340. {
  341. group_num = 2;
  342. bms_data2.bms_cycle = Device2.vk_bms5.circulation_time;
  343. bms_data2.bms_volt = Device2.vk_bms2.voltage;
  344. bms_data2.bms_temp = Device2.vk_bms2.tempture;
  345. bms_data2.bms_vs = Device2.vk_bms2.persent / 10;
  346. bms_data2.bms_ss = Device2.vk_bms2.warn_flag;
  347. bms_data2.bms_num = Device2.vk_bms2.bms_num;
  348. memcpy(&bms_data2.bms_v1,&Device2.vk_bms2.bms_v1,26 * 2);
  349. memcpy(&bms_data2.bms_ids[0],&Device2.vk_bms3.bms_id[0],20);
  350. bms_data2.bms_ac = (short)(Device2.vk_bms2.current / 10);
  351. bms_data2.serial_num = FAC_VK_BMS;
  352. // if( Device2.vk_bms3.bms_type_info[0] == 'S' && Device2.vk_bms3.bms_type_info[0] == 'H'
  353. // && Device2.vk_bms3.bms_type_info[0] == 'A' && Device2.vk_bms3.bms_type_info[0] == '1')
  354. // {
  355. // bms_data2.serial_num = 11; //???
  356. // }
  357. if(StrArrayNull( &bms_data2.bms_ids[0], sizeof( bms_data2.bms_ids ) ) == false && dev_bms2.regist.sn == false)
  358. regist_dev_info(&dev_bms2,DEVICE_BMS2,false,(char *)bms_data2.bms_ids,32,NULL,0,NULL,0,NULL,0);
  359. if(StrArrayNull( (uint8_t *)&Device2.vk_bms3.bms_company_info[0], sizeof( Device2.vk_bms3.bms_company_info ) ) == false && dev_bms2.regist.manu == false)
  360. regist_dev_info(&dev_bms2,DEVICE_BMS2,false,NULL,0,NULL,0,NULL,0,&Device2.vk_bms3.bms_company_info[0],16);
  361. }
  362. else
  363. {
  364. memset( &bms_data2, 0, sizeof( bms_data2 ) );
  365. }
  366. }
  367. else
  368. {
  369. if ( Dev.Bms_Link.connect_status == COMP_NORMAL )
  370. {
  371. Dev.Bms_Link.connect_status = COMP_LOST;
  372. //memset(&bms_data, 0, sizeof(bms_data));
  373. //状态未置异常
  374. bms_data.bms_ss = 0;
  375. }
  376. }
  377. }
  378. /**
  379. * @file Send_VKbms_info
  380. * @brief VK智能电池协议飞控端发送
  381. * @param none
  382. * @details
  383. * @author Zhang Sir
  384. **/
  385. uint8_t utc_send_time = 10;
  386. void send_msg_to_VKbms(void)
  387. {
  388. static uint8_t change_dev = 1;
  389. Vkbms_Device *ptr = NULL;
  390. static uint32_t bms_heart_time = 0;;
  391. unsigned int can_id = 0;
  392. uint8_t len = 0, msg_id = 0,i = 0;
  393. uint8_t bms_can_buf[8] = {0};
  394. uint16_t crc = 0;
  395. if(change_dev == 1)
  396. {
  397. change_dev = 2;
  398. ptr = &Device1;
  399. }
  400. else if(change_dev == 2)
  401. {
  402. change_dev = 1;
  403. ptr = &Device2;
  404. }
  405. if(ptr->Vkbms_Link.connect_status != COMP_NORMAL)
  406. return;
  407. //握手应答
  408. if(ptr->ack_to_bms == true)
  409. {
  410. msg_id = 0x01;
  411. can_id = msg_id << 20 | 0x7 << 17 | ptr->source_id << 11 | 0x1 << 5 | 0x1 << 4 | 0x1 << 3 | 1;
  412. len = 2;
  413. bms_can_buf[0] = 0x56;
  414. bms_can_buf[1] = 0x31;
  415. can_send_msg_normal(&bms_can_buf[0], len, can_id);
  416. ptr->ack_to_bms = false;
  417. }
  418. if(ptr->get_bms3_ack == false)
  419. {
  420. len = 0;
  421. msg_id = 0x03;//canid 4083768 3E5039
  422. can_id = msg_id << 20 | 0x7 << 17 | ptr->source_id << 11 | 0x1 << 5 | 0x1 << 4 | 0x1 << 3 | 1;
  423. can_send_msg_normal(&bms_can_buf[0], len, can_id);
  424. }
  425. else if(ptr->get_bms4_ack == false)
  426. {
  427. len = 0;
  428. msg_id = 0x04; //canid 5132344 4E5039
  429. can_id = msg_id << 20 | 0x7 << 17 | ptr->source_id << 11 | 0x1 << 5 | 0x1 << 4 | 0x1 << 3 | 1;
  430. can_send_msg_normal(&bms_can_buf[0], len, can_id);
  431. }
  432. else if(ptr->get_bms5_ack == false)
  433. {
  434. len = 0;
  435. msg_id = 0x05;//canid 6180920 5E5039
  436. can_id = msg_id << 20 | 0x7 << 17 | ptr->source_id << 11 | 0x1 << 5 | 0x1 << 4 | 0x1 << 3 | 1;
  437. can_send_msg_normal(&bms_can_buf[0], len, can_id);
  438. }
  439. if(start_msg.key_to_bms == true)
  440. {
  441. msg_id = 0x07;
  442. crc = Get_Crc16(&start_msg.key_data[0],20);
  443. memcpy(&bms_can_buf[0],&crc,2);
  444. memcpy(&bms_can_buf[2],&start_msg.key_data[i],6);
  445. can_id = msg_id << 20 | 0x7 << 17 | ptr->source_id << 11 | 0x1 << 5 | 0x1 << 4 | 0x0 << 3 | 1;
  446. can_send_msg_normal(&bms_can_buf[0], 8, can_id);
  447. i += 6;
  448. can_id = msg_id << 20 | 0x7 << 17 | ptr->source_id << 11 | 0x1 << 5 | 0x0 << 4 | 0x0 << 3 | 2;
  449. can_send_msg_normal(&start_msg.key_data[i], 8, can_id);
  450. i += 8;
  451. can_id = msg_id << 20 | 0x7 << 17 | ptr->source_id << 11 | 0x1 << 5 | 0x0 << 4 | 0x1 << 3 | 3;
  452. can_send_msg_normal(&start_msg.key_data[i], 6, can_id);
  453. }
  454. //开启mos
  455. else if(start_msg.mos_status == true)
  456. {
  457. msg_id = 0x08;
  458. can_id = msg_id << 20 | 0x7 << 17 | ptr->source_id << 11 | 0x1 << 5 | 0x1 << 4 | 0x1 << 3 | 1;
  459. bms_can_buf[0] = 0x01;
  460. can_send_msg_normal(&bms_can_buf[0], 1, can_id);
  461. }
  462. else if(utc_time != 0 && utc_send_time > 0 )
  463. {
  464. msg_id = 0x09;
  465. can_id = msg_id << 20 | 0x7 << 17 | ptr->source_id << 11 | 0x1 << 5 | 0x1 << 4 | 0x1 << 3 | 1;
  466. memcpy(&bms_can_buf[0],&utc_time,4);
  467. can_send_msg_normal(&bms_can_buf[0], 4, can_id);
  468. utc_send_time--;
  469. }
  470. else if(HAL_GetTick() - bms_heart_time > 500)//实时信息应答包
  471. {
  472. msg_id = 0x02;
  473. can_id = msg_id << 20 | 0x7 << 17 | ptr->source_id << 11 | 0x1 << 5 | 0x1 << 4 | 0x1 << 3 | 1;
  474. can_send_msg_normal(&bms_can_buf[0], 0, can_id);
  475. bms_heart_time = HAL_GetTick();
  476. }
  477. // if(Device1.Vkbms_Link.connect_status == COMP_NORMAL || Device2.Vkbms_Link.connect_status == COMP_NORMAL)
  478. // {
  479. // static uint8_t bsm_step_num = 6;
  480. // static uint32_t bms_heart_time = 0;;
  481. // unsigned int can_id = 0;
  482. // uint8_t len = 0, msg_id = 0,i = 0;
  483. // uint8_t bms_can_buf[8] = {0};
  484. // uint16_t crc = 0;
  485. // //上电握手
  486. // if(Device1.ack_to_bms == true || Device2.ack_to_bms == true)
  487. // {
  488. // msg_id = 0x01;
  489. // if(Device1.ack_to_bms == true)
  490. // {
  491. // can_id = msg_id << 20 | 0x7 << 17 | Device1.source_id << 11 | 0x1 << 5 | 0x1 << 4 | 0x1 << 3 | 1;
  492. // Device1.ack_to_bms = false;
  493. // }
  494. // else if (Device2.ack_to_bms == true)
  495. // {
  496. // can_id = msg_id << 20 | 0x7 << 17 | Device2.source_id << 11 | 0x1 << 5 | 0x1 << 4 | 0x1 << 3 | 1;
  497. // Device2.ack_to_bms = false;
  498. // }
  499. // len = 2;
  500. // bms_can_buf[0] = 0x56;
  501. // bms_can_buf[1] = 0x31;
  502. // can_send_msg_normal(&bms_can_buf[0], len, can_id);
  503. // }
  504. // //读取电池信息
  505. // if(bms_step <= 2)
  506. // {
  507. // //上电发送的信息
  508. // switch (bms_step)
  509. // {
  510. // case 0:
  511. // if(bsm_step_num > 0)
  512. // {
  513. // len = 0;
  514. // msg_id = 0x03;//canid 4083768 3E5039
  515. // can_id = msg_id << 20 | 0x7 << 17 | Device1.source_id << 11 | 0x1 << 5 | 0x1 << 4 | 0x1 << 3 | 1;
  516. // can_send_msg_normal(&bms_can_buf[0], len, can_id);
  517. // if(Device2.Vkbms_Link.connect_status == COMP_NORMAL)
  518. // {
  519. // can_id = msg_id << 20 | 0x7 << 17 | Device2.source_id << 11 | 0x1 << 5 | 0x1 << 4 | 0x1 << 3 | 1;
  520. // can_send_msg_normal(&bms_can_buf[0], len, can_id);
  521. // }
  522. // bsm_step_num--;
  523. // }
  524. // else
  525. // {
  526. // bsm_step_num = 5;
  527. // bms_step = 1;
  528. // }
  529. // break;
  530. // case 1:
  531. // if(bsm_step_num > 0)
  532. // {
  533. // len = 0;
  534. // msg_id = 0x04; //canid 5132344 4E5039
  535. // can_id = msg_id << 20 | 0x7 << 17 | Device1.source_id << 11 | 0x1 << 5 | 0x1 << 4 | 0x1 << 3 | 1;
  536. // can_send_msg_normal(&bms_can_buf[0], len, can_id);
  537. // if(Device2.Vkbms_Link.connect_status == COMP_NORMAL)
  538. // {
  539. // can_id = msg_id << 20 | 0x7 << 17 | Device2.source_id << 11 | 0x1 << 5 | 0x1 << 4 | 0x1 << 3 | 1;
  540. // can_send_msg_normal(&bms_can_buf[0], len, can_id);
  541. // }
  542. // bsm_step_num--;
  543. // }
  544. // else
  545. // {
  546. // bsm_step_num = 5;
  547. // bms_step = 2;
  548. // }
  549. // break;
  550. // case 2:
  551. // if(bsm_step_num > 0)
  552. // {
  553. // len = 0;
  554. // msg_id = 0x05;//canid 6180920 5E5039
  555. // can_id = msg_id << 20 | 0x7 << 17 | Device1.source_id << 11 | 0x1 << 5 | 0x1 << 4 | 0x1 << 3 | 1;
  556. // can_send_msg_normal(&bms_can_buf[0], len, can_id);
  557. // if(Device2.Vkbms_Link.connect_status == COMP_NORMAL)
  558. // {
  559. // can_id = msg_id << 20 | 0x7 << 17 | Device2.source_id << 11 | 0x1 << 5 | 0x1 << 4 | 0x1 << 3 | 1;
  560. // can_send_msg_normal(&bms_can_buf[0], len, can_id);
  561. // }
  562. // bsm_step_num--;
  563. // }
  564. // else
  565. // {
  566. // bsm_step_num = 5;
  567. // bms_step = 3;
  568. // }
  569. // break;
  570. // default:
  571. // break;
  572. // }
  573. // }
  574. // //秘钥匹配
  575. // else if(start_msg.key_to_bms == true && bsm_step_num > 0 && bms_step == 3 ) //上个if语句发完再发
  576. // {
  577. // msg_id = 0x07;
  578. // crc = Get_Crc16(&start_msg.key_data[0],20);
  579. // memcpy(&bms_can_buf[0],&crc,2);
  580. // memcpy(&bms_can_buf[2],&start_msg.key_data[i],6);
  581. // can_id = msg_id << 20 | 0x7 << 17 | Device1.source_id << 11 | 0x1 << 5 | 0x1 << 4 | 0x0 << 3 | 1;
  582. // can_send_msg_normal(&bms_can_buf[0], 8, can_id);
  583. // i += 6;
  584. // can_id = msg_id << 20 | 0x7 << 17 | Device1.source_id << 11 | 0x1 << 5 | 0x0 << 4 | 0x0 << 3 | 2;
  585. // can_send_msg_normal(&start_msg.key_data[i], 8, can_id);
  586. // i += 8;
  587. // can_id = msg_id << 20 | 0x7 << 17 | Device1.source_id << 11 | 0x1 << 5 | 0x0 << 4 | 0x1 << 3 | 3;
  588. // can_send_msg_normal(&start_msg.key_data[i], 6, can_id);
  589. // bsm_step_num--;
  590. // if(bsm_step_num == 0)
  591. // {
  592. // bsm_step_num = 5;
  593. // bms_step = 4;
  594. // }
  595. // }
  596. // //开启mos
  597. // else if(start_msg.mos_status == true && bsm_step_num > 0 && (bms_step == 4 || start_msg.mos_status == true))
  598. // {
  599. // msg_id = 0x08;
  600. // can_id = msg_id << 20 | 0x7 << 17 | Device1.source_id << 11 | 0x1 << 5 | 0x1 << 4 | 0x1 << 3 | 1;
  601. // bms_can_buf[0] = 0x01;
  602. // can_send_msg_normal(&bms_can_buf[0], 1, can_id);
  603. // bsm_step_num--;
  604. // }
  605. // else if(utc_time != 0 && utc_send_time > 0 )
  606. // {
  607. // msg_id = 0x09;
  608. // can_id = msg_id << 20 | 0x7 << 17 | Device1.source_id << 11 | 0x1 << 5 | 0x1 << 4 | 0x1 << 3 | 1;
  609. // memcpy(&bms_can_buf[0],&utc_time,4);
  610. // can_send_msg_normal(&bms_can_buf[0], 4, can_id);
  611. // if(Device2.Vkbms_Link.connect_status == COMP_NORMAL)
  612. // {
  613. // can_id = msg_id << 20 | 0x7 << 17 | Device2.source_id << 11 | 0x1 << 5 | 0x1 << 4 | 0x1 << 3 | 1;
  614. // can_send_msg_normal(&bms_can_buf[0], 4, can_id);
  615. // }
  616. // utc_send_time--;
  617. // }
  618. // else if(HAL_GetTick() - bms_heart_time > 1000)//实时信息应答包
  619. // {
  620. // msg_id = 0x02;
  621. // can_id = msg_id << 20 | 0x7 << 17 | Device1.source_id << 11 | 0x1 << 5 | 0x1 << 4 | 0x1 << 3 | 1;
  622. // can_send_msg_normal(&bms_can_buf[0], 0, can_id);
  623. // if(Device2.Vkbms_Link.connect_status == COMP_NORMAL)
  624. // {
  625. // can_id = msg_id << 20 | 0x7 << 17 | Device2.source_id << 11 | 0x1 << 5 | 0x1 << 4 | 0x1 << 3 | 1;
  626. // can_send_msg_normal(&bms_can_buf[0], 0, can_id);
  627. // }
  628. // bms_heart_time = HAL_GetTick();
  629. // }
  630. // }
  631. //开启mos
  632. // else if(start_msg.mos_status == true)
  633. // {
  634. // msg_id = 0x08;
  635. // can_id = msg_id << 20 | 0x7 << 17 | ptr->source_id << 11 | 0x1 << 5 | 0x1 << 4 | 0x1 << 3 | 1;
  636. // bms_can_buf[0] = 0x01;
  637. // can_send_msg_normal(&bms_can_buf[0], 1, can_id);
  638. // }
  639. // else if(utc_time != 0 && utc_send_time > 0 )
  640. // {
  641. // msg_id = 0x09;
  642. // can_id = msg_id << 20 | 0x7 << 17 | ptr->source_id << 11 | 0x1 << 5 | 0x1 << 4 | 0x1 << 3 | 1;
  643. // memcpy(&bms_can_buf[0],&utc_time,4);
  644. // can_send_msg_normal(&bms_can_buf[0], 4, can_id);
  645. // utc_send_time--;
  646. // }
  647. // else if(HAL_GetTick() - bms_heart_time > 500)//实时信息应答包
  648. // {
  649. // msg_id = 0x02;
  650. // can_id = msg_id << 20 | 0x7 << 17 | ptr->source_id << 11 | 0x1 << 5 | 0x1 << 4 | 0x1 << 3 | 1;
  651. // can_send_msg_normal(&bms_can_buf[0], 0, can_id);
  652. // bms_heart_time = HAL_GetTick();
  653. // }
  654. // if(Device1.Vkbms_Link.connect_status == COMP_NORMAL || Device2.Vkbms_Link.connect_status == COMP_NORMAL)
  655. // {
  656. // static uint8_t bsm_step_num = 6;
  657. // static uint32_t bms_heart_time = 0;;
  658. // unsigned int can_id = 0;
  659. // uint8_t len = 0, msg_id = 0,i = 0;
  660. // uint8_t bms_can_buf[8] = {0};
  661. // uint16_t crc = 0;
  662. // //上电握手
  663. // if(Device1.ack_to_bms == true || Device2.ack_to_bms == true)
  664. // {
  665. // msg_id = 0x01;
  666. // if(Device1.ack_to_bms == true)
  667. // {
  668. // can_id = msg_id << 20 | 0x7 << 17 | Device1.source_id << 11 | 0x1 << 5 | 0x1 << 4 | 0x1 << 3 | 1;
  669. // Device1.ack_to_bms = false;
  670. // }
  671. // else if (Device2.ack_to_bms == true)
  672. // {
  673. // can_id = msg_id << 20 | 0x7 << 17 | Device2.source_id << 11 | 0x1 << 5 | 0x1 << 4 | 0x1 << 3 | 1;
  674. // Device2.ack_to_bms = false;
  675. // }
  676. // len = 2;
  677. // bms_can_buf[0] = 0x56;
  678. // bms_can_buf[1] = 0x31;
  679. // can_send_msg_normal(&bms_can_buf[0], len, can_id);
  680. // }
  681. // //读取电池信息
  682. // if(bms_step <= 2)
  683. // {
  684. // //上电发送的信息
  685. // switch (bms_step)
  686. // {
  687. // case 0:
  688. // if(bsm_step_num > 0)
  689. // {
  690. // len = 0;
  691. // msg_id = 0x03;//canid 4083768 3E5039
  692. // can_id = msg_id << 20 | 0x7 << 17 | Device1.source_id << 11 | 0x1 << 5 | 0x1 << 4 | 0x1 << 3 | 1;
  693. // can_send_msg_normal(&bms_can_buf[0], len, can_id);
  694. // if(Device2.Vkbms_Link.connect_status == COMP_NORMAL)
  695. // {
  696. // can_id = msg_id << 20 | 0x7 << 17 | Device2.source_id << 11 | 0x1 << 5 | 0x1 << 4 | 0x1 << 3 | 1;
  697. // can_send_msg_normal(&bms_can_buf[0], len, can_id);
  698. // }
  699. // bsm_step_num--;
  700. // }
  701. // else
  702. // {
  703. // bsm_step_num = 5;
  704. // bms_step = 1;
  705. // }
  706. // break;
  707. // case 1:
  708. // if(bsm_step_num > 0)
  709. // {
  710. // len = 0;
  711. // msg_id = 0x04; //canid 5132344 4E5039
  712. // can_id = msg_id << 20 | 0x7 << 17 | Device1.source_id << 11 | 0x1 << 5 | 0x1 << 4 | 0x1 << 3 | 1;
  713. // can_send_msg_normal(&bms_can_buf[0], len, can_id);
  714. // if(Device2.Vkbms_Link.connect_status == COMP_NORMAL)
  715. // {
  716. // can_id = msg_id << 20 | 0x7 << 17 | Device2.source_id << 11 | 0x1 << 5 | 0x1 << 4 | 0x1 << 3 | 1;
  717. // can_send_msg_normal(&bms_can_buf[0], len, can_id);
  718. // }
  719. // bsm_step_num--;
  720. // }
  721. // else
  722. // {
  723. // bsm_step_num = 5;
  724. // bms_step = 2;
  725. // }
  726. // break;
  727. // case 2:
  728. // if(bsm_step_num > 0)
  729. // {
  730. // len = 0;
  731. // msg_id = 0x05;//canid 6180920 5E5039
  732. // can_id = msg_id << 20 | 0x7 << 17 | Device1.source_id << 11 | 0x1 << 5 | 0x1 << 4 | 0x1 << 3 | 1;
  733. // can_send_msg_normal(&bms_can_buf[0], len, can_id);
  734. // if(Device2.Vkbms_Link.connect_status == COMP_NORMAL)
  735. // {
  736. // can_id = msg_id << 20 | 0x7 << 17 | Device2.source_id << 11 | 0x1 << 5 | 0x1 << 4 | 0x1 << 3 | 1;
  737. // can_send_msg_normal(&bms_can_buf[0], len, can_id);
  738. // }
  739. // bsm_step_num--;
  740. // }
  741. // else
  742. // {
  743. // bsm_step_num = 5;
  744. // bms_step = 3;
  745. // }
  746. // break;
  747. // default:
  748. // break;
  749. // }
  750. // }
  751. // //秘钥匹配
  752. // else if(start_msg.key_to_bms == true && bsm_step_num > 0 && bms_step == 3 ) //上个if语句发完再发
  753. // {
  754. // msg_id = 0x07;
  755. // crc = Get_Crc16(&start_msg.key_data[0],20);
  756. // memcpy(&bms_can_buf[0],&crc,2);
  757. // memcpy(&bms_can_buf[2],&start_msg.key_data[i],6);
  758. // can_id = msg_id << 20 | 0x7 << 17 | Device1.source_id << 11 | 0x1 << 5 | 0x1 << 4 | 0x0 << 3 | 1;
  759. // can_send_msg_normal(&bms_can_buf[0], 8, can_id);
  760. // i += 6;
  761. // can_id = msg_id << 20 | 0x7 << 17 | Device1.source_id << 11 | 0x1 << 5 | 0x0 << 4 | 0x0 << 3 | 2;
  762. // can_send_msg_normal(&start_msg.key_data[i], 8, can_id);
  763. // i += 8;
  764. // can_id = msg_id << 20 | 0x7 << 17 | Device1.source_id << 11 | 0x1 << 5 | 0x0 << 4 | 0x1 << 3 | 3;
  765. // can_send_msg_normal(&start_msg.key_data[i], 6, can_id);
  766. // bsm_step_num--;
  767. // if(bsm_step_num == 0)
  768. // {
  769. // bsm_step_num = 5;
  770. // bms_step = 4;
  771. // }
  772. // }
  773. // //开启mos
  774. // else if(start_msg.mos_status == true && bsm_step_num > 0 && (bms_step == 4 || start_msg.mos_status == true))
  775. // {
  776. // msg_id = 0x08;
  777. // can_id = msg_id << 20 | 0x7 << 17 | Device1.source_id << 11 | 0x1 << 5 | 0x1 << 4 | 0x1 << 3 | 1;
  778. // bms_can_buf[0] = 0x01;
  779. // can_send_msg_normal(&bms_can_buf[0], 1, can_id);
  780. // bsm_step_num--;
  781. // }
  782. // else if(utc_time != 0 && utc_send_time > 0 )
  783. // {
  784. // msg_id = 0x09;
  785. // can_id = msg_id << 20 | 0x7 << 17 | Device1.source_id << 11 | 0x1 << 5 | 0x1 << 4 | 0x1 << 3 | 1;
  786. // memcpy(&bms_can_buf[0],&utc_time,4);
  787. // can_send_msg_normal(&bms_can_buf[0], 4, can_id);
  788. // if(Device2.Vkbms_Link.connect_status == COMP_NORMAL)
  789. // {
  790. // can_id = msg_id << 20 | 0x7 << 17 | Device2.source_id << 11 | 0x1 << 5 | 0x1 << 4 | 0x1 << 3 | 1;
  791. // can_send_msg_normal(&bms_can_buf[0], 4, can_id);
  792. // }
  793. // utc_send_time--;
  794. // }
  795. // else if(HAL_GetTick() - bms_heart_time > 1000)//实时信息应答包
  796. // {
  797. // msg_id = 0x02;
  798. // can_id = msg_id << 20 | 0x7 << 17 | Device1.source_id << 11 | 0x1 << 5 | 0x1 << 4 | 0x1 << 3 | 1;
  799. // can_send_msg_normal(&bms_can_buf[0], 0, can_id);
  800. // if(Device2.Vkbms_Link.connect_status == COMP_NORMAL)
  801. // {
  802. // can_id = msg_id << 20 | 0x7 << 17 | Device2.source_id << 11 | 0x1 << 5 | 0x1 << 4 | 0x1 << 3 | 1;
  803. // can_send_msg_normal(&bms_can_buf[0], 0, can_id);
  804. // }
  805. // bms_heart_time = HAL_GetTick();
  806. // }
  807. // }
  808. }
  809. /**
  810. * @file bms_function
  811. * @brief 智能电池检测函数
  812. * @param none
  813. * @details
  814. * @author Zhang Sir
  815. **/
  816. void bms_function()
  817. {
  818. static uint32_t bms_time = 0;
  819. static uint32_t bms_5hz_time = 0;
  820. if(Check_Timer_Ready(&bms_time,_10_HZ_))
  821. {
  822. update_bms_data();
  823. send_msg_to_VKbms();//存在双电池 不同时发送 发送频率加快
  824. }
  825. if(Check_Timer_Ready(&bms_5hz_time,_5_HZ_))
  826. {
  827. //给智能电池发送上电信息
  828. send_msg_to_okcell();
  829. send_msg_to_herewin();
  830. //send_msg_to_poweramp();
  831. }
  832. }
  833. /**
  834. * @file BMSCanRecvHookFunction
  835. * @brief VK智能电池协议
  836. * @param none
  837. * @details
  838. * @author Zhang Sir
  839. **/
  840. uint16_t bms_test = 0;
  841. uint16_t bms_re = 0;
  842. uint8_t fmu_send_vkbms_msgid = 0;
  843. void BMSCanRecvHookFunction(uint32_t CanID, uint8_t data[], uint8_t len)
  844. {
  845. uint32_t source_id = 0, msg_id = 0;
  846. uint8_t bms_SOF = 0, bms_EOF = 0, frame_num = 0;
  847. static uint32_t bms1_source_id = 0;
  848. static uint32_t pack_msg_id = 0;
  849. Vkbms_Device *Bmspointer = NULL;
  850. msg_id = (CanID & VK_MSG_MASK_ID) >> 20;
  851. source_id = (CanID & VK_SRC_MASK_ID) >> 5;
  852. bms_SOF = (CanID >> 4) & 0x1;
  853. bms_EOF = (CanID >> 3) & 0x1;
  854. frame_num = CanID & 0x7;
  855. if(source_id == bms1_source_id || bms1_source_id == 0)
  856. {
  857. bms1_source_id = source_id;
  858. Bmspointer = &Device1;
  859. Bmspointer->source_id = source_id;
  860. }
  861. else
  862. {
  863. Bmspointer = &Device2;
  864. Bmspointer->source_id = source_id;
  865. }
  866. Bmspointer->Vkbms_Link.connect_status = COMP_NORMAL;
  867. Bmspointer->Vkbms_Link.recv_time = HAL_GetTick();
  868. //单帧
  869. if(bms_SOF == 1 && bms_EOF == 1)
  870. {
  871. memcpy(&Bmspointer->bms_can_buf[0],&data[0],len);
  872. }
  873. //多帧 帧头
  874. else if(bms_SOF == 1 && bms_EOF == 0)
  875. {
  876. Bmspointer->mul_frame_i = 0;
  877. Bmspointer->mul_frame_num = 2;
  878. Bmspointer->if_mul_frame = true;
  879. Bmspointer->recv_mul_freme_complete = false;
  880. memcpy(&Bmspointer->bms_can_buf[Bmspointer->mul_frame_i],&data[0],len);
  881. Bmspointer->mul_frame_i += len;
  882. pack_msg_id = msg_id;
  883. }
  884. // 中间帧
  885. else if(Bmspointer->if_mul_frame == true && bms_SOF == 0 && bms_EOF == 0 && pack_msg_id == msg_id)
  886. {
  887. if(Bmspointer->mul_frame_num == frame_num /*&& ((Bmspointer->mul_frame_i + len) <= sizeof(vkbms2))*/ )
  888. {
  889. memcpy(&Bmspointer->bms_can_buf[Bmspointer->mul_frame_i],&data[0],len);
  890. Bmspointer->mul_frame_i += len;
  891. Bmspointer->mul_frame_num++;
  892. if(Bmspointer->mul_frame_num == 8)
  893. {
  894. Bmspointer->mul_frame_num = 1;
  895. }
  896. if(Bmspointer->mul_frame_num >= 8)
  897. {
  898. Bmspointer->mul_frame_num = 0;
  899. }
  900. }
  901. else
  902. {
  903. Bmspointer->if_mul_frame = false;
  904. }
  905. }
  906. //帧尾
  907. else if(bms_SOF == 0 && bms_EOF == 1 && Bmspointer->if_mul_frame == true && pack_msg_id == msg_id)
  908. {
  909. memcpy(&Bmspointer->bms_can_buf[Bmspointer->mul_frame_i],&data[0],len);
  910. Bmspointer->mul_frame_i += len;
  911. Bmspointer->if_mul_frame = false;
  912. //bms_test = Get_Crc16(&Bmspointer->bms_can_buf[2], Bmspointer->mul_frame_i - 2);
  913. //bms_re = Bmspointer->bms_can_buf[0] + (Bmspointer->bms_can_buf[1] << 8);
  914. if(Get_Crc16(&Bmspointer->bms_can_buf[2], Bmspointer->mul_frame_i - 2) == (Bmspointer->bms_can_buf[0] + (Bmspointer->bms_can_buf[1] << 8)))
  915. {
  916. Bmspointer->recv_mul_freme_complete = true;
  917. }
  918. }
  919. switch (msg_id)
  920. {
  921. case 0X01:
  922. if(Bmspointer->bms_can_buf[0] == 0x56 && Bmspointer->bms_can_buf[1] == 0x31)
  923. {
  924. Bmspointer->ack_to_bms = true;
  925. Bmspointer->source_id = source_id;
  926. }
  927. break;
  928. case 0X02:
  929. if(Bmspointer->recv_mul_freme_complete == true)
  930. {
  931. memcpy(&Bmspointer->vk_bms2.voltage, &Bmspointer->bms_can_buf[2], sizeof(vkbms2));//接收一整包电池数据
  932. Bmspointer->recv_mul_freme_complete = false;
  933. }
  934. break;
  935. case 0X03:
  936. if(Bmspointer->recv_mul_freme_complete == true)
  937. {
  938. memcpy(&Bmspointer->vk_bms3.bms_company_info, &Bmspointer->bms_can_buf[2], sizeof(vkbms3));
  939. Bmspointer->recv_mul_freme_complete = false;
  940. Bmspointer->get_bms3_ack = true;
  941. }
  942. break;
  943. case 0X04:
  944. memcpy(&Bmspointer->vk_bms4.capacity, &Bmspointer->bms_can_buf[0], sizeof(vkbms4));
  945. Bmspointer->recv_mul_freme_complete = false;
  946. Bmspointer->get_bms4_ack = true;
  947. break;
  948. case 0X05:
  949. if(Bmspointer->recv_mul_freme_complete == true)
  950. {
  951. memcpy(&Bmspointer->vk_bms5.health_percent, &Bmspointer->bms_can_buf[2], sizeof(vkbms5));
  952. Bmspointer->recv_mul_freme_complete = false;
  953. Bmspointer->get_bms5_ack = true;
  954. }
  955. break;
  956. //秘钥是否匹配
  957. case 0x07:
  958. start_msg.key_to_bms = false;
  959. if(Bmspointer->bms_can_buf[0] == 0)
  960. {
  961. start_msg.mos_status = true;
  962. start_msg.Id_content = 1;
  963. }
  964. else
  965. {
  966. start_msg.Id_content = 2;
  967. }
  968. start_msg.Id = 3;
  969. start_msg.key_info_checking = true;
  970. break;
  971. case 0x08:
  972. start_msg.Id = 4;
  973. start_msg.Id_content = Bmspointer->bms_can_buf[0];
  974. start_msg.key_info_checking = true;
  975. start_msg.mos_status = false;
  976. break;
  977. case 0x09:
  978. if(Bmspointer->bms_can_buf[0] == 0)
  979. {
  980. utc_send_time = 0;
  981. }
  982. break;
  983. default:
  984. break;
  985. }
  986. }