app_bms_1.c 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  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_1.h"
  8. BMS_SELF_SEND_STATUS bms_1_self_ss;
  9. BMS_SELF_CUR_VOL_STATUS bms_1_cur_vol_ss;
  10. void Can_Bms_1_Cur_Vol_Self_Send_Check(CAN_FRAME*can_bms_1_frame)
  11. {
  12. uint16_t len;
  13. uint8_t *buf = can_bms_1_frame->data;
  14. do
  15. {
  16. if(bms_1_cur_vol_ss.m_cur != sub_bms_info_1.packet_common.m_current/RESOLUTION_DELTA_50M)
  17. break;
  18. if(bms_1_cur_vol_ss.m_vol != sub_bms_info_1.packet_common.m_total_vol/RESOLUTION_DELTA_50M)
  19. break;
  20. return;
  21. }while(0);
  22. bms_1_cur_vol_ss.m_cur = sub_bms_info_1.packet_common.m_current/RESOLUTION_DELTA_10M;
  23. bms_1_cur_vol_ss.m_vol = sub_bms_info_1.packet_common.m_total_vol/RESOLUTION_DELTA_10M;
  24. len = sizeof(bms_1_cur_vol_ss);
  25. //
  26. can_bms_1_frame->head.rsp = FRAME_PT_NO_RSP;
  27. can_bms_1_frame->head.dest = CTR_ID;
  28. can_bms_1_frame->head.sour = SELF_ID;
  29. can_bms_1_frame->head.index = 1;
  30. can_bms_1_frame->head.total = (len - 1)/8 + 1;
  31. can_bms_1_frame->head.pro =FRAME_PRO_D;
  32. //
  33. can_bms_1_frame->len = len;
  34. memcpy(buf,&bms_1_cur_vol_ss,len);
  35. //
  36. if(!Send_Data_Can(can_bms_1_frame,BMS_1_CUR_VOL_SELF))
  37. {
  38. //g_event |= BMS_1_RESEND_CMD_EVENT;
  39. //return;
  40. }
  41. //
  42. bms_1_cur_vol_ss.m_cur = sub_bms_info_1.packet_common.m_current/RESOLUTION_DELTA_50M;
  43. bms_1_cur_vol_ss.m_vol = sub_bms_info_1.packet_common.m_total_vol/RESOLUTION_DELTA_50M;
  44. }
  45. void Can_Bms_1_Self_Send_Check(CAN_FRAME*can_bms_1_frame)
  46. {
  47. uint16_t len;
  48. uint8_t *buf = can_bms_1_frame->data;
  49. if (bms_1_self_ss.m_percent != sub_bms_info_1.packet_common.m_percent
  50. || bms_1_self_ss.charge_flag != sub_bms_info_1.packet_common.charge_flag
  51. || bms_1_self_ss.work_status != sub_bms_info_1.packet_common.work_status) {
  52. shark_can_send_pending |= SHARK_SEND_PENDING_3181;
  53. shark_can_send_times = 0;
  54. }
  55. if ((shark_can_send_pending & SHARK_SEND_PENDING_3181) == 0) {
  56. return;
  57. }
  58. bms_1_self_ss.m_percent = sub_bms_info_1.packet_common.m_percent;
  59. bms_1_self_ss.charge_flag = sub_bms_info_1.packet_common.charge_flag;
  60. bms_1_self_ss.work_status = sub_bms_info_1.packet_common.work_status;
  61. len = sizeof(bms_1_self_ss);
  62. //
  63. can_bms_1_frame->head.rsp = FRAME_PT_NEED_RSP;
  64. can_bms_1_frame->head.dest = CTR_ID;
  65. can_bms_1_frame->head.sour = SELF_ID;
  66. can_bms_1_frame->head.index = 1;
  67. can_bms_1_frame->head.total = (len - 1)/8 + 1;
  68. can_bms_1_frame->head.pro =FRAME_PRO_D;
  69. //
  70. can_bms_1_frame->len = len;
  71. memcpy(buf,&bms_1_self_ss,len);
  72. //
  73. if(!Send_Data_Can(can_bms_1_frame,BMS_1_SELF))
  74. {
  75. //g_event |= BMS_1_RESEND_CMD_EVENT;
  76. //return;
  77. }
  78. }
  79. int8_t Handle_Can_Bms_1_CMD(CAN_FRAME*can_bms_1_frame)
  80. {
  81. uint16_t key;
  82. memcpy(&key,can_bms_1_frame->data,sizeof(key));
  83. switch(key)
  84. {
  85. case KEY_BMS_1_COMMON:
  86. break;
  87. case KEY_BMS_1_READ_INFO:
  88. case KEY_BMS_1_READ_VER:
  89. sub_bms_info_1.update_mask |= SHARK_BATT_INFO_VERTION;
  90. break;
  91. case KEY_BMS_1_ALARM_TIMES:
  92. case KEY_BMS_1_ALARM_TIMES_1:
  93. case KEY_BMS_1_ALARM_TIMES_2:
  94. sub_bms_info_1.update_mask |= SHARK_BATT_INFO_TIMES;
  95. break;
  96. case KEY_BMS_1_CELL_VOL:
  97. case KEY_BMS_1_CELL_VOL_1:
  98. case KEY_BMS_1_CELL_VOL_2:
  99. sub_bms_info_1.update_mask |= SHARK_BATT_INFO_CELL_VOL;
  100. break;
  101. case KEY_BMS_1_TEMP_OTHER:
  102. sub_bms_info_1.update_mask |= SHARK_BATT_INFO_TEMP;
  103. break;
  104. case KEY_BMS_1_SELF_UP:
  105. shark_can_send_pending &= ~SHARK_SEND_PENDING_3181;
  106. return 0;
  107. default:
  108. return 0;
  109. }
  110. return 1;
  111. }
  112. int8_t Rsp_Can_Bms_1_CMD(CAN_FRAME*can_bms_1_frame)
  113. {
  114. uint16_t key,len;
  115. uint8_t *buf = can_bms_1_frame->data,*bt;
  116. uint16_t temp;
  117. if (can_bms_1_frame->head.rsp != FRAME_PT_NEED_RSP) {
  118. return 1;
  119. }
  120. memcpy(&key,can_bms_1_frame->data,sizeof(key));
  121. switch(key)
  122. {
  123. case KEY_BMS_1_COMMON:
  124. len = 2;
  125. buf[len++] = 0;
  126. memcpy(&buf[len],&sub_bms_info_1.packet_common,sizeof(sub_bms_info_1.packet_common) - 1);
  127. if(sheng_yu_li_cheng.sy_yu_ji_ke_xing_shi_li_cheng)
  128. {
  129. if(sheng_yu_li_cheng.sy_percent_total == sub_bms_info_1.packet_common.m_percent)
  130. buf[3] = sheng_yu_li_cheng.sy_yu_ji_ke_xing_shi_li_cheng;
  131. else
  132. #if 0
  133. //bang zi ce shi start
  134. buf[3] = sheng_yu_li_cheng.sy_yu_ji_ke_xing_shi_li_cheng*sub_bms_info_1.packet_common.m_percent/50;
  135. //bang zi ce shi start
  136. #else
  137. {
  138. if(Is_Sub_BMS_1_Normal() == SHARK_BATT_EXIT_SUCCESS)
  139. {
  140. temp = (uint16_t)(sub_bms_info_1.packet_common.m_percent*sheng_yu_li_cheng.sy_ss_parm.neng_hao_bi*10/1000);
  141. if(temp%10 >= 5)
  142. buf[3] = temp/10 + 1;
  143. else
  144. buf[3] = temp/10;
  145. }
  146. else
  147. buf[3] = 0;
  148. }
  149. #endif
  150. }
  151. len += sizeof(sub_bms_info_1.packet_common) - 1;
  152. break;
  153. case KEY_BMS_1_READ_INFO:
  154. len = 2;
  155. buf[len++] = 0;
  156. memcpy(&buf[len],sub_bms_info_1.bat_dev_info.sn,sizeof(sub_bms_info_1.bat_dev_info.sn));
  157. len += sizeof(sub_bms_info_1.bat_dev_info.sn);
  158. break;
  159. case KEY_BMS_1_READ_VER:
  160. len = 2;
  161. buf[len++] = 0;
  162. memcpy(&buf[len],sub_bms_info_1.bat_dev_info.soft_ver,sizeof(sub_bms_info_1.bat_dev_info.soft_ver));
  163. len += sizeof(sub_bms_info_1.bat_dev_info.soft_ver);
  164. break;
  165. case KEY_BMS_1_ALARM_TIMES:
  166. len = 2;
  167. buf[len++] = 0;
  168. //memcpy(&buf[len],&sub_bms_info_1.bat_times,sizeof(sub_bms_info_1.bat_times));
  169. //len += sizeof(sub_bms_info_1.bat_times);
  170. bt = (uint8_t*)(&sub_bms_info_1.bat_times);
  171. memcpy(&buf[len],bt,14);
  172. len += 14;
  173. break;
  174. case KEY_BMS_1_ALARM_TIMES_1:
  175. len = 2;
  176. buf[len++] = 0;
  177. bt = (uint8_t*)(&sub_bms_info_1.bat_times);
  178. memcpy(&buf[len],&bt[14],16);
  179. len += 16;
  180. break;
  181. case KEY_BMS_1_ALARM_TIMES_2:
  182. len = 2;
  183. buf[len++] = 0;
  184. bt = (uint8_t*)(&sub_bms_info_1.bat_times);
  185. memcpy(&buf[len],&bt[30],12);
  186. len += 12;
  187. break;
  188. case KEY_BMS_1_CELL_VOL:
  189. len = 2;
  190. buf[len++] = 0;
  191. bt = (uint8_t*)(&sub_bms_info_1.cell_vol);
  192. memcpy(&buf[len],bt,13);
  193. len += 13;
  194. break;
  195. case KEY_BMS_1_CELL_VOL_1:
  196. len = 2;
  197. buf[len++] = 0;
  198. buf[len++] = 0;
  199. bt = (uint8_t*)(&sub_bms_info_1.cell_vol);
  200. memcpy(&buf[len],&bt[13],12);
  201. len += 12;
  202. break;
  203. case KEY_BMS_1_CELL_VOL_2:
  204. len = 2;
  205. buf[len++] = 0;
  206. buf[len++] = 0;
  207. bt = (uint8_t*)(&sub_bms_info_1.cell_vol);
  208. memcpy(&buf[len],&bt[25],6);
  209. len += 6;
  210. //
  211. memset(&buf[len],0x00,6);
  212. len += 6;
  213. break;
  214. case KEY_BMS_1_TEMP_OTHER:
  215. len = 2;
  216. buf[len++] = 0;
  217. bt = (uint8_t*)(&sub_bms_info_1.temp_other);
  218. memcpy(&buf[len],bt,5);
  219. len += 5;
  220. break;
  221. case KEY_BMS_1_SELF_UP:
  222. return 0;
  223. default:
  224. return 0;
  225. }
  226. //
  227. can_bms_1_frame->head.rsp = FRAME_PT_RSP;
  228. can_bms_1_frame->head.dest = can_bms_1_frame->head.sour;
  229. can_bms_1_frame->head.sour = SELF_ID;
  230. can_bms_1_frame->head.index = 1;
  231. can_bms_1_frame->head.total = (len - 1)/8 + 1;
  232. can_bms_1_frame->head.pro =FRAME_PRO_D;
  233. //
  234. can_bms_1_frame->len = len;
  235. //
  236. if(!Send_Data_Can(can_bms_1_frame,BMS_1_RSP))
  237. {
  238. g_event |= BMS_1_RESEND_CMD_EVENT;
  239. return 0;
  240. }
  241. return 1;
  242. }