app_bms_2.c 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  1. #include "common.h"
  2. #include "drv_can.h"
  3. #include "app_rs485_1.h"
  4. #include "app_rs485_2.h"
  5. #include "app_can.h"
  6. #include "app.h"
  7. #include "app_bms_2.h"
  8. BMS_SELF_SEND_STATUS bms_2_self_ss;
  9. BMS_SELF_CUR_VOL_STATUS bms_2_cur_vol_ss;
  10. DELAY_COMMON bms_2_self_stimeout;
  11. void Can_Bms_2_Cur_Vol_Self_Send_Check(CAN_FRAME*can_bms_2_frame)
  12. {
  13. uint16_t len;
  14. uint8_t *buf = can_bms_2_frame->data;
  15. do
  16. {
  17. if(bms_2_cur_vol_ss.m_cur != sub_bms_info_2.packet_common.m_current/RESOLUTION_DELTA_50M)
  18. break;
  19. if(bms_2_cur_vol_ss.m_vol != sub_bms_info_2.packet_common.m_total_vol/RESOLUTION_DELTA_50M)
  20. break;
  21. return;
  22. }while(0);
  23. bms_2_cur_vol_ss.m_cur = sub_bms_info_2.packet_common.m_current/RESOLUTION_DELTA_10M;
  24. bms_2_cur_vol_ss.m_vol = sub_bms_info_2.packet_common.m_total_vol/RESOLUTION_DELTA_10M;
  25. len = sizeof(bms_2_cur_vol_ss);
  26. //
  27. can_bms_2_frame->head.rsp = FRAME_PT_NO_RSP;
  28. can_bms_2_frame->head.dest = CTR_ID;
  29. can_bms_2_frame->head.sour = SELF_ID;
  30. can_bms_2_frame->head.index = 1;
  31. can_bms_2_frame->head.total = (len - 1)/8 + 1;
  32. can_bms_2_frame->head.pro =FRAME_PRO_D;
  33. //
  34. can_bms_2_frame->len = len;
  35. memcpy(buf,&bms_2_cur_vol_ss,len);
  36. bms_2_self_stimeout.set = 0;
  37. bms_2_self_stimeout.count = 0;
  38. g_event &= ~BMS_2_SELF_TIMEOUT_EVENT;
  39. //
  40. if(!Send_Data_Can(can_bms_2_frame,BMS_2_CUR_VOL_SELF))
  41. {
  42. //g_event |= BMS_2_RESEND_CMD_EVENT;
  43. //return;
  44. }
  45. //
  46. bms_2_cur_vol_ss.m_cur = sub_bms_info_2.packet_common.m_current/RESOLUTION_DELTA_50M;
  47. bms_2_cur_vol_ss.m_vol = sub_bms_info_2.packet_common.m_total_vol/RESOLUTION_DELTA_50M;
  48. }
  49. void Can_Bms_2_Self_Send_Check(CAN_FRAME*can_bms_2_frame)
  50. {
  51. uint16_t len;
  52. uint8_t *buf = can_bms_2_frame->data;
  53. do
  54. {
  55. if(bms_2_self_ss.m_percent != sub_bms_info_2.packet_common.m_percent)
  56. break;
  57. if(bms_2_self_ss.charge_flag != sub_bms_info_2.packet_common.charge_flag)
  58. break;
  59. if(bms_2_self_ss.work_status != sub_bms_info_2.packet_common.work_status)
  60. break;
  61. //if(bms_2_self_ss.bms_status != sub_bms_info_2.packet_common.bms_status)
  62. // break;
  63. //Can_Bms_2_Cur_Vol_Self_Send_Check(can_bms_2_frame);
  64. return;
  65. }while(0);
  66. bms_2_self_ss.m_percent = sub_bms_info_2.packet_common.m_percent;
  67. bms_2_self_ss.charge_flag = sub_bms_info_2.packet_common.charge_flag;
  68. bms_2_self_ss.work_status = sub_bms_info_2.packet_common.work_status;
  69. len = sizeof(bms_2_self_ss);
  70. //
  71. can_bms_2_frame->head.rsp = FRAME_PT_NEED_RSP;
  72. can_bms_2_frame->head.dest = CTR_ID;
  73. can_bms_2_frame->head.sour = SELF_ID;
  74. can_bms_2_frame->head.index = 1;
  75. can_bms_2_frame->head.total = (len - 1)/8 + 1;
  76. can_bms_2_frame->head.pro =FRAME_PRO_D;
  77. //
  78. can_bms_2_frame->len = len;
  79. memcpy(buf,&bms_2_self_ss,len);
  80. bms_2_self_stimeout.set = 1;
  81. bms_2_self_stimeout.count = 0;
  82. //
  83. if(!Send_Data_Can(can_bms_2_frame,BMS_2_SELF))
  84. {
  85. //g_event |= BMS_2_RESEND_CMD_EVENT;
  86. //return;
  87. }
  88. }
  89. int8_t Handle_Can_Bms_2_CMD(CAN_FRAME*can_bms_2_frame)
  90. {
  91. uint16_t key;
  92. memcpy(&key,can_bms_2_frame->data,sizeof(key));
  93. switch(key)
  94. {
  95. case KEY_BMS_2_COMMON:
  96. break;
  97. case KEY_BMS_2_READ_INFO:
  98. case KEY_BMS_2_READ_VER:
  99. sub_bms_info_2.update_mask |= SHARK_BATT_INFO_VERTION;
  100. break;
  101. case KEY_BMS_2_ALARM_TIMES:
  102. case KEY_BMS_2_ALARM_TIMES_1:
  103. case KEY_BMS_2_ALARM_TIMES_2:
  104. sub_bms_info_2.update_mask |= SHARK_BATT_INFO_TIMES;
  105. break;
  106. case KEY_BMS_2_CELL_VOL:
  107. case KEY_BMS_2_CELL_VOL_1:
  108. case KEY_BMS_2_CELL_VOL_2:
  109. sub_bms_info_2.update_mask |= SHARK_BATT_INFO_CELL_VOL;
  110. break;
  111. case KEY_BMS_2_TEMP_OTHER:
  112. sub_bms_info_2.update_mask |= SHARK_BATT_INFO_TEMP;
  113. break;
  114. case KEY_BMS_2_SELF_UP:
  115. bms_2_self_stimeout.set = 0;
  116. return 0;
  117. default:
  118. return 0;
  119. }
  120. return 1;
  121. }
  122. int8_t Rsp_Can_Bms_2_CMD(CAN_FRAME*can_bms_2_frame)
  123. {
  124. uint16_t key,len;
  125. uint8_t *buf = can_bms_2_frame->data,*bt;
  126. uint16_t temp;
  127. memcpy(&key,can_bms_2_frame->data,sizeof(key));
  128. switch(key)
  129. {
  130. case KEY_BMS_2_COMMON:
  131. if((can_bms_2_frame->head.rsp != FRAME_PT_NEED_RSP) || bms_2_self_stimeout.set)
  132. return 1;
  133. len = 2;
  134. buf[len++] = 0;
  135. memcpy(&buf[len],&sub_bms_info_2.packet_common,sizeof(sub_bms_info_2.packet_common) - 1);
  136. if(sheng_yu_li_cheng.sy_yu_ji_ke_xing_shi_li_cheng)
  137. {
  138. if(sheng_yu_li_cheng.sy_percent_total == sub_bms_info_2.packet_common.m_percent)
  139. buf[3] = sheng_yu_li_cheng.sy_yu_ji_ke_xing_shi_li_cheng;
  140. else
  141. #if 0
  142. //bang zi ce shi start
  143. buf[3] = sheng_yu_li_cheng.sy_yu_ji_ke_xing_shi_li_cheng*sub_bms_info_2.packet_common.m_percent/50;
  144. //bang zi ce shi start
  145. #else
  146. {
  147. if(Is_Sub_BMS_2_Normal() == SHARK_BATT_EXIT_SUCCESS)
  148. {
  149. temp = (uint16_t)(sub_bms_info_2.packet_common.m_percent*sheng_yu_li_cheng.sy_ss_parm.neng_hao_bi*10/1000);
  150. if(temp%10 >= 5)
  151. buf[3] = temp/10 + 1;
  152. else
  153. buf[3] = temp/10;
  154. }
  155. else
  156. buf[3] = 0;
  157. }
  158. #endif
  159. }
  160. len += sizeof(sub_bms_info_2.packet_common) - 1;
  161. break;
  162. case KEY_BMS_2_READ_INFO:
  163. if((can_bms_2_frame->head.rsp != FRAME_PT_NEED_RSP) || bms_2_self_stimeout.set)
  164. return 1;
  165. len = 2;
  166. buf[len++] = 0;
  167. memcpy(&buf[len],sub_bms_info_2.bat_dev_info.sn,sizeof(sub_bms_info_2.bat_dev_info.sn));
  168. len += sizeof(sub_bms_info_2.bat_dev_info.sn);
  169. break;
  170. case KEY_BMS_2_READ_VER:
  171. if((can_bms_2_frame->head.rsp != FRAME_PT_NEED_RSP) || bms_2_self_stimeout.set)
  172. return 1;
  173. len = 2;
  174. buf[len++] = 0;
  175. memcpy(&buf[len],sub_bms_info_2.bat_dev_info.soft_ver,sizeof(sub_bms_info_2.bat_dev_info.soft_ver));
  176. len += sizeof(sub_bms_info_2.bat_dev_info.soft_ver);
  177. break;
  178. case KEY_BMS_2_ALARM_TIMES:
  179. if((can_bms_2_frame->head.rsp != FRAME_PT_NEED_RSP) || bms_2_self_stimeout.set)
  180. return 1;
  181. len = 2;
  182. buf[len++] = 0;
  183. //memcpy(&buf[len],&sub_bms_info_2.bat_times,sizeof(sub_bms_info_2.bat_times));
  184. //len += sizeof(sub_bms_info_2.bat_times);
  185. bt = (uint8_t*)(&sub_bms_info_2.bat_times);
  186. memcpy(&buf[len],bt,14);
  187. len += 14;
  188. break;
  189. case KEY_BMS_2_ALARM_TIMES_1:
  190. if((can_bms_2_frame->head.rsp != FRAME_PT_NEED_RSP) || bms_2_self_stimeout.set)
  191. return 1;
  192. len = 2;
  193. buf[len++] = 0;
  194. bt = (uint8_t*)(&sub_bms_info_2.bat_times);
  195. memcpy(&buf[len],&bt[14],16);
  196. len += 16;
  197. break;
  198. case KEY_BMS_2_ALARM_TIMES_2:
  199. if((can_bms_2_frame->head.rsp != FRAME_PT_NEED_RSP) || bms_2_self_stimeout.set)
  200. return 1;
  201. len = 2;
  202. buf[len++] = 0;
  203. bt = (uint8_t*)(&sub_bms_info_2.bat_times);
  204. memcpy(&buf[len],&bt[30],12);
  205. len += 12;
  206. break;
  207. case KEY_BMS_2_CELL_VOL:
  208. if((can_bms_2_frame->head.rsp != FRAME_PT_NEED_RSP) || bms_2_self_stimeout.set)
  209. return 1;
  210. len = 2;
  211. buf[len++] = 0;
  212. bt = (uint8_t*)(&sub_bms_info_2.cell_vol);
  213. memcpy(&buf[len],bt,13);
  214. len += 13;
  215. break;
  216. case KEY_BMS_2_CELL_VOL_1:
  217. if((can_bms_2_frame->head.rsp != FRAME_PT_NEED_RSP) || bms_2_self_stimeout.set)
  218. return 1;
  219. len = 2;
  220. buf[len++] = 0;
  221. buf[len++] = 0;
  222. bt = (uint8_t*)(&sub_bms_info_2.cell_vol);
  223. memcpy(&buf[len],&bt[13],12);
  224. len += 12;
  225. break;
  226. case KEY_BMS_2_CELL_VOL_2:
  227. if((can_bms_2_frame->head.rsp != FRAME_PT_NEED_RSP) || bms_2_self_stimeout.set)
  228. return 1;
  229. len = 2;
  230. buf[len++] = 0;
  231. buf[len++] = 0;
  232. bt = (uint8_t*)(&sub_bms_info_2.cell_vol);
  233. memcpy(&buf[len],&bt[25],6);
  234. len += 6;
  235. //
  236. memset(&buf[len],0x00,6);
  237. len += 6;
  238. break;
  239. case KEY_BMS_2_TEMP_OTHER:
  240. if((can_bms_2_frame->head.rsp != FRAME_PT_NEED_RSP) || bms_2_self_stimeout.set)
  241. return 1;
  242. len = 2;
  243. buf[len++] = 0;
  244. bt = (uint8_t*)(&sub_bms_info_2.temp_other);
  245. memcpy(&buf[len],bt,5);
  246. len += 5;
  247. break;
  248. case KEY_BMS_2_SELF_UP:
  249. return 0;
  250. default:
  251. return 0;
  252. }
  253. //
  254. can_bms_2_frame->head.rsp = FRAME_PT_RSP;
  255. can_bms_2_frame->head.dest = can_bms_2_frame->head.sour;
  256. can_bms_2_frame->head.sour = SELF_ID;
  257. can_bms_2_frame->head.index = 1;
  258. can_bms_2_frame->head.total = (len - 1)/8 + 1;
  259. can_bms_2_frame->head.pro =FRAME_PRO_D;
  260. //
  261. can_bms_2_frame->len = len;
  262. //
  263. if(!Send_Data_Can(can_bms_2_frame,BMS_2_RSP))
  264. {
  265. g_event |= BMS_2_RESEND_CMD_EVENT;
  266. return 0;
  267. }
  268. return 1;
  269. }
  270. void Bms_2_Self_Send_Timeout(void)
  271. {
  272. if(bms_2_self_stimeout.set)
  273. {
  274. ++bms_2_self_stimeout.count;
  275. if(bms_2_self_stimeout.count >= 300)
  276. {
  277. memset(&bms_2_self_stimeout,0x00,sizeof(bms_2_self_stimeout));
  278. g_event |= BMS_2_SELF_TIMEOUT_EVENT;
  279. }
  280. else if(bms_2_self_stimeout.count == 200)
  281. g_event |= BMS_2_SELF_TIMEOUT_EVENT;
  282. else if(bms_2_self_stimeout.count == 100)
  283. g_event |= BMS_2_SELF_TIMEOUT_EVENT;
  284. }
  285. else
  286. bms_2_self_stimeout.count = 0;
  287. }