n9.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816
  1. #include "n9.h"
  2. #include "plt.h"
  3. struct n9_t n9[N9_NBR_MAX + 1];
  4. int n9_reset_bsytikchk(int idx)
  5. {
  6. n9[idx].bsytik.timer = 0;
  7. n9[idx].bsytik.timeout = 0;
  8. n9[idx].bsytik.chkcnt = 0;
  9. return 0;
  10. }
  11. // 0 : not timeout
  12. // 1 : timeout
  13. int n9_is_bsytikchk_timeout(int idx)
  14. {
  15. struct n9_t *dev = &n9[idx];
  16. if (dev->bsytik.chken == 1)
  17. {
  18. return dev->bsytik.timeout;
  19. }
  20. else
  21. {
  22. return 0;
  23. }
  24. }
  25. int n9_set_bsytik_from_host(int idx)
  26. {
  27. n9[idx].bsytik.from_host++;
  28. return 0;
  29. }
  30. int n9_get_bsytikchk_from_host(int idx)
  31. {
  32. return n9[idx].bsytik.from_host++;
  33. }
  34. int n9_get_bsytikchk_en(int idx)
  35. {
  36. return n9[idx].bsytik.chken;
  37. }
  38. int n9_set_bsytikchk_en(int idx, int val)
  39. {
  40. n9[idx].bsytik.chken = val;
  41. return 0;
  42. }
  43. int n9_set_dac_param_en(int idx, int val)
  44. {
  45. struct n9_t *dev = &n9[1];
  46. struct comm_t *comm = &dev->comm;
  47. comm_set_dac_param_en(comm, val);
  48. return 0;
  49. }
  50. static int n9_dbcb_0(void *para, int ncolumn, char **columnvalue, char *columnname[])
  51. {
  52. int i;
  53. struct dbcbparam_t *pcbparam = (struct dbcbparam_t *)para;
  54. struct n9_t *dev = &n9[1];
  55. pcbparam->nrow++;
  56. log_dbg("%s, ++, row:%d, col:%d", __func__, pcbparam->nrow, ncolumn);
  57. for (i = 0; i < ncolumn; i++)
  58. {
  59. if (strcmp("info", columnname[i]) == 0)
  60. {
  61. strcpy(dev->szinfo, columnvalue[i]);
  62. }
  63. else if (strcmp("adr", columnname[i]) == 0)
  64. {
  65. dev->comm.adr = atoi(columnvalue[i]);
  66. }
  67. else if (strcmp("chan_idx", columnname[i]) == 0)
  68. {
  69. dev->comm.chanidx = atoi(columnvalue[i]);
  70. }
  71. else if (strcmp("idx", columnname[i]) == 0)
  72. {
  73. dev->idx = atoi(columnvalue[i]);
  74. }
  75. else if (strcmp("devid", columnname[i]) == 0)
  76. {
  77. if (columnvalue[i] != NULL && strcmp(columnvalue[i], "") != 0)
  78. {
  79. strcpy(dev->szdev_id, columnvalue[i]);
  80. }
  81. else
  82. {
  83. log_dbg("%s, devid is null", __func__);
  84. }
  85. }
  86. }
  87. pcbparam->ret = 0;
  88. log_dbg("%s, --,ret:%d", __func__, pcbparam->ret);
  89. return 0;
  90. }
  91. int n9_get_cmd(int idx)
  92. {
  93. return n9[idx].cmd;
  94. }
  95. int n9_get_comm_st(int idx)
  96. {
  97. struct n9_t *dev = &n9[idx];
  98. struct comm_t *comm = &dev->comm;
  99. return comm_get_state(comm);
  100. }
  101. void n9_reset_cmd(int idx)
  102. {
  103. n9[idx].cmd = CMD_SM_DONE;
  104. }
  105. int n9_get_state(int idx)
  106. {
  107. static int s = 0;
  108. if (n9[idx].sm.state != s)
  109. {
  110. // log_dbg("pcs new state : %d", n9[idx].sm.state);
  111. s = n9[idx].sm.state;
  112. }
  113. return n9[idx].sm.state;
  114. }
  115. char *n9_get_state_str(int idx)
  116. {
  117. return n9[idx].sm.szState;
  118. }
  119. int n9_get_step(int idx)
  120. {
  121. return n9[idx].sm.step;
  122. }
  123. int n9_get_tick(int idx)
  124. {
  125. return n9[idx].sm.tick;
  126. }
  127. double n9_get_tick_ave(int idx)
  128. {
  129. return n9[idx].sm.timing_ave;
  130. }
  131. double n9_get_tick_cur(int idx)
  132. {
  133. return n9[idx].sm.timing_cur;
  134. }
  135. double n9_get_tick_max(int idx)
  136. {
  137. return n9[idx].sm.timing_max;
  138. }
  139. char *n9_get_err_str(int idx)
  140. {
  141. return n9[idx].sm.szerr;
  142. }
  143. int n9_chk_state(int idx, int stat)
  144. {
  145. return n9_get_state(idx) == stat ? 0 : -1;
  146. }
  147. int n9_get_ap(int idx)
  148. {
  149. return n9[idx].pow.ap;
  150. }
  151. double n9_get_dcv(int idx)
  152. {
  153. return n9[idx].dc_v;
  154. }
  155. double n9_get_dcc(int idx)
  156. {
  157. return n9[idx].dc_c;
  158. }
  159. int n9_get_errstat(int idx)
  160. {
  161. return n9[idx].fault;
  162. }
  163. double n9_get_uab(int idx)
  164. {
  165. return n9[idx].Uab;
  166. }
  167. double n9_get_ubc(int idx)
  168. {
  169. return n9[idx].Ubc;
  170. }
  171. double n9_get_uac(int idx)
  172. {
  173. return n9[idx].Uca;
  174. }
  175. double n9_get_ua(int idx)
  176. {
  177. return n9[idx].Ua;
  178. }
  179. double n9_get_ub(int idx)
  180. {
  181. return n9[idx].Ub;
  182. }
  183. double n9_get_uc(int idx)
  184. {
  185. return n9[idx].Uc;
  186. }
  187. double n9_get_ia(int idx)
  188. {
  189. return n9[idx].Ia;
  190. }
  191. double n9_get_ib(int idx)
  192. {
  193. return n9[idx].Ib;
  194. }
  195. double n9_get_ic(int idx)
  196. {
  197. return n9[idx].Ic;
  198. }
  199. double n9_get_temp_igbt(int idx)
  200. {
  201. return n9[idx].t_igbt;
  202. }
  203. double n9_get_temp_env(int idx)
  204. {
  205. return n9[idx].t_env;
  206. }
  207. double n9_get_grid_freq(int idx)
  208. {
  209. return n9[idx].gridf;
  210. }
  211. char *n9_get_info_str(int idx)
  212. {
  213. return n9[idx].szinfo;
  214. }
  215. // char* n9_get_state_str( int idx)
  216. //{
  217. // return n9[idx].sm.szstate;
  218. // }
  219. // int n9_get_state( int idx)
  220. //{
  221. // return n9[idx].sm.state;
  222. // }
  223. int n9_get_dev_aps(int idx)
  224. {
  225. return n9[idx].Pset;
  226. }
  227. static void n9_update(int idx)
  228. {
  229. struct n9_t *dev = &n9[idx];
  230. dev->pow.ap = dev->ap;
  231. }
  232. static void *n9_thrd_main(void *param)
  233. {
  234. struct n9_t *dev = &n9[1];
  235. log_dbg("%s, idx:%d, ++", __func__, 1);
  236. n9_set_bsytikchk_en(1, 1);
  237. n9_sm_init(1);
  238. n9_comm_init(1);
  239. while (1)
  240. {
  241. n9_comm_dac(1);
  242. n9_sm(1);
  243. n9_update(1);
  244. usleep(10000); /* 10ms */
  245. }
  246. log_dbg("%s, --", __func__);
  247. }
  248. static void *n9_thrd_aux(void *param)
  249. {
  250. int idx = 1;
  251. struct n9_t *dev = &n9[idx];
  252. struct statemachine_t *sm = &dev->sm;
  253. log_dbg("%s, ++", __func__);
  254. while (1)
  255. {
  256. if (dev->bsytik.timer++ >= 10)
  257. { // chk every 1 second
  258. dev->bsytik.timer = 0;
  259. if (dev->bsytik.last_from_host != dev->bsytik.from_host)
  260. { // refresh
  261. dev->bsytik.last_from_host = dev->bsytik.from_host;
  262. dev->bsytik.chkcnt = 0;
  263. }
  264. else
  265. { // counting
  266. if (dev->bsytik.chkcnt++ >= 2)
  267. { // 5s
  268. dev->bsytik.timeout = 1;
  269. dev->bsytik.chkcnt = 0;
  270. }
  271. }
  272. }
  273. static int cnt = 0;
  274. if (cnt < 1 && mqtt_get_state() == SMST_READY)
  275. {
  276. cnt++;
  277. if (idx == 1)
  278. {
  279. cloud.pcs_init = 0;
  280. }
  281. char buf[4096] = {0};
  282. n9_get_init_data(ctn_get_idx_in_ess(), 1, buf);
  283. cloud_send_init(buf);
  284. }
  285. usleep(100000); /* 100ms */
  286. }
  287. log_dbg("%s, --", __func__);
  288. }
  289. int n9_init()
  290. {
  291. pthread_t thrd;
  292. int ret = 0;
  293. int result;
  294. char *errmsg = NULL;
  295. char sql[1024];
  296. struct dbcbparam_t cbparam;
  297. sqlite3 *db = NULL;
  298. struct n9_t *dev = &n9[1];
  299. log_dbg("%s, ++", __func__);
  300. plt_lock_ctndb();
  301. db = plt_get_ctndb();
  302. sprintf(sql, "select * from n9");
  303. cbparam.nrow = 0;
  304. result = sqlite3_exec(db, sql, n9_dbcb_0, (void *)&cbparam, &errmsg);
  305. plt_unlock_ctndb();
  306. if (result != SQLITE_OK)
  307. {
  308. log_dbg("%s, result != SQLITE_OK, result:%d", __func__, result);
  309. ret = -1;
  310. }
  311. else if (cbparam.ret != 0)
  312. {
  313. log_dbg("%s, cbparam.ret != 0, %d", __func__, cbparam.ret);
  314. ret = -2;
  315. }
  316. else if (cbparam.nrow != 1)
  317. {
  318. log_dbg("%s, cbparam.nrow != 1, %d", __func__, cbparam.nrow);
  319. ret = -3;
  320. }
  321. else
  322. {
  323. db = plt_get_devdb();
  324. cbparam.nrow = 0;
  325. plt_lock_devdb();
  326. sprintf(sql, "select * from n9");
  327. result = sqlite3_exec(db, sql, n9_dbcb_0, (void *)&cbparam, &errmsg);
  328. plt_unlock_devdb();
  329. if (strcmp(n9[1].szdev_id, "") == 0)
  330. {
  331. if (get_snow_id(n9[1].szdev_id) != 0)
  332. {
  333. ret = -4;
  334. }
  335. else
  336. {
  337. char sql[1024];
  338. char *errmsg = NULL;
  339. sprintf(sql, "update n9 set devid=\"%s\" where idx=%d", n9[1].szdev_id, n9[1].idx);
  340. plt_lock_devdb();
  341. int rc = sqlite3_exec(db, sql, NULL, NULL, &errmsg);
  342. plt_unlock_devdb();
  343. if (rc != SQLITE_OK)
  344. {
  345. log_dbg("%s, failed to update level device id:%s", __func__, errmsg);
  346. ret = -4;
  347. goto leave;
  348. }
  349. else
  350. {
  351. log_dbg("%s, update device id:%s", __func__, gt[1].szdev_id);
  352. }
  353. }
  354. }
  355. if (pthread_create(&thrd, NULL, n9_thrd_main, NULL) != 0)
  356. {
  357. log_dbg("%s, create n9 thrd main fail", __func__);
  358. ret = -1;
  359. }
  360. else if (pthread_create(&thrd, NULL, n9_thrd_aux, NULL) != 0)
  361. {
  362. log_dbg("%s, create n9 thrd aux fail", __func__);
  363. ret = -1;
  364. }
  365. }
  366. leave:
  367. log_dbg("%s, --, ret:%d", __func__, ret);
  368. return ret;
  369. }
  370. int n9_send_sm_cmd(int idx, int val)
  371. {
  372. // print_stack();
  373. int ret = 0;
  374. struct n9_t *dev = &n9[idx];
  375. dev->cmd = val;
  376. log_dbg("%s, idx:%d, cmd:%d, ret:%d", __func__, idx, val, ret);
  377. return ret;
  378. }
  379. int n9_get_runmod(int idx)
  380. {
  381. return n9[idx].module_run_mode;
  382. }
  383. int n9_get_runstat(int idx)
  384. {
  385. return n9[idx].runstate;
  386. }
  387. char *n9_get_runstat_str(int idx)
  388. {
  389. return n9[idx].runstate_str;
  390. }
  391. int n9_set_aps(int idx, int aps)
  392. {
  393. struct n9_t *dev = &n9[idx];
  394. int ret = 0;
  395. dev->pow.last_aps = dev->pow.aps;
  396. dev->pow.aps = aps;
  397. log_dbg("%s, idx:%d, aps:%d, last_aps:%d", __func__, idx, dev->pow.aps, dev->pow.last_aps);
  398. return ret;
  399. }
  400. int n9_reset_aps(int idx)
  401. {
  402. struct n9_t *dev = &n9[idx];
  403. int ret = 0;
  404. dev->pow.last_aps = 0;
  405. dev->pow.aps = 0;
  406. // log_dbg( "%s, idx:%d, val:%d, ret:%d", __func__, idx, aps, ret);
  407. return ret;
  408. }
  409. int n9_get_aps(int idx)
  410. {
  411. return n9[idx].pow.aps;
  412. }
  413. int n9_get_last_aps(int idx)
  414. {
  415. return n9[idx].pow.last_aps;
  416. }
  417. int n9_is_aps_changed(int idx)
  418. {
  419. return (n9[idx].pow.aps != n9[idx].pow.last_aps) ? 1 : 0;
  420. }
  421. int n9_get_chan_idx(int idx)
  422. {
  423. return n9[idx].comm.chanidx;
  424. }
  425. int n9_get_adr(int idx)
  426. {
  427. return n9[idx].comm.adr;
  428. }
  429. char *n9_get_comm_state_str(int idx)
  430. {
  431. return n9[idx].comm.szState;
  432. }
  433. double n9_get_dac_ave(int idx)
  434. {
  435. return n9[idx].comm.dac.timing_ave;
  436. }
  437. double n9_get_dac_cur(int idx)
  438. {
  439. return n9[idx].comm.dac.timing_cur;
  440. }
  441. double n9_get_dac_max(int idx)
  442. {
  443. return n9[idx].comm.dac.timing_max;
  444. }
  445. unsigned short *n9_get_faults(int idx)
  446. {
  447. return n9[idx].faults;
  448. }
  449. int n9_get_dac_param_en(int idx)
  450. {
  451. return n9[idx].comm.dac.param_en;
  452. }
  453. // char* n9_get_info_str(int idx)
  454. //{
  455. // return n9[idx].szinfo;
  456. // }
  457. double n9_get_chg_e_total(int idx)
  458. {
  459. return n9[idx].chg_power_total_ac;
  460. }
  461. double n9_get_dhg_e_total(int idx)
  462. {
  463. return n9[idx].dhg_power_total_ac;
  464. }
  465. struct n9_t *n9_get_all_data_ptr()
  466. {
  467. return n9;
  468. }
  469. int n9_get_tool_data(int idx, char *buf)
  470. {
  471. if (idx < 1 || idx > N9_NBR_MAX || buf == NULL)
  472. {
  473. return -1;
  474. }
  475. struct n9_t *dev = &n9[idx];
  476. struct statemachine_t *sm = &dev->sm;
  477. struct comm_t *comm = &dev->comm;
  478. char temp_buf[8192];
  479. int i = 0;
  480. sm_get_summary(sm, temp_buf, sizeof(temp_buf));
  481. sprintf(buf, "%s ", temp_buf);
  482. comm_get_summary(comm, temp_buf, sizeof(temp_buf));
  483. strcat(buf, temp_buf);
  484. sprintf(temp_buf, "bsytik_from_host:%03d timeout:%d en:%d\n",
  485. dev->bsytik.from_host, dev->bsytik.timeout, dev->bsytik.chken);
  486. strcat(buf, temp_buf);
  487. // 0xED00
  488. sprintf(temp_buf, "dev id :%s runstat:" L_GREEN "%s" NONE " dc_v:" L_GREEN "%.1f" NONE ", dc_c:%.1f, grid_freq:%.2f, ua:%.1f ub:%.1f uc:%.1f ia:%.1f ib:%.1f ic:%.1f,\
  489. ap:" L_GREEN "%.1f" NONE " dc_ap:%.1f, day_chg:%d dhg:%d, total_chg:%d dhg:%d, igbt_temp :%.1f env:%.1f, errstatus:" L_GREEN "%d" NONE "\n",
  490. dev->szdev_id,
  491. dev->runstate_str, dev->dc_v, dev->dc_c, dev->gridf,
  492. dev->Ua, dev->Ub, dev->Uc, dev->Ia, dev->Ib, dev->Ic,
  493. dev->ap, dev->dc_ap,
  494. dev->chg_power_day_sum_ac, dev->dhg_power_day_sum_ac, dev->chg_power_total_ac, dev->dhg_power_total_ac,
  495. dev->t_igbt, dev->t_env,
  496. dev->fault);
  497. strcat(buf, temp_buf);
  498. // 0x0E14 and 0x0F14
  499. strcat(buf, L_GREEN "Faults: " NONE);
  500. for (i = 0; i < 8; i++)
  501. {
  502. if (dev->faults[i] != 0)
  503. {
  504. sprintf(temp_buf, L_GREEN "%d:" BYTE_TO_BINARY_PATTERN " ", i + 1, BYTE_TO_BINARY(dev->faults[i]));
  505. }
  506. else
  507. {
  508. sprintf(temp_buf, "%d:" BYTE_TO_BINARY_PATTERN " ", i + 1, BYTE_TO_BINARY(dev->faults[i]));
  509. }
  510. strcat(buf, temp_buf);
  511. }
  512. strcat(buf, "\n");
  513. sprintf(temp_buf, " DC ovp:%.1f,uvp:%.1f,ocp:%.1f AC ovp:%.1f,uvp:%.1f,ocp:%.1f\n",
  514. dev->Ubus_ovp, dev->Ubus_uvp, dev->Ubus_ocp, dev->AC_ovp, dev->AC_uvp, dev->AC_ocp);
  515. strcat(buf, temp_buf);
  516. }
  517. void printBits(size_t const size, void const *const ptr, char *prefix, char *buf)
  518. {
  519. unsigned char *b = (unsigned char *)ptr;
  520. unsigned char byte;
  521. int i, j;
  522. char temp[4096] = {0};
  523. for (i = size - 1; i >= 0; i--)
  524. {
  525. for (j = 7; j >= 0; j--)
  526. {
  527. byte = (b[i] >> j) & 1;
  528. sprintf(temp, "'%sbit_%d' : %u", prefix, i * 8 + (j + 1), byte);
  529. if (j != 0)
  530. strcat(temp, ",");
  531. strcat(buf, temp);
  532. }
  533. }
  534. }
  535. int n9_get_tbmqtt_data_inteval_30s(int idx, char *buf)
  536. {
  537. sprintf(buf, "'pcs_runstat':'%s','pcs_errstat':%d,'pcs_state':'%s',"
  538. "'pcs_fault1':'" BYTE_TO_BINARY_PATTERN "','pcs_fault2':'" BYTE_TO_BINARY_PATTERN "','pcs_fault3':'" BYTE_TO_BINARY_PATTERN "','pcs_fault4':'" BYTE_TO_BINARY_PATTERN "','pcs_fault5':'" BYTE_TO_BINARY_PATTERN "','pcs_fault6':'" BYTE_TO_BINARY_PATTERN "','pcs_fault7':'" BYTE_TO_BINARY_PATTERN "','pcs_fault8':'" BYTE_TO_BINARY_PATTERN "'",
  539. n9_get_runstat_str(idx), n9_get_errstat(idx), n9_get_state_str(idx), BYTE_TO_BINARY(n9[idx].faults[0]), BYTE_TO_BINARY(n9[idx].faults[1]),
  540. BYTE_TO_BINARY(n9[idx].faults[2]), BYTE_TO_BINARY(n9[idx].faults[3]), BYTE_TO_BINARY(n9[idx].faults[4]), BYTE_TO_BINARY(n9[idx].faults[5]), BYTE_TO_BINARY(n9[idx].faults[6]), BYTE_TO_BINARY(n9[idx].faults[7]));
  541. }
  542. int n9_get_tbmqtt_data_inteval_60s(int idx, char *buf)
  543. {
  544. struct n9_t *dev = &n9[idx];
  545. sprintf(buf, "'pcs_ua':%.1f, 'pcs_ub':%.1f, 'pcs_uc':%.1f,\
  546. 'pcs_uab':%.1f, 'pcs_ubc':%.1f, 'pcs_uca':%.1f,\
  547. 'pcs_ia':%.1f, 'pcs_ib':%.1f, 'pcs_ic':%.1f,\
  548. 'pcs_ap':%.1f,'pcs_rap':%.1f,'pcs_pf':%.1f,\
  549. 'pcs_dcv':%.1f,'pcs_dcc':%.1f,'pcs_gf':%.1f,\
  550. 'pcs_t_igbt':%.1f, 'pcs_t_env':%.1f, \
  551. 'pcs_pos_bus_v':%.1f, 'pcs_neg_bus_v':%.1f, 'pcs_bat_v':%.1f, 'pcs_bat_c':%.1f, 'pcs_dcp':%.1f",
  552. n9_get_ua(idx), n9_get_ub(idx), n9_get_uc(idx),
  553. dev->Uab, dev->Ubc, dev->Uca,
  554. n9_get_ia(idx), n9_get_ib(idx), n9_get_ic(idx),
  555. dev->ap, dev->Qsum, dev->Pfactor,
  556. dev->dc_v, dev->dc_c, dev->gridf,
  557. n9_get_temp_igbt(idx), n9_get_temp_env(idx),
  558. dev->dc_v_pos, dev->dc_v_neg, dev->bat_v, dev->bat_c, dev->dc_ap);
  559. }
  560. int n9_get_tbmqtt_data_half_hour(int idx, char *buf)
  561. {
  562. sprintf(buf, "'pcs_chg_day_ac':%d, 'pcs_dhg_day_ac':%d, 'pcs_chg_total_ac':%d, 'pcs_dhg_total_ac':%d,"
  563. "'pcs_chg_day_dc':%d, 'pcs_dhg_day_dc':%d, 'pcs_chg_total_dc':%d, 'pcs_dhg_total_dc':%d",
  564. n9[idx].chg_power_day_sum_ac, n9[idx].dhg_power_day_sum_ac, n9[idx].chg_power_total_ac, n9[idx].dhg_power_total_ac,
  565. n9[idx].chg_power_day_sum_dc, n9[idx].dhg_power_day_sum_dc, n9[idx].chg_power_total_dc, n9[idx].dhg_power_total_dc);
  566. }
  567. int n9_get_init_data(int ctn_idx, int idx, char *buf)
  568. {
  569. sprintf(buf, "{\"device_id\":\"%s\", \"type\":2, \"idx\":%d, \"pid\":\"%s\", \"config\":{ \
  570. \"chan_idx\":%d, \"adr\":%d}}",
  571. n9[idx].szdev_id,
  572. idx,
  573. ctn_get_dev_id(),
  574. n9[idx].comm.chanidx,
  575. n9[idx].comm.adr);
  576. return 0;
  577. }
  578. int n9_get_cloud_data_5_seconds(int ctn_idx, int idx, char *buf)
  579. {
  580. sprintf(buf, "{\"device_id\":\"%s\", \"type\":2, \"state\":\"%d\", \"runstat\":%d, \"dcv\":%.1f, \"dcc\":%.1f,\
  581. \"errstat\":%d, \"ap\":%d}",
  582. n9[idx].szdev_id, n9_get_state(idx),
  583. n9_get_runstat(idx),
  584. n9_get_dcv(idx),
  585. n9_get_dcc(idx),
  586. n9_get_errstat(idx),
  587. n9_get_ap(idx));
  588. }
  589. int n9_get_cloud_data_60_seconds(int cnt_idx, int idx, char *buf)
  590. {
  591. struct n9_t *dev = &n9[idx];
  592. sprintf(buf, "{\"device_id\":\"%s\", \"type\":2, \"state\":\"%d\", \"uab\":%.1f, \"ubc\":%.1f, \"uca\":%.1f, \"ua\":%.1f, \"ub\":%.1f, \"uc\":%.1f,\
  593. \"ia\":%.1f, \"ib\":%.1f, \"ic\":%.1f,\"t_a\":%.1f, \"t_env\":%.1f, \"rap\":%.1f, \"gf\":%.1f, \"pf\":%.1f}",
  594. dev->szdev_id,
  595. n9_get_state(idx),
  596. dev->Uab,
  597. dev->Ubc,
  598. dev->Uca,
  599. n9_get_ua(idx),
  600. n9_get_ub(idx),
  601. n9_get_uc(idx),
  602. n9_get_ia(idx),
  603. n9_get_ib(idx),
  604. n9_get_ic(idx),
  605. n9_get_temp_igbt(idx),
  606. n9_get_temp_env(idx),
  607. dev->Ssum,
  608. n9_get_grid_freq(idx),
  609. dev->Pfactor);
  610. }
  611. int n9_get_modbus_data(int idx, unsigned short *data)
  612. {
  613. struct n9_t *dev = &n9[idx];
  614. data[0] = (unsigned short)DEVM_N9;
  615. data[1] = (unsigned short)1;
  616. data[2] = (unsigned short)dev->sm.state;
  617. data[3] = (unsigned short)dev->sm.step;
  618. data[4] = (unsigned short)dev->sm.err;
  619. data[5] = (unsigned short)dev->comm.adr;
  620. data[6] = (unsigned short)dev->comm.state;
  621. data[7] = (unsigned short)dev->dsp_ver[0];
  622. data[8] = (unsigned short)dev->dsp_ver[1];
  623. data[9] = (unsigned short)dev->dsp_ver[2];
  624. data[10] = (unsigned short)dev->cpld_ver[0];
  625. data[11] = (unsigned short)dev->cpld_ver[1];
  626. data[12] = (unsigned short)dev->cpld_ver[2];
  627. data[13] = (unsigned short)dev->workmode;
  628. data[14] = (unsigned short)dev->Ua * 10;
  629. data[15] = (unsigned short)dev->Ub * 10;
  630. data[16] = (unsigned short)dev->Uc * 10;
  631. data[17] = (unsigned short)dev->Ia * 10;
  632. data[18] = (unsigned short)dev->Ib * 10;
  633. data[19] = (unsigned short)dev->Ic * 10;
  634. data[20] = (unsigned short)dev->dc_v * 10;
  635. data[21] = (unsigned short)dev->bat_v * 10;
  636. data[22] = (unsigned short)dev->bat_c * 10;
  637. data[23] = (unsigned short)dev->gridf * 100;
  638. data[24] = (unsigned short)dev->ap * 10;
  639. data[25] = (unsigned short)dev->dc_ap * 10;
  640. data[26] = (unsigned short)dev->c_dhg_mode;
  641. data[27] = (unsigned short)dev->bat_ovp * 10;
  642. data[28] = (unsigned short)dev->bat_uvp * 10;
  643. data[29] = (unsigned short)dev->Ubus_ovp * 10;
  644. data[30] = (unsigned short)dev->Ubus_uvp * 10;
  645. data[31] = (unsigned short)dev->t_igbt * 10;
  646. data[32] = (unsigned short)dev->faults[0];
  647. data[33] = (unsigned short)dev->faults[1];
  648. data[34] = (unsigned short)dev->faults[2];
  649. data[35] = (unsigned short)dev->faults[3];
  650. data[36] = (unsigned short)dev->faults[4];
  651. data[37] = (unsigned short)dev->faults[5];
  652. data[38] = (unsigned short)dev->faults[6];
  653. data[39] = (unsigned short)dev->faults[7];
  654. data[40] = (unsigned short)dev->Pset;
  655. data[41] = (unsigned short)dev->Ila * 10;
  656. data[42] = (unsigned short)dev->Ilb * 10;
  657. data[43] = (unsigned short)dev->Ilc * 10;
  658. data[44] = (unsigned short)dev->Pa * 10;
  659. data[45] = (unsigned short)dev->Pb * 10;
  660. data[46] = (unsigned short)dev->Pc * 10;
  661. data[47] = (unsigned short)dev->Sa * 10;
  662. data[48] = (unsigned short)dev->Sb * 10;
  663. data[49] = (unsigned short)dev->Sc * 10;
  664. data[50] = (unsigned short)dev->Qa * 10;
  665. data[51] = (unsigned short)dev->Qb * 10;
  666. data[52] = (unsigned short)dev->Qc * 10;
  667. data[53] = (unsigned short)dev->ap * 10;
  668. data[54] = (unsigned short)dev->Ssum * 10;
  669. data[55] = (unsigned short)dev->Qsum * 10;
  670. data[56] = (unsigned short)dev->Pfactor * 100;
  671. data[57] = (unsigned short)dev->dc_v_pos * 10;
  672. data[58] = (unsigned short)dev->dc_v_neg * 10;
  673. data[59] = (unsigned short)dev->dc_ap * 10;
  674. data[60] = (unsigned short)dev->dc_c * 10;
  675. data[61] = (unsigned short)dev->Uab * 10;
  676. data[62] = (unsigned short)dev->Ubc * 10;
  677. data[63] = (unsigned short)dev->Uca * 10;
  678. data[64] = (unsigned short)dev->t_env * 10;
  679. return 0;
  680. }
  681. int n9_is_run(int idx)
  682. {
  683. return (n9[idx].runstate == N9_RUNSTAT_RUN);
  684. }
  685. int n9_sync_clock(int idx, int year, int month, int day, int hour, int minute, int second)
  686. {
  687. int ret = 0;
  688. struct n9_t *dev = &n9[idx];
  689. int chanidx = dev->comm.chanidx;
  690. int addr = dev->comm.adr;
  691. int start = 0x1020;
  692. int quantity = 6;
  693. unsigned short values[6] = {0};
  694. values[0] = year;
  695. values[1] = month;
  696. values[2] = day;
  697. values[3] = hour;
  698. values[4] = minute;
  699. values[5] = second;
  700. chan_lock(chanidx);
  701. ret = chan_write_multi_registers(chanidx, addr, start, quantity, values);
  702. chan_unlock(chanidx);
  703. if (ret < 0)
  704. {
  705. log_dbg("%s, idx:%d, fail", __func__, idx);
  706. }
  707. else
  708. {
  709. log_dbg("%s, idx:%d, success", __func__, idx);
  710. }
  711. return ret;
  712. }