app.c 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004
  1. #include"common.h"
  2. #include "drv_io.h"
  3. #include "app.h"
  4. #include "app_rs485_1.h"
  5. #include "app_rs485_2.h"
  6. #include "drv_can.h"
  7. #include "app_adas.h"
  8. #include "measure_vol.h"
  9. #include "app_can.h"
  10. #include "low_power.h"
  11. #include "app_end_ctr.h"
  12. #include "drv_io.h"
  13. // CB_VAL cb_val_last;
  14. uint8_t cb_operate_state = CB_BAT_NO;
  15. uint8_t Check_CB_oper_sta_start = 0;
  16. DELAY_COMMON Check_CB_oper_sta_delay;
  17. uint8_t cfg_operate = CFG_BAT_NO;
  18. uint8_t work_normal = 0;
  19. uint8_t is_intelligent = 1;
  20. uint8_t CB_OPERATE_PRECEDENCE_PARRALLEL = PRE_SERIES;
  21. uint8_t CB_OPERATE_PRECEDENCE_Config = PRE_SERIES;
  22. DELAY_COMMON Series_delay;
  23. DELAY_COMMON Next_Series_delay;
  24. uint8_t Next_Series_Not_Enable = 0;
  25. uint8_t one_bat_charge_status = OBCS_CHARGER_OUT;
  26. uint8_t one_bat_initial = 1;
  27. uint8_t serise_low_enable = 0;
  28. uint8_t serise_low_qd_status = 0;
  29. UPDATE_BAT update_bat;
  30. const double nhb_default = 600;
  31. SHENG_YU_LI_CHENG sheng_yu_li_cheng;
  32. DELAY_COMMON save_param_delay;
  33. shark_bool shark_battery_series_disabled;
  34. u8 shark_battery_series_times;
  35. shark_bool shark_battery_switch_busy;
  36. shark_bool shark_printf_enabled;
  37. void Misc_Initial(void)
  38. {
  39. GPIO_Initial();
  40. }
  41. void CB_Operate_Initial(void)
  42. {
  43. _CB_Operate_Initial();
  44. // memset(&cb_val_last,0x00,sizeof(cb_val_last));
  45. //Check_CB_oper_sta_delay.set = 1;
  46. //Check_CB_oper_sta_delay.count = 0;
  47. Battery_CB_Switch(CB_BAT_NO);
  48. }
  49. void App_Initial(void)
  50. {
  51. CB_OPERATE_PRECEDENCE_PARRALLEL = CB_OPERATE_PRECEDENCE_Config;
  52. memset(&Series_delay,0x00,sizeof(Series_delay));
  53. memset(&Next_Series_delay,0x00,sizeof(Next_Series_delay));
  54. Initial_Neng_Hao_Bi();
  55. }
  56. uint8_t Check_Battery_1_On(void)
  57. {
  58. uint32_t vol = 0;
  59. if(IS_CHARGER_ON())
  60. return 0;
  61. if((sub_bms_info_2.packet_common.bms_status & BMS_STA_S_OPEN) == 0)
  62. {
  63. vol = Measure_Vol();
  64. if(vol != 0xFFFFFFFF && vol > sub_bms_info_2.packet_common.m_total_vol)
  65. return 1;
  66. }
  67. return 0;
  68. }
  69. uint8_t Check_Battery_2_On(void)
  70. {
  71. uint32_t vol = 0;
  72. if(IS_CHARGER_ON())
  73. return 0;
  74. if((sub_bms_info_1.packet_common.bms_status & BMS_STA_S_OPEN) == 0)
  75. {
  76. vol = Measure_Vol();
  77. if(vol != 0xFFFFFFFF && vol > sub_bms_info_1.packet_common.m_total_vol)
  78. return 1;
  79. }
  80. return 0;
  81. }
  82. shark_bool battery_wait_voltage_parallel(void)
  83. {
  84. u64 time1 = shark_get_time() + 1000;
  85. u64 time2 = shark_get_time() + 5000;
  86. u32 voltage_min, voltage_max;
  87. if (sub_bms_info_1.conn_state == SUB_BMS_CONT_HV485) {
  88. if (sub_bms_info_2.conn_state == SUB_BMS_CONT_HV485) {
  89. if (sub_bms_info_1.packet_common.m_total_vol > sub_bms_info_2.packet_common.m_total_vol) {
  90. voltage_max = sub_bms_info_1.packet_common.m_total_vol;
  91. } else {
  92. voltage_max = sub_bms_info_2.packet_common.m_total_vol;
  93. }
  94. } else {
  95. voltage_max = sub_bms_info_1.packet_common.m_total_vol;
  96. }
  97. } else if (sub_bms_info_2.conn_state == SUB_BMS_CONT_HV485) {
  98. voltage_max = sub_bms_info_2.packet_common.m_total_vol;
  99. } else {
  100. return shark_false;
  101. }
  102. voltage_min = voltage_max - SHARK_BATT_VOLTAGE_FUZZ;
  103. voltage_max += SHARK_BATT_VOLTAGE_FUZZ;
  104. while (shark_true) {
  105. u32 time = shark_get_time_safe();
  106. u32 voltage = Measure_Vol();
  107. if (voltage < voltage_min) {
  108. if (time > time1) {
  109. println("parallel: %d < %d", voltage, voltage_min);
  110. return shark_false;
  111. }
  112. } else if (voltage > voltage_max) {
  113. if (time > time2) {
  114. println("parallel: %d > %d", voltage, voltage_max);
  115. return shark_false;
  116. }
  117. } else {
  118. break;
  119. }
  120. }
  121. return shark_true;
  122. }
  123. shark_bool battery_wait_voltage_series(void)
  124. {
  125. u64 time1 = shark_get_time() + 200;
  126. u64 time2 = time1 + 800;
  127. u32 voltage_min;
  128. if (sub_bms_info_1.conn_state != SUB_BMS_CONT_HV485) {
  129. return shark_false;
  130. }
  131. if (sub_bms_info_2.conn_state != SUB_BMS_CONT_HV485) {
  132. return shark_false;
  133. }
  134. if (sub_bms_info_1.packet_common.m_total_vol > sub_bms_info_2.packet_common.m_total_vol) {
  135. voltage_min = sub_bms_info_1.packet_common.m_total_vol + 20000;
  136. } else {
  137. voltage_min = sub_bms_info_2.packet_common.m_total_vol + 20000;
  138. }
  139. while (shark_true) {
  140. u64 time = shark_get_time_safe();
  141. u32 voltage = Measure_Vol();
  142. if (voltage > voltage_min && time > time1) {
  143. break;
  144. }
  145. if (time > time2) {
  146. println("series: %d < %d", voltage, voltage_min);
  147. return shark_false;
  148. }
  149. }
  150. return shark_true;
  151. }
  152. static u8 shark_battery_switch_series(void)
  153. {
  154. // Power_On_Normal(0, 2);
  155. if (sub_bms_info_1.packet_common.m_total_vol > sub_bms_info_2.packet_common.m_total_vol) {
  156. if (shark_battery_set_power(SHARK_BATT_POWER_FULL, SHARK_BATT_POWER_OFF, 3) != 3) {
  157. return CB_BAT_NO;
  158. }
  159. delay_1ms(100);
  160. if (shark_battery_set_power(SHARK_BATT_POWER_FULL, SHARK_BATT_POWER_SMALL, 3) != 3) {
  161. return CB_BAT_NO;
  162. }
  163. } else {
  164. if (shark_battery_set_power(SHARK_BATT_POWER_OFF, SHARK_BATT_POWER_FULL, 3) != 3) {
  165. return CB_BAT_NO;
  166. }
  167. delay_1ms(100);
  168. if (shark_battery_set_power(SHARK_BATT_POWER_SMALL, SHARK_BATT_POWER_FULL, 3) != 3) {
  169. return CB_BAT_NO;
  170. }
  171. }
  172. shark_bms_set_mos_series();
  173. if (!battery_wait_voltage_series()) {
  174. shark_bms_set_mos_close();
  175. return CB_BAT_NO;
  176. }
  177. if (shark_battery_set_power(SHARK_BATT_POWER_FULL, SHARK_BATT_POWER_FULL, 3) != 3) {
  178. shark_bms_set_mos_close();
  179. return CB_BAT_NO;
  180. }
  181. sub_bms_info_1.state = SHARK_BATT_STATE_USED;
  182. sub_bms_info_2.state = SHARK_BATT_STATE_USED;
  183. shark_battery_series_disabled = shark_false;
  184. return CB_BAT1_BAT2_SERIES;
  185. }
  186. static u8 shark_battery_switch_parrallel(void)
  187. {
  188. shark_bms_set_mos_parrallel();
  189. sub_bms_info_1.state = SHARK_BATT_STATE_USED;
  190. sub_bms_info_2.state = SHARK_BATT_STATE_USED;
  191. return CB_BAT1_BAT2_PARRALLEL;
  192. }
  193. static u8 shark_battery_switch_bat1(u8 mask)
  194. {
  195. if (shark_battery_set_power(SHARK_BATT_POWER_FULL, SHARK_BATT_POWER_OFF, mask) != mask) {
  196. return CB_BAT_NO;
  197. }
  198. shark_bms_set_mos_bat1();
  199. sub_bms_info_1.state = SHARK_BATT_STATE_USED;
  200. sub_bms_info_2.state = SHARK_BATT_STATE_IDLE;
  201. return CB_BAT1;
  202. }
  203. static u8 shark_battery_switch_bat2(u8 mask)
  204. {
  205. if (shark_battery_set_power(SHARK_BATT_POWER_OFF, SHARK_BATT_POWER_FULL, mask) != mask) {
  206. return CB_BAT_NO;
  207. }
  208. shark_bms_set_mos_bat2();
  209. sub_bms_info_1.state = SHARK_BATT_STATE_IDLE;
  210. sub_bms_info_2.state = SHARK_BATT_STATE_USED;
  211. return CB_BAT2;
  212. }
  213. static u8 shark_battery_switch_single(void)
  214. {
  215. u64 time = shark_get_time() + 500;
  216. u32 open1 = 0;
  217. u32 open2 = 0;
  218. while (time > shark_get_time_safe()) {
  219. if (BAT1_IS_OPEN()) {
  220. open1++;
  221. }
  222. if (BAT2_IS_OPEN()) {
  223. open2++;
  224. }
  225. }
  226. println("open: %d %d", open1, open2);
  227. println("voltage: %d %d", sub_bms_info_1.packet_common.m_total_vol, sub_bms_info_2.packet_common.m_total_vol);
  228. if (open1 > open2) {
  229. return shark_battery_switch_bat1(3);
  230. }
  231. if (open1 < open2) {
  232. return shark_battery_switch_bat2(3);
  233. }
  234. if (sub_bms_info_1.packet_common.m_total_vol > sub_bms_info_2.packet_common.m_total_vol) {
  235. return shark_battery_switch_bat1(3);
  236. }
  237. return shark_battery_switch_bat2(3);
  238. }
  239. static shark_bool shark_battery_series_enabled(void)
  240. {
  241. if (QD_Dect()) {
  242. if (end_ctr_self_ss_new.xl_sta) {
  243. return shark_false;
  244. }
  245. if (shark_battery_series_disabled) {
  246. return shark_false;
  247. }
  248. if (shark_battery_series_times > SHARK_SERIES_MAX_TIMES) {
  249. return shark_false;
  250. }
  251. }
  252. if (sub_bms_info_1.packet_common.m_percent < SERIES_UNDER_XX_PERCENT) {
  253. return shark_false;
  254. }
  255. if (sub_bms_info_2.packet_common.m_percent < SERIES_UNDER_XX_PERCENT) {
  256. return shark_false;
  257. }
  258. if (IS_CHARGE_IN()) {
  259. return shark_false;
  260. }
  261. return shark_true;
  262. }
  263. static shark_bool shark_battery_check_series(u8 operate)
  264. {
  265. if (operate != CB_BAT1_BAT2_SERIES) {
  266. return shark_false;
  267. }
  268. return shark_battery_series_enabled();
  269. }
  270. static shark_bool shark_battery_check_parrallel(u8 operate)
  271. {
  272. if (operate != CB_BAT1_BAT2_PARRALLEL) {
  273. return shark_false;
  274. }
  275. return SHARK_BOOL(IS_CHARGE_IN());
  276. }
  277. static u8 shark_battery_switch_auto(u8 operate)
  278. {
  279. if (operate == cb_operate_state) {
  280. return operate;
  281. }
  282. shark_bms_set_mos_close();
  283. sub_bms_info_1.state = SHARK_BATT_STATE_IDLE;
  284. sub_bms_info_2.state = SHARK_BATT_STATE_IDLE;
  285. if (shark_battery_set_power(SHARK_BATT_POWER_FULL, SHARK_BATT_POWER_FULL, 3) == 0) {
  286. return CB_BAT_NO;
  287. }
  288. if (operate == CB_BAT_NO) {
  289. return CB_BAT_NO;
  290. }
  291. if (!battery_wait_voltage_parallel()) {
  292. return CB_BAT_NO;
  293. }
  294. if (shark_battery_is_normal_power_on(&sub_bms_info_1)) {
  295. if (shark_battery_is_normal_power_on(&sub_bms_info_2)) {
  296. if (shark_battery_check_series(operate)) {
  297. operate = shark_battery_switch_series();
  298. if (operate == CB_BAT1_BAT2_SERIES) {
  299. shark_battery_series_times = 0;
  300. } else if (shark_battery_series_times < 0xFF) {
  301. shark_battery_series_times++;
  302. }
  303. return operate;
  304. } else if (shark_battery_check_parrallel(operate)) {
  305. return shark_battery_switch_parrallel();
  306. } else {
  307. return shark_battery_switch_single();
  308. }
  309. } else {
  310. return shark_battery_switch_bat1(1);
  311. }
  312. } else if (shark_battery_is_normal_power_on(&sub_bms_info_2)) {
  313. return shark_battery_switch_bat2(2);
  314. } else {
  315. return CB_BAT_NO;
  316. }
  317. }
  318. int8_t Battery_CB_Switch(uint8_t cb_operate)
  319. {
  320. println("switch: %d -> %d", cb_operate_state, cb_operate);
  321. #if 1
  322. shark_battery_switch_busy = shark_true;
  323. cb_operate_state = shark_battery_switch_auto(cb_operate);
  324. shark_battery_switch_busy = shark_false;
  325. println("switch: %d", cb_operate_state);
  326. return cb_operate_state;
  327. #else
  328. #define COM_TIMEOUT (15)
  329. switch(cb_operate)
  330. {
  331. case CB_BAT1_BAT2_AUTO:
  332. cb_operate = shark_battery_switch_auto(shark_false);
  333. println("single auto: %d", cb_operate);
  334. break;
  335. case CB_BAT1:
  336. shark_bms_set_mos_close();
  337. if(!battery_wait_voltage_down(SELECT_ONE_BATTERY_VOL)) {
  338. goto SWITCH_ERROR;
  339. }
  340. switch(cb_operate_state)
  341. {
  342. case CB_BAT_NO:
  343. //
  344. if(sub_bms_info_2.conn_state == SUB_BMS_CONT_HV485)
  345. {
  346. i = 0;
  347. while(i++ < COM_TIMEOUT && RS485_busy_2)
  348. delay_1ms(10);
  349. if(RS485_busy_2)
  350. goto SWITCH_ERROR;
  351. if(Operate_Sub_BMS_2_CD(0) == 0)
  352. goto SWITCH_ERROR;
  353. }
  354. else if(sub_bms_info_2.conn_state == SUB_BMS_DISC_NO485)
  355. {
  356. if(Check_Battery_2_On())
  357. goto SWITCH_ERROR;
  358. }
  359. else
  360. {
  361. goto SWITCH_ERROR;
  362. }
  363. //
  364. i = 0;
  365. while(i++ < COM_TIMEOUT && RS485_busy_1)
  366. delay_1ms(10);
  367. if(RS485_busy_1)
  368. goto SWITCH_ERROR;
  369. if(one_bat_initial == 0)
  370. {
  371. if(Operate_Sub_BMS_1_CD(2) == 0)
  372. goto SWITCH_ERROR;
  373. delay_1ms(200);
  374. }
  375. if(Operate_Sub_BMS_1_CD(1) == 0)
  376. goto SWITCH_ERROR;
  377. break;
  378. case CB_BAT1:
  379. break;
  380. case CB_BAT2:
  381. i = 0;
  382. while(i++ < COM_TIMEOUT && RS485_busy_1)
  383. delay_1ms(10);
  384. if(RS485_busy_1)
  385. goto SWITCH_ERROR;
  386. if(Operate_Sub_BMS_1_CD(1) == 0)
  387. goto SWITCH_ERROR;
  388. //
  389. i = 0;
  390. while(i++ < COM_TIMEOUT && RS485_busy_2)
  391. delay_1ms(10);
  392. if(RS485_busy_2)
  393. goto SWITCH_ERROR;
  394. if(Operate_Sub_BMS_2_CD(0) == 0)
  395. goto SWITCH_ERROR;
  396. break;
  397. case CB_BAT1_BAT2_PARRALLEL:
  398. //
  399. i = 0;
  400. while(i++ < COM_TIMEOUT && RS485_busy_2)
  401. delay_1ms(10);
  402. if(RS485_busy_2)
  403. goto SWITCH_ERROR;
  404. if(Operate_Sub_BMS_2_CD(0) == 0)
  405. goto SWITCH_ERROR;
  406. break;
  407. case CB_BAT1_BAT2_SERIES:
  408. //
  409. if(sub_bms_info_2.conn_state == SUB_BMS_CONT_HV485)
  410. {
  411. i = 0;
  412. while(i++ < COM_TIMEOUT && RS485_busy_2)
  413. delay_1ms(10);
  414. //if(RS485_busy_2)
  415. // goto SWITCH_ERROR;
  416. if(Operate_Sub_BMS_2_CD(0) == 0)
  417. {
  418. // goto SWITCH_ERROR;
  419. }
  420. }
  421. else
  422. Operate_Sub_BMS_2_CD(0);
  423. break;
  424. default:
  425. goto SWITCH_ERROR;
  426. }
  427. shark_bms_set_mos_bat1();
  428. sub_bms_info_1.state = SHARK_BATT_STATE_USED;
  429. sub_bms_info_2.state = SHARK_BATT_STATE_IDLE;
  430. break;
  431. case CB_BAT2:
  432. shark_bms_set_mos_close();
  433. if(!battery_wait_voltage_down(SELECT_ONE_BATTERY_VOL)) {
  434. goto SWITCH_ERROR;
  435. }
  436. switch(cb_operate_state)
  437. {
  438. case CB_BAT_NO:
  439. //
  440. if(sub_bms_info_1.conn_state == SUB_BMS_CONT_HV485)
  441. {
  442. i = 0;
  443. while(i++ < COM_TIMEOUT && RS485_busy_1)
  444. delay_1ms(10);
  445. if(RS485_busy_1)
  446. goto SWITCH_ERROR;
  447. if(Operate_Sub_BMS_1_CD(0) == 0)
  448. goto SWITCH_ERROR;
  449. }
  450. else if(sub_bms_info_1.conn_state == SUB_BMS_DISC_NO485)
  451. {
  452. if(Check_Battery_1_On())
  453. goto SWITCH_ERROR;
  454. }
  455. else
  456. {
  457. goto SWITCH_ERROR;
  458. }
  459. //
  460. i = 0;
  461. while(i++ < COM_TIMEOUT && RS485_busy_2)
  462. delay_1ms(10);
  463. if(RS485_busy_2)
  464. goto SWITCH_ERROR;
  465. if(one_bat_initial == 0)
  466. {
  467. if(Operate_Sub_BMS_2_CD(2) == 0)
  468. goto SWITCH_ERROR;
  469. delay_1ms(200);
  470. }
  471. if(Operate_Sub_BMS_2_CD(1) == 0)
  472. goto SWITCH_ERROR;
  473. break;
  474. case CB_BAT1:
  475. //
  476. i = 0;
  477. while(i++ < COM_TIMEOUT && RS485_busy_2)
  478. delay_1ms(10);
  479. if(RS485_busy_2)
  480. goto SWITCH_ERROR;
  481. if(Operate_Sub_BMS_2_CD(1) == 0)
  482. goto SWITCH_ERROR;
  483. //
  484. i = 0;
  485. while(i++ < COM_TIMEOUT && RS485_busy_1)
  486. delay_1ms(10);
  487. if(RS485_busy_1)
  488. goto SWITCH_ERROR;
  489. if(Operate_Sub_BMS_1_CD(0) == 0)
  490. goto SWITCH_ERROR;
  491. break;
  492. case CB_BAT2:
  493. break;
  494. case CB_BAT1_BAT2_PARRALLEL:
  495. //
  496. i = 0;
  497. while(i++ < COM_TIMEOUT && RS485_busy_1)
  498. delay_1ms(10);
  499. if(RS485_busy_1)
  500. goto SWITCH_ERROR;
  501. if(Operate_Sub_BMS_1_CD(0) == 0)
  502. goto SWITCH_ERROR;
  503. break;
  504. case CB_BAT1_BAT2_SERIES:
  505. //
  506. if(sub_bms_info_1.conn_state == SUB_BMS_CONT_HV485)
  507. {
  508. i = 0;
  509. while(i++ < COM_TIMEOUT && RS485_busy_1)
  510. delay_1ms(10);
  511. //if(RS485_busy_1)
  512. // goto SWITCH_ERROR;
  513. if(Operate_Sub_BMS_1_CD(0) == 0)
  514. {
  515. //goto SWITCH_ERROR;
  516. }
  517. }
  518. else
  519. Operate_Sub_BMS_1_CD(0);
  520. break;
  521. default:
  522. goto SWITCH_ERROR;
  523. }
  524. shark_bms_set_mos_bat2();
  525. sub_bms_info_1.state = SHARK_BATT_STATE_IDLE;
  526. sub_bms_info_2.state = SHARK_BATT_STATE_USED;
  527. break;
  528. case CB_BAT1_BAT2_PARRALLEL:
  529. shark_bms_set_mos_close();
  530. if(!battery_wait_voltage_down(SELECT_ONE_BATTERY_VOL)) {
  531. goto SWITCH_ERROR;
  532. }
  533. switch(cb_operate_state)
  534. {
  535. case CB_BAT_NO:
  536. goto SWITCH_ERROR;
  537. case CB_BAT1:
  538. //
  539. i = 0;
  540. while(i++ < COM_TIMEOUT && RS485_busy_2)
  541. delay_1ms(10);
  542. if(RS485_busy_2)
  543. goto SWITCH_ERROR;
  544. if(Operate_Sub_BMS_2_CD(1) == 0)
  545. goto SWITCH_ERROR;
  546. break;
  547. case CB_BAT2:
  548. //
  549. i = 0;
  550. while(i++ < COM_TIMEOUT && RS485_busy_1)
  551. delay_1ms(10);
  552. if(RS485_busy_1)
  553. goto SWITCH_ERROR;
  554. if(Operate_Sub_BMS_1_CD(1) == 0)
  555. goto SWITCH_ERROR;
  556. break;
  557. case CB_BAT1_BAT2_PARRALLEL:
  558. break;
  559. case CB_BAT1_BAT2_SERIES:
  560. delay_1ms(10);
  561. break;
  562. default:
  563. goto SWITCH_ERROR;
  564. }
  565. shark_bms_set_mos_parrallel();
  566. sub_bms_info_1.state = SHARK_BATT_STATE_USED;
  567. sub_bms_info_2.state = SHARK_BATT_STATE_USED;
  568. break;
  569. case CB_BAT1_BAT2_SERIES:
  570. #if 1
  571. cb_operate = shark_battery_switch_auto(shark_true);
  572. println("series auto: %d", cb_operate);
  573. #else
  574. Power_On_Normal(0,2);
  575. shark_bms_set_mos_close();
  576. //delay_1ms(2000);
  577. //serise_low_qd_status = QD_Dect();
  578. //Power_On_Normal(0,2);
  579. switch(cb_operate_state)
  580. {
  581. case CB_BAT_NO:
  582. goto SWITCH_ERROR;
  583. case CB_BAT1:
  584. delay_1ms(10);
  585. shark_bms_set_mos_series();
  586. //
  587. i = 0;
  588. while(i++ < COM_TIMEOUT && RS485_busy_2)
  589. delay_1ms(10);
  590. if(RS485_busy_2)
  591. goto SWITCH_ERROR;
  592. if(Operate_Sub_BMS_2_CD(2) == 0)
  593. goto SWITCH_ERROR;
  594. /*for(uint16_t i = 0;i < 20;i++)
  595. {
  596. if(Handle_Can_Data() == 1)
  597. {
  598. // output fail
  599. ;
  600. }
  601. delay_1ms(10);
  602. }*/
  603. delay_1ms(200);
  604. if(Operate_Sub_BMS_2_CD(1) == 0)
  605. goto SWITCH_ERROR;
  606. break;
  607. case CB_BAT2:
  608. delay_1ms(10);
  609. shark_bms_set_mos_series();
  610. //
  611. i = 0;
  612. while(i++ < COM_TIMEOUT && RS485_busy_1)
  613. delay_1ms(10);
  614. if(RS485_busy_1)
  615. goto SWITCH_ERROR;
  616. if(Operate_Sub_BMS_1_CD(2) == 0)
  617. goto SWITCH_ERROR;
  618. /*for(uint16_t i = 0;i < 20;i++)
  619. {
  620. if(Handle_Can_Data() == 1)
  621. {
  622. // output fail
  623. ;
  624. }
  625. delay_1ms(10);
  626. }*/
  627. delay_1ms(200);
  628. if(Operate_Sub_BMS_1_CD(1) == 0)
  629. goto SWITCH_ERROR;
  630. break;
  631. case CB_BAT1_BAT2_PARRALLEL:
  632. if(sub_bms_info_1.packet_common.m_total_vol < sub_bms_info_2.packet_common.m_total_vol)
  633. {
  634. //
  635. i = 0;
  636. while(i++ < COM_TIMEOUT && RS485_busy_1)
  637. delay_1ms(10);
  638. if(RS485_busy_1)
  639. goto SWITCH_ERROR;
  640. if(Operate_Sub_BMS_1_CD(0) == 0)
  641. goto SWITCH_ERROR;
  642. delay_1ms(50);
  643. delay_1ms(10);
  644. shark_bms_set_mos_series();
  645. if(Operate_Sub_BMS_1_CD(2) == 0)
  646. goto SWITCH_ERROR;
  647. /*for(uint16_t i = 0;i < 20;i++)
  648. {
  649. if(Handle_Can_Data() == 1)
  650. {
  651. // output fail
  652. ;
  653. }
  654. delay_1ms(10);
  655. }*/
  656. delay_1ms(200);
  657. if(Operate_Sub_BMS_1_CD(1) == 0)
  658. goto SWITCH_ERROR;
  659. }
  660. else
  661. {
  662. //
  663. i = 0;
  664. while(i++ < COM_TIMEOUT && RS485_busy_2)
  665. delay_1ms(10);
  666. if(RS485_busy_2)
  667. goto SWITCH_ERROR;
  668. if(Operate_Sub_BMS_2_CD(0) == 0)
  669. goto SWITCH_ERROR;
  670. delay_1ms(50);
  671. delay_1ms(10);
  672. shark_bms_set_mos_series();
  673. if(Operate_Sub_BMS_2_CD(2) == 0)
  674. goto SWITCH_ERROR;
  675. /*for(uint16_t i = 0;i < 20;i++)
  676. {
  677. if(Handle_Can_Data() == 1)
  678. {
  679. // output fail
  680. ;
  681. }
  682. delay_1ms(10);
  683. }*/
  684. delay_1ms(200);
  685. if(Operate_Sub_BMS_2_CD(1) == 0)
  686. goto SWITCH_ERROR;
  687. }
  688. break;
  689. case CB_BAT1_BAT2_SERIES:
  690. break;
  691. default:
  692. goto SWITCH_ERROR;
  693. }
  694. delay_1ms(10);
  695. shark_bms_set_mos_series();
  696. sub_bms_info_1.state = SHARK_BATT_STATE_USED;
  697. sub_bms_info_2.state = SHARK_BATT_STATE_USED;
  698. #endif
  699. break;
  700. case CB_BAT_NO:
  701. default:
  702. ACC2_Enable(0);
  703. shark_bms_set_mos_close();
  704. sub_bms_info_1.state = SHARK_BATT_STATE_IDLE;
  705. sub_bms_info_2.state = SHARK_BATT_STATE_IDLE;
  706. cb_operate = CB_BAT_NO;
  707. if(Is_Soak())
  708. {
  709. sub_bms_info_1.sub_bms_cmd.operate = OP_OPEN_FET;
  710. sub_bms_info_1.sub_bms_cmd.param = 0x00;
  711. sub_bms_info_2.sub_bms_cmd.operate = OP_OPEN_FET;
  712. sub_bms_info_2.sub_bms_cmd.param = 0x00;
  713. }
  714. break;
  715. }
  716. // cb_val_last = cb_val_temp;
  717. cb_operate_state = cb_operate;
  718. return cb_operate;
  719. SWITCH_ERROR:
  720. println("switch err");
  721. shark_bms_set_mos_close();
  722. cb_operate_state = CB_BAT_NO;
  723. return cb_operate_state;
  724. #undef COM_TIMEOUT
  725. #endif
  726. }
  727. void test_io(void)
  728. {
  729. volatile uint8_t a,b;
  730. a = BAT1_IS_OPEN();
  731. b = BAT2_IS_OPEN();
  732. a++;
  733. b++;
  734. }
  735. uint8_t Select_One_BAT(void)
  736. {
  737. #if 0
  738. uint8_t temp_op = CB_BAT_NO;
  739. println("select one");
  740. sub_bms_info_1.state = SHARK_BATT_STATE_IDLE;
  741. sub_bms_info_2.state = SHARK_BATT_STATE_IDLE;
  742. if(Is_Sub_BMS_1_Normal() == SHARK_BATT_EXIT_SUCCESS)
  743. {
  744. if(Is_Sub_BMS_2_Normal() == SHARK_BATT_EXIT_SUCCESS)
  745. {
  746. if(sub_bms_info_1.packet_common.m_total_vol >= sub_bms_info_2.packet_common.m_total_vol)
  747. {
  748. if(IS_CHARGE_IN())
  749. {
  750. temp_op = CB_BAT2;
  751. }
  752. else
  753. {
  754. temp_op = CB_BAT1;
  755. }
  756. }
  757. else
  758. {
  759. if(IS_CHARGE_IN())
  760. {
  761. temp_op = CB_BAT1;
  762. }
  763. else
  764. {
  765. temp_op = CB_BAT2;
  766. }
  767. }
  768. }
  769. else
  770. {
  771. temp_op = CB_BAT1;
  772. }
  773. }
  774. else if(Is_Sub_BMS_2_Normal() == SHARK_BATT_EXIT_SUCCESS)
  775. {
  776. temp_op = CB_BAT2;
  777. }
  778. return temp_op;
  779. #else
  780. return CB_BAT1_BAT2_AUTO;
  781. #endif
  782. }
  783. uint8_t Check_CB_BAT_1(void)
  784. {
  785. uint8_t temp_op = CB_MAX;
  786. if(Is_Sub_BMS_1_Normal() == SHARK_BATT_EXIT_SUCCESS)
  787. {
  788. if((sub_bms_info_1.packet_common.bms_status & (BMS_STA_D_OPEN | BMS_STA_C_OPEN)) != (BMS_STA_D_OPEN | BMS_STA_C_OPEN))
  789. {
  790. //sub_bms_info_1.sub_bms_cmd.operate = OP_OPEN_FET;
  791. //sub_bms_info_1.sub_bms_cmd.param = 0x03;
  792. if((sub_bms_info_1.packet_common.work_status &(ST_OVRDISCHRG_VOL|ST_PDOWN)) != 0)
  793. ;
  794. else
  795. temp_op = CB_BAT_NO;
  796. }
  797. //
  798. if((sub_bms_info_2.packet_common.bms_status & (BMS_STA_D_OPEN | BMS_STA_S_OPEN)) != 0)
  799. {
  800. sub_bms_info_2.sub_bms_cmd.operate = OP_OPEN_FET;
  801. sub_bms_info_2.sub_bms_cmd.param = 0x00;
  802. }
  803. }
  804. else
  805. {
  806. /*if(Is_Sub_BMS_2_Normal())
  807. temp_op = CB_BAT2;
  808. else*/
  809. temp_op = CB_BAT_NO;
  810. }
  811. return temp_op;
  812. }
  813. uint8_t Check_CB_BAT_2(void)
  814. {
  815. uint8_t temp_op = CB_MAX;
  816. if(Is_Sub_BMS_2_Normal() == SHARK_BATT_EXIT_SUCCESS)
  817. {
  818. if((sub_bms_info_2.packet_common.bms_status & (BMS_STA_D_OPEN | BMS_STA_C_OPEN)) != (BMS_STA_D_OPEN | BMS_STA_C_OPEN))
  819. {
  820. //sub_bms_info_2.sub_bms_cmd.operate = OP_OPEN_FET;
  821. //sub_bms_info_2.sub_bms_cmd.param = 0x03;
  822. if((sub_bms_info_2.packet_common.work_status &(ST_OVRDISCHRG_VOL|ST_PDOWN)) != 0)
  823. ;
  824. else
  825. temp_op = CB_BAT_NO;
  826. }
  827. //
  828. if((sub_bms_info_1.packet_common.bms_status & (BMS_STA_D_OPEN | BMS_STA_S_OPEN)) != 0)
  829. {
  830. sub_bms_info_1.sub_bms_cmd.operate = OP_OPEN_FET;
  831. sub_bms_info_1.sub_bms_cmd.param = 0x00;
  832. }
  833. }
  834. else
  835. {
  836. /*if(Is_Sub_BMS_1_Normal())
  837. temp_op = CB_BAT1;
  838. else*/
  839. temp_op = CB_BAT_NO;
  840. }
  841. return temp_op;
  842. }
  843. int32_t Battery_1_Bu_Chang_Vol(void)
  844. {
  845. return ((int32_t)sub_bms_info_1.packet_common.m_total_vol - (int32_t)(BATTERY_RESISTANCE_OHM * sub_bms_info_1.packet_common.m_current));
  846. }
  847. int32_t Battery_2_Bu_Chang_Vol(void)
  848. {
  849. return ((int32_t)sub_bms_info_2.packet_common.m_total_vol - (int32_t)(BATTERY_RESISTANCE_OHM * sub_bms_info_2.packet_common.m_current));
  850. }
  851. uint8_t Check_CB_BAT1_BAT2_PARRALLEL(void)
  852. {
  853. int32_t delta_vol;
  854. int32_t m_1_total_vol,m_2_total_vol;
  855. uint8_t temp_op = CB_MAX;
  856. if(is_intelligent && CB_OPERATE_PRECEDENCE_PARRALLEL != PRE_PARRALLEL)
  857. {
  858. temp_op = Select_One_BAT();
  859. return temp_op;
  860. }
  861. //
  862. if(Is_Sub_BMS_1_Normal() == SHARK_BATT_EXIT_SUCCESS && Is_Sub_BMS_2_Normal() == SHARK_BATT_EXIT_SUCCESS)
  863. {
  864. if((sub_bms_info_1.packet_common.bms_status & (BMS_STA_D_OPEN | BMS_STA_C_OPEN)) != (BMS_STA_D_OPEN | BMS_STA_C_OPEN))
  865. {
  866. sub_bms_info_1.sub_bms_cmd.operate = OP_OPEN_FET;
  867. sub_bms_info_1.sub_bms_cmd.param = 0x03;
  868. }
  869. if((sub_bms_info_2.packet_common.bms_status & (BMS_STA_D_OPEN | BMS_STA_C_OPEN)) != (BMS_STA_D_OPEN | BMS_STA_C_OPEN))
  870. {
  871. sub_bms_info_2.sub_bms_cmd.operate = OP_OPEN_FET;
  872. sub_bms_info_2.sub_bms_cmd.param = 0x03;
  873. }
  874. }
  875. else
  876. {
  877. temp_op = Select_One_BAT();
  878. return temp_op;
  879. }
  880. //
  881. if(sub_bms_info_1.packet_common.m_current > 20000 || sub_bms_info_2.packet_common.m_current > 20000)
  882. {
  883. temp_op = Select_One_BAT();
  884. return temp_op;
  885. }
  886. //
  887. m_1_total_vol = Battery_1_Bu_Chang_Vol();
  888. m_2_total_vol = Battery_2_Bu_Chang_Vol();
  889. if(m_1_total_vol >= m_2_total_vol)
  890. {
  891. delta_vol = m_1_total_vol - m_2_total_vol;
  892. }
  893. else
  894. {
  895. delta_vol = m_2_total_vol - m_1_total_vol;
  896. }
  897. if(delta_vol > PARRALLEL_DELTA_VOL)
  898. {
  899. temp_op = Select_One_BAT();
  900. return temp_op;
  901. }
  902. return temp_op;
  903. }
  904. void Series_Delay_Timeout(void)
  905. {
  906. if(Series_delay.set)
  907. {
  908. Series_delay.count++;
  909. }
  910. if(Next_Series_delay.set)
  911. {
  912. Next_Series_delay.count++;
  913. if(Next_Series_delay.count <= NEXT_SERIES_TIME_OUT)
  914. Next_Series_Not_Enable = 1;
  915. else
  916. {
  917. memset(&Next_Series_delay,0x00,sizeof(Next_Series_delay));
  918. Next_Series_Not_Enable = 0;
  919. }
  920. }
  921. }
  922. #ifdef HAN_GUO_VERSION
  923. uint8_t Select_One_BAT_Han_Guo(void)
  924. {
  925. uint8_t temp_op = CB_BAT_NO;
  926. if(Is_Sub_BMS_1_Normal())
  927. {
  928. if(Is_Sub_BMS_2_Normal())
  929. {
  930. if(sub_bms_info_1.packet_common.m_total_vol >= sub_bms_info_2.packet_common.m_total_vol)
  931. {
  932. if(IS_CHARGE_IN())
  933. {
  934. temp_op = CB_BAT2;
  935. }
  936. else
  937. {
  938. temp_op = CB_BAT1;
  939. }
  940. }
  941. else
  942. {
  943. if(IS_CHARGE_IN())
  944. {
  945. temp_op = CB_BAT1;
  946. }
  947. else
  948. {
  949. temp_op = CB_BAT2;
  950. }
  951. }
  952. }
  953. else
  954. {
  955. temp_op = CB_BAT1;
  956. }
  957. }
  958. else if(Is_Sub_BMS_2_Normal())
  959. {
  960. temp_op = CB_BAT2;
  961. }
  962. else
  963. {
  964. if(sub_bms_info_1.packet_common.m_total_vol < sub_bms_info_2.packet_common.m_total_vol)
  965. temp_op = CB_BAT2;
  966. else
  967. temp_op = CB_BAT1;
  968. }
  969. return temp_op;
  970. }
  971. #endif
  972. uint8_t Check_CB_BAT1_BAT2_SERIES(void)
  973. {
  974. uint8_t temp_op = CB_MAX;
  975. int32_t m_1_total_vol,m_2_total_vol;
  976. if(is_intelligent && CB_OPERATE_PRECEDENCE_PARRALLEL != PRE_SERIES)
  977. {
  978. temp_op = Select_One_BAT();
  979. return temp_op;
  980. }
  981. if(serise_low_enable)
  982. {
  983. temp_op = Select_One_BAT();
  984. return temp_op;
  985. }
  986. if(IS_CHARGE_IN())
  987. {
  988. temp_op = Select_One_BAT();
  989. return temp_op;
  990. }
  991. if(Is_Sub_BMS_1_Normal() == SHARK_BATT_EXIT_SUCCESS && Is_Sub_BMS_2_Normal() == SHARK_BATT_EXIT_SUCCESS)
  992. {
  993. if((sub_bms_info_1.packet_common.bms_status & (BMS_STA_D_OPEN | BMS_STA_C_OPEN)) != (BMS_STA_D_OPEN | BMS_STA_C_OPEN))
  994. {
  995. //sub_bms_info_1.sub_bms_cmd.operate = OP_OPEN_FET;
  996. //sub_bms_info_1.sub_bms_cmd.param = 0x03;
  997. sub_bms_info_1.define_error= D_BMS_ERROR_SERISE_CD_OFF;
  998. temp_op = Select_One_BAT();
  999. sub_bms_info_1.define_error = D_BMS_ERROR_NO;
  1000. return temp_op;
  1001. }
  1002. if((sub_bms_info_2.packet_common.bms_status & (BMS_STA_D_OPEN | BMS_STA_C_OPEN)) != (BMS_STA_D_OPEN | BMS_STA_C_OPEN))
  1003. {
  1004. //sub_bms_info_2.sub_bms_cmd.operate = OP_OPEN_FET;
  1005. //sub_bms_info_2.sub_bms_cmd.param = 0x03;
  1006. sub_bms_info_2.define_error = D_BMS_ERROR_SERISE_CD_OFF;
  1007. temp_op = Select_One_BAT();
  1008. sub_bms_info_2.define_error = D_BMS_ERROR_NO;
  1009. return temp_op;
  1010. }
  1011. }
  1012. else
  1013. {
  1014. if (end_ctr_self_ss_new.xl_sta && QD_Dect()) {
  1015. shark_battery_series_disabled = shark_true;
  1016. }
  1017. #ifdef HAN_GUO_VERSION
  1018. temp_op = Select_One_BAT_Han_Guo();
  1019. #else
  1020. temp_op = Select_One_BAT();
  1021. #endif
  1022. return temp_op;
  1023. }
  1024. /*if(Measure_Vol() <= CHECK_SERIES_VOL)
  1025. {
  1026. temp_op = Select_One_BAT();
  1027. return temp_op;
  1028. }*/
  1029. m_1_total_vol = Battery_1_Bu_Chang_Vol();
  1030. m_2_total_vol = Battery_2_Bu_Chang_Vol();
  1031. if(m_1_total_vol <= CHECK_SERIES_PROTECT_VOL\
  1032. ||m_2_total_vol <= CHECK_SERIES_PROTECT_VOL )
  1033. {
  1034. if(Series_delay.set == 0)
  1035. {
  1036. Series_delay.set = 1;
  1037. Series_delay.count = 0;
  1038. }
  1039. }
  1040. else
  1041. {
  1042. memset(&Series_delay,0x00,sizeof(Series_delay));
  1043. }
  1044. if(Series_delay.set&&Series_delay.count >= SERIES_UNDER_VOL_TIME_OUT)
  1045. {
  1046. memset(&Series_delay,0x00,sizeof(Series_delay));
  1047. temp_op = Select_One_BAT();
  1048. serise_low_enable = 1;
  1049. return temp_op;
  1050. }
  1051. if(sub_bms_info_1.packet_common.m_percent < SERIES_UNDER_XX_PERCENT\
  1052. || sub_bms_info_2.packet_common.m_percent < SERIES_UNDER_XX_PERCENT)
  1053. {
  1054. temp_op = Select_One_BAT();
  1055. return temp_op;
  1056. }
  1057. return temp_op;
  1058. }
  1059. uint8_t power_switch_from = 0;
  1060. void Power_On_Normal(uint8_t enable,uint8_t from)
  1061. {
  1062. if(enable)
  1063. {
  1064. //FL_Enable(1);
  1065. //ACC2_Enable(1);
  1066. Can_Power_Enable(1);
  1067. Enable_12V(1);
  1068. one_bat_initial = 0;
  1069. Reset_Enter_Sleep_Delay();
  1070. /*if(serise_low_qd_status == 1)
  1071. {
  1072. QD_Enable(1);
  1073. serise_low_qd_status = 0;
  1074. }*/
  1075. }
  1076. else
  1077. {
  1078. #if 0
  1079. NVIC_SystemReset();
  1080. #else
  1081. // FL_Enable(0);
  1082. ACC2_Enable(0);
  1083. Can_Power_Enable(0);
  1084. Can_Stop_Send();
  1085. //QD_Enable(0);
  1086. QD_Enable_From(0,1);
  1087. ADAS_Enable(0);
  1088. Enable_12V(0);
  1089. Set_Enter_Sleep_Delay();
  1090. #endif
  1091. }
  1092. work_normal = enable;
  1093. power_switch_from = from;
  1094. }
  1095. void Check_CB_Operate_State(void)
  1096. {
  1097. uint8_t temp_op = CB_MAX;
  1098. //if(Check_CB_oper_sta_start == 0)
  1099. // return;
  1100. if(!Sub_BMS_1_COM_Finish() || !Sub_BMS_2_COM_Finish())
  1101. return;
  1102. switch(cb_operate_state)
  1103. {
  1104. case CB_BAT_NO:
  1105. temp_op = Select_One_BAT();
  1106. break;
  1107. case CB_BAT1:
  1108. temp_op = Check_CB_BAT_1();
  1109. break;
  1110. case CB_BAT2:
  1111. temp_op = Check_CB_BAT_2();
  1112. break;
  1113. case CB_BAT1_BAT2_PARRALLEL:
  1114. temp_op = Check_CB_BAT1_BAT2_PARRALLEL();
  1115. break;
  1116. case CB_BAT1_BAT2_SERIES:
  1117. temp_op = Check_CB_BAT1_BAT2_SERIES();
  1118. /*if(temp_op != CB_MAX)
  1119. {
  1120. Next_Series_delay.set = 1;
  1121. Next_Series_delay.count = 0;
  1122. Next_Series_Not_Enable = 1;
  1123. }*/
  1124. break;
  1125. default:
  1126. return;
  1127. }
  1128. #if CONFIG_SOAK_ENABLE
  1129. if (Is_Soak()) {
  1130. temp_op = CB_BAT_NO;
  1131. }
  1132. #endif
  1133. if(temp_op >= CB_MAX)
  1134. {
  1135. //test-start
  1136. if(work_normal == 0)
  1137. {
  1138. Power_On_Normal(1,3);
  1139. }
  1140. //test-end
  1141. return;
  1142. }
  1143. else if(temp_op == CB_BAT_NO)
  1144. {
  1145. if(work_normal == 1)
  1146. {
  1147. Power_On_Normal(0,1);
  1148. }
  1149. }
  1150. else
  1151. {
  1152. /*if(work_normal == 1)
  1153. {
  1154. Power_On_Normal(0);
  1155. }*/
  1156. }
  1157. Battery_CB_Switch(temp_op);
  1158. }
  1159. uint8_t Is_BAT1_Lock(void)
  1160. {
  1161. return 0;
  1162. }
  1163. uint8_t Is_BAT2_Lock(void)
  1164. {
  1165. return 0;
  1166. }
  1167. void Charger_Out(void)
  1168. {
  1169. Set_Charger_In(0);
  1170. one_bat_charge_status = OBCS_CHARGER_OUT;
  1171. if(sub_bms_info_1.packet_common.m_percent >= 100 && sub_bms_info_2.packet_common.m_percent >= 100)
  1172. battery_charged_full = 1;
  1173. }
  1174. void Check_Charge_In(void)
  1175. {
  1176. if(sub_bms_info_1.packet_common.m_percent < 97 || sub_bms_info_2.packet_common.m_percent < 97)
  1177. battery_charged_full = 0;
  1178. //if(gpio_input_bit_get(GPIOC,GPIO_PIN_4) == 0)
  1179. {
  1180. // Set_Charger_In(1);
  1181. }
  1182. if(IS_CHARGE_IN())
  1183. {
  1184. if(is_intelligent)
  1185. {
  1186. CB_OPERATE_PRECEDENCE_PARRALLEL = PRE_PARRALLEL;
  1187. if(cb_operate_state == CB_BAT1_BAT2_SERIES)
  1188. {
  1189. if(Battery_Change_Mode(CFG_BAT1_BAT2_PARRALLEL) == CB_BAT1_BAT2_PARRALLEL)
  1190. CHARG_PROTECT_OPEN(1);
  1191. }
  1192. else
  1193. {
  1194. CHARG_PROTECT_OPEN(1);
  1195. if(cb_operate_state == CB_BAT1 || cb_operate_state == CB_BAT2)
  1196. {
  1197. if(one_bat_charge_status == OBCS_CHARGER_OUT)
  1198. one_bat_charge_status = OBCS_CHARGER_IN;
  1199. }
  1200. }
  1201. }
  1202. else
  1203. {
  1204. if(cb_operate_state == CB_BAT1_BAT2_SERIES)
  1205. {
  1206. ;
  1207. }
  1208. else
  1209. CHARG_PROTECT_OPEN(1);
  1210. }
  1211. if(IS_CHARGER_ON())
  1212. {
  1213. if(sub_bms_info_1.packet_common.charge_flag == 0 && sub_bms_info_2.packet_common.charge_flag == 0)
  1214. {
  1215. if(charge_delay.set == 0)
  1216. {
  1217. charge_delay.set = 1;
  1218. charge_delay.count = 0;
  1219. }
  1220. else
  1221. {
  1222. if(charge_delay.count >= CHARGE_DELAY_TIME_OUT_COUNT)
  1223. {
  1224. memset(&charge_delay,0x00,sizeof(charge_delay));
  1225. Charger_Out();
  1226. }
  1227. }
  1228. }
  1229. else
  1230. {
  1231. memset(&charge_delay,0x00,sizeof(charge_delay));
  1232. }
  1233. if(cb_operate_state == CB_BAT1_BAT2_PARRALLEL)
  1234. {
  1235. if(sub_bms_info_1.packet_common.charge_flag)
  1236. {
  1237. if((sub_bms_info_2.packet_common.work_status&ST_DISCHRG_CUR)!= 0)
  1238. {
  1239. if(sub_bms_info_1.packet_common.m_current + sub_bms_info_2.packet_common.m_current\
  1240. < 5000)
  1241. Charger_Out();
  1242. }
  1243. }
  1244. else if(sub_bms_info_2.packet_common.charge_flag)
  1245. {
  1246. if((sub_bms_info_1.packet_common.work_status&ST_DISCHRG_CUR)!= 0)
  1247. {
  1248. if(sub_bms_info_1.packet_common.m_current + sub_bms_info_2.packet_common.m_current\
  1249. < 5000)
  1250. Charger_Out();
  1251. }
  1252. }
  1253. }
  1254. }
  1255. }
  1256. else
  1257. {
  1258. CHARG_PROTECT_OPEN(0);
  1259. if(is_intelligent)
  1260. {
  1261. CB_OPERATE_PRECEDENCE_PARRALLEL = CB_OPERATE_PRECEDENCE_Config;
  1262. }
  1263. }
  1264. }
  1265. uint8_t Change_Mode_Sub_BMS_1_Normal(void)
  1266. {
  1267. return Is_Sub_BMS_1_Normal() == SHARK_BATT_EXIT_SUCCESS;
  1268. }
  1269. uint8_t Change_Mode_Sub_BMS_2_Normal(void)
  1270. {
  1271. return Is_Sub_BMS_2_Normal() == SHARK_BATT_EXIT_SUCCESS;
  1272. }
  1273. uint8_t Change_Mode_Sub_BMS_PARRALLEL(void)
  1274. {
  1275. int32_t delta_vol;
  1276. int32_t m_1_total_vol,m_2_total_vol;
  1277. //
  1278. if(cb_operate_state == CB_BAT_NO)
  1279. return 0;
  1280. if(is_intelligent && CB_OPERATE_PRECEDENCE_PARRALLEL != PRE_PARRALLEL)
  1281. return 0;
  1282. //
  1283. if(Is_Sub_BMS_1_Normal() == SHARK_BATT_EXIT_SUCCESS && Is_Sub_BMS_2_Normal() == SHARK_BATT_EXIT_SUCCESS)
  1284. ;
  1285. else
  1286. return 0;
  1287. m_1_total_vol = Battery_1_Bu_Chang_Vol();
  1288. m_2_total_vol = Battery_2_Bu_Chang_Vol();
  1289. if(m_1_total_vol >= m_2_total_vol)
  1290. {
  1291. delta_vol = m_1_total_vol - m_2_total_vol;
  1292. }
  1293. else
  1294. {
  1295. delta_vol = m_2_total_vol - m_1_total_vol;
  1296. }
  1297. if(delta_vol <= PARRALLEL_BL_DELTA_VOL)
  1298. return 1;
  1299. return 0;
  1300. }
  1301. uint8_t Change_Mode_Sub_BMS_SERIES(void)
  1302. {
  1303. int32_t m_1_total_vol,m_2_total_vol;
  1304. if (!shark_battery_series_enabled()) {
  1305. return 0;
  1306. }
  1307. //
  1308. if(!(cb_operate_state == CB_BAT1 || cb_operate_state == CB_BAT2))
  1309. return 0;
  1310. if(is_intelligent && CB_OPERATE_PRECEDENCE_PARRALLEL != PRE_SERIES)
  1311. return 0;
  1312. #ifdef HAN_GUO_VERSION
  1313. #else
  1314. if(serise_low_enable)
  1315. return 0;
  1316. #endif
  1317. if(IS_CHARGE_IN())
  1318. return 0;
  1319. if(!(Is_Sub_BMS_1_Normal() == SHARK_BATT_EXIT_SUCCESS && Is_Sub_BMS_2_Normal() == SHARK_BATT_EXIT_SUCCESS))
  1320. return 0;
  1321. /*if(cb_operate_state == CB_BAT1)
  1322. {
  1323. if((sub_bms_info_2.packet_common.bms_status & BMS_STA_S_BAHU) != 0)
  1324. {
  1325. return 0;
  1326. }
  1327. }
  1328. else if(cb_operate_state == CB_BAT2)
  1329. {
  1330. if((sub_bms_info_1.packet_common.bms_status & BMS_STA_S_BAHU) != 0)
  1331. {
  1332. return 0;
  1333. }
  1334. }*/
  1335. #ifdef HAN_GUO_VERSION
  1336. if(sub_bms_info_1.packet_common.m_percent < 2\
  1337. || sub_bms_info_2.packet_common.m_percent < 2)
  1338. return 0;
  1339. #else
  1340. if(Next_Series_Not_Enable)
  1341. return 0;
  1342. m_1_total_vol = Battery_1_Bu_Chang_Vol();
  1343. m_2_total_vol = Battery_2_Bu_Chang_Vol();
  1344. if(m_1_total_vol <= SERIES_PROTECT_VOL\
  1345. ||m_2_total_vol <= SERIES_PROTECT_VOL )
  1346. return 0;
  1347. if(sub_bms_info_1.packet_common.m_percent < SERIES_UNDER_XX_PERCENT\
  1348. || sub_bms_info_2.packet_common.m_percent < SERIES_UNDER_XX_PERCENT)
  1349. return 0;
  1350. #endif
  1351. return 1;
  1352. }
  1353. uint8_t Battery_Change_Mode(uint8_t cfg_mode)
  1354. {
  1355. uint8_t cb_operate = CB_MAX;
  1356. if(!work_normal)
  1357. return 0;
  1358. switch(cfg_mode)
  1359. {
  1360. case CFG_BAT_NO:
  1361. return 0;
  1362. case CFG_BAT1:
  1363. if(Change_Mode_Sub_BMS_1_Normal())
  1364. {
  1365. cb_operate = CB_BAT1;
  1366. }
  1367. break;
  1368. case CFG_BAT2:
  1369. if(Change_Mode_Sub_BMS_2_Normal())
  1370. {
  1371. cb_operate = CB_BAT2;
  1372. }
  1373. break;
  1374. case CFG_BAT1_BAT2_PARRALLEL:
  1375. if(Change_Mode_Sub_BMS_PARRALLEL())
  1376. {
  1377. cb_operate = CB_BAT1_BAT2_PARRALLEL;
  1378. }
  1379. break;
  1380. case CFG_BAT1_BAT2_SERIES:
  1381. if(Change_Mode_Sub_BMS_SERIES())
  1382. {
  1383. cb_operate = CB_BAT1_BAT2_SERIES;
  1384. }
  1385. break;
  1386. case CFG_MAX:
  1387. default:
  1388. return 0;
  1389. }
  1390. if(cb_operate >= CB_MAX)
  1391. return 0;
  1392. return Battery_CB_Switch(cb_operate);
  1393. }
  1394. void Intelligent_Management_Battery(void)
  1395. {
  1396. if(is_intelligent)
  1397. {
  1398. if(CB_OPERATE_PRECEDENCE_PARRALLEL == PRE_PARRALLEL)
  1399. {
  1400. if(cb_operate_state == CB_BAT1_BAT2_PARRALLEL)
  1401. return;
  1402. else if(Battery_Change_Mode(CFG_BAT1_BAT2_PARRALLEL) == CB_BAT1_BAT2_PARRALLEL)
  1403. return;
  1404. }
  1405. else
  1406. {
  1407. if(cb_operate_state == CB_BAT1_BAT2_SERIES)
  1408. return;
  1409. if(Battery_Change_Mode(CB_BAT1_BAT2_SERIES) == CB_BAT1_BAT2_SERIES)
  1410. return;
  1411. }
  1412. switch(cb_operate_state)
  1413. {
  1414. case CB_BAT1:
  1415. if(IS_CHARGER_ON())
  1416. {
  1417. if((sub_bms_info_1.packet_common.bms_status & BMS_STA_C_FULL) == BMS_STA_C_FULL)
  1418. {
  1419. Battery_Change_Mode(CFG_BAT2);
  1420. }
  1421. else
  1422. {
  1423. if(one_bat_charge_status == OBCS_CHARGER_IN)
  1424. {
  1425. if(Battery_2_Bu_Chang_Vol() < Battery_1_Bu_Chang_Vol())
  1426. {
  1427. Battery_Change_Mode(CFG_BAT2);
  1428. }
  1429. one_bat_charge_status = OBCS_CHARGER_CHECK_FINISH;
  1430. }
  1431. }
  1432. }
  1433. else
  1434. {
  1435. if((abs(sub_bms_info_1.packet_common.m_current) <= 1000)\
  1436. &&(Battery_2_Bu_Chang_Vol() > Battery_1_Bu_Chang_Vol()+ONE_BATTERY_DELTA_VOL))
  1437. {
  1438. Battery_Change_Mode(CFG_BAT2);
  1439. }
  1440. }
  1441. break;
  1442. case CB_BAT2:
  1443. if(IS_CHARGER_ON())
  1444. {
  1445. if((sub_bms_info_2.packet_common.bms_status & BMS_STA_C_FULL) == BMS_STA_C_FULL)
  1446. {
  1447. Battery_Change_Mode(CFG_BAT1);
  1448. }
  1449. else
  1450. {
  1451. if(one_bat_charge_status == OBCS_CHARGER_IN)
  1452. {
  1453. if(Battery_1_Bu_Chang_Vol() < Battery_2_Bu_Chang_Vol())
  1454. {
  1455. Battery_Change_Mode(CFG_BAT1);
  1456. }
  1457. one_bat_charge_status = OBCS_CHARGER_CHECK_FINISH;
  1458. }
  1459. }
  1460. }
  1461. else
  1462. {
  1463. if((abs(sub_bms_info_2.packet_common.m_current) <= 1000)\
  1464. &&(Battery_1_Bu_Chang_Vol() > Battery_2_Bu_Chang_Vol()+ONE_BATTERY_DELTA_VOL))
  1465. {
  1466. Battery_Change_Mode(CFG_BAT1);
  1467. }
  1468. }
  1469. break;
  1470. case CB_BAT_NO:
  1471. case CB_BAT1_BAT2_SERIES:
  1472. default:
  1473. break;
  1474. }
  1475. }
  1476. }
  1477. void Check_Battery_Small_Current(void)
  1478. {
  1479. switch(cb_operate_state)
  1480. {
  1481. case CB_BAT1:
  1482. if((sub_bms_info_2.packet_common.bms_status & BMS_STA_S_OPEN) == BMS_STA_S_OPEN)
  1483. {
  1484. sub_bms_info_2.sub_bms_cmd.operate = OP_OPEN_FET;
  1485. sub_bms_info_2.sub_bms_cmd.param = 0x00;
  1486. }
  1487. break;
  1488. case CB_BAT2:
  1489. if((sub_bms_info_1.packet_common.bms_status & BMS_STA_S_OPEN) == BMS_STA_S_OPEN)
  1490. {
  1491. sub_bms_info_1.sub_bms_cmd.operate = OP_OPEN_FET;
  1492. sub_bms_info_1.sub_bms_cmd.param = 0x00;
  1493. }
  1494. break;
  1495. case CB_BAT_NO:
  1496. case CB_BAT1_BAT2_PARRALLEL:
  1497. case CB_BAT1_BAT2_SERIES:
  1498. default:
  1499. break;
  1500. }
  1501. }
  1502. void Save_Neng_Hao_Bi(uint8_t *data,uint16_t len)
  1503. {
  1504. uint32_t capacity = (REG32(0x1FFFF7E0) & 0xFFFF) << 10;
  1505. uint32_t address = 0x08000000 + (capacity - SYLC_FLASH_ADDRESS);
  1506. uint8_t i = 0;
  1507. uint32_t df_value = 0x0325;
  1508. fmc_unlock();
  1509. Flash_flag_clear();
  1510. fmc_page_erase(address);
  1511. Flash_flag_clear();
  1512. fmc_lock();
  1513. fmc_unlock();
  1514. i = 0;
  1515. while(i<len)
  1516. {
  1517. memcpy(&df_value,&data[i],4);
  1518. fmc_word_program(address + i,df_value);
  1519. Flash_flag_clear();
  1520. i+= 4;
  1521. }
  1522. fmc_lock();
  1523. }
  1524. void Save_Param_Time_Out(void)
  1525. {
  1526. if(save_param_delay.set)
  1527. {
  1528. save_param_delay.count++;
  1529. if(save_param_delay.count > 600)
  1530. {
  1531. save_param_delay.count = 0;
  1532. g_event |= SAVE_PARAM_EVENT;
  1533. }
  1534. }
  1535. }
  1536. void Initial_Neng_Hao_Bi(void)
  1537. {
  1538. uint32_t capacity = (REG32(0x1FFFF7E0) & 0xFFFF) << 10;
  1539. uint32_t address = 0x08000000 + (capacity - SYLC_FLASH_ADDRESS);
  1540. SYLC_SAVE_PARM *sylc_temp = (SYLC_SAVE_PARM *)address;
  1541. memset(&sheng_yu_li_cheng,0x00,sizeof(sheng_yu_li_cheng));
  1542. if(sylc_temp->sy_valid_flag != SY_VALID_FLAG_KEY)
  1543. {
  1544. sheng_yu_li_cheng.sy_ss_parm.sy_valid_flag = SY_VALID_FLAG_KEY;
  1545. sheng_yu_li_cheng.sy_ss_parm.neng_hao_bi = nhb_default;
  1546. Save_Neng_Hao_Bi((uint8_t *)&sheng_yu_li_cheng.sy_ss_parm,sizeof(sheng_yu_li_cheng.sy_ss_parm));
  1547. }
  1548. else
  1549. {
  1550. sheng_yu_li_cheng.sy_ss_parm = *sylc_temp;
  1551. if(sheng_yu_li_cheng.sy_ss_parm.neng_hao_bi < NENG_HAO_BI_MIN)
  1552. {
  1553. sheng_yu_li_cheng.sy_ss_parm.neng_hao_bi = NENG_HAO_BI_MIN;
  1554. Save_Neng_Hao_Bi((uint8_t *)&sheng_yu_li_cheng.sy_ss_parm,sizeof(sheng_yu_li_cheng.sy_ss_parm));
  1555. }
  1556. if(sheng_yu_li_cheng.sy_ss_parm.neng_hao_bi > NENG_HAO_BI_MAX)
  1557. {
  1558. sheng_yu_li_cheng.sy_ss_parm.neng_hao_bi = NENG_HAO_BI_MAX;
  1559. Save_Neng_Hao_Bi((uint8_t *)&sheng_yu_li_cheng.sy_ss_parm,sizeof(sheng_yu_li_cheng.sy_ss_parm));
  1560. }
  1561. }
  1562. save_param_delay.set = 1;
  1563. save_param_delay.count = 0;
  1564. }
  1565. extern uint8_t Get_QD_State(void);
  1566. uint8_t Reset_Cal(void)
  1567. {
  1568. if(Get_QD_State() == 0)
  1569. return 1;
  1570. if(sheng_yu_li_cheng.sy_dan_ci_li_cheng_temp < sheng_yu_li_cheng.sy_dan_ci_li_cheng)
  1571. return 1;
  1572. if(sheng_yu_li_cheng.sy_percent_dlta && sheng_yu_li_cheng.sy_dan_ci_li_cheng <= 50)
  1573. return 1;
  1574. return 0;
  1575. }
  1576. void Cal_Sheng_Yu_Li_Cheng(void)
  1577. {
  1578. uint8_t dlta = 0;
  1579. uint32_t lc_temp;
  1580. if(Reset_Cal())
  1581. {
  1582. sheng_yu_li_cheng.sy_percent_1 = sub_bms_info_1.packet_common.m_percent;
  1583. sheng_yu_li_cheng.sy_percent_2 = sub_bms_info_2.packet_common.m_percent;
  1584. sheng_yu_li_cheng.sy_percent_dlta = 0;
  1585. //Left_Light_Enable(1);
  1586. }
  1587. sheng_yu_li_cheng.sy_dan_ci_li_cheng = sheng_yu_li_cheng.sy_dan_ci_li_cheng_temp;
  1588. if(sub_bms_info_1.rs485_connect && sub_bms_info_1.packet_common.m_percent != 0)
  1589. {
  1590. if(sheng_yu_li_cheng.sy_percent_1 > sub_bms_info_1.packet_common.m_percent)
  1591. {
  1592. dlta = sheng_yu_li_cheng.sy_percent_1 - sub_bms_info_1.packet_common.m_percent;
  1593. sheng_yu_li_cheng.sy_percent_dlta += dlta;
  1594. }
  1595. }
  1596. sheng_yu_li_cheng.sy_percent_1 = sub_bms_info_1.packet_common.m_percent;
  1597. if(sub_bms_info_2.rs485_connect && sub_bms_info_2.packet_common.m_percent != 0)
  1598. {
  1599. if(sheng_yu_li_cheng.sy_percent_2 > sub_bms_info_2.packet_common.m_percent)
  1600. {
  1601. dlta = sheng_yu_li_cheng.sy_percent_2 - sub_bms_info_2.packet_common.m_percent;
  1602. sheng_yu_li_cheng.sy_percent_dlta += dlta;
  1603. }
  1604. }
  1605. sheng_yu_li_cheng.sy_percent_2 = sub_bms_info_2.packet_common.m_percent;
  1606. sheng_yu_li_cheng.sy_percent_total = sub_bms_info_1.packet_common.m_percent + sub_bms_info_2.packet_common.m_percent;
  1607. if(dlta && sheng_yu_li_cheng.sy_percent_dlta >= 7 && sheng_yu_li_cheng.sy_dan_ci_li_cheng > 700 )
  1608. {
  1609. double nhb_temp = (double)(sheng_yu_li_cheng.sy_dan_ci_li_cheng)/sheng_yu_li_cheng.sy_percent_dlta;
  1610. if(nhb_temp < NENG_HAO_BI_MIN)
  1611. nhb_temp = NENG_HAO_BI_MIN;
  1612. if(nhb_temp > NENG_HAO_BI_MAX)
  1613. nhb_temp = NENG_HAO_BI_MAX;
  1614. sheng_yu_li_cheng.sy_ss_parm.neng_hao_bi = sheng_yu_li_cheng.sy_ss_parm.neng_hao_bi*0.8 + nhb_temp*0.2;
  1615. }
  1616. else
  1617. {
  1618. }
  1619. lc_temp = (uint32_t)(sheng_yu_li_cheng.sy_percent_total*sheng_yu_li_cheng.sy_ss_parm.neng_hao_bi/1000);
  1620. if(lc_temp > 200)
  1621. lc_temp = 200;
  1622. #if 0
  1623. //bang zi ce shi start
  1624. sheng_yu_li_cheng.sy_yu_ji_ke_xing_shi_li_cheng = (uint8_t)(lc_temp*2);
  1625. //bang zi ce shi end
  1626. #else
  1627. sheng_yu_li_cheng.sy_yu_ji_ke_xing_shi_li_cheng = (uint8_t)lc_temp;
  1628. #endif
  1629. if(sheng_yu_li_cheng.sy_yu_ji_ke_xing_shi_li_cheng == 0\
  1630. || (sub_bms_info_1.packet_common.bms_status & BMS_STA_JIAO_YAN)\
  1631. || (sub_bms_info_2.packet_common.bms_status & BMS_STA_JIAO_YAN))
  1632. {
  1633. sheng_yu_li_cheng.sy_yu_ji_ke_xing_shi_li_cheng = sub_bms_info_1.packet_common.yjkxslc\
  1634. + sub_bms_info_2.packet_common.yjkxslc;
  1635. }
  1636. }
  1637. void Save_Param(void)
  1638. {
  1639. Save_Neng_Hao_Bi((uint8_t *)&sheng_yu_li_cheng.sy_ss_parm,sizeof(sheng_yu_li_cheng.sy_ss_parm));
  1640. }