app_rs485_1.h 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
  1. #ifndef APP_RS485_1_H
  2. #define APP_RS485_1_H
  3. enum
  4. {
  5. OP_NONE,
  6. OP_BOND,
  7. OP_WRITE_SN,
  8. OP_PAIR,
  9. OP_UPDATE_PAIR,
  10. OP_READ_INFO,
  11. OP_ALARM_TIMES,
  12. OP_CELL_VOL,//0x07
  13. OP_TEMP_OTHER,//0x08
  14. OP_OPEN_FET = 0x0B,
  15. OP_CLEAR_PAIR = OP_TEMP_OTHER + 1,
  16. OP_UPDATE_SOFTWARE_REQ = 0x0E,
  17. OP_UPDATE_SOFTWARE = 0x0F,
  18. OP_MAX
  19. };
  20. typedef struct
  21. {
  22. uint8_t operate;
  23. uint8_t op_result;
  24. uint16_t resver;
  25. uint32_t param;
  26. }SUB_BMS_CMD;
  27. #define RS485_COM_TIMEOUT (150)
  28. #define RS485_COM_ERROR (3)
  29. #define RS485_COM_UPDATE_TIMEOUT (1500)
  30. /*******************************************通用帧头-start*********************************************************/
  31. #pragma pack (push,1)
  32. typedef struct
  33. {
  34. //整个包大小
  35. uint8_t size;
  36. //命令设备
  37. uint8_t type;
  38. //协议类型
  39. uint8_t protocol;
  40. //命令类型
  41. uint8_t cmd;
  42. //命令校验
  43. uint16_t checksum;
  44. //命令处理调用
  45. uint8_t dir;
  46. //命令返回状态
  47. uint8_t bStatus;
  48. //命令数据部分
  49. }COMMAND_BODY;
  50. #pragma pack(pop)
  51. //
  52. #define BMS_STA_BOND (0x01)
  53. #define BMS_STA_D_OPEN (0x02)
  54. #define BMS_STA_C_OPEN (0x04)
  55. #define BMS_STA_S_OPEN (0x08)
  56. #define BMS_STA_C_FULL (0x10)
  57. #define BMS_STA_S_BAHU (0x20)
  58. #define BMS_STA_JIAO_YAN (0x40)
  59. /*******************************************通用帧头-end*********************************************************/
  60. /*******************************************BMS帧头-start*********************************************************/
  61. #define SBU_BMS_ADDRESS (0x30)
  62. #define SUB_BMS_ADDRESS_0 (SBU_BMS_ADDRESS)
  63. #define SUB_BMS_ADDRESS_1 (SBU_BMS_ADDRESS + 1)
  64. #define SUB_BMS_ADDRESS_2 (SBU_BMS_ADDRESS + 1)
  65. #define BMS_DIR (0x16)
  66. #define SET_COMMAND (0x10)
  67. #define GET_COMMAND (0x20)
  68. #define ACK_COMMAND (0x30)
  69. #define ENG_COMMAND (0x40)
  70. /*******************************************BMS帧头-end*********************************************************/
  71. #pragma pack (push,1)
  72. typedef struct
  73. {
  74. uint8_t yjkxslc;
  75. uint8_t m_percent;
  76. uint8_t yjcdwcsj;
  77. uint8_t charge_flag;
  78. int32_t m_current;
  79. uint32_t m_total_vol;
  80. uint8_t bms_temp;
  81. uint16_t work_status;
  82. uint32_t banlance_cell;
  83. uint8_t bms_status;
  84. uint8_t operate_result;
  85. }PACKET_COMMON;
  86. #define SERIAL_NUM_SIZE 18
  87. #define SOFTWARE_SIZE 20
  88. typedef struct
  89. {
  90. uint8_t sn[SERIAL_NUM_SIZE];
  91. uint8_t soft_ver[SOFTWARE_SIZE];
  92. }BATTERY_DEV_INFO;
  93. typedef struct
  94. {
  95. uint16_t dcsmxs;
  96. uint32_t charge_times;
  97. uint32_t charge_over_vol_times;
  98. uint32_t discharge_under_vol_times;
  99. uint32_t charge_over_cur_times;
  100. uint32_t discharge_under_cur_times;
  101. uint32_t short_times;
  102. uint32_t charge_under_temp_times;
  103. uint32_t discharge_under_temp_times;
  104. uint32_t charge_over_temp_times;
  105. uint32_t discharge_over_temp_times;
  106. }BATTERY_TIMES;
  107. #define CELL_NUM_MAX (15u)
  108. typedef struct
  109. {
  110. uint8_t cv_cell_num;
  111. uint16_t cv_cell_vol[CELL_NUM_MAX];
  112. }CELL_VOL;
  113. #define THERMISTOR_NUM_MAX (4u)
  114. typedef struct
  115. {
  116. int8_t to_temp_num[THERMISTOR_NUM_MAX];
  117. uint8_t to_fet;
  118. }TEMP_OTHER;
  119. #pragma pack(pop)
  120. typedef struct
  121. {
  122. PACKET_COMMON packet_common;
  123. BATTERY_DEV_INFO bat_dev_info;
  124. BATTERY_TIMES bat_times;
  125. CELL_VOL cell_vol;
  126. TEMP_OTHER temp_other;
  127. SUB_BMS_CMD sub_bms_cmd;
  128. uint8_t rs485_connect;
  129. uint8_t rs485_time_out;
  130. }SUB_BMS_INFO;
  131. extern SUB_BMS_INFO sub_bms_info_1;
  132. extern SUB_BMS_INFO sub_bms_info_2;
  133. typedef struct
  134. {
  135. uint8_t set;
  136. uint16_t count;
  137. uint8_t com_err_flag;
  138. uint32_t com_err_count;
  139. }SUB_BMS_COM;
  140. extern SUB_BMS_COM sub_rs485_time_out_1;
  141. extern SUB_BMS_COM sub_rs485_time_out_2;
  142. extern uint8_t RS485_busy_1;
  143. extern uint8_t RS485_busy_2;
  144. #if 0
  145. _inline void Sub_BMS_1_RS485_Com_Time_Out(void)
  146. {
  147. if(sub_rs485_time_out_1.set)
  148. {
  149. if(++sub_rs485_time_out_1.count >= RS485_COM_TIMEOUT)
  150. {
  151. RS485_busy_1 = 0;
  152. sub_rs485_time_out_1.set = 0;
  153. sub_rs485_time_out_1.count = 0;
  154. if(sub_rs485_time_out_1.com_err_flag == 0)
  155. {
  156. sub_rs485_time_out_1.com_err_flag = 1;
  157. sub_rs485_time_out_1.com_err_count = 1;
  158. }
  159. else
  160. {
  161. if(++sub_rs485_time_out_1.com_err_count >= 5)
  162. {
  163. sub_rs485_time_out_1.com_err_count = 0;
  164. g_event |= SUB_BMS_1_RS485_DISC_EVENT;
  165. }
  166. }
  167. }
  168. }
  169. }
  170. __inline void Sub_BMS_2_RS485_Com_Time_Out(void)
  171. {
  172. if(sub_rs485_time_out_2.set)
  173. {
  174. if(++sub_rs485_time_out_2.count >= RS485_COM_TIMEOUT)
  175. {
  176. RS485_busy_2 = 0;
  177. sub_rs485_time_out_2.set = 0;
  178. sub_rs485_time_out_2.count = 0;
  179. if(sub_rs485_time_out_2.com_err_flag == 0)
  180. {
  181. sub_rs485_time_out_2.com_err_flag = 1;
  182. sub_rs485_time_out_2.com_err_count = 1;
  183. }
  184. else
  185. {
  186. if(++sub_rs485_time_out_2.com_err_count >= 5)
  187. {
  188. sub_rs485_time_out_2.com_err_count = 0;
  189. g_event |= SUB_BMS_2_RS485_DISC_EVENT;
  190. }
  191. }
  192. }
  193. }
  194. }
  195. #endif
  196. extern DELAY_COMMON send_delay;
  197. __inline void Send_Sub_BMS_CMD_Delay(void)
  198. {
  199. if(send_delay.set)
  200. {
  201. ++send_delay.count;
  202. if(send_delay.count >= 400)
  203. {
  204. send_delay.count = 0;
  205. g_event |= SUB_BMS_2_SEND_CMD_EVENT;
  206. }
  207. else if(send_delay.count == 200)
  208. {
  209. g_event |= SUB_BMS_1_SEND_CMD_EVENT;
  210. }
  211. }
  212. }
  213. extern uint8_t sub_bms_1_connect;
  214. extern uint8_t sub_bms_2_connect;
  215. enum
  216. {
  217. SUB_BMS_INVALID_STATUS,
  218. SUB_BMS_DISC_NO485,
  219. SUB_BMS_DISC_HV485,
  220. SUB_BMS_CONT_HV485,
  221. SUB_BMS_CONT_NO485,
  222. };
  223. extern uint8_t sub_bms_1_lt_state;
  224. extern uint8_t sub_bms_2_lt_state;
  225. enum
  226. {
  227. CW_NONE,
  228. CW_CHONG_DIAN_ZUO,
  229. CW_CHE_SHANG_CHARGER,
  230. CW_CHE_SHANG_NO_CHARGER,
  231. CW_MAX
  232. };
  233. extern uint8_t cang_wei;
  234. extern uint16_t bms_1_work_status ;
  235. extern uint16_t bms_2_work_status ;
  236. extern uint8_t bms_1_test_define_error;
  237. extern uint8_t bms_2_test_define_error;
  238. void Check_Sub_BMS_1(void);
  239. void Check_Sub_BMS_2(void);
  240. int8_t Handle_RS485_1_Data(void);
  241. int8_t Handle_RS485_2_Data(void);
  242. void RS485_Communication_Time_Out_1(void);
  243. void RS485_Communication_Time_Out_2(void);
  244. void Send_Sub_BMS_1_CMD(void);
  245. void Send_Sub_BMS_2_CMD(void);
  246. void Sub_BMS_1_Initial(void);
  247. void Sub_BMS_2_Initial(void);
  248. void Sub_BMS_1_lt_State(void);
  249. void Sub_BMS_2_lt_State(void);
  250. uint8_t Is_Sub_BMS_1_Normal(void);
  251. uint8_t Is_Sub_BMS_2_Normal(void);
  252. int8_t Operate_Sub_BMS_1_CD(uint8_t on);
  253. int8_t Operate_Sub_BMS_2_CD(uint8_t on);
  254. uint8_t Sub_BMS_1_COM_Finish(void);
  255. uint8_t Sub_BMS_2_COM_Finish(void);
  256. uint8_t SUB_BMS_1_DEC(void);
  257. uint8_t SUB_BMS_2_DEC(void);
  258. int8_t Update_Sub_BMS_1_Software(uint8_t step);
  259. int8_t Update_Sub_BMS_2_Software(uint8_t step);
  260. extern void RS485_Print(uint8_t dest,uint8_t * dbuf,uint16_t dbuf_len);
  261. #endif