mc0051gs_comm.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548
  1. #include "mc0051gs.h"
  2. #include "plt.h"
  3. static void mc0051gs_comm_0xA30B(int idx)
  4. {
  5. unsigned short tab_us[128] = {0};
  6. struct mc0051gs_t *dev = &mc0051gs[idx];
  7. struct comm_t *comm = &dev->comm;
  8. int chanidx = comm->chanidx;
  9. int addr = comm->adr;
  10. int start, nb, rc, i;
  11. int ret = 0;
  12. if (comm_get_state(comm) != COMMST_NORMAL)
  13. {
  14. return;
  15. }
  16. nb = 2;
  17. start = 0x0400;
  18. chan_lock(chanidx);
  19. rc = chan_read_holdingregisters_with_retry(chanidx, addr, start, nb, tab_us);
  20. chan_unlock(chanidx);
  21. if (rc < 0)
  22. {
  23. comm_set_state(comm, COMMST_ERR);
  24. return;
  25. }
  26. else if (rc == 0)
  27. { /* read ok */
  28. const int started_idx = (0x0400 - 0x0400);
  29. const int runMode_idx = (0x0401 - 0x0400);
  30. const int ctlMode_idx = (0x0402 - 0x0400);
  31. dev->started = (int)(tab_us[started_idx]);
  32. dev->runMode = (int)(tab_us[runMode_idx]);
  33. dev->ctlMode = (int)(tab_us[ctlMode_idx]);
  34. if (dev->runMode == 0)
  35. {
  36. sprintf(dev->sys_run_mode_set, "%s", "stop");
  37. }
  38. else if (dev->runMode == 1)
  39. {
  40. sprintf(dev->sys_run_mode_set, "%s", "loop");
  41. }
  42. else if (dev->runMode == 2)
  43. {
  44. sprintf(dev->sys_run_mode_set, "%s", "cool");
  45. }
  46. else if (dev->runMode == 3)
  47. {
  48. sprintf(dev->sys_run_mode_set, "%s", "heat");
  49. }
  50. else if (dev->runMode == 4)
  51. {
  52. sprintf(dev->sys_run_mode_set, "%s", "auto");
  53. }
  54. if (dev->ctlMode == 0)
  55. {
  56. sprintf(dev->ctrMode_str, "%s", "Cell temp");
  57. }
  58. else if (dev->ctlMode == 1)
  59. {
  60. sprintf(dev->ctrMode_str, "%s", "out temp");
  61. }
  62. else if (dev->ctlMode == 2)
  63. {
  64. sprintf(dev->ctrMode_str, "%s", "in temp");
  65. }
  66. }
  67. nb = 4;
  68. start = 0xA30B;
  69. chan_lock(chanidx);
  70. rc = chan_read_holdingregisters_with_retry(chanidx, addr, start, nb, tab_us);
  71. chan_unlock(chanidx);
  72. if (rc < 0)
  73. {
  74. comm_set_state(comm, COMMST_ERR);
  75. return;
  76. }
  77. else if (rc == 0)
  78. { /* read ok */
  79. dev->cellt_max = tab_us[0xA30B - start] / 10.0;
  80. dev->cellt_min = tab_us[0xA30C - start] / 10.0;
  81. dev->cellt_ave = tab_us[0xA30D - start] / 10.0;
  82. dev->cell_run = tab_us[0xA30E - start];
  83. if (dev->cell_run == 0)
  84. {
  85. sprintf(dev->cell_run_str, "%s", "not run");
  86. }
  87. else if (dev->cell_run == 1)
  88. {
  89. sprintf(dev->cell_run_str, "%s", "running");
  90. }
  91. else
  92. {
  93. sprintf(dev->cell_run_str, "%s", "unknown");
  94. }
  95. }
  96. }
  97. static void mc0051gs_comm_0xE600(int idx)
  98. {
  99. unsigned short tab_us[128] = {0};
  100. struct mc0051gs_t *dev = &mc0051gs[idx];
  101. struct comm_t *comm = &dev->comm;
  102. int chanidx = comm->chanidx;
  103. int addr = comm->adr;
  104. int start, nb, rc, i;
  105. int ret = 0;
  106. if (comm_get_state(comm) != COMMST_NORMAL)
  107. {
  108. return;
  109. }
  110. // start = 0xE600;
  111. // chan_lock(chanidx);
  112. // usleep(100000); // 100ms
  113. // rc = chan_write_single_register_with_retry(chanidx, addr, start, 220); // 制冷点先默认22
  114. // chan_unlock(chanidx);
  115. // if (rc < 0)
  116. // {
  117. // comm_set_state(comm, COMMST_ERR);
  118. // return;
  119. // }
  120. // start = 0xE602;
  121. // chan_lock(chanidx);
  122. // usleep(100000);
  123. // rc = chan_write_single_register_with_retry(chanidx, addr, start, 50); // 制冷回差默认5
  124. // chan_unlock(chanidx);
  125. // if (rc < 0)
  126. // {
  127. // comm_set_state(comm, COMMST_ERR);
  128. // return;
  129. // }
  130. chan_lock(comm->chanidx);
  131. rc = chan_read_holdingregisters_with_retry(comm->chanidx, comm->adr, 0x0400, 1, tab_us);
  132. chan_unlock(comm->chanidx);
  133. if (rc < 0)
  134. {
  135. comm_set_state(comm, COMMST_ERR);
  136. return;
  137. }
  138. else
  139. {
  140. dev->started = tab_us[0];
  141. }
  142. nb = 19;
  143. start = 0xE600;
  144. chan_lock(chanidx);
  145. rc = chan_read_holdingregisters_with_retry(chanidx, addr, start, nb, tab_us);
  146. chan_unlock(chanidx);
  147. if (rc < 0)
  148. {
  149. comm_set_state(comm, COMMST_ERR);
  150. return;
  151. }
  152. else if (rc == 0)
  153. { /* read ok */
  154. dev->cool_temp = *((signed short *)&tab_us[0xE600 - start]) / 10.0;
  155. dev->heat_temp = *((signed short *)&tab_us[0xE601 - start]) / 10.0;
  156. dev->cool_gap_temp = tab_us[0xE602 - start] / 10.0;
  157. dev->heat_gap_temp = tab_us[0xE603 - start] / 10.0;
  158. dev->pump_gear = tab_us[0xE604 - start]; /*水泵档位*/
  159. dev->adr = tab_us[0xE605 - start];
  160. if (tab_us[0xE606 - start] == 2)
  161. {
  162. dev->baud = 4800;
  163. }
  164. else if (tab_us[0xE606 - start] == 3)
  165. {
  166. dev->baud = 9600;
  167. }
  168. else if (tab_us[0xE606 - start] == 4)
  169. {
  170. dev->baud = 19200;
  171. }
  172. else if (tab_us[0xE606 - start] == 5)
  173. {
  174. dev->baud = 38400;
  175. }
  176. else if (tab_us[0xE606 - start] == 6)
  177. {
  178. dev->baud = 57600;
  179. }
  180. else
  181. {
  182. dev->baud = 0;
  183. }
  184. dev->comp_gear = tab_us[0xE608 - start]; /*压缩机档位*/
  185. dev->cool_cell_temp = tab_us[0xE60C - start] / 10.0; /*cell is working*/
  186. dev->cool_stop_cell_temp = tab_us[0xE60D - start] / 10.0; /*cell is working*/
  187. dev->heat_cell_temp = tab_us[0xE60E - start] / 10.0; /*cell is working*/
  188. dev->heat_stop_cell_temp = tab_us[0xE60F - start] / 10.0; /*cell is working*/
  189. dev->cool_gap_cell_temp_noworking = tab_us[0xE610 - start] / 10.0; /*在电池非运行状态时,制冷开启温度= 电芯温度制冷点+ 电池非运行模式制冷偏差温度*/
  190. dev->cell_self_cycle_start_diff_temp = tab_us[0xE611 - start] / 10.0; /*电芯温度自循环启动差*/
  191. dev->cell_self_cycle_stop_diff_temp = tab_us[0xE612 - start] / 10.0; /*电芯温度自循环启动差*/
  192. }
  193. }
  194. static void mc0051gs_comm_0xE700(int idx)
  195. {
  196. unsigned short tab_us[128] = {0};
  197. struct mc0051gs_t *dev = &mc0051gs[idx];
  198. struct comm_t *comm = &dev->comm;
  199. int chanidx = comm->chanidx;
  200. int addr = comm->adr;
  201. int start, nb, rc, i;
  202. int ret = 0;
  203. int temp = 0;
  204. if (comm_get_state(comm) != COMMST_NORMAL)
  205. {
  206. return;
  207. }
  208. nb = 72;
  209. start = 0xE700;
  210. chan_lock(chanidx);
  211. rc = chan_read_holdingregisters_with_retry(chanidx, addr, start, nb, tab_us);
  212. chan_unlock(chanidx);
  213. if (rc < 0)
  214. {
  215. comm_set_state(comm, COMMST_ERR);
  216. return;
  217. }
  218. else if (rc == 0)
  219. { /* read ok */
  220. dev->out_water_temp = tab_us[0xE700 - start] / 10.0;
  221. dev->in_water_temp = tab_us[0xE701 - start] / 10.0;
  222. dev->out_air_temp = tab_us[0xE702 - start] / 10.0;
  223. dev->ev_temp = tab_us[0xE703 - start] / 10.0;
  224. dev->in_water_press = tab_us[0xE704 - start] / 100.0;
  225. dev->out_water_press = tab_us[0xE705 - start] / 100.0;
  226. dev->out_water_high_temp_alarm = tab_us[0xE706 - start]; /*0 正常,1 告警,255告警未使能*/
  227. dev->out_water_low_temp_alarm = tab_us[0xE707 - start]; /*0 正常,1 告警,255告警未使能*/
  228. dev->out_temp_sensor_alarm = tab_us[0xE708 - start]; /*0 正常,1 告警,255告警未使能*/
  229. dev->in_temp_sensor_alarm = tab_us[0xE709 - start]; /*0 正常,1 告警,255告警未使能*/
  230. dev->pump_comm_alarm = tab_us[0xE70A - start]; /*0 正常,1 告警,255告警未使能*/
  231. dev->VFD_comm_alarm = tab_us[0xE70B - start]; /*0 正常,1 告警,255告警未使能*/
  232. dev->sys_high_voltage_lock = tab_us[0xE70C - start]; /*0 正常,1 锁定,255告警未使能*/
  233. dev->sys_low_voltage_lock = tab_us[0xE70D - start]; /*0 正常,1 锁定,255告警未使能*/
  234. dev->air_out_over_temp_lock = tab_us[0xE70E - start]; /*0 正常,1 锁定,255告警未使能*/
  235. dev->VFD_oc_lock = tab_us[0xE70F - start]; /*0 正常,1 锁定,255告警未使能*/
  236. dev->VFD_ot_lock = tab_us[0xE710 - start]; /*0 正常,1 锁定,255告警未使能*/
  237. dev->VFD_over_fre_lock = tab_us[0xE711 - start]; /*0 正常,1 锁定,255告警未使能*/
  238. dev->VFD_under_fre_lock = tab_us[0xE712 - start]; /*0 正常,1 锁定,255告警未使能*/
  239. dev->VFD_phase_lost_lock = tab_us[0xE713 - start]; /*0 正常,1 锁定,255告警未使能*/
  240. dev->VFD_other_fault_lock = tab_us[0xE714 - start]; /*0 正常,1 锁定,255告警未使能*/
  241. dev->alarm_level = tab_us[0xE715 - start];
  242. if (dev->alarm_level == 0)
  243. {
  244. sprintf(dev->alarm_level_str, "%s", "no alarm");
  245. }
  246. else if (dev->alarm_level == 1)
  247. {
  248. sprintf(dev->alarm_level_str, "%s", "serious alarm");
  249. }
  250. else if (dev->alarm_level == 2)
  251. {
  252. sprintf(dev->alarm_level_str, "%s", "secondary alarm");
  253. }
  254. else if (dev->alarm_level == 3)
  255. {
  256. sprintf(dev->alarm_level_str, "%s", "commonly alarm");
  257. }
  258. else
  259. {
  260. sprintf(dev->alarm_level_str, "%s", "unkown alarm");
  261. }
  262. dev->elc_heat_state = tab_us[0xE716 - start];
  263. dev->lack_liquid_alarm = tab_us[0xE717 - start]; /*0 正常,1 告警,255告警未使能*/
  264. dev->sys_pree_high_alarm = tab_us[0xE718 - start]; /*0 正常,1 告警,255告警未使能*/
  265. dev->out_water_press_high_alarm = tab_us[0xE719 - start]; /*0 正常,1 告警,255告警未使能*/
  266. dev->pump_speed = tab_us[0xE71A - start] / 10.0;
  267. dev->pump_state = tab_us[0xE71B - start];
  268. dev->heart = tab_us[0xE71C - start];
  269. dev->comp_state = tab_us[0xE71D - start];
  270. temp = tab_us[0xE721 - start];
  271. temp = (temp << 16) + tab_us[0xE720 - start];
  272. dev->comp_run_time = temp;
  273. temp = tab_us[0xE723 - start];
  274. temp = (temp << 16) + tab_us[0xE722 - start];
  275. dev->comp_start_times = temp;
  276. temp = tab_us[0xE725 - start];
  277. temp = (temp << 16) + tab_us[0xE724 - start];
  278. dev->elc_heat_run_time = temp;
  279. temp = tab_us[0xE727 - start];
  280. temp = (temp << 16) + tab_us[0xE726 - start];
  281. dev->elc_heat_start_times = temp;
  282. temp = tab_us[0xE729 - start];
  283. temp = (temp << 16) + tab_us[0xE728 - start];
  284. dev->pump_run_time = temp;
  285. temp = tab_us[0xE72B - start];
  286. temp = (temp << 16) + tab_us[0xE72A - start];
  287. dev->pump_start_times = temp;
  288. temp = tab_us[0xE72D - start];
  289. temp = (temp << 16) + tab_us[0xE72C - start];
  290. dev->outfan_run_time = temp;
  291. temp = tab_us[0xE72F - start];
  292. temp = (temp << 16) + tab_us[0xE72E - start];
  293. dev->outfan_start_times = temp;
  294. dev->sys_run_state = tab_us[0xE730 - start];
  295. if (dev->sys_run_state == 0)
  296. {
  297. sprintf(dev->sys_run_state_str, "%s", "stop");
  298. }
  299. else if (dev->sys_run_state == 1)
  300. {
  301. sprintf(dev->sys_run_state_str, "%s", "Internal circulation");
  302. }
  303. else if (dev->sys_run_state == 2)
  304. {
  305. sprintf(dev->sys_run_state_str, "%s", "cooling");
  306. }
  307. else if (dev->sys_run_state == 3)
  308. {
  309. sprintf(dev->sys_run_state_str, "%s", "heating");
  310. }
  311. else
  312. {
  313. }
  314. dev->pump_fault = tab_us[0xE735 - start];
  315. dev->fan_drive_fault = tab_us[0xE736 - start];
  316. dev->fan_drive_comm_fault = tab_us[0xE737 - start];
  317. dev->upper_computer_comm_fault = tab_us[0xE738 - start];
  318. dev->cellt_max_comm_fault = tab_us[0xE739 - start];
  319. dev->cellt_min_comm_fault = tab_us[0xE740 - start];
  320. dev->cellt_ave_comm_fault = tab_us[0xE741 - start];
  321. dev->water_over_press = tab_us[0xE742 - start] / 10.0;
  322. dev->water_under_press = tab_us[0xE743 - start] / 10.0;
  323. dev->in_water_over_press_fault = tab_us[0xE744 - start];
  324. dev->in_water_under_press_fault = tab_us[0xE745 - start];
  325. dev->out_water_over_press_fault = tab_us[0xE746 - start];
  326. dev->out_water_under_press_fault = tab_us[0xE747 - start];
  327. }
  328. else
  329. {
  330. return;
  331. }
  332. }
  333. int mc0051gs_comm_init(int idx)
  334. {
  335. struct mc0051gs_t *dev = &mc0051gs[idx];
  336. struct comm_t *comm = &dev->comm;
  337. comm_set_state(comm, COMMST_ERR);
  338. }
  339. int mc0051gs_comm_reset(int idx)
  340. {
  341. struct mc0051gs_t *dev = &mc0051gs[idx];
  342. struct comm_t *comm = &dev->comm;
  343. comm_reset(comm);
  344. // comm_set_state( comm, COMMST_NORMAL );
  345. }
  346. int write_single_register(int idx, int regaddr, int value)
  347. {
  348. int ret = 0;
  349. struct mc0051gs_t *dev = &mc0051gs[idx];
  350. struct comm_t *comm = &dev->comm;
  351. chan_lock(comm->chanidx);
  352. ret = chan_write_single_register_with_retry(comm->chanidx, comm->adr, regaddr, value);
  353. chan_unlock(comm->chanidx);
  354. // log_dbg("%s, idx:%d, val:%d, ret:%d", __func__, idx, value, ret);
  355. return ret;
  356. }
  357. int mc0051gs_set_dev_start(int idx)
  358. {
  359. return write_single_register(idx, 0x0400, 1);
  360. }
  361. int mc0051gs_set_dev_stop(int idx)
  362. {
  363. return write_single_register(idx, 0x0400, 0);
  364. }
  365. int mc0051gs_set_dev_mbadr(int idx, int val)
  366. {
  367. return write_single_register(idx, 0x0007, val);
  368. }
  369. int mc0051gs_set_run_mode(int idx, int mode)
  370. {
  371. return write_single_register(idx, 0x0401, mode);
  372. }
  373. int mc0051gs_set_ctl_mode(int idx, int mode)
  374. {
  375. if (mode == 0) // 电芯温度控制
  376. {
  377. mc0051gs_set_cool_start_temp_cellmode(idx, 25);
  378. mc0051gs_set_cool_stop_temp_cellmode(idx, 21);
  379. mc0051gs_set_heat_start_temp_cellmode(idx, 15);
  380. mc0051gs_set_heat_stop_temp_cellmode(idx, 24);
  381. }
  382. else if (mode == 1 || mode == 2)
  383. {
  384. static double cool_set = 22, hot_set = 20;
  385. if (pack_get_cell_t_max() >= 25 && pack_get_cell_t_min() >= 22)
  386. {
  387. cool_set = mc0051gs[1].out_water_temp - 4;
  388. log_dbg("cool_set:%f", cool_set);
  389. }
  390. else if (pack_get_cell_t_min() <= 20 && pack_get_cell_t_max() <= 22)
  391. {
  392. hot_set = mc0051gs[1].out_water_temp + 6;
  393. log_dbg("hot_set:%f", hot_set);
  394. }
  395. else
  396. {
  397. cool_set = 22;
  398. hot_set = 20;
  399. log_dbg("hot_set:%f, cool_set:%f", hot_set, cool_set);
  400. }
  401. if (cool_set < hot_set)
  402. {
  403. hot_set = cool_set - 2;
  404. }
  405. mc0051gs_set_cool_temp(idx, cool_set);
  406. mc0051gs_set_cool_gap_temp(idx, 2);
  407. mc0051gs_set_heat_temp(idx, hot_set);
  408. mc0051gs_set_heat_gap_temp(idx, 2);
  409. }
  410. else
  411. {
  412. return -1;
  413. }
  414. return write_single_register(idx, 0x0402, mode);
  415. }
  416. int mc0051gs_set_cellt_max(int idx, double temp)
  417. {
  418. return write_single_register(idx, 0xA30B, (int)(temp * 10));
  419. }
  420. int mc0051gs_set_cellt_min(int idx, double temp)
  421. {
  422. return write_single_register(idx, 0xA30C, (int)(temp * 10));
  423. }
  424. int mc0051gs_set_cellt_avg(int idx, double temp)
  425. {
  426. return write_single_register(idx, 0xA30D, (int)(temp * 10));
  427. }
  428. int mc0051gs_set_cellt_running(int idx, int working)
  429. {
  430. return write_single_register(idx, 0xA30E, working);
  431. }
  432. int mc0051gs_set_cool_temp(int idx, int val)
  433. {
  434. return write_single_register(idx, 0xE600, val * 10);
  435. }
  436. int mc0051gs_set_heat_temp(int idx, int val)
  437. {
  438. return write_single_register(idx, 0xE601, val * 10);
  439. }
  440. int mc0051gs_set_cool_gap_temp(int idx, int val)
  441. {
  442. return write_single_register(idx, 0xE602, val * 10);
  443. }
  444. int mc0051gs_set_heat_gap_temp(int idx, int val)
  445. {
  446. return write_single_register(idx, 0xE603, val * 10);
  447. }
  448. int mc0051gs_set_pump_gear(int idx, int val)
  449. {
  450. return write_single_register(idx, 0xE604, val * 10);
  451. }
  452. int mc0051gs_set_comp_gear(int idx, int val)
  453. {
  454. return write_single_register(idx, 0xE608, val);
  455. }
  456. int mc0051gs_set_cool_start_temp_cellmode(int idx, int val)
  457. {
  458. return write_single_register(idx, 0xE60C, val * 10);
  459. }
  460. int mc0051gs_set_cool_stop_temp_cellmode(int idx, int val)
  461. {
  462. return write_single_register(idx, 0xE60D, val * 10);
  463. }
  464. int mc0051gs_set_heat_start_temp_cellmode(int idx, int val)
  465. {
  466. return write_single_register(idx, 0xE60E, val * 10);
  467. }
  468. int mc0051gs_set_heat_stop_temp_cellmode(int idx, int val)
  469. {
  470. return write_single_register(idx, 0xE60F, val * 10);
  471. }
  472. void mc0051gs_comm_dac(int idx)
  473. {
  474. struct mc0051gs_t *dev = &mc0051gs[idx];
  475. struct comm_t *comm = &dev->comm;
  476. int ret = 0;
  477. if (comm_get_state(comm) != COMMST_NORMAL)
  478. {
  479. return;
  480. }
  481. comm_start_cal_dac_timing(comm);
  482. if (comm_get_dac_param_en(comm) == 1)
  483. {
  484. comm_set_dac_param_en(comm, 0);
  485. mc0051gs_set_run_mode(idx, 4); // 自动
  486. }
  487. // 设定空调运行模式和温度控制模式
  488. mc0051gs_set_ctl_mode(idx, 1); // 电芯温度控制
  489. mc0051gs_comm_0xA30B(idx);
  490. mc0051gs_comm_0xE600(idx);
  491. mc0051gs_comm_0xE700(idx);
  492. comm_stop_cal_dac_timing(comm);
  493. }