ies1000_comm.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646
  1. #include "plt.h"
  2. int ies1000_comm_init(int idx)
  3. {
  4. struct ies1000_t* dev = &ies1000[idx];
  5. struct comm_t* comm = &dev->comm;
  6. comm_set_state( comm, COMMST_ERR );
  7. }
  8. int ies1000_comm_reset(int idx)
  9. {
  10. struct ies1000_t* dev = &ies1000[idx];
  11. struct comm_t* comm = &dev->comm;
  12. comm_set_state( comm, COMMST_NORMAL );
  13. comm_set_dac_param_en(comm, 1);
  14. }
  15. int ies1000_set_dev_aps(int idx, int aps)
  16. {
  17. int ret = 0;
  18. struct ies1000_t* dev = &ies1000[idx];
  19. int chanidx = dev->comm.chanidx;
  20. int addr = dev->comm.adr;
  21. int regaddr = 0xF007;
  22. int nb = 1;
  23. short val = aps*10;
  24. // modbus tcp connection, no delay
  25. chan_lock(chanidx);
  26. ret = chan_write_single_register_with_retry(chanidx, addr, regaddr, val);
  27. chan_unlock(chanidx);
  28. if( ret < 0 ){
  29. log_dbg("%s, idx:%d, aps:%d, fail", __func__, idx, aps);
  30. }
  31. return ret;
  32. }
  33. int ies1000_set_dev_startcmd( int idx )
  34. {
  35. int ret = 0;
  36. struct ies1000_t* dev = &ies1000[idx];
  37. int chanidx = dev->comm.chanidx;
  38. int addr = dev->comm.adr;
  39. int regaddr = 0xF400;
  40. int nb = 1;
  41. int trycnt = 0;
  42. int val = 1;
  43. // modbus tcp connection, no delay
  44. chan_lock(chanidx);
  45. ret = chan_write_single_register_with_retry(chanidx, addr, regaddr, val);
  46. chan_unlock(chanidx);
  47. if( ret < 0 ){
  48. log_dbg("%s, idx:%d, fail", __func__, idx);
  49. }
  50. return ret;
  51. }
  52. int ies1000_set_dev_stopcmd( int idx )
  53. {
  54. int ret = 0;
  55. struct ies1000_t* dev = &ies1000[idx];
  56. int chanidx = dev->comm.chanidx;
  57. int addr = dev->comm.adr;
  58. int regaddr = 0xF401;
  59. int nb = 1;
  60. int trycnt = 0;
  61. int val = 1;
  62. // modbus tcp connection, no delay
  63. chan_lock(chanidx);
  64. ret = chan_write_single_register_with_retry(chanidx, addr, regaddr, val);
  65. chan_unlock(chanidx);
  66. if( ret < 0 ){
  67. log_dbg("%s, idx:%d, fail", __func__, idx);
  68. }
  69. return ret;
  70. }
  71. int ies1000_set_dev_idlecmd( int idx )
  72. {
  73. int ret = 0;
  74. struct ies1000_t* dev = &ies1000[idx];
  75. int chanidx = dev->comm.chanidx;
  76. int addr = dev->comm.adr;
  77. int regaddr = 0xF402;
  78. int nb = 1;
  79. int trycnt = 0;
  80. int val = 1;
  81. // modbus tcp connection, no delay
  82. chan_lock(chanidx);
  83. ret = chan_write_single_register_with_retry(chanidx, addr, regaddr, val);
  84. chan_unlock(chanidx);
  85. if( ret < 0 ){
  86. log_dbg("%s, idx:%d, fail", __func__, idx);
  87. }
  88. return ret;
  89. }
  90. // send fault reset cmd to pcs
  91. // 0:invalid 1:reset
  92. int ies1000_set_dev_resetcmd( int idx )
  93. {
  94. int ret = 0;
  95. struct ies1000_t* dev = &ies1000[idx];
  96. int chanidx = dev->comm.chanidx;
  97. int addr = dev->comm.adr;
  98. int regaddr = 0xF40A;
  99. int nb = 1;
  100. int trycnt = 0;
  101. int val = 1;
  102. // modbus tcp connection, no delay
  103. chan_lock(chanidx);
  104. ret = chan_write_single_register_with_retry(chanidx, addr, regaddr, val);
  105. chan_unlock(chanidx);
  106. if( ret < 0 ){
  107. log_dbg("%s, idx:%d, fail", __func__, idx);
  108. }
  109. return ret;
  110. }
  111. int ies1000_set_dev_runmod( int idx, int val )
  112. {
  113. int ret = 0;
  114. struct ies1000_t* dev = &ies1000[idx];
  115. int chanidx = dev->comm.chanidx;
  116. int addr = dev->comm.adr;
  117. int regaddr = 0xF001;
  118. // modbus tcp connection, no delay
  119. chan_lock(chanidx);
  120. ret = chan_write_single_register_with_retry(chanidx, addr, regaddr, val);
  121. chan_unlock(chanidx);
  122. if( ret < 0 ){
  123. log_dbg("%s, idx:%d, fail", __func__, idx);
  124. }
  125. return ret;
  126. }
  127. int ies1000_set_dev_offgird_voltage( int idx, double val )
  128. {
  129. int ret = 0;
  130. struct ies1000_t* dev = &ies1000[idx];
  131. int chanidx = dev->comm.chanidx;
  132. int addr = dev->comm.adr;
  133. int regaddr = 0xF005;
  134. // modbus tcp connection, no delay
  135. chan_lock(chanidx);
  136. ret = chan_write_single_register_with_retry(chanidx, addr, regaddr, val*10);
  137. chan_unlock(chanidx);
  138. if( ret < 0 ){
  139. log_dbg("%s, idx:%d, fail", __func__, idx);
  140. }
  141. return ret;
  142. }
  143. int ies1000_set_dev_mid_bal_ctrl_en( int idx, int val )
  144. {
  145. int ret = 0;
  146. struct ies1000_t* dev = &ies1000[idx];
  147. int chanidx = dev->comm.chanidx;
  148. int addr = dev->comm.adr;
  149. int regaddr = 0xF51B;
  150. // modbus tcp connection, no delay
  151. chan_lock(chanidx);
  152. ret = chan_write_single_register_with_retry(chanidx, addr, regaddr, val);
  153. chan_unlock(chanidx);
  154. if( ret < 0 ){
  155. log_dbg("%s, idx:%d, fail", __func__, idx);
  156. }
  157. return ret;
  158. }
  159. int ies1000_set_dev_mid_bal_ctrl_start_point( int idx, double dval)
  160. {
  161. int ret = 0;
  162. struct ies1000_t* dev = &ies1000[idx];
  163. int chanidx = dev->comm.chanidx;
  164. int addr = dev->comm.adr;
  165. int regaddr = 0xF51C;
  166. // modbus tcp connection, no delay
  167. chan_lock(chanidx);
  168. ret = chan_write_single_register_with_retry(chanidx, addr, regaddr, dval*100);
  169. chan_unlock(chanidx);
  170. if( ret < 0 ){
  171. log_dbg("%s, idx:%d, fail", __func__, idx);
  172. }
  173. return ret;
  174. }
  175. // 0xF000
  176. static void ies1000_comm_dac_0xF000(int idx)
  177. {
  178. unsigned short tab_us[128]={0};
  179. struct ies1000_t* dev = &ies1000[idx];
  180. struct comm_t* comm = &dev->comm;
  181. int chanidx = dev->comm.chanidx;
  182. int addr = dev->comm.adr;
  183. int start, nb, rc;
  184. if( comm_get_state(comm) != COMMST_NORMAL ){
  185. return;
  186. }
  187. nb = 34;
  188. start = 0xF000;
  189. chan_lock(chanidx);
  190. rc = chan_read_holdingregisters_with_retry( chanidx, addr, start, nb, tab_us);
  191. if( rc < 0){
  192. comm_set_state(comm, COMMST_ERR);
  193. }
  194. chan_unlock(chanidx);
  195. if( rc == 0){ /* read ok */
  196. dev->cmdsrc = tab_us[0xF000 - start];
  197. if(dev->cmdsrc == 0){
  198. strcpy(dev->szcmdsrc, "HMI");
  199. }else if(dev->cmdsrc == 1){
  200. strcpy(dev->szcmdsrc, "EMS");
  201. }else if(dev->cmdsrc == 2){
  202. strcpy(dev->szcmdsrc, "Backend");
  203. }else{
  204. strcpy(dev->szcmdsrc, "unknown");
  205. }
  206. dev->runmod = tab_us[0xF001 - start];
  207. if(dev->runmod == IES1000_RUNMOD_ONGRID){
  208. strcpy(dev->szrunmod, "ongrid");
  209. }else if(dev->runmod == IES1000_RUNMOD_OFFGRID){
  210. strcpy(dev->szrunmod, "offgrid");
  211. }else if(dev->runmod == IES1000_RUNMOD_ONOFFGRID){
  212. strcpy(dev->szrunmod, "onoffgrid");
  213. }else{
  214. strcpy(dev->szrunmod, "unknown");
  215. }
  216. dev->workmod = tab_us[0xF002 - start];
  217. if(dev->workmod == 0){
  218. strcpy(dev->szworkmod, "ac_power");
  219. }else if(dev->workmod == 1){
  220. strcpy(dev->szworkmod, "voltage");
  221. }else if(dev->workmod == 2){
  222. strcpy(dev->szworkmod, "current");
  223. }else if(dev->workmod == 3){
  224. strcpy(dev->szworkmod, "3-seg chg");
  225. }else{
  226. strcpy(dev->szworkmod, "na");
  227. }
  228. dev->switch_initmod = tab_us[0xF003 - start];
  229. if(dev->switch_initmod == 0){
  230. strcpy(dev->szswitch_initmod, "ongrid");
  231. }else if(dev->switch_initmod == 1){
  232. strcpy(dev->szswitch_initmod, "offgrid");
  233. }else{
  234. strcpy(dev->szswitch_initmod, "unkown");
  235. }
  236. dev->offgrid_freq = tab_us[0xF004 - start];
  237. if(dev->offgrid_freq == 0){
  238. strcpy(dev->szoffgrid_freq, "50Hz");
  239. }else if(dev->offgrid_freq == 1){
  240. strcpy(dev->szoffgrid_freq, "60Hz");
  241. }else{
  242. strcpy(dev->szworkmod, "unkown");
  243. }
  244. dev->offgrid_vol_set = tab_us[0xF005 - start]/10.0;
  245. dev->reactive_p_set_mod = tab_us[0xF006 - start];
  246. if(dev->reactive_p_set_mod == 0){
  247. strcpy(dev->szreactive_p_set_mod, "by pow");
  248. }else if(dev->reactive_p_set_mod == 1){
  249. strcpy(dev->szreactive_p_set_mod, "by factor");
  250. }else{
  251. strcpy(dev->szreactive_p_set_mod, "unkown");
  252. }
  253. dev->active_p_set = ((short)(tab_us[0xF007 - start]))/10;
  254. dev->reactive_p_set = ((short)(tab_us[0xF008 - start]))/10;
  255. dev->cv_v_set = tab_us[0xF00A - start]/10.0;
  256. dev->cc_c_set = tab_us[0xF00B - start]/10.0;
  257. dev->pow_set_src = tab_us[0xF012 - start];
  258. if(dev->pow_set_src == 0){
  259. strcpy(dev->szpow_set_src, "comm");
  260. }else if(dev->pow_set_src == 1){
  261. strcpy(dev->szpow_set_src, "AI");
  262. }else{
  263. strcpy(dev->szpow_set_src, "unkown");
  264. }
  265. dev->ins_det = tab_us[0xF021 - start];
  266. }
  267. }
  268. // 0xF100 PCS internal config
  269. static void ies1000_comm_dac_0xF100( int idx )
  270. {
  271. unsigned short tab_us[128]={0};
  272. struct ies1000_t* dev = &ies1000[idx];
  273. struct comm_t* comm = &dev->comm;
  274. int chanidx = dev->comm.chanidx;
  275. int addr = dev->comm.adr;
  276. int start, nb, rc;
  277. if( comm_get_state(comm) != COMMST_NORMAL ){
  278. return;
  279. }
  280. /* system info */
  281. nb = 30;
  282. start = 0xF100;
  283. chan_lock(chanidx);
  284. rc = chan_read_holdingregisters_with_retry( chanidx, addr, start, nb, tab_us);
  285. if( rc < 0){
  286. comm_set_state(comm, COMMST_ERR);
  287. }
  288. chan_unlock(chanidx);
  289. if( rc == 0){ /* read ok */
  290. dev->dc_ovp = tab_us[0xF108 - start]/10.0;
  291. dev->dc_uvp = tab_us[0xF109 - start]/10.0;
  292. dev->dc_dfp = tab_us[0xF10A - start]/10.0;
  293. dev->dc_ocp = tab_us[0xF10B - start]/10.0;
  294. dev->env_otp = tab_us[0xF10C - start];
  295. dev->reactor_otp = tab_us[0xF10D - start];
  296. dev->igbt_otp = tab_us[0xF10E - start];
  297. }
  298. }
  299. /* F5 IES1000 control param */
  300. static void ies1000_comm_dac_0xF509( int idx )
  301. {
  302. unsigned short tab_us[128]={0};
  303. struct ies1000_t* dev = &ies1000[idx];
  304. struct comm_t* comm = &dev->comm;
  305. int chanidx = dev->comm.chanidx;
  306. int addr = dev->comm.adr;
  307. int start, nb, rc;
  308. if( comm_get_state(comm) != COMMST_NORMAL ){
  309. return;
  310. }
  311. nb = 60;
  312. start = 0xF509;
  313. chan_lock(chanidx);
  314. rc = chan_read_holdingregisters_with_retry( chanidx, addr, start, nb, tab_us);
  315. if( rc < 0){
  316. comm_set_state(comm, COMMST_ERR);
  317. }
  318. chan_unlock(chanidx);
  319. if( rc == 0){ /* read ok */
  320. dev->gridfreq_autoadj = tab_us[0xF509 - start];
  321. dev->pow_adjrate_en = tab_us[0xF524 - start];
  322. dev->pow_adjrate_set = tab_us[0xF525 - start];
  323. dev->isl_det = tab_us[0xF544 - start];
  324. }
  325. }
  326. // 0xEB37 time sync
  327. static void ies1000_comm_dac_0xEB37( int idx )
  328. {
  329. unsigned short tab_us[256]={0};
  330. struct ies1000_t* dev = &ies1000[idx];
  331. struct comm_t* comm = &dev->comm;
  332. int chanidx = dev->comm.chanidx;
  333. int addr = dev->comm.adr;
  334. int start, nb, rc;
  335. if( comm_get_state(comm) != COMMST_NORMAL ){
  336. return;
  337. }
  338. nb = 60;
  339. start = 0xEB00;
  340. chan_lock(chanidx);
  341. rc = chan_read_holdingregisters_with_retry( chanidx, addr, start, nb, tab_us);
  342. if( rc < 0){
  343. comm_set_state(comm, COMMST_ERR);
  344. }
  345. chan_unlock(chanidx);
  346. if( rc == 0){ /* read ok */
  347. dev->sync_year = tab_us[0xEB37 - start];
  348. dev->sync_month = tab_us[0xEB38 - start]/100;
  349. dev->sync_day = tab_us[0xEB38 - start] - dev->sync_month*100;
  350. dev->sync_hour = tab_us[0xEB39 - start]/100;
  351. dev->sync_min = tab_us[0xEB39 - start] - dev->sync_hour*100;
  352. dev->sync_sec = tab_us[0xEB3A - start];
  353. }
  354. }
  355. // 0xED00
  356. static void ies1000_comm_dac_0xED00( int idx )
  357. {
  358. unsigned short tab_us[128]={0};
  359. struct ies1000_t* dev = &ies1000[idx];
  360. struct comm_t* comm = &dev->comm;
  361. int chanidx = dev->comm.chanidx;
  362. int addr = dev->comm.adr;
  363. int start, nb, rc;
  364. if( comm_get_state(comm) != COMMST_NORMAL ){
  365. return;
  366. }
  367. nb = 93;
  368. start = 0xED00;
  369. chan_lock(chanidx);
  370. rc = chan_read_holdingregisters_with_retry( chanidx, addr, start, nb, tab_us);
  371. if( rc < 0){
  372. comm_set_state(comm, COMMST_ERR);
  373. }
  374. chan_unlock(chanidx);
  375. if( rc == 0){ /* read ok */
  376. comm_stop_cal_dac_timing(comm);
  377. dev->runstatus = tab_us[0xED00 - start];
  378. if(dev->runstatus == 0){
  379. strcpy(dev->szrunstatus,"stop");
  380. }else if(dev->runstatus == 1){
  381. strcpy(dev->szrunstatus,"idle");
  382. }else if(dev->runstatus == 2){
  383. strcpy(dev->szrunstatus,"dhg");
  384. }else if(dev->runstatus == 3){
  385. strcpy(dev->szrunstatus,"chg");
  386. }else{
  387. strcpy(dev->szrunstatus,"na");
  388. }
  389. dev->dc_v = ((short)tab_us[0xED0A - start])/10.0;
  390. dev->dc_c = ((short)tab_us[0xED0B - start])/10.0;
  391. dev->grid_freq = tab_us[0xED12 - start]/100.0;
  392. dev->grid_v = tab_us[0xED14 - start]/10.0;
  393. dev->ac_c = tab_us[0xED15 - start]/10.0;
  394. dev->ua = tab_us[0xED1E - start]/10.0;
  395. dev->ub = tab_us[0xED1F - start]/10.0;
  396. dev->uc = tab_us[0xED20 - start]/10.0;
  397. dev->ia = tab_us[0xED21 - start]/10.0;
  398. dev->ib = tab_us[0xED22 - start]/10.0;
  399. dev->ic = tab_us[0xED23 - start]/10.0;
  400. dev->ap = ((short)tab_us[0xED2A - start])/10.0;
  401. dev->dc_p = ((short)tab_us[0xED2B - start])/10.0;
  402. dev->ac_breaker = tab_us[0xED36 - start];//ie1000_100kW 无此寄存器
  403. dev->dc_breaker = tab_us[0xED38 - start];
  404. dev->dcbuf_cont = tab_us[0xED3C - start];//ie1000_100kW 无此寄存器
  405. dev->emg_btn = tab_us[0xED3E - start];
  406. dev->chg_e_day = tab_us[0xED45 - start];
  407. dev->dhg_e_day = tab_us[0xED46 - start];
  408. dev->chg_e_total = tab_us[0xED48 -start]<<16|tab_us[0xED47 - start];
  409. dev->dhg_e_total = tab_us[0xED4A - start]<<16|tab_us[0xED49 - start];
  410. dev->temp_igbt_a = ((short)tab_us[0xED4B - start])/10.0;
  411. dev->temp_igbt_b = ((short)tab_us[0xED4C - start])/10.0;
  412. dev->temp_igbt_c = ((short)tab_us[0xED4D - start])/10.0;
  413. dev->temp_reactor = ((short)tab_us[0xED4E - start])/10.0;//ie1000_100kW 无此寄存器
  414. dev->temp_env = ((short)tab_us[0xED4F - start])/10.0;
  415. dev->errstatus = tab_us[0xED5C - start];
  416. }
  417. }
  418. // 0x0E14 fault state word
  419. static void ies1000_comm_dac_0x0E14( int idx )
  420. {
  421. unsigned short tab_us[128]={0};
  422. struct ies1000_t* dev = &ies1000[idx];
  423. struct comm_t* comm = &dev->comm;
  424. int chanidx = dev->comm.chanidx;
  425. int addr = dev->comm.adr;
  426. int start, nb, rc;
  427. if( comm_get_state(comm) != COMMST_NORMAL ){
  428. return;
  429. }
  430. nb = 6;
  431. start = 0x0E14;
  432. chan_lock(chanidx);
  433. rc = chan_read_holdingregisters_with_retry( chanidx, addr, start, nb, tab_us);
  434. if( rc < 0){
  435. comm_set_state(comm, COMMST_ERR);
  436. }
  437. chan_unlock(chanidx);
  438. if( rc == 0){ // read ok
  439. dev->faults[1] = tab_us[0x0E14 - start];
  440. dev->faults[2] = tab_us[0x0E15 - start];
  441. dev->faults[3] = tab_us[0x0E16 - start];
  442. dev->faults[4] = tab_us[0x0E17 - start];
  443. dev->faults[5] = tab_us[0x0E18 - start];
  444. dev->faults[6] = tab_us[0x0E19 - start];
  445. }
  446. }
  447. // 0x0F14 warning state word
  448. static void ies1000_comm_dac_0x0F14( int idx )
  449. {
  450. unsigned short tab_us[128]={0};
  451. struct ies1000_t* dev = &ies1000[idx];
  452. struct comm_t* comm = &dev->comm;
  453. int chanidx = dev->comm.chanidx;
  454. int addr = dev->comm.adr;
  455. int start, nb, rc;
  456. if( comm_get_state(comm) != COMMST_NORMAL ){
  457. return;
  458. }
  459. nb = 6;
  460. start = 0x0F14;
  461. chan_lock(chanidx);
  462. rc = chan_read_holdingregisters_with_retry( chanidx, addr, start, nb, tab_us);
  463. if( rc < 0){
  464. comm_set_state(comm, COMMST_ERR);
  465. }
  466. chan_unlock(chanidx);
  467. if( rc == 0){ // read ok
  468. dev->warns[1] = tab_us[0x0F14 - start];
  469. dev->warns[2] = tab_us[0x0F15 - start];
  470. dev->warns[3] = tab_us[0x0F16 - start];
  471. dev->warns[4] = tab_us[0x0F17 - start];
  472. dev->warns[5] = tab_us[0x0F18 - start];
  473. dev->warns[6] = tab_us[0x0F19 - start];
  474. comm_stop_cal_dac_timing(comm);
  475. }
  476. }
  477. void ies1000_comm_dac( int idx )
  478. {
  479. struct ies1000_t* dev = &ies1000[idx];
  480. struct comm_t* comm = &dev->comm;
  481. unsigned short tab_us[128]={0};
  482. int start, nb;
  483. int chan_idx = dev->comm.chanidx;
  484. int addr = dev->comm.adr;
  485. int ret = 0;
  486. if( comm_get_state(comm) != COMMST_NORMAL ){
  487. return;
  488. }
  489. comm_start_cal_dac_timing(comm);
  490. if( comm_get_dac_param_en(comm) == 1 ){
  491. comm_set_dac_param_en(comm, 0);
  492. ies1000_comm_dac_0xF100(idx);
  493. ies1000_comm_dac_0xF509(idx);
  494. ies1000_comm_dac_0xEB37(idx);
  495. //misc_gen_datetimestr( dev->comm.szpollparam_datetime, sizeof(dev->comm.szpollparam_datetime) );
  496. }
  497. ies1000_comm_dac_0xF000(idx);
  498. ies1000_comm_dac_0xED00(idx);
  499. ies1000_comm_dac_0x0E14(idx);
  500. ies1000_comm_dac_0x0F14(idx);
  501. }
  502. int ies1000_set_dev_datetime( int idx, int year, int month, int day, int hour, int minute, int second )
  503. {
  504. int rc, ret = 0;
  505. struct ies1000_t* dev = &ies1000[idx];
  506. int chanidx = dev->comm.chanidx;
  507. int addr = dev->comm.adr;
  508. int regaddr = 0xEB37;
  509. int val = 1;
  510. // set year
  511. regaddr = 0xEB37;
  512. val = year;
  513. chan_lock(chanidx);
  514. rc = chan_write_single_register_with_retry(chanidx, addr, regaddr, val);
  515. chan_unlock(chanidx);
  516. if( rc != 0 ){
  517. log_dbg("%s, idx:%d, set year fail", __func__, idx);
  518. ret = -1;
  519. goto leave;
  520. }
  521. // set month and day
  522. regaddr = 0xEB38;
  523. val = month*100 + day;
  524. chan_lock(chanidx);
  525. rc = chan_write_single_register_with_retry(chanidx, addr, regaddr, val);
  526. chan_unlock(chanidx);
  527. if( rc != 0 ){
  528. log_dbg("%s, idx:%d, set month and day fail", __func__, idx);
  529. ret = -1;
  530. goto leave;
  531. }
  532. // set hour and minute
  533. regaddr = 0xEB39;
  534. val = hour*100 + minute;
  535. chan_lock(chanidx);
  536. rc = chan_write_single_register_with_retry(chanidx, addr, regaddr, val);
  537. chan_unlock(chanidx);
  538. if( rc != 0 ){
  539. log_dbg("%s, idx:%d, set hour and minute fail", __func__, idx);
  540. ret = -1;
  541. goto leave;
  542. }
  543. // set second
  544. regaddr = 0xEB3A;
  545. val = second;
  546. chan_lock(chanidx);
  547. rc = chan_write_single_register_with_retry(chanidx, addr, regaddr, val);
  548. chan_unlock(chanidx);
  549. if( rc != 0 ){
  550. log_dbg("%s, idx:%d, set second fail", __func__, idx);
  551. ret = -1;
  552. goto leave;
  553. }
  554. leave:
  555. return ret;
  556. }