| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466 |
- #ifndef _SOFT_BMS_H
- #define _SOFT_BMS_H
- #include "common.h"
- #include "stdint.h"
- //VK电池协议 0x1E0958
- #define VK_BMS_FILTER_ID 0xE0800 //0 0000 0000 1110 0000 1000 0000 0000 flag 111 目标节点0x1
- #define VK_BMS_MASK_ID 0x1C0FF800 //1 1100 0000 1111 1111 1000 0000 0000
- //0x1C0E0800
- #define VK_MSG_MASK_ID 0X3F00000
- #define VK_SRC_MASK_ID 0X7E0
- /***************************************herewin********************************************/
- #define HEREWIN_HEART_ID 0x004300F0 //心跳数据包
- #define HEREWIN_VOL_ID 0x008400F0 //单体电压包
- #define HEREWIN_TEM_ID 0x008200F0 //单体温度包
- #define HEREWIN_SEARCH_ID 0x008000F0 //定值查询
- #define HEREWIN_CIRCULATION_ID 0x008600F0 //循环次数查询
- #pragma pack(1)
- typedef struct
- {
- uint8_t herewin_buf[64]; //临时buf
- uint8_t message_num; //报文序号
- uint8_t message_total;//总帧数
- uint16_t byte_num; //有效字节数
- int last_frame_num; //最后一包有效字节数
- uint16_t crc; //和校验
- uint8_t i;
- bool crc_is_ok; //校验通过
- }herewin_can_info;
- #pragma pack()
- #pragma pack(1)
- typedef struct
- {
- char battery_temp[3]; //每个电芯温度°C
- uint16_t battery_vol[14]; //每个电芯电压 0.001V
- uint16_t alarm_info; //报警信息
- uint16_t warn_info; //警告信息
- uint16_t total_vol; //总电压 0.01V
- uint16_t tolal_ele; //总电流 0.01A
- uint8_t SOC_info; //剩余电量%
- uint8_t SOH_info; //健康状态%
- uint8_t SOP_info; //功率状态%
- uint32_t serial_number; //序列号
- uint16_t hard_version; //硬件版本
- uint16_t soft_version; //软件版本
- uint8_t battery_num; //电芯个数
- uint16_t circulation_num; //循环次数
-
- //充电请求相关参数
- uint16_t re_vol; //请求电压
- uint16_t re_ele; //请求电流
- uint16_t max_vol; //单体最大电压
- uint16_t power_status; //充电状态
- bool get_temp_flag; //温度是单独一包,并且有偏移,没获取到温度之前会显示负数
- }herewin_bms;
- #pragma pack()
- extern herewin_bms herewin_info;
- extern Connect_check Herewin_Link;
- void HerewinCanRecvHookFunction(uint32_t cellCanID, uint8_t data[], uint8_t len);
- void send_msg_to_herewin(void);
- /***********************************************************************************/
- /***************************************Okcell********************************************/
- #pragma pack(1)
- typedef struct
- {
- uint16_t cell_d0[33]; //13s字节到20,扩展到15s。
- }_CELL_D0;
- #pragma pack()
- #pragma pack(1)
- typedef struct
- {
- uint16_t cell_d1[3];
- }_CELL_D1;
- #pragma pack()
- #pragma pack(1)
- typedef struct
- {
- uint16_t cell_d2[2];
- }_CELL_D2;
- #pragma pack()
- #pragma pack(1)
- typedef struct
- {
- uint16_t cell_d3[9];
- }_CELL_D3;
- #pragma pack()
- #pragma pack(1)
- typedef struct
- {
- uint16_t cell_d4[4];
- }_CELL_D4;
- #pragma pack()
- #pragma pack(1)
- typedef struct
- {
- uint8_t cell_p2[4];
- }_CELL_P2;
- #pragma pack()
- #pragma pack(1)
- typedef struct
- {
- uint8_t cell_p3[12];
- }_CELL_P3;
- #pragma pack()
- #pragma pack(1)
- typedef struct
- {
- uint32_t cell_CanID;
- _CELL_D0 cell_D0;
- _CELL_D1 cell_D1;
- _CELL_D2 cell_D2;
- _CELL_D3 cell_D3;
- _CELL_D4 cell_D4;
- _CELL_P2 cell_P2;
- _CELL_P3 cell_P3;
- }_CELL_INF;
- #pragma pack()
- #define OKCELL_MAXLEN 200
- #pragma pack(1)
- typedef struct {
- uint32_t deviceCanID;
- unsigned char Okcell_recv_buf[OKCELL_MAXLEN];
- short Okcell_recv_index;
-
- //获取到起始标志位
- bool Okcell_get_s;
-
- Connect_check Okcell_Link;
-
-
- //获取电池编号
- bool get_cellNumber;
- //获取电池SHA1加密文
- bool get_cellEncryption;
- uint32_t get_cellEncryption_counts;
- //电池波特率是否锁定
- bool cell_bps_lock_success;
- //由于锁定波特率缺少反馈应答,5s内收到多于10包正确的数据则认为波特率锁定成功。
- short recv_celldata_counts;
- uint32_t recv_celldata_time;
-
- _CELL_INF okcell_inf;
- }_OKCELL_DEVICE;
- extern uint8_t group_num;
- #pragma pack()
- extern _OKCELL_DEVICE okcell_device1, okcell_device2;
- extern unsigned char okcell_sha1_out[20];
- #define CAN_OKCELL_SEND_ID (0x15350000)
- #pragma pack(1)
- struct OkCell_P80{
- char ok_s[4];
- char ok_cmd[2];
- char ok_len;
- char ok_flag;
- char ok_data;
- char ok_crc[2];
- char ok_e[3];
- };
- #pragma pack()
- extern struct OkCell_P80 okcell_p80;
- #pragma pack(1)
- struct OkCell_P82{
- char ok_s[4];
- char ok_cmd[2];
- char ok_len;
- char ok_flag;
- char ok_data[4];
- char ok_crc[2];
- char ok_e[3];
- };
- #pragma pack()
- extern struct OkCell_P82 okcell_p82;
- #pragma pack(1)
- struct OkCell_P83{
- char ok_s[4];
- char ok_cmd[2];
- char ok_len;
- char ok_flag;
- char ok_crc[2];
- char ok_e[3];
- };
- #pragma pack()
- extern struct OkCell_P83 okcell_p83;
- void OkcellCanRecvHookFunction(uint32_t cellCanID, uint8_t* data, uint8_t len);
- void send_msg_to_okcell(void);
- /***********************************************************************************/
- #define TATTU_MAXLEN 200
- #pragma pack(1)
- typedef struct
- {
- unsigned char tail_tranid:5;
- unsigned char tail_toggle:1;
- unsigned char tail_end :1;
- unsigned char tail_start :1;
- }_TAIL_BYTE;
- #pragma pack()
- #pragma pack(1)
- typedef struct
- {
- //unsigned short def_info[26]; //tattu
- unsigned short tattu_company;
- unsigned short tattu_type;
- unsigned short tattu_volt;
- short tattu_cur;
- unsigned short tattu_temp;
- unsigned short tattu_perc;
- unsigned short tattu_cycle;
- unsigned short tattu_health;
- unsigned short tattu_v1;
- unsigned short tattu_v2;
- unsigned short tattu_v3;
- unsigned short tattu_v4;
- unsigned short tattu_v5;
- unsigned short tattu_v6;
- unsigned short tattu_v7;
- unsigned short tattu_v8;
- unsigned short tattu_v9;
- unsigned short tattu_v10;
- unsigned short tattu_v11;
- unsigned short tattu_v12;
- unsigned short tattu_v13;
- unsigned short tattu_v14;
- unsigned short tattu_descapa;
- unsigned short tattu_recapa;
- unsigned int tattu_err;
- unsigned char tuattu_id[16];
-
- unsigned short tattu_cnum; //tattu
- }_TATTU_INFO;
- #pragma pack()
- //extern _TATTU_INFO ttu_inf;
- #pragma pack(1)
- typedef struct {
- uint32_t deviceCanID;
- unsigned char Tattu_recv_buf[TATTU_MAXLEN];
- Connect_check Tattu_Link;
-
- short Tattu_recv_index;
- //获取到起始标志位
- bool Tattu_get_s;
- _TAIL_BYTE ttu_tailbyte;
-
- _TATTU_INFO ttu_inf;
- }_TATTU_DEVICE;
- #pragma pack()
- extern _TATTU_DEVICE tattu_device1, tattu_device2;
- extern comp_status tattu_link_status;
- void TattuCanRecvHookFunction(uint32_t ttuCanID, uint8_t data[], uint8_t len);
- extern uint16_t CCITT_CRC16;
- void CCITT_CRC16Init(uint8_t const *bytes, uint16_t len);
- void CCITT_CRC_ARRAY(uint8_t const * bytes, uint16_t len);
- /***********************************************************************************/
- /***************************************VKBMS********************************************/
- #pragma pack(1)
- struct BMS_DATA
- {
- uint8_t bms_version[3]; //协议版本
- uint8_t bms_group; //电池组数
- uint8_t bms_num; //串数
- uint16_t bms_v1; //mv
- uint16_t bms_v2;
- uint16_t bms_v3;
- uint16_t bms_v4;
- uint16_t bms_v5;
- uint16_t bms_v6;
- uint16_t bms_v7;
- uint16_t bms_v8;
- uint16_t bms_v9;
- uint16_t bms_v10;
- uint16_t bms_v11;
- uint16_t bms_v12;
- uint16_t bms_v13;
- uint16_t bms_v14;
- uint16_t bms_v15;
- uint16_t bms_v16;
- uint16_t bms_v17;
- uint16_t bms_v18;
- uint16_t bms_v19;
- uint16_t bms_v20;
- uint16_t bms_v21;
- uint16_t bms_v22;
- uint16_t bms_v23;
- uint16_t bms_v24;
- uint16_t bms_v25;
- uint16_t bms_v26; //最大兼容26s电池
- uint8_t bms_ids[32]; //VK3协议 32字节 之前20字节
- uint16_t bms_cycle; //循环次数
- uint16_t bms_volt; //电压 mv
- int16_t bms_ac; //电流 10ma
- int16_t bms_temp; //温度 0.1℃
- uint8_t bms_vs; //充电百分比 1%
- uint16_t bms_ss; //状态
- uint16_t serial_num; //VK3厂商编号
- };
- #pragma pack()
- //msgid 0x02
- #pragma pack(1)
- typedef struct{
- uint16_t voltage; //10mv
- int current;
- short tempture;
- short mosfet_tempture;
- uint16_t persent;
- uint32_t warn_flag;
- uint16_t bms_num;
- uint16_t bms_v1;
- uint16_t bms_v2;
- uint16_t bms_v3;
- uint16_t bms_v4;
- uint16_t bms_v5;
- uint16_t bms_v6;
- uint16_t bms_v7;
- uint16_t bms_v8;
- uint16_t bms_v9;
- uint16_t bms_v10;
- uint16_t bms_v11;
- uint16_t bms_v12;
- uint16_t bms_v13;
- uint16_t bms_v14;
- uint16_t bms_v15;
- uint16_t bms_v16;
- uint16_t bms_v17;
- uint16_t bms_v18;
- uint16_t bms_v19;
- uint16_t bms_v20;
- uint16_t bms_v21;
- uint16_t bms_v22;
- uint16_t bms_v23;
- uint16_t bms_v24;
- uint16_t bms_v25;
- uint16_t bms_v26;
- }vkbms2;
- #pragma pack()
- extern vkbms2 vk_bms2;
- //msgid 0x03
- #pragma pack(1)
- typedef struct{
- char bms_company_info[20]; //电池厂商信息
- char bms_type_info[20]; //电池型号信息
- char bms_id[20]; //电池ID信息
- char bms_hard_version[10]; //电池硬件版本
- char bms_soft_version[10]; //电池软件版本
- }vkbms3;
- #pragma pack()
- //msgid 0x04
- #pragma pack(1)
- typedef struct{
- uint16_t capacity; //电池设计容量
- uint16_t discharge_rate; //电池放电倍率
- uint16_t normal_voltage; //标称电压
- uint16_t bms_num; //电池串数
- }vkbms4;
- #pragma pack()
- //msgid 0x05
- #pragma pack(1)
- typedef struct{
- uint16_t health_percent; //健康度%
- uint16_t circulation_time;//循环次数
- uint16_t over_recharge; //过充次数
- uint16_t over_discharge; //过放次数
- uint16_t over_current; //过流次数
- uint16_t over_tempreature;//过温次数
- uint16_t SOC;
- uint16_t SOH;
- uint16_t recharge_capacity;//充电容量
- uint16_t surplus_capacity; //剩余容量
- uint16_t inter_resistance; //电池内阻值
- }vkbms5;
- #pragma pack()
- #pragma pack(1)
- typedef struct soft_bms
- {
- Connect_check Vkbms_Link;
- uint32_t can_id;
- bool ack_to_bms;
- uint8_t source_id;
- bool if_mul_frame;
- bool recv_mul_freme_complete;
- uint8_t mul_frame_i;
- uint8_t mul_frame_num;
- uint8_t bms_can_buf[128];
- vkbms2 vk_bms2;
- vkbms3 vk_bms3;
- vkbms4 vk_bms4;
- vkbms5 vk_bms5;
- bool get_bms3_ack;
- bool get_bms4_ack;
- bool get_bms5_ack;
- }Vkbms_Device;
- #pragma pack()
- extern Vkbms_Device Device1;
- extern Vkbms_Device Device2;
- extern uint8_t bms_step;
- extern uint8_t bms_group_num;
- extern struct BMS_DATA bms_data, bms_data2;
- /***********************************************************************************/
- void bms_function(void);
- void update_bms_data( void );
- void BMSCanRecvHookFunction(uint32_t CanID, uint8_t data[], uint8_t len);
- #endif
|