cascade.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896
  1. #include "cascade.h"
  2. #include "mb.h"
  3. #include "lock.h"
  4. #include "list.h"
  5. #include "modbus.h"
  6. #include <rtthread.h>
  7. #include <unistd.h>
  8. #include "pthread.h"
  9. #include "stdio.h"
  10. #include "string.h"
  11. #include "power.h"
  12. #include "paras.h"
  13. #include "thread.h"
  14. #define REGS(x) (((x)+(x)%2)/2)
  15. typedef void * handle_t;
  16. typedef struct {
  17. mb_inst_t *hinst;
  18. uint8_t mode;
  19. uint8_t type;
  20. rt_thread_t tid;
  21. uint8_t quit;
  22. }mb_handle_t;
  23. typedef struct {
  24. union {
  25. md_ac_dc_t ac_dc;
  26. md_3_ac_t ac_3;
  27. }data;
  28. }north_data_t;
  29. typedef struct cascade_info{
  30. uint8_t saddr;
  31. uint8_t read_addr;
  32. uint8_t md_type;
  33. uint32_t bund;
  34. uint8_t quit;
  35. slave_info_t *info;
  36. lock_t lock;
  37. mb_handle_t* mb;
  38. slave_t slaves[CASCADE_MAX+1];
  39. cmd_data_t cmd;
  40. // union {
  41. // md_ac_dc_t ac_dc;
  42. // md_3_ac_t ac_3;
  43. // }data; //modbus to user
  44. north_data_t *north;
  45. }cascade_handle_t;
  46. static int sendlen=0; //级联读取offset
  47. static cascade_handle_t slave_info = {0}; //自维护全局变量
  48. static mb_cascade_fun_t func = {0}; //匹配mdbus 回调函数
  49. const mb_cb_table_t mb_table = {
  50. .read_disc = mb_port_read_disc, //读离散量输入
  51. .read_coil = mb_port_read_coil, //读线圈
  52. .write_coil = mb_port_write_coil, //写线圈
  53. .read_input = mb_port_read_input, //读输入寄存器
  54. .read_hold = mb_port_read_hold, //读保持寄存器
  55. .write_hold = mb_port_write_hold, //写保持寄存器
  56. };
  57. static int mb_write_read(cascade_handle_t *cas, int addr, data_t *wd, data_t *rd);
  58. static int master_query(cascade_handle_t *cas);
  59. static void slave_func(uint16_t reg,void *r_w_data,uint32_t lenth);
  60. static int slave_get_info(cascade_handle_t *cas);
  61. static int master_cmd(cascade_handle_t *cas,uint8_t cur_dev_addr ,cmd_data_t *cmd);
  62. static void slave_rm(uint8_t addr);
  63. static void memswap(uint8_t *buf, int len);
  64. static void * my_memcpy_byte(void *dst, const void *src, int n);
  65. static uint8_t master_scan(cascade_handle_t *cas);
  66. static int _mb_write(cascade_handle_t *cas, int addr, data_t *d);
  67. static int _mb_read(cascade_handle_t *cas, int addr, data_t *d);
  68. static void* off_on_thread(void *arg); //主机控制从机开关线程
  69. static void memswap(uint8_t *buf, int len)
  70. {
  71. int i;
  72. uint8_t tmp;
  73. for(i=0; i<len; i+=2) {
  74. tmp = buf[i];
  75. buf[i] = buf[i+1];
  76. buf[i+1] = tmp;
  77. }
  78. }
  79. static void slave_rm(uint8_t addr)
  80. {
  81. if(addr > 0 && addr < SLAVE_CH_MAX)
  82. {
  83. slave_info.slaves[addr].addr = 0;
  84. slave_info.slaves[addr].err = 0;
  85. }
  86. }
  87. static uint8_t master_scan(cascade_handle_t *cas)
  88. {
  89. static uint8_t slave_addr = 1;
  90. if(slave_addr > CASCADE_MAX)
  91. {
  92. slave_addr = 1;
  93. }
  94. if(cas->slaves[slave_addr].addr == 0)
  95. {
  96. //scan
  97. uint16_t value = 0;
  98. lock_on(cas->lock);
  99. int r = mb_read(cas->mb,slave_addr,CASCADE_REG_SCAN,&value,1,300);
  100. lock_off(cas->lock);
  101. if(r > 0)
  102. {
  103. LOGD("scan slave addr %d !!!\n",slave_addr);
  104. cas->slaves[slave_addr].addr = slave_addr;
  105. cas->slaves[slave_addr].err = 0;
  106. }
  107. }
  108. slave_addr++;
  109. }
  110. static int slave_get_info(cascade_handle_t *cas)
  111. {
  112. slave_info_t *info=cas->info;
  113. power_data_t power = power_data_get();
  114. info->channels = power.chs-1 > 0 ? power.chs-1 : power.chs;
  115. if(info->channels > SLAVE_CH_MAX)
  116. info->channels = SLAVE_CH_MAX;
  117. if(info->channels == 0)
  118. return -1;
  119. for(int i=0; i < info->channels;i++)
  120. {
  121. info->ch[i] = power.pch[i+1];
  122. }
  123. LOGD("slave will send %d channels to master!!!!\n",info->channels);
  124. return 0;
  125. }
  126. static void *my_memcpy_byte(void *dst, const void *src, int n)
  127. {
  128. if (dst == NULL || src == NULL || n <= 0)
  129. return NULL;
  130. char * pdst = (char *)dst;
  131. char * psrc = (char *)src;
  132. if (pdst > psrc && pdst < psrc + n)
  133. {
  134. pdst = pdst + n - 1;
  135. psrc = psrc + n - 1;
  136. while (n--)
  137. *pdst-- = *psrc--;
  138. }
  139. else
  140. {
  141. while (n--)
  142. *pdst++ = *psrc++;
  143. }
  144. return dst;
  145. }
  146. static void slave_func(uint16_t reg,void *r_w_data,uint32_t lenth)
  147. {
  148. cmd_data_t *cmd=NULL;
  149. mb_handle_t *handle = (mb_handle_t *)(slave_info.mb);
  150. pthread_t id = 0;
  151. power_data_t power = power_data_get();
  152. switch (reg)
  153. {
  154. case CASCADE_REG_SCAN:
  155. break;
  156. case CASCADE_REG_WRITE:
  157. {
  158. cmd = (cmd_data_t*)(r_w_data);
  159. if(cmd->cmd>=CASCADE_CMD_GET_INFO) {
  160. slave_info.cmd = *cmd;
  161. }
  162. //LOGD("____write_____ %d\n",lenth);
  163. sendlen = 0;
  164. switch(cmd->cmd)
  165. {
  166. case CASCADE_CMD_OPEN:
  167. case CASCADE_CMD_CLOSE:
  168. {
  169. cmd_data_t *pcmd=malloc(sizeof(cmd_data_t));
  170. if(pcmd) {
  171. *pcmd = *cmd;
  172. pthread_create(&id,NULL,off_on_thread,pcmd);
  173. pthread_detach(id);
  174. }
  175. }
  176. break;
  177. case CASCADE_CMD_OPEN_NF:
  178. case CASCADE_CMD_CLOSE_NF:
  179. {
  180. }
  181. break;
  182. case CASCADE_CMD_SAVE:
  183. case CASCADE_CMD_SAVE3:
  184. {
  185. }
  186. break;
  187. case CASCADE_CMD_BREAKER_SAVE_ADD:
  188. {
  189. }
  190. break;
  191. case CASCADE_CMD_BREAKER_SAVE_UPDATE:
  192. {
  193. }
  194. break;
  195. case CASCADE_CMD_BREAKER_SAVE_DELETE:
  196. {
  197. }
  198. break;
  199. }
  200. }
  201. break;
  202. case CASCADE_REG_READ:
  203. {
  204. cmd = &slave_info.cmd;
  205. switch(cmd->cmd)
  206. {
  207. case CASCADE_CMD_GET_INFO:
  208. {
  209. LOGD("____read_____ %d,sendlen = %d size=%d\n",lenth,sendlen,sizeof(power_ch_t)*4);
  210. //my_memcpy_byte(r_w_data,(void*)&slave_info.info+sendlen,lenth*2);
  211. uint8_t * base_addr = (uint8_t *)&power.pch[1];
  212. my_memcpy_byte(r_w_data,base_addr+sendlen,lenth*2);
  213. memswap(r_w_data,lenth*2);
  214. }
  215. break;
  216. case CASCADE_CMD_QUERY_CH:
  217. {
  218. //my_memcpy_byte(r_w_data,(void*)&slave_info.info+sendlen,lenth*2);
  219. //power_data_t power = power_data_get();
  220. uint8_t * base_addr = (uint8_t *)&power.pch[1];
  221. //my_memcpy_byte(r_w_data,&power.pch[1]+sendlen,lenth*2);
  222. my_memcpy_byte(r_w_data,base_addr+sendlen,lenth*2);
  223. memswap(r_w_data,lenth*2);
  224. }
  225. break;
  226. case CASCADE_CMD_BREAKER_QUERY:
  227. break;
  228. case CASCADE_CMD_QUERY_VOL:break;
  229. case CASCADE_CMD_QUERY_CUR:break;
  230. case CASCADE_CMD_QUERY_PWR:break;
  231. case CASCADE_CMD_QUERY_PWRQ:break;
  232. case CASCADE_CMD_QUERY_HIS:break;
  233. case CASCADE_CMD_QUERY_TOTAL:break;
  234. case CASCADE_CMD_QUERY_TOTAL_PWR:break;
  235. case CASCADE_CMD_BREAKER_GET_INFO:break;
  236. }
  237. sendlen += lenth*2;
  238. }
  239. break;
  240. default:
  241. {
  242. }
  243. break;
  244. }
  245. }
  246. static int _mb_write(cascade_handle_t *cas, int addr, data_t *d)
  247. {
  248. int i = 0,r=0,timeout=0;
  249. int wl,xlen,wlen=0,oncelen=250;
  250. uint8_t retry = 5;
  251. uint8_t buff[MB_BUF_SIZE+100];
  252. if(d->dlen<=0) {
  253. return -1;
  254. }
  255. lock_on(cas->lock);
  256. for(;i < retry;i++)
  257. {
  258. while(1)
  259. {
  260. if(wlen+oncelen>d->dlen) {
  261. xlen = d->dlen-wlen;
  262. } else
  263. {
  264. xlen = oncelen;
  265. }
  266. xlen += xlen%2;
  267. memcpy(buff, d->data+wlen, xlen);
  268. //交换数据
  269. memswap(buff,xlen%2+xlen);
  270. wl = mb_write(cas->mb, addr, CASCADE_REG_WRITE, (uint16_t*)buff, xlen/2);
  271. if(wl<=0) {
  272. LOGE("___ _mb_write failed, addr: %d, reg: %d, cnt: %d, %s, retry: %d\n", addr, CASCADE_REG_WRITE, xlen/2,"write failed",i+1);
  273. if(addr >0 && addr < SLAVE_CH_MAX)
  274. {
  275. slave_info.slaves[addr].err ++;
  276. if(slave_info.slaves[addr].err > 5)
  277. {
  278. slave_rm(addr);
  279. }
  280. }
  281. r = -1;
  282. break;
  283. }else
  284. {
  285. slave_info.slaves[addr].err = 0;
  286. r = 0;
  287. }
  288. if(wlen+wl*2>=d->dlen) {
  289. break;
  290. }else {
  291. xlen = wl*2;
  292. }
  293. wlen += xlen;
  294. }
  295. if(r == 0)
  296. break;
  297. }
  298. lock_off(cas->lock);
  299. return r;
  300. }
  301. static int _mb_read(cascade_handle_t *cas, int addr, data_t *d)
  302. {
  303. int i=0,r=0,finish=0,timeout=0;
  304. int rl,xlen,rlen=0,oncelen=250;
  305. uint8_t retry = 5;
  306. uint16_t buff[MB_BUF_SIZE];
  307. if(d->dlen<=0) {
  308. return -1;
  309. }
  310. lock_on(cas->lock);
  311. for(i =0;i < retry;i++)
  312. {
  313. while(1) {
  314. if(rlen+oncelen>d->dlen) {
  315. xlen = d->dlen-rlen;
  316. }else{
  317. xlen = oncelen;
  318. }
  319. xlen += xlen%2;
  320. rl = mb_read(cas->mb, addr, CASCADE_REG_READ, buff, xlen/2,100);
  321. if(rl<=0) {
  322. LOGE("___ _mb_read failed, %s, rlen: %d, retry: %d\n", "read error", rlen, i+1);
  323. if(addr >0 && addr < SLAVE_CH_MAX)
  324. {
  325. cas->slaves[addr].err ++;
  326. if(cas->slaves[addr].err > 5)
  327. {
  328. slave_rm(addr);
  329. }
  330. }
  331. r = -1; break;
  332. }else
  333. {
  334. cas->slaves[addr].err =0;
  335. }
  336. if(rlen+rl*2>=d->dlen) {
  337. xlen = d->dlen-rlen;
  338. finish = 1;
  339. }else
  340. {
  341. xlen = rl*2;
  342. }
  343. memcpy((char*)d->data+rlen, buff, xlen);
  344. rlen += xlen;
  345. if(finish) {
  346. r = 0;
  347. break;
  348. }
  349. }
  350. if(r==0)
  351. break;
  352. }
  353. lock_off(cas->lock);
  354. return r;
  355. }
  356. static int mb_write_read(cascade_handle_t *cas, int addr, data_t *wd, data_t *rd)
  357. {
  358. int r=0;
  359. r = _mb_write(cas, addr,wd);
  360. if(r==0) {
  361. r = _mb_read(cas, addr,rd);
  362. }
  363. return r;
  364. }
  365. static void* off_on_thread(void *arg)
  366. {
  367. cascade_handle_t *cas=&slave_info;
  368. cmd_data_t *pcmd=(cmd_data_t*)arg;
  369. if(pcmd->cmd==CASCADE_CMD_OPEN) {
  370. // LOGD("____ slave CASCADE_CMD_OPEN\n");
  371. }
  372. else {
  373. // LOGD("____ slave CASCADE_CMD_CLOSE\n");
  374. }
  375. int flag=((pcmd->cmd==CASCADE_CMD_OPEN)?1:0);
  376. if(pcmd->chId == 0xff) {
  377. // all
  378. }else
  379. {
  380. //one
  381. }
  382. if(pcmd->cmd==CASCADE_CMD_OPEN) {
  383. // sprintf(temp,"$开启$|$所有$|$通道$");
  384. }
  385. else {
  386. // sprintf(temp,"$关闭$|$所有$|$通道$");
  387. }
  388. //data base
  389. free(pcmd);
  390. pthread_exit(NULL);
  391. }
  392. static int master_cmd(cascade_handle_t *cas,uint8_t cur_dev_addr ,cmd_data_t *cmd)
  393. {
  394. int i,r;
  395. data_t rdata,wdata;
  396. if(cur_dev_addr==0) {
  397. return -1;
  398. }
  399. switch(cmd->cmd) {
  400. case CASCADE_CMD_OPEN:
  401. case CASCADE_CMD_CLOSE:
  402. case CASCADE_CMD_SAVE:
  403. case CASCADE_CMD_SAVE3:
  404. case CASCADE_CMD_OPEN_NF:
  405. case CASCADE_CMD_CLOSE_NF:
  406. {
  407. LOGD("____ master CMD: %d\n", cmd->cmd);
  408. wdata.dlen = sizeof(cmd_data_t);
  409. wdata.data = (uint8_t*)cmd;
  410. r = _mb_write(cas, cur_dev_addr, &wdata);
  411. }
  412. break;
  413. case CASCADE_CMD_GET_INFO:
  414. {
  415. wdata.dlen = sizeof(cmd_data_t);
  416. wdata.data = (uint8_t*)cmd;
  417. // rdata.dlen = sizeof(slave_info_t)-sizeof(power_ch_t)*SLAVE_CH_MAX;
  418. // rdata.data = (uint8_t*)cas->info;
  419. uint16_t value = 0;
  420. r = mb_read(cas->mb,cur_dev_addr,4000,&value,1,100);//获取通道数
  421. //r = mb_write_read(cas, cur_dev_addr, &wdata, &rdata);
  422. LOGD("r = %d value=%d\n",r,value);
  423. if(r == 1)
  424. {
  425. uint8_t chanels = value & 0xff;
  426. if(chanels == 0 || chanels > 100)
  427. {
  428. cas->info->channels = 0;
  429. LOGD("get slave channels %d!!!\n",chanels);
  430. }else
  431. {
  432. if(chanels >= SLAVE_CH_MAX)
  433. chanels = SLAVE_CH_MAX;
  434. cas->info->channels = chanels;
  435. //rdata.dlen = sizeof(slave_info_t) -sizeof(power_ch_t)*(SLAVE_CH_MAX - cas->info.channels);
  436. rdata.dlen = sizeof(power_ch_t)*cas->info->channels;
  437. rdata.data = (uint8_t*)&(cas->info->ch);
  438. r = mb_write_read(cas, cur_dev_addr, &wdata, &rdata);
  439. if(r==0) {
  440. }else
  441. {
  442. LOGE("_____ master CASCADE_CMD_GET_INFO read failed\n");
  443. }
  444. }
  445. }
  446. // if(r==0) {
  447. // rdata.dlen = sizeof(slave_info_t)-sizeof(power_ch_t)*(SLAVE_CH_MAX - cas->info.channels);
  448. // rdata.data = (uint8_t*)&cas->info;
  449. // r = mb_write_read(cas, cur_dev_addr, &wdata, &rdata);
  450. // if(r==0) {
  451. // }else
  452. // {
  453. // LOGE("_____ master CASCADE_CMD_GET_INFO read failed\n");
  454. // }
  455. // }
  456. // else {
  457. // LOGE("_____ master CASCADE_CMD_GET_INFO failed\n");
  458. // }
  459. }
  460. break;
  461. case CASCADE_CMD_BREAKER_GET_INFO:
  462. {
  463. }
  464. break;
  465. case CASCADE_CMD_BREAKER_SAVE_UPDATE:
  466. case CASCADE_CMD_BREAKER_SAVE_DELETE:
  467. case CASCADE_CMD_BREAKER_SAVE_ADD:
  468. {
  469. }
  470. break;
  471. default:
  472. cas->cmd = *cmd;
  473. r = 0;
  474. }
  475. return r;
  476. }
  477. uint8_t cascade_init(const char* uart,uint8_t mode,uint8_t addr,uint32_t baud)
  478. {
  479. mb_para_t para;
  480. para.type = MB_TYPE_RTU;
  481. para.para.rtu.dev = (char *)uart;
  482. para.para.rtu.baudrate = baud;
  483. para.para.rtu.parity = 0;
  484. para.para.rtu.pin = -1;
  485. para.para.rtu.lvl = 0;
  486. para.para.rtu.baudrate = baud;
  487. memset(&slave_info,0,sizeof(slave_info));
  488. slave_info.quit = 1;
  489. if(addr == 0){
  490. para.mode = MB_MODE_MASTER;
  491. }else
  492. {
  493. para.mode = MB_MODE_SLAVE;
  494. slave_info.saddr = addr;
  495. }
  496. slave_info.bund = baud;
  497. slave_info.md_type = para.mode;
  498. slave_info.lock = lock_init();
  499. slave_info.mb = mb_init(&para);
  500. if(!slave_info.mb) {
  501. return -1;
  502. }
  503. if(para.mode == MB_MODE_SLAVE)
  504. {
  505. mb_handle_t *handle = (mb_handle_t *)(slave_info.mb);
  506. mb_set_slave(slave_info.mb->hinst,slave_info.saddr);
  507. mb_set_cb_table(slave_info.mb->hinst,&mb_table);
  508. func.slave_func = slave_func;
  509. mb_set_cb_cascade(slave_info.mb->hinst,&func);
  510. slave_info.north = (north_data_t *)malloc(sizeof(north_data_t));
  511. if(slave_info.north == NULL)
  512. {
  513. LOGE("can't malloc to large memery!!!\n");
  514. return -1;
  515. }
  516. memset(slave_info.north,0,sizeof(north_data_t));
  517. }else if(para.mode == MB_MODE_MASTER)
  518. {
  519. slave_info.info = (slave_info_t *) malloc(sizeof(slave_info_t));
  520. if(slave_info.info == NULL)
  521. {
  522. LOGE("can't malloc to large slave_info.info memery!!!\n");
  523. return -1;
  524. }
  525. memset(slave_info.info,0,sizeof(slave_info_t));
  526. }
  527. slave_info.quit = 0;
  528. if(para.mode == MB_MODE_MASTER)
  529. slave_info.read_addr = 1;
  530. LOGD("uart: %s mode: %d addr: %d bound: %d\n",uart,slave_info.md_type,slave_info.saddr,para.para.rtu.baudrate);
  531. LOGD("scan thread!!!\n");
  532. thread_start(THREAD_ID_CAS_SCAN,cascade_scan_thread,NULL);
  533. sleep(1);
  534. LOGD("cascade thread!!!\n");
  535. thread_start(THREAD_ID_CAS_TH,cascade_thread,NULL);
  536. return 0;
  537. }
  538. uint8_t cascade_deinit()
  539. {
  540. mb_handle_t *handle = (mb_handle_t *)(slave_info.mb);
  541. lock_deinit(slave_info.lock);
  542. mb_deinit(slave_info.mb);
  543. if(slave_info.north)
  544. {
  545. free(slave_info.north);
  546. slave_info.north = 0;
  547. }
  548. if(slave_info.info)
  549. {
  550. free(slave_info.info);
  551. slave_info.info = 0;
  552. }
  553. return 0;
  554. }
  555. void cascade_scan_thread(void *arg)
  556. {
  557. mb_handle_t *handle=(mb_handle_t *)(&slave_info.mb);
  558. while(slave_info.quit == 0)
  559. {
  560. if(slave_info.md_type == MB_MODE_MASTER)
  561. {
  562. master_scan(&slave_info);
  563. sleep(1);
  564. }else //做从机//拷贝数据到北向
  565. {
  566. paras_data_t* p_data = paras_get();
  567. power_data_t power = power_data_get();
  568. if(p_data->prod.type == PDU_AC_I1O1 || p_data->prod.type == PDU_DC_I1O1)
  569. {
  570. int channels = power.chs > 0 ? power.chs - 1: 0;
  571. slave_info.north->data.ac_dc.dev_cnt = (p_data->prod.type << 8 | channels);
  572. int cnt = power.chs > SLAVE_CH_MAX ? SLAVE_CH_MAX : channels;
  573. //电量信息
  574. for(int i = 0; i < cnt;i++)
  575. {
  576. slave_info.north->data.ac_dc.power[i].voltage = power.pch[i].power[0].voltage *1000;
  577. slave_info.north->data.ac_dc.power[i].current = power.pch[i].power[0].current *1000;
  578. slave_info.north->data.ac_dc.power[i].power = power.pch[i].power[0].power *1000;
  579. slave_info.north->data.ac_dc.power[i].consumer = power.pch[i].power[0].consump *1000;
  580. slave_info.north->data.ac_dc.power[i].factor = power.pch[i].power[0].factor *1000;
  581. slave_info.north->data.ac_dc.power[i].freq = power.pch[i].power[0].freq *1000;
  582. }
  583. //总信息
  584. //slave_info.north->data.ac_dc.power_all. = power.ttl.total;
  585. slave_info.north->data.ac_dc.power_all.all_consumer = power.ttl.total[0].consump *1000;
  586. slave_info.north->data.ac_dc.power_all.all_current = power.ttl.total[0].current *1000;
  587. slave_info.north->data.ac_dc.power_all.all_power = power.ttl.total[0].power *1000;
  588. slave_info.north->data.ac_dc.power_all.all_voltage = power.ttl.total[0].voltage *1000;
  589. //温湿度
  590. slave_info.north->data.ac_dc.temp = 0; //后续加上传感器数据
  591. slave_info.north->data.ac_dc.humity = 0;
  592. for(int i = 0; i < cnt;i++)
  593. slave_info.north->data.ac_dc.switch_stu[i] = 0;
  594. for(int i = 0; i < cnt;i++)
  595. {
  596. slave_info.north->data.ac_dc.delay_open[i] = power.pch[i].info.start_delay;
  597. }
  598. for(int i = 0; i < cnt;i++)
  599. {
  600. slave_info.north->data.ac_dc.delay_close[i] = power.pch[i].info.stop_delay;
  601. }
  602. }else
  603. {
  604. int channels = power.chs > 0 ? power.chs - 1: 0;
  605. slave_info.north->data.ac_3.dev_cnt = (p_data->prod.type << 8 | channels);
  606. for(int i = A_P; i <= C_P;i++)
  607. {
  608. slave_info.north->data.ac_3.ac_3_all_pw[i].consumer = power.ttl.total[i].consump *1000;
  609. slave_info.north->data.ac_3.ac_3_all_pw[i].current = power.ttl.total[i].current *1000;
  610. slave_info.north->data.ac_3.ac_3_all_pw[i].power = power.ttl.total[i].power *1000;
  611. slave_info.north->data.ac_3.ac_3_all_pw[i].voltage = power.ttl.total[i].voltage *1000;
  612. }
  613. int cnt = power.chs > SLAVE_CH_MAX ? SLAVE_CH_MAX : channels;
  614. for(int i = 0; i < cnt;i++)
  615. {
  616. //总体信息
  617. }
  618. for(int i = 0; i < cnt;i++)
  619. {
  620. for(int j = A_P; j <= C_P;j++)
  621. {
  622. slave_info.north->data.ac_3.ac_3_chn_p[i][j].p_consumer = power.pch[i].power[j].consump * 1000;
  623. slave_info.north->data.ac_3.ac_3_chn_p[i][j].p_current = power.pch[i].power[j].current * 1000;
  624. slave_info.north->data.ac_3.ac_3_chn_p[i][j].p_power = power.pch[i].power[j].power * 1000;
  625. slave_info.north->data.ac_3.ac_3_chn_p[i][j].p_voltage = power.pch[i].power[j].voltage * 1000;
  626. slave_info.north->data.ac_3.ac_3_chn_p[i][j].p_status = power.pch[i].power[j].status;
  627. }
  628. }
  629. for(int i = 0; i < cnt;i++)
  630. {
  631. slave_info.north->data.ac_3.delay_open[i] = power.pch[i].info.start_delay;
  632. }
  633. for(int i = 0; i < cnt;i++)
  634. {
  635. slave_info.north->data.ac_3.delay_close[i] = power.pch[i].info.stop_delay;
  636. }
  637. }
  638. //LOGD("cpy data to north user\n");
  639. //slave_get_info(&slave_info);
  640. }
  641. sleep(1);
  642. }
  643. }
  644. void cascade_thread(void *arg)
  645. {
  646. mb_handle_t *handle=(mb_handle_t *)(&slave_info.mb);
  647. LOGD("__ cascade %s\n", (slave_info.md_type==MODBUS_MASTER)?"master":"slave");
  648. while(slave_info.quit==0) {
  649. if(slave_info.md_type==MODBUS_MASTER) { //主模
  650. cmd_data_t cmd;
  651. cmd.cmd = CASCADE_CMD_GET_INFO;
  652. cmd.obj = OBJ_OVERALL;
  653. slave_info.cmd = cmd;
  654. master_cmd(&slave_info,slave_info.read_addr,&cmd); ;
  655. sleep(1);
  656. }
  657. else { //从模式,等待主设备发起数据请求
  658. mb_slave_fsm(slave_info.mb->hinst);
  659. }
  660. }
  661. pthread_exit(NULL);
  662. }
  663. int cascade_request(cmd_data_t *cmd)
  664. {
  665. master_cmd(&slave_info,1,cmd);
  666. return 0;
  667. }
  668. int mb_port_read_disc(u16 addr, u8 *pbit)//读离散量输入, 返回 : 0-成功, -2-地址错误
  669. {
  670. MB_ASSERT(pbit != NULL);
  671. return(-2);
  672. }
  673. int mb_port_read_coil(u16 addr, u8 *pbit)//读线圈, 返回 : 0-成功, -2-地址错误
  674. {
  675. MB_ASSERT(pbit != NULL);
  676. return(-2);
  677. }
  678. int mb_port_write_coil(u16 addr, u8 bit)//写线圈, 返回 : 0-成功, -2-地址错误, -4-设备故障
  679. {
  680. return(-2);
  681. }
  682. int mb_port_read_input(u16 addr, u16 *preg)//读输入寄存器, 返回 : 0-成功, -2-地址错误
  683. {
  684. MB_ASSERT(preg != NULL);
  685. return(-2);
  686. }
  687. int mb_port_read_hold(u16 addr, u16 *preg)//读保持寄存器, 返回 : 0-成功, -2-地址错误
  688. {
  689. MB_ASSERT(preg != NULL);
  690. uint16_t *data = NULL;
  691. if( AC_DC_DEV_CHN_REG <= addr && addr <= AC_DC_DRY_REG)
  692. {
  693. data = (uint16_t*)(&slave_info.north->data.ac_dc);
  694. uint32_t offset = addr - AC_DC_DEV_CHN_REG;
  695. *preg = *(data+offset);
  696. return 0;
  697. }
  698. if(AC_3_DEV_CHN_REG <= addr && addr <= AC_3_DRY_REG)
  699. {
  700. data = (uint16_t*)(&slave_info.north->data.ac_3);
  701. uint32_t offset = addr - AC_3_DEV_CHN_REG;
  702. *preg = *(data+offset);
  703. return 0;
  704. }
  705. return(-2);
  706. }
  707. int mb_port_write_hold(u16 addr, u16 reg)//写保持寄存器, 返回 : 0-成功, -2-地址错误, -3-值非法, -4-设备故障
  708. {
  709. power_data_t power = power_data_get();
  710. if(AC_DC_SET_DELAY_OPEN <= addr && addr <= AC_DC_ALL_SET_SWITCH_REG)
  711. {
  712. switch(addr)
  713. {
  714. case AC_DC_SET_DELAY_OPEN ... (AC_DC_SET_DELAY_CLOSE-1):
  715. {
  716. uint16_t channel = addr - AC_DC_SET_DELAY_OPEN;
  717. //获取通道控制接口 写入数据
  718. }
  719. break;
  720. }
  721. return 0;
  722. }
  723. return(-2);
  724. }
  725. uint8_t cascade_read_slave(uint8_t addr)
  726. {
  727. memset(&slave_info.info,0,sizeof(slave_info.info));
  728. slave_info.read_addr = addr;
  729. }
  730. uint8_t cascade_set_mode(uint8_t mode,uint8_t addr)
  731. {
  732. if(MODBUS_MASTER == mode)
  733. {
  734. slave_info.md_type = MODBUS_MASTER;
  735. slave_info.saddr = 0;
  736. mb_handle_t *handle=(mb_handle_t *)(&slave_info.mb);
  737. mb_set_slave(slave_info.mb->hinst,0);
  738. }else
  739. {
  740. slave_info.md_type =MODBUS_SLAVE;
  741. mb_handle_t *handle=(mb_handle_t *)(&slave_info.mb);
  742. slave_info.saddr = addr;
  743. mb_set_slave(slave_info.mb->hinst,addr);
  744. }
  745. }
  746. void cascade_reinit(uint8_t mode,uint8_t addr,uint32_t baud)
  747. {
  748. if(mode != MODBUS_MASTER || mode !=MODBUS_SLAVE || addr >= SLAVE_CH_MAX)
  749. {
  750. return;
  751. }
  752. mb_handle_t *handle=(mb_handle_t *)(&slave_info.mb);
  753. slave_info.quit = 1;
  754. sleep(1);
  755. cascade_deinit();
  756. cascade_init(CASCADE_PORT,mode,addr,baud);
  757. }
  758. power_data_t cascade_power_get(void)
  759. {
  760. power_data_t cas_d = {0};
  761. cas_d.chs = slave_info.info->channels;
  762. cas_d.pch = &slave_info.info->ch[0];
  763. return cas_d;
  764. }
  765. int cascade_get_dlist(dev_list_t *dl)
  766. {
  767. int i,cnt=0;
  768. slave_t *sl=NULL;
  769. if(!dl) {
  770. return -1;
  771. }
  772. sl = (slave_t*)malloc(sizeof(slave_t)*(CASCADE_MAX+1));
  773. if(!sl) {
  774. return -1;
  775. }
  776. for(i=0; i<=CASCADE_MAX; i++) {
  777. if(slave_info.slaves[i].addr>=0) {
  778. sl[cnt++] = slave_info.slaves[i];
  779. }
  780. }
  781. dl->slave = sl;
  782. dl->cnt = cnt;
  783. LOGD("____dev cnt: %d\n", cnt);
  784. }
  785. int cascade_free_dlist(dev_list_t *dl)
  786. {
  787. if(!dl) {
  788. return -1;
  789. }
  790. free(dl->slave);
  791. return 0;
  792. }