VcuCanProtocolFunc.c 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747
  1. #include "VcuCanProtocolFunc.h"
  2. /**
  3. * @brief : VcuCan淇℃伅瑙g爜鍑芥暟
  4. * @param {UINT32} ID
  5. * @param {UINT8} *rawData
  6. * @return {*}
  7. */
  8. void VcuDecodeFunction(UINT32 ID, UINT8 *rawData)
  9. {
  10. switch (ID)
  11. {
  12. case 0x1802F3D0:
  13. Checksum = (UINT8)(((*(UINT8 *)(rawData + 0))) & 0xFF);
  14. VCU_Life = (UINT8)(((*(UINT8 *)(rawData + 1))) & 0xF);
  15. VCU_HvOnOff = (UINT8)(((*(UINT8 *)(rawData + 1)) >> 4) & 0x3);
  16. VCU_AuxOnOff = (UINT8)(((*(UINT8 *)(rawData + 1)) >> 6) & 0x3);
  17. VCU_VehicleSpeed = (UINT8)(((*(UINT8 *)(rawData + 2))) & 0xFF);
  18. VCU_HeatOnOff = (UINT8)(((*(UINT8 *)(rawData + 3))) & 0x3);
  19. VCU_MainPosRlySts = (UINT8)(((*(UINT8 *)(rawData + 3)) >> 2) & 0x3);
  20. VCU_MainNegRlySts = (UINT8)(((*(UINT8 *)(rawData + 3)) >> 4) & 0x3);
  21. VCU_PreChgRlySts = (UINT8)(((*(UINT8 *)(rawData + 3)) >> 6) & 0x3);
  22. VCU_AuxRlySts = (UINT8)(((*(UINT8 *)(rawData + 4))) & 0x3);
  23. VCU_MainMotRlySts = (UINT8)(((*(UINT8 *)(rawData + 4)) >> 2) & 0x3);
  24. VCU_MainMotRlyErrSts = (UINT8)(((*(UINT8 *)(rawData + 4)) >> 4) & 0x3);
  25. VCU_Assist1RlySts = (UINT8)(((*(UINT8 *)(rawData + 4)) >> 6) & 0x3);
  26. VCU_Assist1RlyErrSts = (UINT8)(((*(UINT8 *)(rawData + 5))) & 0x3);
  27. VCU_Assist2RlySts = (UINT8)(((*(UINT8 *)(rawData + 5)) >> 2) & 0x3);
  28. VCU_Assist2RlyErrSts = (UINT8)(((*(UINT8 *)(rawData + 5)) >> 4) & 0x3);
  29. VCU_Assist3RlySts = (UINT8)(((*(UINT8 *)(rawData + 5)) >> 6) & 0x3);
  30. VCU_Assist3RlyErrSts = (UINT8)(((*(UINT8 *)(rawData + 6))) & 0x3);
  31. VCU_Assist4RlySts = (UINT8)(((*(UINT8 *)(rawData + 6)) >> 2) & 0x3);
  32. VCU_Assist4RlyErrSts = (UINT8)(((*(UINT8 *)(rawData + 6)) >> 4) & 0x3);
  33. VcuRxFlag[0] = 0x01;
  34. break;
  35. case 0x18E1F3D0:
  36. if (*rawData >= 0x1 && *rawData <= 3)
  37. {
  38. for (UINT8 i = 0; i < 7; i++)
  39. {
  40. if ((UINT8)(i + ((*rawData) - 1) * 7) < (UINT8)sizeof(VCU_VIN))
  41. {
  42. VCU_VIN[i + ((*rawData) - 1) * 7] = *(rawData + i + 1) & 0xFF;
  43. }
  44. }
  45. EBC_VinMsgFlag = EBC_VinMsgFlag | (1 << (*rawData - 1));
  46. }
  47. VcuRxFlag[1] = 0x01;
  48. break;
  49. case 0x18FEDA17:
  50. VCU_TotalDistance = (UINT32)(((*(UINT32 *)(rawData + 0))) & 0xFFFFFFFF);
  51. VcuRxFlag[2] = 0x01;
  52. break;
  53. case 0x18FF15F6:
  54. DrvMotPosRySts = (UINT8)(((*(UINT8 *)(rawData + 0))) & 0x1);
  55. VcuRxFlag[3] = 0x01;
  56. break;
  57. case 0x18FF43A8:
  58. VehSts = (UINT8)(((*(UINT8 *)(rawData + 0))) & 0xF);
  59. VcuRxFlag[4] = 0x01;
  60. break;
  61. case 0x18FF44A8:
  62. BrakePedal = (UINT8)(((*(UINT8 *)(rawData + 4))) & 0xFF);
  63. VcuRxFlag[5] = 0x01;
  64. break;
  65. case 0x18FF4617:
  66. VehSpd = (UINT16)(((*(UINT16 *)(rawData + 0))) & 0xFFFF);
  67. HandbrakeSts = (UINT8)(((*(UINT8 *)(rawData + 2))) & 0x3);
  68. VcuRxFlag[6] = 0x01;
  69. break;
  70. case 0x18FF48A8:
  71. GearPos = (UINT8)(((*(UINT8 *)(rawData + 0)) >> 4) & 0xF);
  72. VcuRxFlag[7] = 0x01;
  73. break;
  74. default:
  75. break;
  76. }
  77. }
  78. /**
  79. * @brief : Vcu涓㈠抚淇℃伅璇婃柇
  80. * @param {*}
  81. * @return {*}
  82. */
  83. void VcuRxDiagnose(void)
  84. {
  85. static UINT16 TimeCounter = 0;//ms
  86. TimeCounter = TimeCounter + 10;
  87. /*
  88. Can涓㈠抚璇婃柇
  89. */
  90. for (UINT8 i = 0; i < sizeof(VcuInTable) / 4; i++)
  91. {
  92. if (VcuRxFlag[i] == 1) // received msg, and clear the error counter
  93. {
  94. VcuRxErrorCount[i] = 0;
  95. VcuRxFlag[i] = 0;
  96. continue;
  97. }
  98. if (VcuRxErrorCount[i] < 3)
  99. {
  100. VcuRxShortError[i] = 0;
  101. VcuRxLongError[i] = 0;
  102. }
  103. else if (VcuRxErrorCount[i] >= 3 && VcuRxErrorCount[i] < 13)
  104. {
  105. VcuRxShortError[i] = 1;
  106. VcuRxLongError[i] = 0;
  107. }
  108. else if (VcuRxErrorCount[i] >= 13)
  109. {
  110. VcuRxShortError[i] = 0;
  111. VcuRxLongError[i] = 1;
  112. VcuRxMsgSetInvalidValue(VcuInTable[i]);
  113. VcuRxErrorCount[i] = 0;
  114. }
  115. else if (VcuRxErrorCount[i] == 0xFF)
  116. {
  117. VcuRxErrorCount[i] = 0xFE;
  118. }
  119. }
  120. /*
  121. CAN涓㈠抚绱
  122. */
  123. if (TimeCounter % 100 == 0) // period <=100ms
  124. {
  125. VcuRxErrorCount[0]++; // can msg 0x1802F3D0
  126. // if(VcuRxErrorCount[0]>=13)
  127. VcuRxErrorCount[3]++; // can msg 0x18FF15F6
  128. // if(VcuRxErrorCount[3]>=13)
  129. VcuRxErrorCount[6]++; // can msg 0x18FF4617
  130. // if(VcuRxErrorCount[6]>=13)
  131. VcuRxErrorCount[7]++; // can msg 0x18FF48A8
  132. // if(VcuRxErrorCount[7]>=13)
  133. }
  134. if (TimeCounter % 200 == 0) // period ==200ms
  135. {
  136. }
  137. if (TimeCounter % 500 == 0) // period ==500ms
  138. {
  139. VcuRxErrorCount[2]++; // can msg 0x18FEDA17
  140. // if(VcuRxErrorCount[2]>=13)
  141. // printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[2]);
  142. VcuRxErrorCount[4]++; // can msg 0x18FF43A8
  143. // if(VcuRxErrorCount[4]>=13)
  144. // printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[4]);
  145. VcuRxErrorCount[5]++; // can msg 0x18FF44A8
  146. // if(VcuRxErrorCount[5]>=13)
  147. // printf("can msg 0x%x lost,cycle time500ms\n",COMInTable[5]);
  148. }
  149. if (TimeCounter % 1000 == 0) // period ==1000ms
  150. {
  151. VcuRxErrorCount[1]++; // can msg 0x18E1F3D0
  152. // if(VcuRxErrorCount[1]>=13)
  153. // printf("can msg 0x%x lost,cycle time1000ms\n",COMInTable[1]);
  154. }
  155. if (TimeCounter % 2000 == 0) // period ==2000ms
  156. {
  157. }
  158. if (TimeCounter % 3000 == 0) // period ==3000ms
  159. {
  160. }
  161. if (TimeCounter % 5000 == 0) // period ==5000ms
  162. {
  163. }
  164. }
  165. /**
  166. * @brief : VcuCan淇℃伅澶辨晥缃綅
  167. * @param {UINT32} ID
  168. * @return {*}
  169. */
  170. void VcuRxMsgSetInvalidValue(UINT32 ID)
  171. {
  172. switch (ID)
  173. {
  174. case 0x1802F3D0:
  175. Checksum = 0xFF;
  176. VCU_Life = 0xFF;
  177. VCU_HvOnOff = 0xFF;
  178. VCU_AuxOnOff = 0xFF;
  179. VCU_VehicleSpeed = 0xFF;
  180. VCU_HeatOnOff = 0xFF;
  181. VCU_MainPosRlySts = 0xFF;
  182. VCU_MainNegRlySts = 0xFF;
  183. VCU_PreChgRlySts = 0xFF;
  184. VCU_AuxRlySts = 0xFF;
  185. VCU_MainMotRlySts = 0xFF;
  186. VCU_MainMotRlyErrSts = 0xFF;
  187. VCU_Assist1RlySts = 0xFF;
  188. VCU_Assist1RlyErrSts = 0xFF;
  189. VCU_Assist2RlySts = 0xFF;
  190. VCU_Assist2RlyErrSts = 0xFF;
  191. VCU_Assist3RlySts = 0xFF;
  192. VCU_Assist3RlyErrSts = 0xFF;
  193. VCU_Assist4RlySts = 0xFF;
  194. VCU_Assist4RlyErrSts = 0xFF;
  195. break;
  196. case 0x18E1F3D0:
  197. break;
  198. case 0x18FEDA17:
  199. VCU_TotalDistance = 0xFFFFFFFF;
  200. break;
  201. case 0x18FF15F6:
  202. DrvMotPosRySts = 0xFF;
  203. break;
  204. case 0x18FF43A8:
  205. VehSts = 0xFF;
  206. break;
  207. case 0x18FF44A8:
  208. BrakePedal = 0xFF;
  209. break;
  210. case 0x18FF4617:
  211. VehSpd = 0xFFFF;
  212. HandbrakeSts = 0xFF;
  213. break;
  214. case 0x18FF48A8:
  215. GearPos = 0xFF;
  216. break;
  217. default:
  218. break;
  219. }
  220. }
  221. /*
  222. 缁勭爜鍑芥暟
  223. */
  224. void VcuEncodeFunction(UINT32 ID, UINT8 *rawData)
  225. {
  226. switch (ID)
  227. {
  228. case 0x1801D0F3:
  229. ReqVIN = BMS13_ReqVIN;
  230. ReqHVOff = BMS2_RqHVPoerOff;
  231. *(UINT8 *)(rawData + 0) = *(UINT8 *)(rawData + 0) | ((ReqVIN << 0) & 0xFF);
  232. *(UINT8 *)(rawData + 0) = *(UINT8 *)(rawData + 0) | ((ReqHVOff << 2) & 0xFF);
  233. break;
  234. case 0x1801D8F3:
  235. // BMS_SoftwareVersion = ;//瀹氫箟涓轰竴鑷�
  236. // BMS_HardwareVersion = ;
  237. *(UINT16 *)(rawData + 0) = *(UINT16 *)(rawData + 0) | ((BMS_SoftwareVersion << 0) & 0xFFFF);
  238. *(UINT16 *)(rawData + 2) = *(UINT16 *)(rawData + 2) | ((BMS_HardwareVersion << 0) & 0xFFFF);
  239. break;
  240. case 0x1880D0F3:
  241. ChgSysNum = 1; // 瀹氫箟涓�1涓�
  242. Fult2_MainPosRelayWeldErr = BMS12_Fult2_MainPosRelayWeldErr;
  243. Fult2_MainNegRelayWeldErr = BMS12_Fult2_MainNegRelayWeldErr;
  244. Fult2_DCChgPos1RelayWeldErr = BMS12_Fult2_DCChrgPos1RelayWeldErr;
  245. Fult2_DCChgNeg1RelayWeldErr = BMS12_Fult2_DCChrgNeg1RelayWeldErr;
  246. Fult2_DCChgPos2RelayWeldErr = BMS12_Fult2_DCChrgPos2RelayWeldErr;
  247. Fult2_DCChgNeg2RelayWeldErr = BMS12_Fult2_DCChrgNeg2RelayWeldErr;
  248. HeatPosRelayWeldErr = 0x00;
  249. HeatNegRelayWeldErr = 0x00;
  250. MainPosRelaySt = BMS1_MainPosRelaySt;
  251. MainNegRelaySt = BMS1_MainNegRelaySt;
  252. PreChgRelaySt = BMS1_PreChgRelaySt;
  253. DCChrgPos1RelaySt = BMS1_DCChrgPos1RelaySt;
  254. DCChrgNeg1RelaySt = BMS1_DCChrgNeg1RelaySt;
  255. DCChrgPos2RelaySt = BMS1_DCChrgPos2RelaySt;
  256. DCChrgNeg2RelaySt = BMS1_DCChrgNeg2RelaySt;
  257. AuxRelayWeldErr = 0x00;
  258. Fult2_BranchBreakErr = BMS12_Fult2_BranchBreakErr;
  259. Fult2_OverChrgCurrInTheDrive = BMS12_Fult2_OverChrgCurrInTheDrive;
  260. Fult2_MainPosRelayOpenErr = BMS12_Fult2_MainPosRelayOpenErr;
  261. Fult2_MainNegRelayOpenErr = BMS12_Fult2_MainNegRelayOpenErr;
  262. Fult2_DCChgPos1RelayOpenErr = BMS12_Fult2_DCChrgPos1RelayOpenErr;
  263. Fult2_DCChgPos2RelayOpenErr = BMS12_Fult2_DCChrgNeg1RelayOpenErr;
  264. Fult2_DCChgNeg1RelayOpenErr = BMS12_Fult2_DCChrgPos2RelayOpenErr;
  265. Fult2_DCChgNeg2RelayOpenErr = BMS12_Fult2_DCChrgNeg2RelayOpenErr;
  266. Fult2_HeatRelayWeldErr = BMS12_Fult2_HeatRelayWeldErr;
  267. Fult2_HeatRelayOpenErr = BMS12_Fult2_HeatRelayOpenErr;
  268. Fult2_TMSErr = BMS12_Fult2_TMSErr;
  269. Fult2_PowerSupplyErr = BMS12_Fult2_PowerSupplyErr;
  270. Fult2_PackSelfProtect = BMS12_Fult2_PackSelfProtect;
  271. Fult2_ChrgNTCTempOver = BMS12_Fult2_ChrgNTCTempOver;
  272. BattSysNum = BMS9_BattSysNum;
  273. BatSysFaultCode = BMS2_FaultCode; // TBD 鏄惁闇�瑕佸鍔燛BC鏁呴殰鐮�
  274. *(UINT8 *)(rawData + 0) = *(UINT8 *)(rawData + 0) | ((ChgSysNum << 0) & 0xFF);
  275. *(UINT8 *)(rawData + 0) = *(UINT8 *)(rawData + 0) | ((Fult2_MainPosRelayWeldErr << 4) & 0xFF);
  276. *(UINT8 *)(rawData + 0) = *(UINT8 *)(rawData + 0) | ((Fult2_MainNegRelayWeldErr << 5) & 0xFF);
  277. *(UINT8 *)(rawData + 0) = *(UINT8 *)(rawData + 0) | ((Fult2_DCChgPos1RelayWeldErr << 6) & 0xFF);
  278. *(UINT8 *)(rawData + 0) = *(UINT8 *)(rawData + 0) | ((Fult2_DCChgNeg1RelayWeldErr << 7) & 0xFF);
  279. *(UINT8 *)(rawData + 1) = *(UINT8 *)(rawData + 1) | ((Fult2_DCChgPos2RelayWeldErr << 0) & 0xFF);
  280. *(UINT8 *)(rawData + 1) = *(UINT8 *)(rawData + 1) | ((Fult2_DCChgNeg2RelayWeldErr << 1) & 0xFF);
  281. *(UINT8 *)(rawData + 1) = *(UINT8 *)(rawData + 1) | ((HeatPosRelayWeldErr << 2) & 0xFF);
  282. *(UINT8 *)(rawData + 1) = *(UINT8 *)(rawData + 1) | ((HeatNegRelayWeldErr << 3) & 0xFF);
  283. *(UINT8 *)(rawData + 1) = *(UINT8 *)(rawData + 1) | ((MainPosRelaySt << 4) & 0xFF);
  284. *(UINT8 *)(rawData + 1) = *(UINT8 *)(rawData + 1) | ((MainNegRelaySt << 6) & 0xFF);
  285. *(UINT8 *)(rawData + 2) = *(UINT8 *)(rawData + 2) | ((PreChgRelaySt << 0) & 0xFF);
  286. *(UINT8 *)(rawData + 2) = *(UINT8 *)(rawData + 2) | ((DCChrgPos1RelaySt << 2) & 0xFF);
  287. *(UINT8 *)(rawData + 2) = *(UINT8 *)(rawData + 2) | ((DCChrgNeg1RelaySt << 4) & 0xFF);
  288. *(UINT8 *)(rawData + 2) = *(UINT8 *)(rawData + 2) | ((DCChrgPos2RelaySt << 6) & 0xFF);
  289. *(UINT8 *)(rawData + 3) = *(UINT8 *)(rawData + 3) | ((DCChrgNeg2RelaySt << 0) & 0xFF);
  290. *(UINT8 *)(rawData + 3) = *(UINT8 *)(rawData + 3) | ((AuxRelayWeldErr << 2) & 0xFF);
  291. *(UINT8 *)(rawData + 3) = *(UINT8 *)(rawData + 3) | ((Fult2_BranchBreakErr << 3) & 0xFF);
  292. *(UINT8 *)(rawData + 3) = *(UINT8 *)(rawData + 3) | ((Fult2_OverChrgCurrInTheDrive << 4) & 0xFF);
  293. *(UINT8 *)(rawData + 3) = *(UINT8 *)(rawData + 3) | ((Fult2_MainPosRelayOpenErr << 6) & 0xFF);
  294. *(UINT8 *)(rawData + 3) = *(UINT8 *)(rawData + 3) | ((Fult2_MainNegRelayOpenErr << 7) & 0xFF);
  295. *(UINT8 *)(rawData + 4) = *(UINT8 *)(rawData + 4) | ((Fult2_DCChgPos1RelayOpenErr << 0) & 0xFF);
  296. *(UINT8 *)(rawData + 4) = *(UINT8 *)(rawData + 4) | ((Fult2_DCChgPos2RelayOpenErr << 1) & 0xFF);
  297. *(UINT8 *)(rawData + 4) = *(UINT8 *)(rawData + 4) | ((Fult2_DCChgNeg1RelayOpenErr << 2) & 0xFF);
  298. *(UINT8 *)(rawData + 4) = *(UINT8 *)(rawData + 4) | ((Fult2_DCChgNeg2RelayOpenErr << 3) & 0xFF);
  299. *(UINT8 *)(rawData + 4) = *(UINT8 *)(rawData + 4) | ((Fult2_HeatRelayWeldErr << 4) & 0xFF);
  300. *(UINT8 *)(rawData + 4) = *(UINT8 *)(rawData + 4) | ((Fult2_HeatRelayOpenErr << 5) & 0xFF);
  301. *(UINT8 *)(rawData + 4) = *(UINT8 *)(rawData + 4) | ((Fult2_TMSErr << 6) & 0xFF);
  302. *(UINT8 *)(rawData + 4) = *(UINT8 *)(rawData + 4) | ((Fult2_PowerSupplyErr << 7) & 0xFF);
  303. *(UINT8 *)(rawData + 5) = *(UINT8 *)(rawData + 5) | ((Fult2_PackSelfProtect << 0) & 0xFF);
  304. *(UINT8 *)(rawData + 5) = *(UINT8 *)(rawData + 5) | ((Fult2_ChrgNTCTempOver << 1) & 0xFF);
  305. *(UINT8 *)(rawData + 6) = *(UINT8 *)(rawData + 6) | ((BattSysNum << 0) & 0xFF);
  306. *(UINT8 *)(rawData + 7) = *(UINT8 *)(rawData + 7) | ((BatSysFaultCode << 0) & 0xFF);
  307. break;
  308. case 0x1881D0F3:
  309. ST1_Life = ST1_Life + 1;
  310. if (ST1_Life >= 15)
  311. {
  312. ST1_Life = 0;
  313. }
  314. if (BMS1_SysSts == 2)
  315. {
  316. BMS_SysSts = 1; //楂樺帇涓婄數
  317. }
  318. else
  319. {
  320. BMS_SysSts = 2; //楂樺帇涓嬬數
  321. }
  322. AssisRelaySts = 0x00; // bms涓嶅彂锛屽浐瀹氫负0
  323. BlanceSts = BMS1_BalanceStatus;
  324. if (BMS1_DCChrgConnectSt == 1 || BMS1_DCChrgConnectSt == 2)
  325. {
  326. DCChrgConnectSt = 1;
  327. }
  328. else
  329. {
  330. DCChrgConnectSt = 0;
  331. }
  332. ChrgMode = BMS1_ChrgMode;
  333. ChrgStatus = BMS1_ChrgStatus;
  334. FaultLevel = BMS2_FaultLevel;
  335. Fult1_DelTemp = BMS11_Fult1_DelTemp;
  336. Fult1_OverTemp = BMS11_Fult1_OverTemp;
  337. Fult1_PackOverHVolt = BMS11_Fult1_PackOverHVolt;
  338. Fult1_PackLowHVolt = BMS11_Fult1_PackLowHVolt;
  339. Fult1_LowSOC = BMS11_Fult1_LowSOC;
  340. Fult1_OverUcell = BMS11_Fult1_OverUcell;
  341. Fult1_LowUcell = BMS11_Fult1_LowUcell;
  342. Fult1_LowInsRes = BMS11_Fult1_LowInsRes;
  343. Fult1_UcellUniformity = BMS11_Fult1_UcellUniformity;
  344. Fult2_CellLowTemp = BMS12_Fult2_CellLowTemp;
  345. Fult2_OverDischrgCurr = BMS12_Fult2_OverDischrgCurr;
  346. Fult2_OverChrgCurrInTheChrg = BMS12_Fult2_OverChrgCurrInTheChrg;
  347. Fult_BranchVolUniformity = 0; // BMS涓嶅彂锛屽畾涔夋棤鏁呴殰
  348. Fult_BMSHardware = 0; // BMS涓嶅彂锛屽畾涔変负鏃犳晠闅�
  349. Fult1_OverSOC = BMS11_Fult1_OverSOC;
  350. Fult1_SOCChangeFast = BMS11_Fult1_SOCChangeFast;
  351. Fult2_InnerCommunicationErr = BMS12_Fult2_InnerCommunicationErr;
  352. Fult1_BatSysNotMatch = BMS11_Fult1_BatSysNotMatch;
  353. Fult1_HVILFault = BMS11_Fult1_HVILFault;
  354. Fult2_FireDetectorEr = BMS12_Fult2_FireDetectorEr;
  355. Fult2_PackFireWarning = BMS12_Fult2_PackFireWarning;
  356. Fult2_FaultNum = BMS12_Fult2_FaultNum;
  357. *(UINT8 *)(rawData + 1) = *(UINT8 *)(rawData + 1) | ((ST1_Life << 0) & 0xFF);
  358. *(UINT8 *)(rawData + 1) = *(UINT8 *)(rawData + 1) | ((BMS_SysSts << 4) & 0xFF);
  359. *(UINT8 *)(rawData + 1) = *(UINT8 *)(rawData + 1) | ((AssisRelaySts << 6) & 0xFF);
  360. *(UINT8 *)(rawData + 1) = *(UINT8 *)(rawData + 1) | ((BlanceSts << 7) & 0xFF);
  361. *(UINT8 *)(rawData + 2) = *(UINT8 *)(rawData + 2) | ((DCChrgConnectSt << 0) & 0xFF);
  362. *(UINT8 *)(rawData + 2) = *(UINT8 *)(rawData + 2) | ((ChrgMode << 1) & 0xFF);
  363. *(UINT8 *)(rawData + 2) = *(UINT8 *)(rawData + 2) | ((ChrgStatus << 3) & 0xFF);
  364. *(UINT8 *)(rawData + 2) = *(UINT8 *)(rawData + 2) | ((FaultLevel << 5) & 0xFF);
  365. *(UINT8 *)(rawData + 3) = *(UINT8 *)(rawData + 3) | ((Fult1_DelTemp << 0) & 0xFF);
  366. *(UINT8 *)(rawData + 3) = *(UINT8 *)(rawData + 3) | ((Fult1_OverTemp << 2) & 0xFF);
  367. *(UINT8 *)(rawData + 3) = *(UINT8 *)(rawData + 3) | ((Fult1_PackOverHVolt << 4) & 0xFF);
  368. *(UINT8 *)(rawData + 3) = *(UINT8 *)(rawData + 3) | ((Fult1_PackLowHVolt << 6) & 0xFF);
  369. *(UINT8 *)(rawData + 4) = *(UINT8 *)(rawData + 4) | ((Fult1_LowSOC << 0) & 0xFF);
  370. *(UINT8 *)(rawData + 4) = *(UINT8 *)(rawData + 4) | ((Fult1_OverUcell << 2) & 0xFF);
  371. *(UINT8 *)(rawData + 4) = *(UINT8 *)(rawData + 4) | ((Fult1_LowUcell << 4) & 0xFF);
  372. *(UINT8 *)(rawData + 4) = *(UINT8 *)(rawData + 4) | ((Fult1_LowInsRes << 6) & 0xFF);
  373. *(UINT8 *)(rawData + 5) = *(UINT8 *)(rawData + 5) | ((Fult1_UcellUniformity << 0) & 0xFF);
  374. *(UINT8 *)(rawData + 5) = *(UINT8 *)(rawData + 5) | ((Fult2_CellLowTemp << 2) & 0xFF);
  375. *(UINT8 *)(rawData + 5) = *(UINT8 *)(rawData + 5) | ((Fult2_OverDischrgCurr << 4) & 0xFF);
  376. *(UINT8 *)(rawData + 5) = *(UINT8 *)(rawData + 5) | ((Fult2_OverChrgCurrInTheChrg << 6) & 0xFF);
  377. *(UINT8 *)(rawData + 6) = *(UINT8 *)(rawData + 6) | ((Fult_BranchVolUniformity << 0) & 0xFF);
  378. *(UINT8 *)(rawData + 6) = *(UINT8 *)(rawData + 6) | ((Fult_BMSHardware << 2) & 0xFF);
  379. *(UINT8 *)(rawData + 6) = *(UINT8 *)(rawData + 6) | ((Fult1_OverSOC << 4) & 0xFF);
  380. *(UINT8 *)(rawData + 6) = *(UINT8 *)(rawData + 6) | ((Fult1_SOCChangeFast << 5) & 0xFF);
  381. *(UINT8 *)(rawData + 6) = *(UINT8 *)(rawData + 6) | ((Fult2_InnerCommunicationErr << 6) & 0xFF);
  382. *(UINT8 *)(rawData + 6) = *(UINT8 *)(rawData + 6) | ((Fult1_BatSysNotMatch << 7) & 0xFF);
  383. *(UINT8 *)(rawData + 7) = *(UINT8 *)(rawData + 7) | ((Fult1_HVILFault << 0) & 0xFF);
  384. *(UINT8 *)(rawData + 7) = *(UINT8 *)(rawData + 7) | ((Fult2_FireDetectorEr << 1) & 0xFF);
  385. *(UINT8 *)(rawData + 7) = *(UINT8 *)(rawData + 7) | ((Fult2_PackFireWarning << 2) & 0xFF);
  386. *(UINT8 *)(rawData + 7) = *(UINT8 *)(rawData + 7) | ((Fult2_FaultNum << 3) & 0xFF);
  387. ST1_CheckSum = 0x00;
  388. for (UINT8 i = 1; i < 8; i++)
  389. {
  390. ST1_CheckSum = ST1_CheckSum ^ (*(UINT8 *)(rawData + i));
  391. }
  392. *(UINT8 *)(rawData + 0) = *(UINT8 *)(rawData + 0) | ((ST1_CheckSum << 0) & 0xFF);
  393. break;
  394. case 0x1882D0F3:
  395. SOC = BMS2_SOC;
  396. SOH = BMS2_SOH;
  397. PackCurrent = BMS2_PackCurrent;
  398. InstChrgCurMaxAllw = BMS5_InstChrgCurMaxAllw;
  399. InstDischrgCurMaxAllw = BMS5_InstDischrgCurMaxAllw;
  400. *(UINT8 *)(rawData + 0) = *(UINT8 *)(rawData + 0) | ((SOC << 0) & 0xFF);
  401. *(UINT8 *)(rawData + 1) = *(UINT8 *)(rawData + 1) | ((SOH << 0) & 0xFF);
  402. *(UINT16 *)(rawData + 2) = *(UINT16 *)(rawData + 2) | ((PackCurrent << 0) & 0xFFFF);
  403. *(UINT16 *)(rawData + 4) = *(UINT16 *)(rawData + 4) | ((InstChrgCurMaxAllw << 0) & 0xFFFF);
  404. *(UINT16 *)(rawData + 6) = *(UINT16 *)(rawData + 6) | ((InstDischrgCurMaxAllw << 0) & 0xFFFF);
  405. break;
  406. case 0x1883D0F3:
  407. PosIsolation = BMS4_PosIsolation;
  408. NegIsolation = BMS4_NegIsolation;
  409. PackInsideVolt = BMS2_PackInsideVolt;
  410. PackOutsideVolt = 0xFFFF;
  411. *(UINT16 *)(rawData + 0) = *(UINT16 *)(rawData + 0) | ((PosIsolation << 0) & 0xFFFF);
  412. *(UINT16 *)(rawData + 2) = *(UINT16 *)(rawData + 2) | ((NegIsolation << 0) & 0xFFFF);
  413. *(UINT16 *)(rawData + 4) = *(UINT16 *)(rawData + 4) | ((PackInsideVolt << 0) & 0xFFFF);
  414. *(UINT16 *)(rawData + 6) = *(UINT16 *)(rawData + 6) | ((PackOutsideVolt << 0) & 0xFFFF);
  415. break;
  416. case 0x1884D0F3:
  417. Max_Temp = (UINT8)(BMS8_Max_Temp + 10);
  418. Min_Temp = (UINT8)(BMS8_Min_Temp + 10);
  419. Avg_Temp = (UINT8)(BMS8_Avg_Temp + 10);
  420. MaxTempSysNr = BMS8_MaxTempSysNr;
  421. MaxTempNr = BMS8_MaxTempNr;
  422. MinTempSysNr = BMS8_MinTempSysNr;
  423. MinTempNr = BMS8_MinTempNr;
  424. *(UINT8 *)(rawData + 0) = *(UINT8 *)(rawData + 0) | ((Max_Temp << 0) & 0xFF);
  425. *(UINT8 *)(rawData + 1) = *(UINT8 *)(rawData + 1) | ((Min_Temp << 0) & 0xFF);
  426. *(UINT8 *)(rawData + 2) = *(UINT8 *)(rawData + 2) | ((Avg_Temp << 0) & 0xFF);
  427. *(UINT8 *)(rawData + 3) = *(UINT8 *)(rawData + 3) | ((MaxTempSysNr << 0) & 0xFF);
  428. *(UINT8 *)(rawData + 4) = *(UINT8 *)(rawData + 4) | ((MaxTempNr << 0) & 0xFF);
  429. *(UINT8 *)(rawData + 5) = *(UINT8 *)(rawData + 5) | ((MinTempSysNr << 0) & 0xFF);
  430. *(UINT8 *)(rawData + 6) = *(UINT8 *)(rawData + 6) | ((MinTempNr << 0) & 0xFF);
  431. break;
  432. case 0x1885D0F3:
  433. Max_Ucell = BMS6_Max_Ucell;
  434. MaxUcellSysNr = BMS7_MaxUcellSysNr;
  435. MaxUcellNr = BMS7_MaxUcellNr;
  436. Avg_Ucell = BMS6_Avg_Ucell;
  437. *(UINT16 *)(rawData + 0) = *(UINT16 *)(rawData + 0) | ((Max_Ucell << 0) & 0xFFFF);
  438. *(UINT8 *)(rawData + 2) = *(UINT8 *)(rawData + 2) | ((MaxUcellSysNr << 0) & 0xFF);
  439. *(UINT8 *)(rawData + 3) = *(UINT8 *)(rawData + 3) | ((MaxUcellNr << 0) & 0xFF);
  440. *(UINT16 *)(rawData + 4) = *(UINT16 *)(rawData + 4) | ((Avg_Ucell << 0) & 0xFFFF);
  441. break;
  442. case 0x1886D0F3:
  443. Min_Ucell = BMS6_Min_Ucell;
  444. MinUcellSysNr = BMS7_MinUcellSysNr;
  445. MinUcellNr = BMS7_MinUcellNr;
  446. if (BMS5_ChrgCurMaxAllw < 10000)
  447. {
  448. ChrgCurMaxAllw = 10000 - BMS5_ChrgCurMaxAllw;
  449. }
  450. else
  451. {
  452. ChrgCurMaxAllw = 0;
  453. }
  454. *(UINT16 *)(rawData + 0) = *(UINT16 *)(rawData + 0) | ((Min_Ucell << 0) & 0xFFFF);
  455. *(UINT8 *)(rawData + 2) = *(UINT8 *)(rawData + 2) | ((MinUcellSysNr << 0) & 0xFF);
  456. *(UINT8 *)(rawData + 3) = *(UINT8 *)(rawData + 3) | ((MinUcellNr << 0) & 0xFF);
  457. *(UINT16 *)(rawData + 4) = *(UINT16 *)(rawData + 4) | ((ChrgCurMaxAllw << 0) & 0xFFFF);
  458. break;
  459. case 0x1887D0F3:
  460. Gun1DCNegTemp = BMS23_Gun1DCNegTemp;
  461. Gun1DCPosTemp = BMS23_Gun1DCPosTemp;
  462. Gun2DCNegTemp = BMS23_Gun2DCNegTemp;
  463. Gun2DCPosTemp = BMS23_Gun2DCPosTemp;
  464. if (BMS1_HeatPosRelaySt == 1)
  465. {
  466. HeatPosRelaySt = 0;
  467. }
  468. else if (BMS1_HeatPosRelaySt == 2)
  469. {
  470. HeatPosRelaySt = 1;
  471. }
  472. if (BMS1_HeatNegRelaySt == 1)
  473. {
  474. HeatNegRelaySt = 0;
  475. }
  476. else if (BMS1_HeatNegRelaySt == 2)
  477. {
  478. HeatNegRelaySt = 1;
  479. }
  480. *(UINT8 *)(rawData + 0) = *(UINT8 *)(rawData + 0) | ((Gun1DCNegTemp << 0) & 0xFF);
  481. *(UINT8 *)(rawData + 1) = *(UINT8 *)(rawData + 1) | ((Gun1DCPosTemp << 0) & 0xFF);
  482. *(UINT8 *)(rawData + 2) = *(UINT8 *)(rawData + 2) | ((Gun2DCNegTemp << 0) & 0xFF);
  483. *(UINT8 *)(rawData + 3) = *(UINT8 *)(rawData + 3) | ((Gun2DCPosTemp << 0) & 0xFF);
  484. *(UINT8 *)(rawData + 4) = *(UINT8 *)(rawData + 4) | ((HeatPosRelaySt << 0) & 0xFF);
  485. *(UINT8 *)(rawData + 4) = *(UINT8 *)(rawData + 4) | ((HeatNegRelaySt << 2) & 0xFF);
  486. break;
  487. case 0x18C1D0F3:
  488. {
  489. UINT16 BMS_Cell_Volt_Buffer[3] = {0x00};
  490. UcellCSCNum = 0x01; // 瀹氫箟涓�1
  491. UcellFrameNum = UcellFrameNum + 1;
  492. for (UINT8 i = 0; i < 3; i++)
  493. {
  494. if (((UcellFrameNum - 1) * 3 + i) < sizeof(BMS_Cell_Volt) / 2)
  495. {
  496. BMS_Cell_Volt_Buffer[i] = BMS_Cell_Volt[(UcellFrameNum - 1) * 3 + i];
  497. }
  498. else
  499. {
  500. UcellFrameNum = 0;
  501. break;
  502. }
  503. }
  504. *(UINT8 *)(rawData + 0) = *(UINT8 *)(rawData + 0) | ((UcellFrameNum << 0) & 0xFF);
  505. *(UINT8 *)(rawData + 1) = *(UINT8 *)(rawData + 1) | ((UcellCSCNum << 0) & 0xFF);
  506. *(UINT16 *)(rawData + 2) = *(UINT16 *)(rawData + 2) | ((BMS_Cell_Volt_Buffer[0] << 0) & 0xFFFF);
  507. *(UINT16 *)(rawData + 4) = *(UINT16 *)(rawData + 4) | ((BMS_Cell_Volt_Buffer[1] << 0) & 0xFFFF);
  508. *(UINT16 *)(rawData + 6) = *(UINT16 *)(rawData + 6) | ((BMS_Cell_Volt_Buffer[2] << 0) & 0xFFFF);
  509. break;
  510. }
  511. case 0x18C2D0F3:
  512. {
  513. UINT8 BMS_Cell_TempN_Buffer[6] = {0x00};
  514. TempCSCNum = 0x01; // 瀹氫箟涓�1
  515. TempFrameNum = TempFrameNum + 1;
  516. for (UINT8 i = 0; i < 6; i++)
  517. {
  518. if (((TempFrameNum - 1) * 6 + i) < sizeof(BMS_Cell_TempN))
  519. {
  520. BMS_Cell_TempN_Buffer[i] = BMS_Cell_TempN[(TempFrameNum - 1) * 3 + i] + 10;
  521. }
  522. else
  523. {
  524. TempFrameNum = 0;
  525. break;
  526. }
  527. }
  528. *(UINT8 *)(rawData + 0) = *(UINT8 *)(rawData + 0) | ((TempFrameNum << 0) & 0xFF);
  529. *(UINT8 *)(rawData + 1) = *(UINT8 *)(rawData + 1) | ((TempCSCNum << 0) & 0xFF);
  530. *(UINT8 *)(rawData + 2) = *(UINT8 *)(rawData + 2) | ((BMS_Cell_TempN_Buffer[0] << 0) & 0xFF);
  531. *(UINT8 *)(rawData + 3) = *(UINT8 *)(rawData + 3) | ((BMS_Cell_TempN_Buffer[1] << 0) & 0xFF);
  532. *(UINT8 *)(rawData + 4) = *(UINT8 *)(rawData + 4) | ((BMS_Cell_TempN_Buffer[2] << 0) & 0xFF);
  533. *(UINT8 *)(rawData + 5) = *(UINT8 *)(rawData + 5) | ((BMS_Cell_TempN_Buffer[3] << 0) & 0xFF);
  534. *(UINT8 *)(rawData + 6) = *(UINT8 *)(rawData + 6) | ((BMS_Cell_TempN_Buffer[4] << 0) & 0xFF);
  535. *(UINT8 *)(rawData + 7) = *(UINT8 *)(rawData + 7) | ((BMS_Cell_TempN_Buffer[5] << 0) & 0xFF);
  536. break;
  537. }
  538. case 0x18E1D0F3:
  539. {
  540. UINT8 Sys_chk = 0;
  541. *(UINT8 *)(rawData + 1) = *(UINT8 *)(rawData + 1) | ((0x01 << 0) & 0xFF);
  542. *(UINT8 *)(rawData + 2) = *(UINT8 *)(rawData + 2) | ((BMS_SN_SysCode[0] << 0) & 0xFF);
  543. *(UINT8 *)(rawData + 3) = *(UINT8 *)(rawData + 3) | ((BMS_SN_SysCode[1] << 0) & 0xFF);
  544. *(UINT8 *)(rawData + 4) = *(UINT8 *)(rawData + 4) | ((BMS_SN_SysCode[2] << 0) & 0xFF);
  545. *(UINT8 *)(rawData + 5) = *(UINT8 *)(rawData + 5) | ((BMS_SN_SysCode[3] << 0) & 0xFF);
  546. *(UINT8 *)(rawData + 6) = *(UINT8 *)(rawData + 6) | ((BMS_SN_SysCode[4] << 0) & 0xFF);
  547. *(UINT8 *)(rawData + 7) = *(UINT8 *)(rawData + 7) | ((BMS_SN_SysCode[5] << 0) & 0xFF);
  548. for (UINT8 i = 0; i < 7; i++)
  549. {
  550. Sys_chk = Sys_chk ^ (*(UINT8 *)(rawData + 1 + i));
  551. }
  552. *(UINT8 *)(rawData + 0) = *(UINT8 *)(rawData + 0) | ((Sys_chk << 0) & 0xFF);
  553. break;
  554. }
  555. case 0x18E2D0F3:
  556. {
  557. UINT8 Sys_chk = 0;
  558. *(UINT8 *)(rawData + 1) = *(UINT8 *)(rawData + 1) | ((BMS_SN_SysCode[6] << 0) & 0xFF);
  559. *(UINT8 *)(rawData + 2) = *(UINT8 *)(rawData + 2) | ((BMS_SN_SysCode[7] << 0) & 0xFF);
  560. *(UINT8 *)(rawData + 3) = *(UINT8 *)(rawData + 3) | ((BMS_SN_SysCode[8] << 0) & 0xFF);
  561. *(UINT8 *)(rawData + 4) = *(UINT8 *)(rawData + 4) | ((BMS_SN_SysCode[9] << 0) & 0xFF);
  562. *(UINT8 *)(rawData + 5) = *(UINT8 *)(rawData + 5) | ((BMS_SN_SysCode[10] << 0) & 0xFF);
  563. *(UINT8 *)(rawData + 6) = *(UINT8 *)(rawData + 6) | ((BMS_SN_SysCode[11] << 0) & 0xFF);
  564. *(UINT8 *)(rawData + 7) = *(UINT8 *)(rawData + 7) | ((BMS_SN_SysCode[12] << 0) & 0xFF);
  565. for (UINT8 i = 0; i < 7; i++)
  566. {
  567. Sys_chk = Sys_chk ^ (*(UINT8 *)(rawData + 1 + i));
  568. }
  569. *(UINT8 *)(rawData + 0) = *(UINT8 *)(rawData + 0) | ((Sys_chk << 0) & 0xFF);
  570. break;
  571. }
  572. case 0x18E3D0F3:
  573. {
  574. UINT8 Sys_chk = 0;
  575. *(UINT8 *)(rawData + 1) = *(UINT8 *)(rawData + 1) | ((BMS_SN_SysCode[13] << 0) & 0xFF);
  576. *(UINT8 *)(rawData + 2) = *(UINT8 *)(rawData + 2) | ((BMS_SN_SysCode[14] << 0) & 0xFF);
  577. *(UINT8 *)(rawData + 3) = *(UINT8 *)(rawData + 3) | ((BMS_SN_SysCode[15] << 0) & 0xFF);
  578. *(UINT8 *)(rawData + 4) = *(UINT8 *)(rawData + 4) | ((BMS_SN_SysCode[16] << 0) & 0xFF);
  579. *(UINT8 *)(rawData + 5) = *(UINT8 *)(rawData + 5) | ((BMS_SN_SysCode[17] << 0) & 0xFF);
  580. *(UINT8 *)(rawData + 6) = *(UINT8 *)(rawData + 6) | ((BMS_SN_SysCode[18] << 0) & 0xFF);
  581. *(UINT8 *)(rawData + 7) = *(UINT8 *)(rawData + 7) | ((BMS_SN_SysCode[19] << 0) & 0xFF);
  582. for (UINT8 i = 0; i < 7; i++)
  583. {
  584. Sys_chk = Sys_chk ^ (*(UINT8 *)(rawData + 1 + i));
  585. }
  586. *(UINT8 *)(rawData + 0) = *(UINT8 *)(rawData + 0) | ((Sys_chk << 0) & 0xFF);
  587. break;
  588. }
  589. case 0x18E4D0F3:
  590. {
  591. UINT8 Sys_chk = 0;
  592. *(UINT8 *)(rawData + 1) = *(UINT8 *)(rawData + 1) | ((BMS_SN_SysCode[20] << 0) & 0xFF);
  593. *(UINT8 *)(rawData + 2) = *(UINT8 *)(rawData + 2) | ((BMS_SN_SysCode[21] << 0) & 0xFF);
  594. *(UINT8 *)(rawData + 3) = *(UINT8 *)(rawData + 3) | ((BMS_SN_SysCode[22] << 0) & 0xFF);
  595. *(UINT8 *)(rawData + 4) = *(UINT8 *)(rawData + 4) | ((BMS_SN_SysCode[23] << 0) & 0xFF);
  596. *(UINT8 *)(rawData + 5) = *(UINT8 *)(rawData + 5) | ((0xFF << 0) & 0xFF);
  597. *(UINT8 *)(rawData + 6) = *(UINT8 *)(rawData + 6) | ((0XFF << 0) & 0xFF);
  598. *(UINT8 *)(rawData + 7) = *(UINT8 *)(rawData + 7) | ((0xFF << 0) & 0xFF);
  599. for (UINT8 i = 0; i < 7; i++)
  600. {
  601. Sys_chk = Sys_chk ^ (*(UINT8 *)(rawData + 1 + i));
  602. }
  603. *(UINT8 *)(rawData + 0) = *(UINT8 *)(rawData + 0) | ((Sys_chk << 0) & 0xFF);
  604. break;
  605. }
  606. case 0x18E5D0F3:
  607. Pack_RateCap = BMS21_RateCap / 10;
  608. Pack_RateHVolt = BMS21_RateHVolt;
  609. Pack_RatePower = BMS21_RatePower;
  610. BattType = BMS21_BattType;
  611. CoolType = BMS21_CoolType;
  612. *(UINT16 *)(rawData + 0) = *(UINT16 *)(rawData + 0) | ((Pack_RateCap << 0) & 0xFFFF);
  613. *(UINT16 *)(rawData + 2) = *(UINT16 *)(rawData + 2) | ((Pack_RateHVolt << 0) & 0xFFFF);
  614. *(UINT16 *)(rawData + 4) = *(UINT16 *)(rawData + 4) | ((Pack_RatePower << 0) & 0xFFFF);
  615. *(UINT8 *)(rawData + 6) = *(UINT8 *)(rawData + 6) | ((BattType << 0) & 0xFF);
  616. *(UINT8 *)(rawData + 6) = *(UINT8 *)(rawData + 6) | ((CoolType << 4) & 0xFF);
  617. break;
  618. case 0x18E6D0F3:
  619. TotCSCNum = BMS9_TotCSCNum;
  620. PackTotCellNum = BMS9_PackTotCellNum;
  621. PackTotTempNum = BMS9_PackTotTempNum;
  622. CellVoltPlat = 0xFF; // BMS涓嶅彂锛屽畾涔変负鏃犳晥
  623. MinAvlCellVolt = 0xFF; // BMS涓嶅彂锛屽畾涔変负鏃犳晥
  624. MaxAvlCellVolt = 0xFF; // BMS涓嶅彂锛屽畾涔変负鏃犳晥
  625. *(UINT8 *)(rawData + 0) = TotCSCNum;
  626. *(UINT8 *)(rawData + 1) = PackTotCellNum;
  627. *(UINT8 *)(rawData + 2) = PackTotCellNum>>8;
  628. *(UINT8 *)(rawData + 3) = PackTotTempNum;
  629. *(UINT8 *)(rawData + 4) = PackTotTempNum>>8;
  630. *(UINT8 *)(rawData + 5) = CellVoltPlat;
  631. *(UINT8 *)(rawData + 6) = MinAvlCellVolt;
  632. *(UINT8 *)(rawData + 7) = MaxAvlCellVolt;
  633. break;
  634. case 0x18F1D0F3:
  635. TotalChargeKwh = BMS15_TotalChargeKwh;
  636. TotalDischargeKwh = BMS15_TotalDischargeKwh;
  637. SingleChargeKwh = BMS19_SingleChargeKwh;
  638. *(UINT8 *)(rawData + 0) = TotalChargeKwh;
  639. *(UINT8 *)(rawData + 1) = TotalChargeKwh>>8;
  640. *(UINT8 *)(rawData + 2) = TotalChargeKwh>>16;
  641. *(UINT8 *)(rawData + 3) = TotalDischargeKwh;
  642. *(UINT8 *)(rawData + 4) = TotalDischargeKwh>>8;
  643. *(UINT8 *)(rawData + 5) = TotalDischargeKwh>>16;
  644. *(UINT8 *)(rawData + 6) = SingleChargeKwh;
  645. *(UINT8 *)(rawData + 7) = SingleChargeKwh>>8;
  646. break;
  647. case 0x18F2D0F3:
  648. TotalEneryECOChargeKwh = BMS16_TotalEneryECOChargeKwh;
  649. TotalStationChargeKwh = BMS17_TotalStationChargeKwh;
  650. *(UINT8 *)(rawData + 0) = TotalEneryECOChargeKwh;
  651. *(UINT8 *)(rawData + 1) = TotalEneryECOChargeKwh>>8;
  652. *(UINT8 *)(rawData + 2) = TotalEneryECOChargeKwh>>16;
  653. *(UINT8 *)(rawData + 3) = TotalStationChargeKwh;
  654. *(UINT8 *)(rawData + 4) = TotalStationChargeKwh>>8;
  655. *(UINT8 *)(rawData + 5) = TotalStationChargeKwh>>16;
  656. *(UINT8 *)(rawData + 6) = 0xFF;
  657. *(UINT8 *)(rawData + 7) = 0xFF;
  658. break;
  659. case 0x18F3D0F3:
  660. TotalPoleChargeKwh = BMS18_TotalPoleChargeKwh;
  661. *(UINT8 *)(rawData + 0) = BMS18_TotalPoleChargeKwh;
  662. *(UINT8 *)(rawData + 1) = BMS18_TotalPoleChargeKwh>>8;
  663. *(UINT8 *)(rawData + 2) = BMS18_TotalPoleChargeKwh>>16;
  664. *(UINT8 *)(rawData + 3) = 0xFF;
  665. *(UINT8 *)(rawData + 4) = 0xFF;
  666. *(UINT8 *)(rawData + 5) = 0xFF;
  667. *(UINT8 *)(rawData + 6) = 0xFF;
  668. *(UINT8 *)(rawData + 7) = 0xFF;
  669. break;
  670. case 0x18FEF8A7:
  671. EBC_DchgPos1Temp = ebcd_T_plugin[0];
  672. EBC_DchgNeg1Temp = ebcd_T_plugin[1];
  673. EBC_DchgPos2Temp = ebcd_T_plugin[2];
  674. EBC_DchgNeg2Temp = ebcd_T_plugin[3];
  675. EBC_ChgPos1Temp = 0xFF; //淇濈暀鍊硷紝瀹氫箟涓烘棤鏁�
  676. EBC_ChgNeg1Temp = 0xFF; //淇濈暀鍊硷紝瀹氫箟涓烘棤鏁�
  677. EBC_ChgPos2Temp = 0xFF; //淇濈暀鍊硷紝瀹氫箟涓烘棤鏁�
  678. EBC_ChgNeg2Temp = 0xFF; //淇濈暀鍊硷紝瀹氫箟涓烘棤鏁�
  679. *(UINT8 *)(rawData + 0) = *(UINT8 *)(rawData + 0) | ((EBC_DchgPos1Temp << 0) & 0xFF);
  680. *(UINT8 *)(rawData + 1) = *(UINT8 *)(rawData + 1) | ((EBC_DchgNeg1Temp << 0) & 0xFF);
  681. *(UINT8 *)(rawData + 2) = *(UINT8 *)(rawData + 2) | ((EBC_DchgPos2Temp << 0) & 0xFF);
  682. *(UINT8 *)(rawData + 3) = *(UINT8 *)(rawData + 3) | ((EBC_DchgNeg2Temp << 0) & 0xFF);
  683. *(UINT8 *)(rawData + 4) = *(UINT8 *)(rawData + 4) | ((EBC_ChgPos1Temp << 0) & 0xFF);
  684. *(UINT8 *)(rawData + 5) = *(UINT8 *)(rawData + 5) | ((EBC_ChgNeg1Temp << 0) & 0xFF);
  685. *(UINT8 *)(rawData + 6) = *(UINT8 *)(rawData + 6) | ((EBC_ChgPos2Temp << 0) & 0xFF);
  686. *(UINT8 *)(rawData + 7) = *(UINT8 *)(rawData + 7) | ((EBC_ChgNeg2Temp << 0) & 0xFF);
  687. break;
  688. case 0x18FF45F4:
  689. ReqMode = BMS28_ReqMode;
  690. HVCmd = BMS28_HVCmd;
  691. ChgSts = BMS1_ChrgStatus;
  692. HVRelaySts = BMS28_HVRelaySts;
  693. HVVolt = BMS28_HVVolt;
  694. SetTemp = BMS28_SetTemp;
  695. Bms_Life = BMS28_Life;
  696. CRC = BMS28_CRC;
  697. *(UINT8 *)(rawData + 0) = *(UINT8 *)(rawData + 0) | ((ReqMode << 0) & 0xFF);
  698. *(UINT8 *)(rawData + 0) = *(UINT8 *)(rawData + 0) | ((HVCmd << 2) & 0xFF);
  699. *(UINT8 *)(rawData + 0) = *(UINT8 *)(rawData + 0) | ((ChgSts << 4) & 0xFF);
  700. *(UINT8 *)(rawData + 0) = *(UINT8 *)(rawData + 0) | ((HVRelaySts << 6) & 0xFF);
  701. *(UINT8 *)(rawData + 2) = *(UINT8 *)(rawData + 2) | ((HVVolt >> 8) & 0xFF);
  702. *(UINT8 *)(rawData + 3) = *(UINT8 *)(rawData + 3) | ((HVVolt << 0) & 0xFF);
  703. *(UINT8 *)(rawData + 4) = *(UINT8 *)(rawData + 4) | ((SetTemp << 0) & 0xFF);
  704. *(UINT8 *)(rawData + 6) = *(UINT8 *)(rawData + 6) | ((Bms_Life << 0) & 0xFF);
  705. *(UINT8 *)(rawData + 7) = *(UINT8 *)(rawData + 7) | ((CRC << 0) & 0xFF);
  706. break;
  707. case 0x18FFC13A:
  708. // TMS_WorkStatus = ;
  709. // TMS_HVRelayST = ;
  710. // TMS_OutletTemp = ;
  711. // TMS_InletTemp = ;
  712. // TMS_ReqPow = ;
  713. // TMS_ErrCode = ;
  714. // TMS_FaultLevel = ;
  715. *(UINT8 *)(rawData + 0) = *(UINT8 *)(rawData + 0) | ((TMS_WorkStatus << 0) & 0xFF);
  716. *(UINT8 *)(rawData + 0) = *(UINT8 *)(rawData + 0) | ((TMS_HVRelayST << 2) & 0xFF);
  717. *(UINT8 *)(rawData + 1) = *(UINT8 *)(rawData + 1) | ((TMS_OutletTemp << 0) & 0xFF);
  718. *(UINT8 *)(rawData + 2) = *(UINT8 *)(rawData + 2) | ((TMS_InletTemp << 0) & 0xFF);
  719. *(UINT8 *)(rawData + 5) = *(UINT8 *)(rawData + 5) | ((TMS_ReqPow >> 8) & 0xFF);
  720. *(UINT8 *)(rawData + 6) = *(UINT8 *)(rawData + 6) | ((TMS_ReqPow << 0) & 0xFF);
  721. *(UINT8 *)(rawData + 7) = *(UINT8 *)(rawData + 7) | ((TMS_ErrCode << 0) & 0xFF);
  722. *(UINT8 *)(rawData + 7) = *(UINT8 *)(rawData + 7) | ((TMS_FaultLevel << 6) & 0xFF);
  723. break;
  724. case 0x18FFF8A7:
  725. {
  726. static UINT8 Life = 0;
  727. Life = Life + 1;
  728. EBC_LockupSts = ebdc_st_lockUpState;
  729. EBC_ConnectorSts = ebdc_st_ConnecState;
  730. EBC_DischgConnectorSts = 2; // 淇濈暀淇″彿锛屽畾涔変负鏃犳晥
  731. EBC_ChgConnectorSts = 2; // 淇濈暀淇″彿锛屽畾涔変负鏃犳晥
  732. EBC_FaultLevel = ebcd_Nr_errMax;
  733. EBC_FaultCode = ebcd_Num_faultCode;
  734. *(UINT8 *)(rawData + 0) = *(UINT8 *)(rawData + 0) | ((Life << 0) & 0xFF);
  735. *(UINT8 *)(rawData + 1) = *(UINT8 *)(rawData + 1) | ((EBC_LockupSts << 0) & 0xFF);
  736. *(UINT8 *)(rawData + 1) = *(UINT8 *)(rawData + 1) | ((EBC_ConnectorSts << 2) & 0xFF);
  737. *(UINT8 *)(rawData + 1) = *(UINT8 *)(rawData + 1) | ((EBC_DischgConnectorSts << 4) & 0xFF);
  738. *(UINT8 *)(rawData + 1) = *(UINT8 *)(rawData + 1) | ((EBC_ChgConnectorSts << 6) & 0xFF);
  739. *(UINT8 *)(rawData + 3) = *(UINT8 *)(rawData + 3) | ((EBC_FaultLevel << 0) & 0xFF);
  740. *(UINT8 *)(rawData + 4) = *(UINT8 *)(rawData + 4) | ((EBC_FaultCode << 0) & 0xFF);
  741. break;
  742. }
  743. default:
  744. break;
  745. }
  746. }