soft_bms.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466
  1. #ifndef _SOFT_BMS_H
  2. #define _SOFT_BMS_H
  3. #include "common.h"
  4. #include "stdint.h"
  5. //VK电池协议 0x1E0958
  6. #define VK_BMS_FILTER_ID 0xE0800 //0 0000 0000 1110 0000 1000 0000 0000 flag 111 目标节点0x1
  7. #define VK_BMS_MASK_ID 0x1C0FF800 //1 1100 0000 1111 1111 1000 0000 0000
  8. //0x1C0E0800
  9. #define VK_MSG_MASK_ID 0X3F00000
  10. #define VK_SRC_MASK_ID 0X7E0
  11. /***************************************herewin********************************************/
  12. #define HEREWIN_HEART_ID 0x004300F0 //心跳数据包
  13. #define HEREWIN_VOL_ID 0x008400F0 //单体电压包
  14. #define HEREWIN_TEM_ID 0x008200F0 //单体温度包
  15. #define HEREWIN_SEARCH_ID 0x008000F0 //定值查询
  16. #define HEREWIN_CIRCULATION_ID 0x008600F0 //循环次数查询
  17. #pragma pack(1)
  18. typedef struct
  19. {
  20. uint8_t herewin_buf[64]; //临时buf
  21. uint8_t message_num; //报文序号
  22. uint8_t message_total;//总帧数
  23. uint16_t byte_num; //有效字节数
  24. int last_frame_num; //最后一包有效字节数
  25. uint16_t crc; //和校验
  26. uint8_t i;
  27. bool crc_is_ok; //校验通过
  28. }herewin_can_info;
  29. #pragma pack()
  30. #pragma pack(1)
  31. typedef struct
  32. {
  33. char battery_temp[3]; //每个电芯温度°C
  34. uint16_t battery_vol[14]; //每个电芯电压 0.001V
  35. uint16_t alarm_info; //报警信息
  36. uint16_t warn_info; //警告信息
  37. uint16_t total_vol; //总电压 0.01V
  38. uint16_t tolal_ele; //总电流 0.01A
  39. uint8_t SOC_info; //剩余电量%
  40. uint8_t SOH_info; //健康状态%
  41. uint8_t SOP_info; //功率状态%
  42. uint32_t serial_number; //序列号
  43. uint16_t hard_version; //硬件版本
  44. uint16_t soft_version; //软件版本
  45. uint8_t battery_num; //电芯个数
  46. uint16_t circulation_num; //循环次数
  47. //充电请求相关参数
  48. uint16_t re_vol; //请求电压
  49. uint16_t re_ele; //请求电流
  50. uint16_t max_vol; //单体最大电压
  51. uint16_t power_status; //充电状态
  52. bool get_temp_flag; //温度是单独一包,并且有偏移,没获取到温度之前会显示负数
  53. }herewin_bms;
  54. #pragma pack()
  55. extern herewin_bms herewin_info;
  56. extern Connect_check Herewin_Link;
  57. void HerewinCanRecvHookFunction(uint32_t cellCanID, uint8_t data[], uint8_t len);
  58. void send_msg_to_herewin(void);
  59. /***********************************************************************************/
  60. /***************************************Okcell********************************************/
  61. #pragma pack(1)
  62. typedef struct
  63. {
  64. uint16_t cell_d0[33]; //13s字节到20,扩展到15s。
  65. }_CELL_D0;
  66. #pragma pack()
  67. #pragma pack(1)
  68. typedef struct
  69. {
  70. uint16_t cell_d1[3];
  71. }_CELL_D1;
  72. #pragma pack()
  73. #pragma pack(1)
  74. typedef struct
  75. {
  76. uint16_t cell_d2[2];
  77. }_CELL_D2;
  78. #pragma pack()
  79. #pragma pack(1)
  80. typedef struct
  81. {
  82. uint16_t cell_d3[9];
  83. }_CELL_D3;
  84. #pragma pack()
  85. #pragma pack(1)
  86. typedef struct
  87. {
  88. uint16_t cell_d4[4];
  89. }_CELL_D4;
  90. #pragma pack()
  91. #pragma pack(1)
  92. typedef struct
  93. {
  94. uint8_t cell_p2[4];
  95. }_CELL_P2;
  96. #pragma pack()
  97. #pragma pack(1)
  98. typedef struct
  99. {
  100. uint8_t cell_p3[12];
  101. }_CELL_P3;
  102. #pragma pack()
  103. #pragma pack(1)
  104. typedef struct
  105. {
  106. uint32_t cell_CanID;
  107. _CELL_D0 cell_D0;
  108. _CELL_D1 cell_D1;
  109. _CELL_D2 cell_D2;
  110. _CELL_D3 cell_D3;
  111. _CELL_D4 cell_D4;
  112. _CELL_P2 cell_P2;
  113. _CELL_P3 cell_P3;
  114. }_CELL_INF;
  115. #pragma pack()
  116. #define OKCELL_MAXLEN 200
  117. #pragma pack(1)
  118. typedef struct {
  119. uint32_t deviceCanID;
  120. unsigned char Okcell_recv_buf[OKCELL_MAXLEN];
  121. short Okcell_recv_index;
  122. //获取到起始标志位
  123. bool Okcell_get_s;
  124. Connect_check Okcell_Link;
  125. //获取电池编号
  126. bool get_cellNumber;
  127. //获取电池SHA1加密文
  128. bool get_cellEncryption;
  129. uint32_t get_cellEncryption_counts;
  130. //电池波特率是否锁定
  131. bool cell_bps_lock_success;
  132. //由于锁定波特率缺少反馈应答,5s内收到多于10包正确的数据则认为波特率锁定成功。
  133. short recv_celldata_counts;
  134. uint32_t recv_celldata_time;
  135. _CELL_INF okcell_inf;
  136. }_OKCELL_DEVICE;
  137. extern uint8_t group_num;
  138. #pragma pack()
  139. extern _OKCELL_DEVICE okcell_device1, okcell_device2;
  140. extern unsigned char okcell_sha1_out[20];
  141. #define CAN_OKCELL_SEND_ID (0x15350000)
  142. #pragma pack(1)
  143. struct OkCell_P80{
  144. char ok_s[4];
  145. char ok_cmd[2];
  146. char ok_len;
  147. char ok_flag;
  148. char ok_data;
  149. char ok_crc[2];
  150. char ok_e[3];
  151. };
  152. #pragma pack()
  153. extern struct OkCell_P80 okcell_p80;
  154. #pragma pack(1)
  155. struct OkCell_P82{
  156. char ok_s[4];
  157. char ok_cmd[2];
  158. char ok_len;
  159. char ok_flag;
  160. char ok_data[4];
  161. char ok_crc[2];
  162. char ok_e[3];
  163. };
  164. #pragma pack()
  165. extern struct OkCell_P82 okcell_p82;
  166. #pragma pack(1)
  167. struct OkCell_P83{
  168. char ok_s[4];
  169. char ok_cmd[2];
  170. char ok_len;
  171. char ok_flag;
  172. char ok_crc[2];
  173. char ok_e[3];
  174. };
  175. #pragma pack()
  176. extern struct OkCell_P83 okcell_p83;
  177. void OkcellCanRecvHookFunction(uint32_t cellCanID, uint8_t* data, uint8_t len);
  178. void send_msg_to_okcell(void);
  179. /***********************************************************************************/
  180. #define TATTU_MAXLEN 200
  181. #pragma pack(1)
  182. typedef struct
  183. {
  184. unsigned char tail_tranid:5;
  185. unsigned char tail_toggle:1;
  186. unsigned char tail_end :1;
  187. unsigned char tail_start :1;
  188. }_TAIL_BYTE;
  189. #pragma pack()
  190. #pragma pack(1)
  191. typedef struct
  192. {
  193. //unsigned short def_info[26]; //tattu
  194. unsigned short tattu_company;
  195. unsigned short tattu_type;
  196. unsigned short tattu_volt;
  197. short tattu_cur;
  198. unsigned short tattu_temp;
  199. unsigned short tattu_perc;
  200. unsigned short tattu_cycle;
  201. unsigned short tattu_health;
  202. unsigned short tattu_v1;
  203. unsigned short tattu_v2;
  204. unsigned short tattu_v3;
  205. unsigned short tattu_v4;
  206. unsigned short tattu_v5;
  207. unsigned short tattu_v6;
  208. unsigned short tattu_v7;
  209. unsigned short tattu_v8;
  210. unsigned short tattu_v9;
  211. unsigned short tattu_v10;
  212. unsigned short tattu_v11;
  213. unsigned short tattu_v12;
  214. unsigned short tattu_v13;
  215. unsigned short tattu_v14;
  216. unsigned short tattu_descapa;
  217. unsigned short tattu_recapa;
  218. unsigned int tattu_err;
  219. unsigned char tuattu_id[16];
  220. unsigned short tattu_cnum; //tattu
  221. }_TATTU_INFO;
  222. #pragma pack()
  223. //extern _TATTU_INFO ttu_inf;
  224. #pragma pack(1)
  225. typedef struct {
  226. uint32_t deviceCanID;
  227. unsigned char Tattu_recv_buf[TATTU_MAXLEN];
  228. Connect_check Tattu_Link;
  229. short Tattu_recv_index;
  230. //获取到起始标志位
  231. bool Tattu_get_s;
  232. _TAIL_BYTE ttu_tailbyte;
  233. _TATTU_INFO ttu_inf;
  234. }_TATTU_DEVICE;
  235. #pragma pack()
  236. extern _TATTU_DEVICE tattu_device1, tattu_device2;
  237. extern comp_status tattu_link_status;
  238. void TattuCanRecvHookFunction(uint32_t ttuCanID, uint8_t data[], uint8_t len);
  239. extern uint16_t CCITT_CRC16;
  240. void CCITT_CRC16Init(uint8_t const *bytes, uint16_t len);
  241. void CCITT_CRC_ARRAY(uint8_t const * bytes, uint16_t len);
  242. /***********************************************************************************/
  243. /***************************************VKBMS********************************************/
  244. #pragma pack(1)
  245. struct BMS_DATA
  246. {
  247. uint8_t bms_version[3]; //协议版本
  248. uint8_t bms_group; //电池组数
  249. uint8_t bms_num; //串数
  250. uint16_t bms_v1; //mv
  251. uint16_t bms_v2;
  252. uint16_t bms_v3;
  253. uint16_t bms_v4;
  254. uint16_t bms_v5;
  255. uint16_t bms_v6;
  256. uint16_t bms_v7;
  257. uint16_t bms_v8;
  258. uint16_t bms_v9;
  259. uint16_t bms_v10;
  260. uint16_t bms_v11;
  261. uint16_t bms_v12;
  262. uint16_t bms_v13;
  263. uint16_t bms_v14;
  264. uint16_t bms_v15;
  265. uint16_t bms_v16;
  266. uint16_t bms_v17;
  267. uint16_t bms_v18;
  268. uint16_t bms_v19;
  269. uint16_t bms_v20;
  270. uint16_t bms_v21;
  271. uint16_t bms_v22;
  272. uint16_t bms_v23;
  273. uint16_t bms_v24;
  274. uint16_t bms_v25;
  275. uint16_t bms_v26; //最大兼容26s电池
  276. uint8_t bms_ids[32]; //VK3协议 32字节 之前20字节
  277. uint16_t bms_cycle; //循环次数
  278. uint16_t bms_volt; //电压 mv
  279. int16_t bms_ac; //电流 10ma
  280. int16_t bms_temp; //温度 0.1℃
  281. uint8_t bms_vs; //充电百分比 1%
  282. uint16_t bms_ss; //状态
  283. uint16_t serial_num; //VK3厂商编号
  284. };
  285. #pragma pack()
  286. //msgid 0x02
  287. #pragma pack(1)
  288. typedef struct{
  289. uint16_t voltage; //10mv
  290. int current;
  291. short tempture;
  292. short mosfet_tempture;
  293. uint16_t persent;
  294. uint32_t warn_flag;
  295. uint16_t bms_num;
  296. uint16_t bms_v1;
  297. uint16_t bms_v2;
  298. uint16_t bms_v3;
  299. uint16_t bms_v4;
  300. uint16_t bms_v5;
  301. uint16_t bms_v6;
  302. uint16_t bms_v7;
  303. uint16_t bms_v8;
  304. uint16_t bms_v9;
  305. uint16_t bms_v10;
  306. uint16_t bms_v11;
  307. uint16_t bms_v12;
  308. uint16_t bms_v13;
  309. uint16_t bms_v14;
  310. uint16_t bms_v15;
  311. uint16_t bms_v16;
  312. uint16_t bms_v17;
  313. uint16_t bms_v18;
  314. uint16_t bms_v19;
  315. uint16_t bms_v20;
  316. uint16_t bms_v21;
  317. uint16_t bms_v22;
  318. uint16_t bms_v23;
  319. uint16_t bms_v24;
  320. uint16_t bms_v25;
  321. uint16_t bms_v26;
  322. }vkbms2;
  323. #pragma pack()
  324. extern vkbms2 vk_bms2;
  325. //msgid 0x03
  326. #pragma pack(1)
  327. typedef struct{
  328. char bms_company_info[20]; //电池厂商信息
  329. char bms_type_info[20]; //电池型号信息
  330. char bms_id[20]; //电池ID信息
  331. char bms_hard_version[10]; //电池硬件版本
  332. char bms_soft_version[10]; //电池软件版本
  333. }vkbms3;
  334. #pragma pack()
  335. //msgid 0x04
  336. #pragma pack(1)
  337. typedef struct{
  338. uint16_t capacity; //电池设计容量
  339. uint16_t discharge_rate; //电池放电倍率
  340. uint16_t normal_voltage; //标称电压
  341. uint16_t bms_num; //电池串数
  342. }vkbms4;
  343. #pragma pack()
  344. //msgid 0x05
  345. #pragma pack(1)
  346. typedef struct{
  347. uint16_t health_percent; //健康度%
  348. uint16_t circulation_time;//循环次数
  349. uint16_t over_recharge; //过充次数
  350. uint16_t over_discharge; //过放次数
  351. uint16_t over_current; //过流次数
  352. uint16_t over_tempreature;//过温次数
  353. uint16_t SOC;
  354. uint16_t SOH;
  355. uint16_t recharge_capacity;//充电容量
  356. uint16_t surplus_capacity; //剩余容量
  357. uint16_t inter_resistance; //电池内阻值
  358. }vkbms5;
  359. #pragma pack()
  360. #pragma pack(1)
  361. typedef struct soft_bms
  362. {
  363. Connect_check Vkbms_Link;
  364. uint32_t can_id;
  365. bool ack_to_bms;
  366. uint8_t source_id;
  367. bool if_mul_frame;
  368. bool recv_mul_freme_complete;
  369. uint8_t mul_frame_i;
  370. uint8_t mul_frame_num;
  371. uint8_t bms_can_buf[128];
  372. vkbms2 vk_bms2;
  373. vkbms3 vk_bms3;
  374. vkbms4 vk_bms4;
  375. vkbms5 vk_bms5;
  376. bool get_bms3_ack;
  377. bool get_bms4_ack;
  378. bool get_bms5_ack;
  379. }Vkbms_Device;
  380. #pragma pack()
  381. extern Vkbms_Device Device1;
  382. extern Vkbms_Device Device2;
  383. extern uint8_t bms_step;
  384. extern uint8_t bms_group_num;
  385. extern struct BMS_DATA bms_data, bms_data2;
  386. /***********************************************************************************/
  387. void bms_function(void);
  388. void update_bms_data( void );
  389. void BMSCanRecvHookFunction(uint32_t CanID, uint8_t data[], uint8_t len);
  390. #endif