cascade.c 21 KB

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