mc0051gs.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387
  1. #include "mc0051gs.h"
  2. #include "mc0051gs_comm.h"
  3. #include "mc0051gs_sm.h"
  4. #include "plt.h"
  5. int mc0051gs_nbr;
  6. struct mc0051gs_t mc0051gs[MC0051GS_NBR_MAX + 1];
  7. int mc0051gs_send_sm_cmd(int idx, int cmd)
  8. {
  9. int ret = 0;
  10. struct mc0051gs_t *dev = &mc0051gs[idx];
  11. dev->cmd = cmd;
  12. log_dbg("%s, idx:%d, cmd:%d, ret:%d", __func__, idx, cmd, ret);
  13. return ret;
  14. }
  15. int mc0051gs_send_sm_cmd_all(int cmd)
  16. {
  17. int ret = 0;
  18. int idx;
  19. struct mc0051gs_t *dev = NULL;
  20. for (idx = 1; idx <= mc0051gs_nbr; idx++)
  21. {
  22. mc0051gs_send_sm_cmd(idx, cmd);
  23. }
  24. return ret;
  25. }
  26. int mc0051gs_chk_state_all(int stat)
  27. {
  28. int idx;
  29. for (idx = 1; idx <= mc0051gs_nbr; idx++)
  30. {
  31. if (mc0051gs_get_state(idx) != stat)
  32. {
  33. return -1;
  34. }
  35. }
  36. return 0;
  37. }
  38. int mc0051gs_get_cmd(int idx)
  39. {
  40. return mc0051gs[idx].cmd;
  41. }
  42. void mc0051gs_reset_cmd(int idx)
  43. {
  44. mc0051gs[idx].cmd = CMD_SM_DONE;
  45. }
  46. int mc0051gs_get_state(int idx)
  47. {
  48. return mc0051gs[idx].sm.state;
  49. }
  50. int mc0051gs_aux(int idx)
  51. {
  52. static int cnt = 0;
  53. if (cnt < mc0051gs_nbr && mqtt_get_state() == SMST_READY)
  54. {
  55. if (idx == mc0051gs_nbr)
  56. {
  57. cloud.ac_init = 0;
  58. }
  59. char buf[4096] = {0};
  60. mc0051gs_get_init_data(ctn_get_idx_in_ess(), idx, buf);
  61. cloud_send_init(buf);
  62. cnt++;
  63. }
  64. }
  65. static void *mc0051gs_thrd_main(void *param)
  66. {
  67. struct mc0051gs_t *dev = NULL;
  68. int idx;
  69. log_dbg("%s, ++", __func__);
  70. for (idx = 1; idx <= mc0051gs_nbr; idx++)
  71. {
  72. mc0051gs_sm_init(idx);
  73. mc0051gs_comm_init(idx);
  74. mc0051gs_aux(idx);
  75. }
  76. while (1)
  77. {
  78. for (idx = 1; idx <= mc0051gs_nbr; idx++)
  79. {
  80. mc0051gs_comm_dac(idx);
  81. mc0051gs_sm(idx);
  82. // usleep(1000000); /* 100ms */
  83. sleep(1);
  84. }
  85. }
  86. log_dbg("%s, --, idx:%d", __func__, idx);
  87. }
  88. static int mc0051gs_dbcb(void *para, int ncolumn, char **columnvalue, char *columnname[])
  89. {
  90. int i;
  91. struct dbcbparam_t *pcbparam = (struct dbcbparam_t *)para;
  92. struct mc0051gs_t *pdev;
  93. int idx = 0;
  94. pcbparam->nrow++;
  95. log_dbg("%s, ++, row:%d, col:%d", __func__, pcbparam->nrow, ncolumn);
  96. pdev = &mc0051gs[pcbparam->nrow];
  97. for (i = 0; i < ncolumn; i++)
  98. {
  99. if (strcmp("chan_idx", columnname[i]) == 0)
  100. {
  101. pdev->comm.chanidx = atoi(columnvalue[i]);
  102. }
  103. else if (strcmp("info", columnname[i]) == 0)
  104. {
  105. strcpy(pdev->szinfo, columnvalue[i]);
  106. }
  107. else if (strcmp("adr", columnname[i]) == 0)
  108. {
  109. pdev->comm.adr = atoi(columnvalue[i]);
  110. }
  111. else if (strcmp("idx", columnname[i]) == 0)
  112. {
  113. pdev->idx = atoi(columnvalue[i]);
  114. }
  115. else if (strcmp("devid", columnname[i]) == 0)
  116. {
  117. if (columnvalue[i] != NULL && strcmp(columnvalue[i], "") != 0)
  118. {
  119. strcpy(pdev->szdev_id, columnvalue[i]);
  120. }
  121. else
  122. {
  123. log_dbg("%s, devid is null", __func__);
  124. }
  125. }
  126. }
  127. pcbparam->ret = 0;
  128. log_dbg("%s, --,ret:%d", __func__, pcbparam->ret);
  129. return 0;
  130. }
  131. int mc0051gs_init(void)
  132. {
  133. pthread_t thrd;
  134. int result = 0;
  135. int ret = 0;
  136. int idx = 0;
  137. struct mc0051gs_t *dev = NULL;
  138. char *errmsg = NULL;
  139. char sql[1024];
  140. struct dbcbparam_t cbparam;
  141. sqlite3 *db = STA.cfg_db;
  142. log_dbg("%s, ++", __func__);
  143. plt_lock_ctndb();
  144. sprintf(sql, "select * from mc0051gs");
  145. cbparam.nrow = 0;
  146. result = sqlite3_exec(db, sql, mc0051gs_dbcb, (void *)&cbparam, &errmsg);
  147. plt_unlock_ctndb();
  148. if (result != SQLITE_OK)
  149. {
  150. log_dbg("%s, result != SQLITE_OK : %d", __func__, result);
  151. ret = -1;
  152. }
  153. else if (cbparam.ret != 0)
  154. {
  155. log_dbg("%s, cbparam.ret != 0 : %d", __func__, cbparam.ret);
  156. ret = -2;
  157. }
  158. else
  159. {
  160. mc0051gs_nbr = cbparam.nrow;
  161. cbparam.nrow = 0;
  162. db = plt_get_devdb();
  163. plt_lock_devdb();
  164. sprintf(sql, "select * from mc0051gs");
  165. result = sqlite3_exec(db, sql, mc0051gs_dbcb, (void *)&cbparam, &errmsg);
  166. plt_unlock_devdb();
  167. for (int i = 1; i <= mc0051gs_nbr; ++i)
  168. {
  169. if (strcmp(mc0051gs[i].szdev_id, "") == 0)
  170. {
  171. if (get_snow_id(mc0051gs[i].szdev_id) != 0)
  172. {
  173. ret = -4;
  174. }
  175. else
  176. {
  177. char sql[1024];
  178. char *errmsg = NULL;
  179. sprintf(sql, "update mc0051gs set devid=\"%s\" where idx=%d", mc0051gs[i].szdev_id, mc0051gs[i].idx);
  180. plt_lock_devdb();
  181. int rc = sqlite3_exec(db, sql, NULL, NULL, &errmsg);
  182. plt_unlock_devdb();
  183. if (rc != SQLITE_OK)
  184. {
  185. log_dbg("%s, failed to update level device id:%s", __func__, errmsg);
  186. ret = -4;
  187. goto leave;
  188. }
  189. else
  190. {
  191. log_dbg("%s, update device id:%s", __func__, mc0051gs[i].szdev_id);
  192. }
  193. }
  194. }
  195. }
  196. if (pthread_create(&thrd, NULL, mc0051gs_thrd_main, NULL) != 0)
  197. {
  198. ret = -1;
  199. log_dbg("%s, create mc0051gs thrd main fail", __func__);
  200. }
  201. }
  202. leave:
  203. log_dbg("%s--, ret:%d", __func__, ret);
  204. return ret;
  205. }
  206. int mc0051gs_get_addr(int idx)
  207. {
  208. return mc0051gs[idx].comm.adr;
  209. }
  210. int mc0051gs_get_comm_st(int idx)
  211. {
  212. struct mc0051gs_t *dev = &mc0051gs[idx];
  213. struct comm_t *comm = &dev->comm;
  214. return comm_get_state(comm);
  215. }
  216. int mc0051gs_get_chan_idx(int idx)
  217. {
  218. struct mc0051gs_t *dev = &mc0051gs[idx];
  219. struct comm_t *comm = &dev->comm;
  220. return comm_get_chan_idx(comm);
  221. }
  222. char *mc0051gs_get_comm_st_str(int idx)
  223. {
  224. struct mc0051gs_t *dev = &mc0051gs[idx];
  225. struct comm_t *comm = &dev->comm;
  226. return comm_get_state_str(comm);
  227. }
  228. int mc0051gs_get_tick(int idx)
  229. {
  230. return mc0051gs[idx].sm.tick;
  231. }
  232. int mc0051gs_get_nbr()
  233. {
  234. return mc0051gs_nbr;
  235. }
  236. int mc0051gs_get_tool_data(int idx, char *buf)
  237. {
  238. if (idx < 1 || idx > mc0051gs_nbr || buf == NULL)
  239. return -1;
  240. struct mc0051gs_t *dev = &mc0051gs[idx];
  241. struct statemachine_t *sm = &dev->sm;
  242. struct comm_t *comm = &dev->comm;
  243. char buf_temp[1024];
  244. sm_get_summary(sm, buf_temp, sizeof(buf_temp));
  245. sprintf(buf, " [%d] %s ", idx, buf_temp);
  246. comm_get_summary(comm, buf_temp, sizeof(buf_temp));
  247. strcat(buf, buf_temp);
  248. sprintf(buf_temp, "\ndev id:%s sys_started: " GREEN "%d" NONE ",mode set: " GREEN " %s " NONE ",sys_run_state:" YELLOW "%s" NONE ",alarm_level:" YELLOW "%s" NONE ",elc_heat_state:%d,pump_state:%d,comp_state:%d,"
  249. "in_water_temp:" YELLOW "%.1f" NONE ",out_water_temp:" YELLOW "%.1f" NONE ",out_air_temp:" YELLOW "%.1f" NONE ",ev_temp:" YELLOW "%.1f" NONE ",in_water_press:" YELLOW "%.1f" NONE ","
  250. "out_water_press:" YELLOW "%.1f" NONE ",pump_speed:" YELLOW "%.1f" NONE "\n",
  251. dev->szdev_id,
  252. dev->started,
  253. dev->sys_run_mode_set,
  254. dev->sys_run_state_str, dev->alarm_level_str, dev->elc_heat_state, dev->pump_state, dev->comp_state,
  255. dev->in_water_temp, dev->out_water_temp, dev->out_air_temp, dev->ev_temp, dev->in_water_press,
  256. dev->out_water_press, dev->pump_speed);
  257. strcat(buf, buf_temp);
  258. sprintf(buf_temp, "cool_temp:%.1f,heat_temp:%.1f,cool_gap_temp:%.1f,heat_gap_temp:%.1f,pump_gear:%d,"
  259. "comp_gear:%d,cool_cell_temp:%.1f,cool_stop_cell_temp:%.1f,heat_cell_temp:%.1f,heat_stop_cell_temp:%.1f,"
  260. "cool_gap_cell_temp_noworking:%.1f,cell_self_cycle_start_diff_temp:%.1f,cell_self_cycle_stop_diff_temp:%.1f\n",
  261. dev->cool_temp, dev->heat_temp, dev->cool_gap_temp, dev->heat_gap_temp, dev->pump_gear,
  262. dev->comp_gear, dev->cool_cell_temp, dev->cool_stop_cell_temp, dev->heat_cell_temp, dev->heat_stop_cell_temp,
  263. dev->cool_gap_cell_temp_noworking, dev->cell_self_cycle_start_diff_temp, dev->cell_self_cycle_stop_diff_temp);
  264. strcat(buf, buf_temp);
  265. sprintf(buf_temp, "cellt_max:%.1f,cellt_min:%.1f,cellt_ave:%.1f,cell_run:%s\n",
  266. dev->cellt_max, dev->cellt_min, dev->cellt_ave, dev->cell_run_str);
  267. strcat(buf, buf_temp);
  268. // alarm
  269. sprintf(buf_temp, "out_water_high_temp_alarm:%d,out_water_low_temp_alarm:%d,out_temp_sensor_alarm:%d,in_temp_sensor_alarm:%d,pump_comm_alarm:%d,\
  270. VFD_comm_alarm:%d,sys_high_voltage_lock:%d,sys_low_voltage_lock:%d,air_out_over_temp_lock:%d,VFD_oc_lock:%d,\
  271. VFD_ot_lock:%d,VFD_over_fre_lock:%d,VFD_under_fre_lock:%d,VFD_phase_lost_lock:%d,VFD_other_fault_lock:%d,\
  272. lack_liquid_alarm:%d,sys_pree_high_alarm:%d,out_water_press_high_alarm:%d,pump_fault:%d,fan_drive_fault:%d,\
  273. fan_drive_comm_fault:%d,upper_computer_comm_fault:%d,cellt_max_comm_fault:%d,cellt_min_comm_fault:%d,cellt_ave_comm_fault:%d,\
  274. water_over_press:%d,water_under_press:%d,in_water_over_press_fault:%d,in_water_under_press_fault:%d,out_water_over_press_fault:%d,\
  275. out_water_under_press_fault:%d\n",
  276. dev->out_water_high_temp_alarm, dev->out_water_low_temp_alarm, dev->out_temp_sensor_alarm, dev->in_temp_sensor_alarm, dev->pump_comm_alarm,
  277. dev->VFD_comm_alarm, dev->sys_high_voltage_lock, dev->sys_low_voltage_lock, dev->air_out_over_temp_lock, dev->VFD_oc_lock,
  278. dev->VFD_ot_lock, dev->VFD_over_fre_lock, dev->VFD_under_fre_lock, dev->VFD_phase_lost_lock, dev->VFD_other_fault_lock,
  279. dev->lack_liquid_alarm, dev->sys_pree_high_alarm, dev->out_water_press_high_alarm, dev->pump_fault, dev->fan_drive_fault,
  280. dev->fan_drive_comm_fault, dev->upper_computer_comm_fault, dev->cellt_max_comm_fault, dev->cellt_min_comm_fault, dev->cellt_ave_comm_fault,
  281. dev->water_over_press, dev->water_under_press, dev->in_water_over_press_fault, dev->in_water_under_press_fault, dev->out_water_over_press_fault,
  282. dev->out_water_under_press_fault);
  283. strcat(buf, buf_temp);
  284. return 0;
  285. }
  286. int mc0051gs_get_tbmqtt_data(int idx, char *buf)
  287. {
  288. struct mc0051gs_t *dev = &mc0051gs[idx];
  289. sprintf(buf, "'ac%d_state':'%s', 'ac%d_rtnwater_pre':%.1f,'ac%d_outwater_pre':%.1f,'ac%d_rtnwater_t':%.1f,'ac%d_outwater_t':%.1f,'ac%d_outside_t':%.1f, 'ac%d_start':%d",
  290. idx, dev->sm.szState,
  291. idx, dev->in_water_press,
  292. idx, dev->out_water_press,
  293. idx, dev->in_water_temp,
  294. idx, dev->out_water_temp,
  295. idx, dev->ev_temp,
  296. idx, dev->started);
  297. }
  298. int mc0051gs_get_cloud_data(int ctn_idx, int idx, char *buf)
  299. {
  300. struct mc0051gs_t *dev = &mc0051gs[idx];
  301. sprintf(buf, "{\"device_id\":\"%s\", \"type\":4, \"rtnwater_pre\":%.1f,\"outwater_pre\":%.1f,\"rtnwater_t\":%.1f,\"outwater_t\":%.1f,\"outside_t\":%.1f,\"state\":\"%d\"}",
  302. dev->szdev_id,
  303. dev->in_water_press,
  304. dev->out_water_press,
  305. dev->in_water_temp,
  306. dev->out_water_temp,
  307. dev->ev_temp,
  308. dev->sm.state);
  309. return 0;
  310. }
  311. int mc0051gs_get_init_data(int ctn_idx, int idx, char *buf)
  312. {
  313. sprintf(buf, "{\"device_id\":\"%s\", \"type\":4, \"idx\":%d, \"pid\":\"%s\", \"config\":{ \
  314. \"chan_idx\":%d, \"adr\":%d}}",
  315. mc0051gs[idx].szdev_id,
  316. idx,
  317. ctn_get_dev_id(),
  318. mc0051gs[idx].comm.chanidx,
  319. mc0051gs[idx].comm.adr);
  320. return 0;
  321. }
  322. int mc0051gs_get_modbus_data(int idx, unsigned short *data)
  323. {
  324. struct mc0051gs_t *dev = &mc0051gs[idx];
  325. data[0] = (unsigned short)DEVM_MC90HDNC1A;
  326. data[1] = (unsigned short)1;
  327. data[2] = (unsigned short)dev->sm.state;
  328. data[3] = (unsigned short)dev->sm.step;
  329. data[4] = (unsigned short)dev->sm.err;
  330. data[5] = (unsigned short)dev->comm.adr;
  331. data[6] = (unsigned short)dev->comm.state;
  332. data[7] = (unsigned short)dev->runMode;
  333. data[8] = (unsigned short)dev->ctlMode;
  334. data[9] = (unsigned short)dev->cool_temp*10;
  335. data[10] = (unsigned short)dev->heat_temp*10;
  336. data[11] = (unsigned short)dev->cool_gap_temp*10;
  337. data[12] = (unsigned short)dev->heat_gap_temp*10;
  338. data[13] = (unsigned short)dev->pump_gear;
  339. data[14] = (unsigned short)dev->comp_gear;
  340. data[15] = (unsigned short)dev->out_water_temp*10;
  341. data[16] = (unsigned short)dev->in_water_temp*10;
  342. data[17] = (unsigned short)dev->out_water_press*100;
  343. data[18] = (unsigned short)dev->in_water_press*100;
  344. data[19] = (unsigned short)dev->pump_speed*10;
  345. return 0;
  346. }