app_bms_2.c 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  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. break;
  99. case KEY_BMS_2_READ_VER:
  100. break;
  101. case KEY_BMS_2_ALARM_TIMES:
  102. break;
  103. case KEY_BMS_2_ALARM_TIMES_1:
  104. break;
  105. case KEY_BMS_2_ALARM_TIMES_2:
  106. break;
  107. case KEY_BMS_2_CELL_VOL:
  108. break;
  109. case KEY_BMS_2_CELL_VOL_1:
  110. break;
  111. case KEY_BMS_2_CELL_VOL_2:
  112. break;
  113. case KEY_BMS_2_TEMP_OTHER:
  114. break;
  115. case KEY_BMS_2_SELF_UP:
  116. bms_2_self_stimeout.set = 0;
  117. return 0;
  118. default:
  119. return 0;
  120. }
  121. return 1;
  122. }
  123. int8_t Rsp_Can_Bms_2_CMD(CAN_FRAME*can_bms_2_frame)
  124. {
  125. uint16_t key,len;
  126. uint8_t *buf = can_bms_2_frame->data,*bt;
  127. uint16_t temp;
  128. memcpy(&key,can_bms_2_frame->data,sizeof(key));
  129. switch(key)
  130. {
  131. case KEY_BMS_2_COMMON:
  132. if((can_bms_2_frame->head.rsp != FRAME_PT_NEED_RSP) || bms_2_self_stimeout.set)
  133. return 1;
  134. len = 2;
  135. buf[len++] = 0;
  136. memcpy(&buf[len],&sub_bms_info_2.packet_common,sizeof(sub_bms_info_2.packet_common) - 1);
  137. if(sheng_yu_li_cheng.sy_yu_ji_ke_xing_shi_li_cheng)
  138. {
  139. if(sheng_yu_li_cheng.sy_percent_total == sub_bms_info_2.packet_common.m_percent)
  140. buf[3] = sheng_yu_li_cheng.sy_yu_ji_ke_xing_shi_li_cheng;
  141. else
  142. #if 0
  143. //bang zi ce shi start
  144. buf[3] = sheng_yu_li_cheng.sy_yu_ji_ke_xing_shi_li_cheng*sub_bms_info_2.packet_common.m_percent/50;
  145. //bang zi ce shi start
  146. #else
  147. {
  148. if(Is_Sub_BMS_2_Normal() == SHARK_BATT_EXIT_SUCCESS)
  149. {
  150. temp = (uint16_t)(sub_bms_info_2.packet_common.m_percent*sheng_yu_li_cheng.sy_ss_parm.neng_hao_bi*10/1000);
  151. if(temp%10 >= 5)
  152. buf[3] = temp/10 + 1;
  153. else
  154. buf[3] = temp/10;
  155. }
  156. else
  157. buf[3] = 0;
  158. }
  159. #endif
  160. }
  161. len += sizeof(sub_bms_info_2.packet_common) - 1;
  162. break;
  163. case KEY_BMS_2_READ_INFO:
  164. if((can_bms_2_frame->head.rsp != FRAME_PT_NEED_RSP) || bms_2_self_stimeout.set)
  165. return 1;
  166. len = 2;
  167. buf[len++] = 0;
  168. memcpy(&buf[len],sub_bms_info_2.bat_dev_info.sn,sizeof(sub_bms_info_2.bat_dev_info.sn));
  169. len += sizeof(sub_bms_info_2.bat_dev_info.sn);
  170. break;
  171. case KEY_BMS_2_READ_VER:
  172. if((can_bms_2_frame->head.rsp != FRAME_PT_NEED_RSP) || bms_2_self_stimeout.set)
  173. return 1;
  174. len = 2;
  175. buf[len++] = 0;
  176. memcpy(&buf[len],sub_bms_info_2.bat_dev_info.soft_ver,sizeof(sub_bms_info_2.bat_dev_info.soft_ver));
  177. len += sizeof(sub_bms_info_2.bat_dev_info.soft_ver);
  178. break;
  179. case KEY_BMS_2_ALARM_TIMES:
  180. if((can_bms_2_frame->head.rsp != FRAME_PT_NEED_RSP) || bms_2_self_stimeout.set)
  181. return 1;
  182. len = 2;
  183. buf[len++] = 0;
  184. //memcpy(&buf[len],&sub_bms_info_2.bat_times,sizeof(sub_bms_info_2.bat_times));
  185. //len += sizeof(sub_bms_info_2.bat_times);
  186. bt = (uint8_t*)(&sub_bms_info_2.bat_times);
  187. memcpy(&buf[len],bt,14);
  188. len += 14;
  189. break;
  190. case KEY_BMS_2_ALARM_TIMES_1:
  191. if((can_bms_2_frame->head.rsp != FRAME_PT_NEED_RSP) || bms_2_self_stimeout.set)
  192. return 1;
  193. len = 2;
  194. buf[len++] = 0;
  195. bt = (uint8_t*)(&sub_bms_info_2.bat_times);
  196. memcpy(&buf[len],&bt[14],16);
  197. len += 16;
  198. break;
  199. case KEY_BMS_2_ALARM_TIMES_2:
  200. if((can_bms_2_frame->head.rsp != FRAME_PT_NEED_RSP) || bms_2_self_stimeout.set)
  201. return 1;
  202. len = 2;
  203. buf[len++] = 0;
  204. bt = (uint8_t*)(&sub_bms_info_2.bat_times);
  205. memcpy(&buf[len],&bt[30],12);
  206. len += 12;
  207. break;
  208. case KEY_BMS_2_CELL_VOL:
  209. if((can_bms_2_frame->head.rsp != FRAME_PT_NEED_RSP) || bms_2_self_stimeout.set)
  210. return 1;
  211. len = 2;
  212. buf[len++] = 0;
  213. bt = (uint8_t*)(&sub_bms_info_2.cell_vol);
  214. memcpy(&buf[len],bt,13);
  215. len += 13;
  216. break;
  217. case KEY_BMS_2_CELL_VOL_1:
  218. if((can_bms_2_frame->head.rsp != FRAME_PT_NEED_RSP) || bms_2_self_stimeout.set)
  219. return 1;
  220. len = 2;
  221. buf[len++] = 0;
  222. buf[len++] = 0;
  223. bt = (uint8_t*)(&sub_bms_info_2.cell_vol);
  224. memcpy(&buf[len],&bt[13],12);
  225. len += 12;
  226. break;
  227. case KEY_BMS_2_CELL_VOL_2:
  228. if((can_bms_2_frame->head.rsp != FRAME_PT_NEED_RSP) || bms_2_self_stimeout.set)
  229. return 1;
  230. len = 2;
  231. buf[len++] = 0;
  232. buf[len++] = 0;
  233. bt = (uint8_t*)(&sub_bms_info_2.cell_vol);
  234. memcpy(&buf[len],&bt[25],6);
  235. len += 6;
  236. //
  237. memset(&buf[len],0x00,6);
  238. len += 6;
  239. break;
  240. case KEY_BMS_2_TEMP_OTHER:
  241. if((can_bms_2_frame->head.rsp != FRAME_PT_NEED_RSP) || bms_2_self_stimeout.set)
  242. return 1;
  243. len = 2;
  244. buf[len++] = 0;
  245. bt = (uint8_t*)(&sub_bms_info_2.temp_other);
  246. memcpy(&buf[len],bt,5);
  247. len += 5;
  248. break;
  249. case KEY_BMS_2_SELF_UP:
  250. return 0;
  251. default:
  252. return 0;
  253. }
  254. //
  255. can_bms_2_frame->head.rsp = FRAME_PT_RSP;
  256. can_bms_2_frame->head.dest = can_bms_2_frame->head.sour;
  257. can_bms_2_frame->head.sour = SELF_ID;
  258. can_bms_2_frame->head.index = 1;
  259. can_bms_2_frame->head.total = (len - 1)/8 + 1;
  260. can_bms_2_frame->head.pro =FRAME_PRO_D;
  261. //
  262. can_bms_2_frame->len = len;
  263. //
  264. if(!Send_Data_Can(can_bms_2_frame,BMS_2_RSP))
  265. {
  266. g_event |= BMS_2_RESEND_CMD_EVENT;
  267. return 0;
  268. }
  269. return 1;
  270. }
  271. void Bms_2_Self_Send_Timeout(void)
  272. {
  273. if(bms_2_self_stimeout.set)
  274. {
  275. ++bms_2_self_stimeout.count;
  276. if(bms_2_self_stimeout.count >= 300)
  277. {
  278. memset(&bms_2_self_stimeout,0x00,sizeof(bms_2_self_stimeout));
  279. g_event |= BMS_2_SELF_TIMEOUT_EVENT;
  280. }
  281. else if(bms_2_self_stimeout.count == 200)
  282. g_event |= BMS_2_SELF_TIMEOUT_EVENT;
  283. else if(bms_2_self_stimeout.count == 100)
  284. g_event |= BMS_2_SELF_TIMEOUT_EVENT;
  285. }
  286. else
  287. bms_2_self_stimeout.count = 0;
  288. }