_modbus_rt_rtu.c 38 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109
  1. /**
  2. * @file _modbus_rt.c
  3. * @brief modbus_rt的pika层的API实现
  4. * @author SenySunny (senysunny@163.com)
  5. * @date 2023-05-14
  6. *
  7. * @attention
  8. *
  9. * <h2><center>&copy; Copyright (c) 2022 Ma Longwei.
  10. * All rights reserved.</center></h2>
  11. *
  12. */
  13. #include "PikaObj.h"
  14. #include "PikaStdData_List.h"
  15. #include "TinyObj.h"
  16. #include "_modbus_rt__rtu.h"
  17. #include "modbus_rtu.h"
  18. #if MODBUS_P2P_ENABLE
  19. #include "modbus_p2p.h"
  20. #endif
  21. void _modbus_rt__rtu___del__(PikaObj *self) {
  22. #if (!MODBUS_RTU_SLAVE_ENABLE) && (!MODBUS_RTU_MASTER_ENABLE)
  23. pika_platform_printf("modbus rtu is not activated.\n");
  24. #else
  25. int ret = 0;
  26. rtu_modbus_device_t dev = (rtu_modbus_device_t)obj_getPtr(self, "dev");
  27. if(NULL == dev) {
  28. pika_platform_printf("modbus_rtu_del error, dev is NULL.\n");
  29. return ;
  30. }
  31. ret = modbus_rtu_destroy(&dev);
  32. if(MODBUS_RT_EOK != ret){
  33. pika_platform_printf("modbus_rtu_destroy error, code:%d.\n", ret);
  34. return ;
  35. }
  36. obj_setPtr(self, "dev", NULL);
  37. #endif
  38. }
  39. void _modbus_rt__rtu__init(PikaObj *self, int mode) {
  40. #if (!MODBUS_RTU_SLAVE_ENABLE) && (!MODBUS_RTU_MASTER_ENABLE)
  41. pika_platform_printf("modbus rtu is not activated.\n");
  42. #else
  43. rtu_modbus_device_t dev = modbus_rtu((modbus_mode_type)mode);
  44. if(NULL == dev) {
  45. pika_platform_printf("modbus_rtu create error.\n");
  46. }
  47. obj_setInt(self, "mode", mode);
  48. obj_setPtr(self, "dev", dev);
  49. int ascii_flag = obj_getInt(self, "ascii_flag");
  50. #if MODBUS_ASCII_SLAVE_ENABLE || MODBUS_ASCII_MASTER_ENABLE
  51. if(ascii_flag) {
  52. modbus_rtu_set_ascii_flag(dev, ascii_flag);
  53. }
  54. #endif
  55. #endif
  56. }
  57. int _modbus_rt__rtu__set_serial(PikaObj *self, char* devname, int baudrate, int bytesize, char* parity, int stopbits, int xonxoff) {
  58. #if (!MODBUS_RTU_SLAVE_ENABLE) && (!MODBUS_RTU_MASTER_ENABLE)
  59. pika_platform_printf("modbus rtu is not activated.\n");
  60. return 0;
  61. #else
  62. int ret = 0;
  63. rtu_modbus_device_t dev = (rtu_modbus_device_t)obj_getPtr(self, "dev");
  64. if(NULL == dev) {
  65. pika_platform_printf("modbus_rtu_set_serial error, dev is NULL.\n");
  66. return 0;
  67. }
  68. if(0 != dev->status) {
  69. pika_platform_printf("modbus_rtu_set_serial error, dev is opened.\n");
  70. return 0;
  71. }
  72. ret = modbus_rtu_set_serial(dev, devname, baudrate, bytesize, parity[0], stopbits, xonxoff);
  73. if(MODBUS_RT_EOK != ret){
  74. pika_platform_printf("modbus_rtu_set_serial error, code:%d.\n", ret);
  75. return 0;
  76. }
  77. return 1;
  78. #endif
  79. }
  80. int _modbus_rt__rtu__set_over_type(PikaObj *self, int over_type) {
  81. #if (!MODBUS_RTU_SLAVE_ENABLE) && (!MODBUS_RTU_MASTER_ENABLE)
  82. pika_platform_printf("modbus rtu is not activated.\n");
  83. return 0;
  84. #elif (!MODBUS_SERIAL_OVER_TCP_ENABLE) && (!MODBUS_SERIAL_OVER_UDP_ENABLE)
  85. pika_platform_printf("modbus_rtu_set_over_type error, MODBUS_SERIAL_OVER_XXX_ENABLE is not ENABLE.\n");
  86. return 0;
  87. #else
  88. int ret = 0;
  89. rtu_modbus_device_t dev = (rtu_modbus_device_t)obj_getPtr(self, "dev");
  90. if(NULL == dev) {
  91. pika_platform_printf("modbus_rtu_set_over_type error, dev is NULL.\n");
  92. return 0;
  93. }
  94. if(0 != dev->status) {
  95. pika_platform_printf("modbus_rtu_set_over_type error, dev is opened.\n");
  96. return 0;
  97. }
  98. if((OVER_NONE != over_type) && (OVER_NET != over_type)) {
  99. pika_platform_printf("modbus_rtu_set_over_type error, type is only for OVER_NONE or OVER_NET.\n");
  100. return 0;
  101. }
  102. ret = modbus_rtu_set_over_type(dev, over_type);
  103. if(MODBUS_RT_EOK != ret){
  104. pika_platform_printf("modbus_rtu_set_over_type error, code:%d.\n", ret);
  105. return 0;
  106. }
  107. return 1;
  108. #endif
  109. }
  110. int _modbus_rt__rtu__set_net(PikaObj *self, char* ip, int port, int type) {
  111. #if (!MODBUS_RTU_SLAVE_ENABLE) && (!MODBUS_RTU_MASTER_ENABLE)
  112. pika_platform_printf("modbus rtu is not activated.\n");
  113. return 0;
  114. #elif (!MODBUS_SERIAL_OVER_TCP_ENABLE) && (!MODBUS_SERIAL_OVER_UDP_ENABLE)
  115. pika_platform_printf("modbus_rtu_set_over_type error, MODBUS_SERIAL_OVER_XXX_ENABLE is not ENABLE.\n");
  116. return 0;
  117. #else
  118. int ret = 0;
  119. rtu_modbus_device_t dev = (rtu_modbus_device_t)obj_getPtr(self, "dev");
  120. if(NULL == dev) {
  121. pika_platform_printf("modbus_rtu_set_net error, dev is NULL.\n");
  122. return 0;
  123. }
  124. if(0 != dev->status) {
  125. pika_platform_printf("modbus_rtu_set_net error, dev is opened.\n");
  126. return 0;
  127. }
  128. if(OVER_NET != dev->over_type) {
  129. pika_platform_printf("modbus_rtu_set_net error, over_type is not OVER_NET.\n");
  130. return 0;
  131. }
  132. ret = modbus_rtu_set_net(dev, ip, port, type);
  133. if(MODBUS_RT_EOK != ret){
  134. pika_platform_printf("modbus_rtu_set_net error, code:%d.\n", ret);
  135. return 0;
  136. }
  137. return 1;
  138. #endif
  139. }
  140. int _modbus_rt__rtu__set_ip(PikaObj *self, char* ip) {
  141. #if (!MODBUS_RTU_SLAVE_ENABLE) && (!MODBUS_RTU_MASTER_ENABLE)
  142. pika_platform_printf("modbus rtu is not activated.\n");
  143. return 0;
  144. #elif (!MODBUS_SERIAL_OVER_TCP_ENABLE) && (!MODBUS_SERIAL_OVER_UDP_ENABLE)
  145. pika_platform_printf("modbus_rtu_set_over_type error, MODBUS_SERIAL_OVER_XXX_ENABLE is not ENABLE.\n");
  146. return 0;
  147. #else
  148. int ret = 0;
  149. rtu_modbus_device_t dev = (rtu_modbus_device_t)obj_getPtr(self, "dev");
  150. if(NULL == dev) {
  151. pika_platform_printf("modbus_rtu_set_ip error, dev is NULL.\n");
  152. return 0;
  153. }
  154. if(0 != dev->status) {
  155. pika_platform_printf("modbus_rtu_set_ip error, dev is opened.\n");
  156. return 0;
  157. }
  158. if(OVER_NET != dev->over_type) {
  159. pika_platform_printf("modbus_rtu_set_ip error, over_type is not OVER_NET.\n");
  160. return 0;
  161. }
  162. ret = modbus_rtu_set_ip(dev, ip);
  163. if(MODBUS_RT_EOK != ret){
  164. pika_platform_printf("modbus_rtu_set_ip error, code:%d.\n", ret);
  165. return 0;
  166. }
  167. return 1;
  168. #endif
  169. }
  170. int _modbus_rt__rtu__set_port(PikaObj *self, int port) {
  171. #if (!MODBUS_RTU_SLAVE_ENABLE) && (!MODBUS_RTU_MASTER_ENABLE)
  172. pika_platform_printf("modbus rtu is not activated.\n");
  173. return 0;
  174. #elif (!MODBUS_SERIAL_OVER_TCP_ENABLE) && (!MODBUS_SERIAL_OVER_UDP_ENABLE)
  175. pika_platform_printf("modbus_rtu_set_over_type error, MODBUS_SERIAL_OVER_XXX_ENABLE is not ENABLE.\n");
  176. return 0;
  177. #else
  178. int ret = 0;
  179. rtu_modbus_device_t dev = (rtu_modbus_device_t)obj_getPtr(self, "dev");
  180. if(NULL == dev) {
  181. pika_platform_printf("modbus_rtu_set_port error, dev is NULL.\n");
  182. return 0;
  183. }
  184. if(0 != dev->status) {
  185. pika_platform_printf("modbus_rtu_set_port error, dev is opened.\n");
  186. return 0;
  187. }
  188. if(OVER_NET != dev->over_type) {
  189. pika_platform_printf("modbus_rtu_set_port error, over_type is not OVER_NET.\n");
  190. return 0;
  191. }
  192. ret = modbus_rtu_set_port(dev, port);
  193. if(MODBUS_RT_EOK != ret){
  194. pika_platform_printf("modbus_rtu_set_port error, code:%d.\n", ret);
  195. return 0;
  196. }
  197. return 1;
  198. #endif
  199. }
  200. int _modbus_rt__rtu__set_type(PikaObj *self, int type) {
  201. #if (!MODBUS_RTU_SLAVE_ENABLE) && (!MODBUS_RTU_MASTER_ENABLE)
  202. pika_platform_printf("modbus rtu is not activated.\n");
  203. return 0;
  204. #elif (!MODBUS_SERIAL_OVER_TCP_ENABLE) && (!MODBUS_SERIAL_OVER_UDP_ENABLE)
  205. pika_platform_printf("modbus_rtu_set_over_type error, MODBUS_SERIAL_OVER_XXX_ENABLE is not ENABLE.\n");
  206. return 0;
  207. #else
  208. int ret = 0;
  209. rtu_modbus_device_t dev = (rtu_modbus_device_t)obj_getPtr(self, "dev");
  210. if(NULL == dev) {
  211. pika_platform_printf("modbus_rtu_set_type error, dev is NULL.\n");
  212. return 0;
  213. }
  214. if(0 != dev->status) {
  215. pika_platform_printf("modbus_rtu_set_type error, dev is opened.\n");
  216. return 0;
  217. }
  218. if(OVER_NET != dev->over_type) {
  219. pika_platform_printf("modbus_rtu_set_type error, over_type is not OVER_NET.\n");
  220. return 0;
  221. }
  222. ret = modbus_rtu_set_type(dev, type);
  223. if(MODBUS_RT_EOK != ret){
  224. pika_platform_printf("modbus_rtu_set_type error, code:%d.\n", ret);
  225. return 0;
  226. }
  227. return 1;
  228. #endif
  229. }
  230. int _modbus_rt__rtu__set_p2p(PikaObj *self, int p2p_flag) {
  231. #if (!MODBUS_RTU_SLAVE_ENABLE) && (!MODBUS_RTU_MASTER_ENABLE)
  232. pika_platform_printf("modbus rtu is not activated.\n");
  233. return 0;
  234. #elif (!MODBUS_P2P_ENABLE)
  235. pika_platform_printf("MODBUS_P2P_ENABLE is not enabled.\n");
  236. return 0;
  237. #else
  238. int ret = 0;
  239. rtu_modbus_device_t dev = (rtu_modbus_device_t)obj_getPtr(self, "dev");
  240. if(NULL == dev) {
  241. pika_platform_printf("modbus_rtu_set_p2p error, dev is NULL.\n");
  242. return 0;
  243. }
  244. if(0 != dev->status) {
  245. pika_platform_printf("modbus_rtu_set_p2p error, dev is opened.\n");
  246. return 0;
  247. }
  248. ret = modbus_rtu_set_p2p_flag(dev, p2p_flag);
  249. if(MODBUS_RT_EOK != ret){
  250. pika_platform_printf("modbus_rtu_set_p2p error, code:%d.\n", ret);
  251. return 0;
  252. }
  253. return 1;
  254. #endif
  255. }
  256. int _modbus_rt__rtu__open(PikaObj *self) {
  257. #if (!MODBUS_RTU_SLAVE_ENABLE) && (!MODBUS_RTU_MASTER_ENABLE)
  258. pika_platform_printf("modbus rtu is not activated.\n");
  259. return 0;
  260. #else
  261. int ret = 0;
  262. rtu_modbus_device_t dev = (rtu_modbus_device_t)obj_getPtr(self, "dev");
  263. if(NULL == dev) {
  264. pika_platform_printf("modbus_rtu_open error, dev is NULL.\n");
  265. return 0;
  266. }
  267. if(0 != dev->status) {
  268. pika_platform_printf("modbus_rtu_open error, dev is opened.\n");
  269. return 0;
  270. }
  271. ret = modbus_rtu_open(dev);
  272. if(MODBUS_RT_EOK != ret){
  273. pika_platform_printf("modbus_rtu_open error, code: %d.\n", ret);
  274. return 0;
  275. }
  276. return 1;
  277. #endif
  278. }
  279. int _modbus_rt__rtu__isopen(PikaObj *self) {
  280. #if (!MODBUS_RTU_SLAVE_ENABLE) && (!MODBUS_RTU_MASTER_ENABLE)
  281. pika_platform_printf("modbus rtu is not activated.\n");
  282. return 0;
  283. #else
  284. rtu_modbus_device_t dev = (rtu_modbus_device_t)obj_getPtr(self, "dev");
  285. if(NULL == dev) {
  286. pika_platform_printf("modbus_rtu_isopen error, dev is NULL.\n");
  287. return 0;
  288. }
  289. return modbus_rtu_isopen(dev);
  290. #endif
  291. }
  292. int _modbus_rt__rtu__close(PikaObj *self) {
  293. #if (!MODBUS_RTU_SLAVE_ENABLE) && (!MODBUS_RTU_MASTER_ENABLE)
  294. pika_platform_printf("modbus rtu is not activated.\n");
  295. return 0;
  296. #else
  297. int ret = 0;
  298. rtu_modbus_device_t dev = (rtu_modbus_device_t)obj_getPtr(self, "dev");
  299. if(NULL == dev) {
  300. pika_platform_printf("modbus_rtu_close error, dev is NULL.\n");
  301. return 0;
  302. }
  303. if(0 == dev->status) {
  304. pika_platform_printf("modbus_rtu_close error, dev is closed.\n");
  305. return 0;
  306. }
  307. ret = modbus_rtu_close(dev);
  308. if(MODBUS_RT_EOK != ret){
  309. pika_platform_printf("modbus_rtu_close error, code: %d.\n", ret);
  310. return 0;
  311. }
  312. return 1;
  313. #endif
  314. }
  315. int _modbus_rt__rtu__slave_set_addr(PikaObj *self, int addr) {
  316. #if (!MODBUS_RTU_SLAVE_ENABLE)
  317. pika_platform_printf("modbus rtu slave is not activated.\n");
  318. return 0;
  319. #else
  320. int ret = 0;
  321. rtu_modbus_device_t dev = (rtu_modbus_device_t)obj_getPtr(self, "dev");
  322. if(NULL == dev) {
  323. pika_platform_printf("modbus_rtu_set_addr error, dev is NULL.\n");
  324. return 0;
  325. }
  326. if(MODBUS_SLAVE != dev->mode){
  327. pika_platform_printf("modbus_rtu_set_addr is only for slave.\n");
  328. return 0;
  329. }
  330. if(0 != dev->status) {
  331. pika_platform_printf("modbus_rtu_set_addr error, dev is opened.\n");
  332. return 0;
  333. }
  334. ret = modbus_rtu_set_addr(dev,addr);
  335. if(MODBUS_RT_EOK != ret){
  336. pika_platform_printf("modbus_rtu_set_addr error, code: %d.\n", ret);
  337. return 0;
  338. }
  339. return 1;
  340. #endif
  341. }
  342. int _modbus_rt__rtu__slave_set_strict(PikaObj *self, int strict) {
  343. #if (!MODBUS_RTU_SLAVE_ENABLE)
  344. pika_platform_printf("modbus rtu slave is not activated.\n");
  345. return 0;
  346. #else
  347. int ret = 0;
  348. rtu_modbus_device_t dev = (rtu_modbus_device_t)obj_getPtr(self, "dev");
  349. if(NULL == dev) {
  350. pika_platform_printf("modbus_rtu_set_strict error, dev is NULL.\n");
  351. return 0;
  352. }
  353. if(MODBUS_SLAVE != dev->mode){
  354. pika_platform_printf("modbus_rtu_set_strict is only for slave.\n");
  355. return 0;
  356. }
  357. if(0 != dev->status) {
  358. pika_platform_printf("modbus_rtu_set_strict error, dev is opened.\n");
  359. return 0;
  360. }
  361. ret = modbus_rtu_set_strict(dev,strict);
  362. if(MODBUS_RT_EOK != ret){
  363. pika_platform_printf("modbus_rtu_set_strict error, code: %d.\n", ret);
  364. return 0;
  365. }
  366. return 1;
  367. #endif
  368. }
  369. int _modbus_rt__rtu__slave_add_block(PikaObj *self, char* name, int type, int addr, int nums) {
  370. #if (!MODBUS_RTU_SLAVE_ENABLE)
  371. pika_platform_printf("modbus rtu slave is not activated.\n");
  372. return 0;
  373. #else
  374. int ret = 0;
  375. rtu_modbus_device_t dev = (rtu_modbus_device_t)obj_getPtr(self, "dev");
  376. if(NULL == dev) {
  377. pika_platform_printf("modbus_rtu_add_block error, dev is NULL.\n");
  378. return 0;
  379. }
  380. if(MODBUS_SLAVE != dev->mode){
  381. pika_platform_printf("modbus_rtu_add_block is only for slave.\n");
  382. return 0;
  383. }
  384. if(0 != dev->status) {
  385. pika_platform_printf("modbus_rtu_add_block error, dev is opened.\n");
  386. return 0;
  387. }
  388. if((0 >= strlen(name)) || (0 > type) || (4 < type)){
  389. pika_platform_printf("modbus_rtu_add_block: the para is error.\n");
  390. return 0;
  391. }
  392. int len = 0;
  393. if((CIOLS == type) || (INPUTS == type)) {
  394. len = nums;
  395. } else if((INPUT_REGISTERS == type) || (REGISTERS == type)) {
  396. len = nums * 2;
  397. }
  398. obj_setBytes(self, name, NULL, len);
  399. uint8_t* block = obj_getBytes(self, name);
  400. ret = modbus_rtu_add_block(dev, type, addr, block, nums);
  401. if(MODBUS_RT_EOK != ret){
  402. pika_platform_printf("modbus_rtu_add_block error, code: %d.\n", ret);
  403. return 0;
  404. }
  405. return 1;
  406. #endif
  407. }
  408. int _modbus_rt__rtu__slave_regs_binding(PikaObj *self, Arg* regs, int type, int addr, int nums) {
  409. #if (!MODBUS_RTU_SLAVE_ENABLE)
  410. pika_platform_printf("modbus rtu slave is not activated.\n");
  411. return 0;
  412. #else
  413. int ret = 0;
  414. ArgType t = arg_getType(regs);
  415. if (ARG_TYPE_BYTES != t) {
  416. pika_platform_printf("modbus_rtu_regs_binding: the regs buf type is only for bytes.\n");
  417. return 0;
  418. }
  419. rtu_modbus_device_t dev = (rtu_modbus_device_t)obj_getPtr(self, "dev");
  420. if(NULL == dev) {
  421. pika_platform_printf("modbus_rtu_regs_binding error, dev is NULL.\n");
  422. return 0;
  423. }
  424. if(MODBUS_SLAVE != dev->mode){
  425. pika_platform_printf("modbus_rtu_regs_binding is only for slave.\n");
  426. return 0;
  427. }
  428. if(0 != dev->status) {
  429. pika_platform_printf("modbus_rtu_regs_binding error, dev is opened.\n");
  430. return 0;
  431. }
  432. size_t regs_size = arg_getBytesSize(regs);
  433. if((CIOLS == type) || (INPUTS == type)) {
  434. if(regs_size < nums) {
  435. pika_platform_printf("modbus_rtu_regs_binding: For CIOLS and INPUTS, the length of regs buf must be greater than nums.\n");
  436. return 0;
  437. }
  438. } else if((INPUT_REGISTERS == type) || (REGISTERS == type)) {
  439. if(regs_size < nums) {
  440. pika_platform_printf("modbus_rtu_regs_binding: For INPUT_REGISTERS and REGISTERS, the length of regs buf must be greater than 2 * nums.\n");
  441. return 0;
  442. }
  443. }
  444. uint8_t* block = arg_getBytes(regs);
  445. ret = modbus_rtu_add_block(dev, type, addr, block, nums);
  446. if(MODBUS_RT_EOK != ret){
  447. pika_platform_printf("modbus_rtu_regs_binding error, code: %d.\n", ret);
  448. return 0;
  449. }
  450. return 1;
  451. #endif
  452. return 0;
  453. }
  454. #if (MODBUS_RTU_SLAVE_ENABLE) || (MODBUS_RTU_MASTER_ENABLE)
  455. PikaEventListener* g_modbus_rt_rtu_event_listener = NULL;
  456. #endif
  457. int _modbus_rt__rtu__slave_pre_ans_handler(agile_modbus_t *ctx, int slave, int function,int addr, int quantity) {
  458. #if (!MODBUS_RTU_SLAVE_ENABLE)
  459. pika_platform_printf("modbus rtu slave is not activated.\n");
  460. return 0;
  461. #else
  462. char hash_str[32] = {0};
  463. memset(hash_str, 0, sizeof(hash_str));
  464. sprintf(hash_str, "pre_ans%p", ctx);
  465. uint32_t eventId = hash_time33(hash_str);
  466. Arg* evt_obj_arg = arg_newDirectObj(New_TinyObj);
  467. PikaObj* evt_obj = arg_getPtr(evt_obj_arg);
  468. obj_setInt(evt_obj, "slave", slave);
  469. obj_setInt(evt_obj, "function", function);
  470. obj_setInt(evt_obj, "addr", addr);
  471. obj_setInt(evt_obj, "quantity", quantity);
  472. pika_eventListener_send(g_modbus_rt_rtu_event_listener, eventId, evt_obj_arg);
  473. return 1;
  474. #endif
  475. }
  476. int _modbus_rt__rtu__slave_set_pre_ans_callback(PikaObj *self, Arg* cb) {
  477. #if (!MODBUS_RTU_SLAVE_ENABLE)
  478. pika_platform_printf("modbus rtu slave is not activated.\n");
  479. return 0;
  480. #else
  481. int ret = 0;
  482. rtu_modbus_device_t dev = (rtu_modbus_device_t)obj_getPtr(self, "dev");
  483. if(NULL == dev) {
  484. pika_platform_printf("modbus_rtu_set_pre_ans_callback error, dev is NULL.\n");
  485. return 0;
  486. }
  487. if(MODBUS_SLAVE != dev->mode){
  488. pika_platform_printf("modbus_rtu_set_pre_ans_callback is only for slave.\n");
  489. return 0;
  490. }
  491. if(0 != dev->status) {
  492. pika_platform_printf("modbus_rtu_set_pre_ans_callback error, dev is opened.\n");
  493. return 0;
  494. }
  495. if(NULL == cb) {
  496. pika_platform_printf("modbus_rtu_set_pre_ans_callback error, cb is NULL.\n");
  497. return 0;
  498. }
  499. ret = modbus_rtu_set_pre_ans_callback(dev,_modbus_rt__rtu__slave_pre_ans_handler);
  500. if(MODBUS_RT_EOK != ret){
  501. pika_platform_printf("modbus_rtu_set_pre_ans_callback error, code: %d.\n", ret);
  502. return 0;
  503. }
  504. if (NULL == g_modbus_rt_rtu_event_listener) {
  505. pika_eventListener_init(&g_modbus_rt_rtu_event_listener);
  506. }
  507. char hash_str[32] = {0};
  508. memset(hash_str, 0, sizeof(hash_str));
  509. sprintf(hash_str, "pre_ans%p", dev->ctx);
  510. uint32_t eventId = hash_time33(hash_str);
  511. pika_eventListener_registEventCallback(g_modbus_rt_rtu_event_listener, eventId, cb);
  512. return 1;
  513. #endif
  514. }
  515. int _modbus_rt__rtu__slave_done_handler(agile_modbus_t *ctx, int slave, int function,int addr, int quantity) {
  516. #if (!MODBUS_RTU_SLAVE_ENABLE)
  517. pika_platform_printf("modbus rtu slave is not activated.\n");
  518. return 0;
  519. #else
  520. char hash_str[32] = {0};
  521. memset(hash_str, 0, sizeof(hash_str));
  522. sprintf(hash_str, "done%p", ctx);
  523. uint32_t eventId = hash_time33(hash_str);
  524. Arg* evt_obj_arg = arg_newDirectObj(New_TinyObj);
  525. PikaObj* evt_obj = arg_getPtr(evt_obj_arg);
  526. obj_setInt(evt_obj, "slave", slave);
  527. obj_setInt(evt_obj, "function", function);
  528. obj_setInt(evt_obj, "addr", addr);
  529. obj_setInt(evt_obj, "quantity", quantity);
  530. pika_eventListener_send(g_modbus_rt_rtu_event_listener, eventId, evt_obj_arg);
  531. return 1;
  532. #endif
  533. }
  534. int _modbus_rt__rtu__slave_set_done_callback(PikaObj *self, Arg* cb) {
  535. #if (!MODBUS_RTU_SLAVE_ENABLE)
  536. pika_platform_printf("modbus rtu slave is not activated.\n");
  537. return 0;
  538. #else
  539. int ret = 0;
  540. rtu_modbus_device_t dev = (rtu_modbus_device_t)obj_getPtr(self, "dev");
  541. if(NULL == dev) {
  542. pika_platform_printf("modbus_rtu_set_done_callback error, dev is NULL.\n");
  543. return 0;
  544. }
  545. if(MODBUS_SLAVE != dev->mode){
  546. pika_platform_printf("modbus_rtu_set_done_callback is only for slave.\n");
  547. return 0;
  548. }
  549. if(0 != dev->status) {
  550. pika_platform_printf("modbus_rtu_set_done_callback error, dev is opened.\n");
  551. return 0;
  552. }
  553. if(NULL == cb) {
  554. pika_platform_printf("modbus_rtu_set_pre_ans_callback error, cb is NULL.\n");
  555. return 0;
  556. }
  557. ret = modbus_rtu_set_done_callback(dev,_modbus_rt__rtu__slave_done_handler);
  558. if(MODBUS_RT_EOK != ret){
  559. pika_platform_printf("modbus_rtu_set_done_callback error, code: %d.\n", ret);
  560. return 0;
  561. }
  562. if (NULL == g_modbus_rt_rtu_event_listener) {
  563. pika_eventListener_init(&g_modbus_rt_rtu_event_listener);
  564. }
  565. char hash_str[32] = {0};
  566. memset(hash_str, 0, sizeof(hash_str));
  567. sprintf(hash_str, "done%p", dev->ctx);
  568. uint32_t eventId = hash_time33(hash_str);
  569. pika_eventListener_registEventCallback(g_modbus_rt_rtu_event_listener, eventId, cb);
  570. return 1;
  571. #endif
  572. }
  573. int _modbus_rt__rtu__slave_set_dev_binding(PikaObj *self, int flag) {
  574. #if (!MODBUS_RTU_SLAVE_ENABLE)
  575. pika_platform_printf("modbus rtu slave is not activated.\n");
  576. return 0;
  577. #elif (!SLAVE_DATA_DEVICE_BINDING)
  578. pika_platform_printf("SLAVE_DATA_DEVICE_BINDING is not activated.\n");
  579. return 0;
  580. #else
  581. int ret = 0;
  582. rtu_modbus_device_t dev = (rtu_modbus_device_t)obj_getPtr(self, "dev");
  583. if(NULL == dev) {
  584. pika_platform_printf("modbus_rtu_set_dev_binding error, dev is NULL.\n");
  585. return 0;
  586. }
  587. if(MODBUS_SLAVE != dev->mode){
  588. pika_platform_printf("modbus_rtu_set_dev_binding is only for slave.\n");
  589. return 0;
  590. }
  591. if(0 != dev->status) {
  592. pika_platform_printf("modbus_rtu_set_dev_binding error, dev is opened.\n");
  593. return 0;
  594. }
  595. ret = modbus_rtu_set_dev_binding(dev,flag);
  596. if(MODBUS_RT_EOK != ret){
  597. pika_platform_printf("modbus_rtu_set_dev_binding error, code: %d.\n", ret);
  598. return 0;
  599. }
  600. return 1;
  601. #endif
  602. }
  603. int _modbus_rt__rtu__master_set_server(PikaObj *self, char* saddr, int sport) {
  604. #if (!MODBUS_RTU_MASTER_ENABLE)
  605. pika_platform_printf("modbus rtu master is not activated.\n");
  606. return 0;
  607. #elif (!MODBUS_SERIAL_OVER_TCP_ENABLE) && (!MODBUS_SERIAL_OVER_UDP_ENABLE)
  608. pika_platform_printf("modbus_rtu_set_over_type error, MODBUS_SERIAL_OVER_XXX_ENABLE is not ENABLE.\n");
  609. return 0;
  610. #else
  611. int ret = 0;
  612. rtu_modbus_device_t dev = (rtu_modbus_device_t)obj_getPtr(self, "dev");
  613. if(NULL == dev) {
  614. pika_platform_printf("modbus_rtu_set_server error, dev is NULL.\n");
  615. return 0;
  616. }
  617. if((MODBUS_MASTER != dev->mode) || (OVER_NET != dev->over_type)){
  618. pika_platform_printf("modbus_rtu_set_server is only for master and OVER_NET.\n");
  619. return 0;
  620. }
  621. ret = modbus_rtu_set_server(dev, saddr, sport);
  622. if(MODBUS_RT_EOK != ret){
  623. pika_platform_printf("modbus_rtu_set_server error, code: %d.\n", ret);
  624. return 0;
  625. }
  626. return 1;
  627. #endif
  628. }
  629. char* _modbus_rt__rtu__master_get_saddr(PikaObj *self) {
  630. #if (!MODBUS_RTU_MASTER_ENABLE)
  631. pika_platform_printf("modbus rtu master is not activated.\n");
  632. return NULL;
  633. #elif (!MODBUS_SERIAL_OVER_TCP_ENABLE) && (!MODBUS_SERIAL_OVER_UDP_ENABLE)
  634. pika_platform_printf("modbus_rtu_set_over_type error, MODBUS_SERIAL_OVER_XXX_ENABLE is not ENABLE.\n");
  635. return NULL;
  636. #else
  637. int ret = 0;
  638. rtu_modbus_device_t dev = (rtu_modbus_device_t)obj_getPtr(self, "dev");
  639. if(NULL == dev) {
  640. pika_platform_printf("modbus_rtu_get_saddr error, dev is NULL.\n");
  641. return NULL;
  642. }
  643. if((MODBUS_MASTER != dev->mode) || (OVER_NET != dev->over_type)){
  644. pika_platform_printf("modbus_rtu_get_saddr is only for master and OVER_NET.\n");
  645. return NULL;
  646. }
  647. char saddr[INET_ADDRSTRLEN];
  648. ret = modbus_rtu_get_saddr(dev, saddr);
  649. if(MODBUS_RT_EOK != ret){
  650. pika_platform_printf("modbus_rtu_get_saddr error, code: %d.\n", ret);
  651. return NULL;
  652. }
  653. char* str = obj_cacheStr(self, saddr);
  654. return str;
  655. #endif
  656. }
  657. PikaObj* _modbus_rt__rtu__slave_read_regs(PikaObj *self, int type, int addr, PikaTuple* val){
  658. #if (!MODBUS_RTU_SLAVE_ENABLE)
  659. pika_platform_printf("modbus rtu slave is not activated.\n");
  660. return NULL;
  661. #else
  662. int ret = 0;
  663. rtu_modbus_device_t dev = (rtu_modbus_device_t)obj_getPtr(self, "dev");
  664. if(NULL == dev) {
  665. pika_platform_printf("modbus_rtu_read_regs error, dev is NULL.\n");
  666. return NULL;
  667. }
  668. if(MODBUS_SLAVE != dev->mode){
  669. pika_platform_printf("modbus_rtu_read_regs is only for slave.\n");
  670. return NULL;
  671. }
  672. if(0 == dev->status) {
  673. pika_platform_printf("modbus_rtu_read_regs error, dev is not opened.\n");
  674. return 0;
  675. }
  676. uint8_t *dest = NULL;
  677. /* 确保参数正确,且值无误*/
  678. if(1 != pikaTuple_getSize(val)) {
  679. pika_platform_printf("modbus_rtu_read_regs: the para num of func is error.\n");
  680. return NULL;
  681. }
  682. Arg* arg_0 = pikaTuple_getArg(val, 0);
  683. ArgType t = arg_getType(arg_0);
  684. if (ARG_TYPE_INT != t) {
  685. pika_platform_printf("modbus_rtu_read_regs: the para type of func is error.\n");
  686. return NULL;
  687. }
  688. int quantity = arg_getInt(arg_0);
  689. if(0 >= quantity) {
  690. pika_platform_printf("modbus_rtu_read_regs: quantity can not be zero or negative.\n");
  691. return NULL;
  692. }
  693. if((CIOLS == type) || (INPUTS == type)) {
  694. dest = modbus_rt_calloc(1,quantity);
  695. if(dest == NULL) {
  696. pika_platform_printf("modbus_rtu_read_regs: mem is not enough.\n");
  697. return NULL;
  698. }
  699. } else if((INPUT_REGISTERS == type) || (REGISTERS == type)) {
  700. dest = modbus_rt_calloc(1,quantity * 2);
  701. if(dest == NULL) {
  702. pika_platform_printf("modbus_rtu_read_regs: mem is not enough.\n");
  703. return NULL;
  704. }
  705. }
  706. ret = modbus_rtu_excuse(dev, MODBUS_READ, type, addr, quantity, dest);
  707. if(MODBUS_RT_EOK != ret) {
  708. modbus_rt_free(dest);
  709. pika_platform_printf("modbus_rtu_read_regs: modbus_rtu_excuse error, code: %d.\n", ret);
  710. return NULL;
  711. }
  712. uint16_t *dest_r = (uint16_t *)dest;
  713. PikaList* list = New_PikaList();
  714. for(int i = 0; i < quantity; i++ ) {
  715. if((CIOLS == type) || (INPUTS == type)) {
  716. pikaList_append(list, arg_newInt(dest[i]));
  717. } else if((INPUT_REGISTERS == type) || (REGISTERS == type)) {
  718. pikaList_append(list, arg_newInt(dest_r[i]));
  719. }
  720. }
  721. modbus_rt_free(dest);
  722. return list;
  723. #endif
  724. }
  725. int _modbus_rt__rtu__slave_write_regs(PikaObj *self, int type, int addr, PikaTuple* val) {
  726. #if (!MODBUS_RTU_SLAVE_ENABLE)
  727. pika_platform_printf("modbus rtu slave is not activated.\n");
  728. return 0;
  729. #else
  730. int ret = 0;
  731. rtu_modbus_device_t dev = (rtu_modbus_device_t)obj_getPtr(self, "dev");
  732. if(NULL == dev) {
  733. pika_platform_printf("modbus_rtu_write_regs error, dev is NULL.\n");
  734. return 0;
  735. }
  736. if(MODBUS_SLAVE != dev->mode){
  737. pika_platform_printf("modbus_rtu_write_regs is only for master.\n");
  738. return 0;
  739. }
  740. if(0 == dev->status) {
  741. pika_platform_printf("modbus_rtu_write_regs error, dev is not opened.\n");
  742. return 0;
  743. }
  744. uint8_t *dest = NULL;
  745. /* 确保参数正确,且值无误*/
  746. if(2 != pikaTuple_getSize(val)) {
  747. pika_platform_printf("modbus_rtu_write_regs: the para num of func is error.\n");
  748. return 0;
  749. }
  750. Arg* arg_0 = pikaTuple_getArg(val, 0);
  751. ArgType t = arg_getType(arg_0);
  752. if (ARG_TYPE_INT != t) {
  753. pika_platform_printf("modbus_rtu_write_regs: the para0 type of func is error.\n");
  754. return 0;
  755. }
  756. int quantity = arg_getInt(arg_0);
  757. if((CIOLS == type) || (INPUTS == type)) {
  758. dest = modbus_rt_calloc(1,quantity);
  759. if(dest == NULL) {
  760. pika_platform_printf("modbus_rtu_write_regs: mem is not enough.\n");
  761. return 0;
  762. }
  763. memset(dest,0,quantity);
  764. } else if((INPUT_REGISTERS == type) || (REGISTERS == type)) {
  765. dest = modbus_rt_calloc(1,quantity * 2);
  766. if(dest == NULL) {
  767. pika_platform_printf("modbus_rtu_write_regs: mem is not enough.\n");
  768. return 0;
  769. }
  770. memset(dest,0,quantity * 2);
  771. }
  772. Arg* arg_1 = pikaTuple_getArg(val, 1);
  773. t = arg_getType(arg_1);
  774. if (ARG_TYPE_OBJECT != t) {
  775. pika_platform_printf("modbus_rtu_write_regs: the para1 type of func is error.\n");
  776. return 0;
  777. }
  778. PikaObj* _list = arg_getPtr(arg_1);
  779. int len_list = pikaList_getSize(_list);
  780. if(len_list > quantity) {
  781. len_list = quantity;
  782. }
  783. if((CIOLS == type) || (INPUTS == type)) {
  784. for(int i = 0; i < len_list; i++) {
  785. dest[i] = pikaList_getInt(_list, i);
  786. }
  787. ret = modbus_rtu_excuse(dev, MODBUS_WRITE, type, addr, quantity, dest);
  788. if(MODBUS_RT_EOK != ret) {
  789. modbus_rt_free(dest);
  790. pika_platform_printf("modbus_rtu_write_regs: modbus_rtu_excuse error, code: %d.\n", ret);
  791. return 0;
  792. }
  793. } else if((INPUT_REGISTERS == type) || (REGISTERS == type)) {
  794. uint16_t *dest_r = (uint16_t *)dest;
  795. for(int i = 0; i < len_list; i++){
  796. dest_r[i] = pikaList_getInt(_list, i);
  797. }
  798. ret = modbus_rtu_excuse(dev, MODBUS_WRITE, type, addr, quantity, dest_r);
  799. if(MODBUS_RT_EOK != ret) {
  800. modbus_rt_free(dest);
  801. pika_platform_printf("modbus_rtu_write_regs: modbus_rtu_excuse error, code: %d.\n", ret);
  802. return 0;
  803. }
  804. }
  805. modbus_rt_free(dest);
  806. return 1;
  807. #endif
  808. }
  809. PikaObj* _modbus_rt__rtu__master_read_list(PikaObj *self, int slave, int fuction, int addr, PikaTuple* val) {
  810. #if (!MODBUS_RTU_MASTER_ENABLE)
  811. pika_platform_printf("modbus rtu master is not activated.\n");
  812. return NULL;
  813. #else
  814. int ret = 0;
  815. rtu_modbus_device_t dev = (rtu_modbus_device_t)obj_getPtr(self, "dev");
  816. if(NULL == dev) {
  817. pika_platform_printf("modbus_rtu_read_list error, dev is NULL.\n");
  818. return NULL;
  819. }
  820. if(MODBUS_MASTER != dev->mode){
  821. pika_platform_printf("modbus_rtu_read_list is only for master.\n");
  822. return NULL;
  823. }
  824. if(0 == dev->status) {
  825. pika_platform_printf("modbus_rtu_read_list error, dev is not opened.\n");
  826. return 0;
  827. }
  828. uint8_t *dest = NULL;
  829. /* 确保参数正确,且值无误*/
  830. if(1 != pikaTuple_getSize(val)) {
  831. pika_platform_printf("modbus_rtu_read_list: the para num of func is error.\n");
  832. return NULL;
  833. }
  834. Arg* arg_0 = pikaTuple_getArg(val, 0);
  835. ArgType t = arg_getType(arg_0);
  836. if (ARG_TYPE_INT != t) {
  837. pika_platform_printf("modbus_rtu_read_list: the para type of func is error.\n");
  838. return NULL;
  839. }
  840. int quantity = arg_getInt(arg_0);
  841. if(0 >= quantity) {
  842. pika_platform_printf("modbus_rtu_read_list: quantity can not be zero or negative.\n");
  843. return NULL;
  844. }
  845. if((AGILE_MODBUS_FC_READ_COILS == fuction) ||(AGILE_MODBUS_FC_READ_DISCRETE_INPUTS == fuction)) {
  846. dest = modbus_rt_calloc(1,quantity);
  847. if(dest == NULL) {
  848. pika_platform_printf("modbus_rtu_read_list: mem is not enough.\n");
  849. return NULL;
  850. }
  851. } else if((AGILE_MODBUS_FC_READ_HOLDING_REGISTERS == fuction) ||(AGILE_MODBUS_FC_READ_INPUT_REGISTERS == fuction)) {
  852. dest = modbus_rt_calloc(1,quantity * 2);
  853. if(dest == NULL) {
  854. pika_platform_printf("modbus_rtu_read_list: mem is not enough.\n");
  855. return NULL;
  856. }
  857. }
  858. ret = modbus_rtu_excuse(dev, slave, fuction, addr, quantity, dest);
  859. if(MODBUS_RT_EOK != ret) {
  860. modbus_rt_free(dest);
  861. pika_platform_printf("modbus_rtu_read_list: modbus_rtu_excuse error, code: %d.\n", ret);
  862. return NULL;
  863. }
  864. uint16_t *dest_r = (uint16_t *)dest;
  865. PikaList* list = New_PikaList();
  866. for(int i = 0; i < quantity; i++ ) {
  867. if((AGILE_MODBUS_FC_READ_COILS == fuction) ||(AGILE_MODBUS_FC_READ_DISCRETE_INPUTS == fuction)) {
  868. pikaList_append(list, arg_newInt(dest[i]));
  869. } else if((AGILE_MODBUS_FC_READ_HOLDING_REGISTERS == fuction) ||(AGILE_MODBUS_FC_READ_INPUT_REGISTERS == fuction)) {
  870. pikaList_append(list, arg_newInt(dest_r[i]));
  871. }
  872. }
  873. modbus_rt_free(dest);
  874. return list;
  875. #endif
  876. }
  877. int _modbus_rt__rtu__master_write_int(PikaObj *self, int slave, int fuction, int addr, PikaTuple* val) {
  878. #if (!MODBUS_RTU_MASTER_ENABLE)
  879. pika_platform_printf("modbus rtu master is not activated.\n");
  880. return 0;
  881. #else
  882. int ret = 0;
  883. rtu_modbus_device_t dev = (rtu_modbus_device_t)obj_getPtr(self, "dev");
  884. if(NULL == dev) {
  885. pika_platform_printf("modbus_rtu_write_int error, dev is NULL.\n");
  886. return 0;
  887. }
  888. if(MODBUS_MASTER != dev->mode){
  889. pika_platform_printf("modbus_rtu_write_int is only for master.\n");
  890. return 0;
  891. }
  892. if(0 == dev->status) {
  893. pika_platform_printf("modbus_rtu_write_int error, dev is not opened.\n");
  894. return 0;
  895. }
  896. /* 确保参数正确,且值无误*/
  897. if(1 != pikaTuple_getSize(val)) {
  898. pika_platform_printf("modbus_rtu_write_int: the para num of func is error.\n");
  899. return 0;
  900. }
  901. Arg* arg_0 = pikaTuple_getArg(val, 0);
  902. ArgType t = arg_getType(arg_0);
  903. if (ARG_TYPE_INT != t) {
  904. pika_platform_printf("modbus_rtu_write_int: the para type of func is error.\n");
  905. return 0;
  906. }
  907. int value = arg_getInt(arg_0);
  908. ret = modbus_rtu_excuse(dev, slave, fuction, addr, 1, &value);
  909. if(MODBUS_RT_EOK != ret) {
  910. pika_platform_printf("modbus_rtu_write_int: modbus_rtu_excuse error, code: %d.\n", ret);
  911. return 0;
  912. }
  913. return 1;
  914. #endif
  915. }
  916. int _modbus_rt__rtu__master_write_list(PikaObj *self, int slave, int fuction, int addr, PikaTuple* val) {
  917. #if (!MODBUS_RTU_MASTER_ENABLE)
  918. pika_platform_printf("modbus rtu master is not activated.\n");
  919. return 0;
  920. #else
  921. int ret = 0;
  922. rtu_modbus_device_t dev = (rtu_modbus_device_t)obj_getPtr(self, "dev");
  923. if(NULL == dev) {
  924. pika_platform_printf("modbus_rtu_write_list error, dev is NULL.\n");
  925. return 0;
  926. }
  927. if(MODBUS_MASTER != dev->mode){
  928. pika_platform_printf("modbus_rtu_write_list is only for master.\n");
  929. return 0;
  930. }
  931. if(0 == dev->status) {
  932. pika_platform_printf("modbus_rtu_write_list error, dev is not opened.\n");
  933. return 0;
  934. }
  935. uint8_t *dest = NULL;
  936. /* 确保参数正确,且值无误*/
  937. if(2 != pikaTuple_getSize(val)) {
  938. pika_platform_printf("modbus_rtu_write_list: the para num of func is error.\n");
  939. return 0;
  940. }
  941. Arg* arg_0 = pikaTuple_getArg(val, 0);
  942. ArgType t = arg_getType(arg_0);
  943. if (ARG_TYPE_INT != t) {
  944. pika_platform_printf("modbus_rtu_write_list: the para0 type of func is error.\n");
  945. return 0;
  946. }
  947. int quantity = arg_getInt(arg_0);
  948. if(fuction == AGILE_MODBUS_FC_WRITE_MULTIPLE_COILS) {
  949. dest = modbus_rt_calloc(1,quantity);
  950. if(dest == NULL) {
  951. pika_platform_printf("modbus_rtu_write_list: mem is not enough.\n");
  952. return 0;
  953. }
  954. memset(dest,0,quantity);
  955. } else if(fuction == AGILE_MODBUS_FC_WRITE_MULTIPLE_REGISTERS) {
  956. dest = modbus_rt_calloc(1,quantity * 2);
  957. if(dest == NULL) {
  958. pika_platform_printf("modbus_rtu_write_list: mem is not enough.\n");
  959. return 0;
  960. }
  961. memset(dest,0,quantity * 2);
  962. }
  963. Arg* arg_1 = pikaTuple_getArg(val, 1);
  964. t = arg_getType(arg_1);
  965. if (ARG_TYPE_OBJECT != t) {
  966. pika_platform_printf("modbus_rtu_write_list: the para1 type of func is error.\n");
  967. return 0;
  968. }
  969. PikaObj* _list = arg_getPtr(arg_1);
  970. int len_list = pikaList_getSize(_list);
  971. if(len_list > quantity) {
  972. len_list = quantity;
  973. }
  974. if(fuction == AGILE_MODBUS_FC_WRITE_MULTIPLE_COILS) {
  975. for(int i = 0; i < len_list; i++) {
  976. dest[i] = pikaList_getInt(_list, i);
  977. }
  978. ret = modbus_rtu_excuse(dev, slave, fuction, addr, quantity, dest);
  979. if(MODBUS_RT_EOK != ret) {
  980. modbus_rt_free(dest);
  981. pika_platform_printf("modbus_rtu_write_list: modbus_rtu_excuse error, code: %d.\n", ret);
  982. return 0;
  983. }
  984. } else if(fuction == AGILE_MODBUS_FC_WRITE_MULTIPLE_REGISTERS) {
  985. uint16_t *dest_r = (uint16_t *)dest;
  986. for(int i = 0; i < len_list; i++){
  987. dest_r[i] = pikaList_getInt(_list, i);
  988. }
  989. ret = modbus_rtu_excuse(dev, slave, fuction, addr, quantity, dest_r);
  990. if(MODBUS_RT_EOK != ret) {
  991. modbus_rt_free(dest);
  992. pika_platform_printf("modbus_rtu_write_list: modbus_rtu_excuse error, code: %d.\n", ret);
  993. return 0;
  994. }
  995. }
  996. modbus_rt_free(dest);
  997. return 1;
  998. #endif
  999. }
  1000. int _modbus_rt__rtu__master_download(PikaObj *self, int slave, char* file_dev, char* file_master) {
  1001. #if (!MODBUS_RTU_MASTER_ENABLE)
  1002. pika_platform_printf("modbus rtu master is not activated.\n");
  1003. return 0;
  1004. #elif (!MODBUS_P2P_ENABLE) || (!MODBUS_P2P_MASTER_ENABLE)
  1005. pika_platform_printf("MODBUS_P2P_ENABLE and MODBUS_P2P_MASTER_ENABLE is not enabled.\n");
  1006. return 0;
  1007. #else
  1008. int ret = 0;
  1009. rtu_modbus_device_t dev = (rtu_modbus_device_t)obj_getPtr(self, "dev");
  1010. if(NULL == dev) {
  1011. pika_platform_printf("modbus_rtu_download error, dev is NULL.\n");
  1012. return 0;
  1013. }
  1014. if(MODBUS_MASTER != dev->mode){
  1015. pika_platform_printf("modbus_rtu_download is only for master.\n");
  1016. return 0;
  1017. }
  1018. if(0 == dev->status) {
  1019. pika_platform_printf("modbus_rtu_download error, dev is not opened.\n");
  1020. return 0;
  1021. }
  1022. if(0 == dev->p2p_flag) {
  1023. pika_platform_printf("modbus_rtu_download error, p2p_flag is not seted.\n");
  1024. return 0;
  1025. }
  1026. ret = modbus_rtu_excuse_file(dev, slave, MODBUS_WRITE, file_dev, file_master);
  1027. if(MODBUS_RT_EOK != ret) {
  1028. pika_platform_printf("modbus_rtu_download error, code: %d.\n", ret);
  1029. return 0;
  1030. }
  1031. return 1;
  1032. #endif
  1033. }
  1034. int _modbus_rt__rtu__master_upload(PikaObj *self, int slave, char* file_dev, char* file_master) {
  1035. #if (!MODBUS_RTU_MASTER_ENABLE)
  1036. pika_platform_printf("modbus rtu master is not activated.\n");
  1037. return 0;
  1038. #elif (!MODBUS_P2P_ENABLE) || (!MODBUS_P2P_MASTER_ENABLE)
  1039. pika_platform_printf("MODBUS_P2P_ENABLE and MODBUS_P2P_MASTER_ENABLE is not enabled.\n");
  1040. return 0;
  1041. #else
  1042. int ret = 0;
  1043. rtu_modbus_device_t dev = (rtu_modbus_device_t)obj_getPtr(self, "dev");
  1044. if(NULL == dev) {
  1045. pika_platform_printf("modbus_rtu_upload error, dev is NULL.\n");
  1046. return 0;
  1047. }
  1048. if(MODBUS_MASTER != dev->mode){
  1049. pika_platform_printf("modbus_rtu_upload is only for master.\n");
  1050. return 0;
  1051. }
  1052. if(0 == dev->status) {
  1053. pika_platform_printf("modbus_rtu_upload error, dev is not opened.\n");
  1054. return 0;
  1055. }
  1056. if(0 == dev->p2p_flag) {
  1057. pika_platform_printf("modbus_rtu_upload error, p2p_flag is not seted.\n");
  1058. return 0;
  1059. }
  1060. ret = modbus_rtu_excuse_file(dev, slave, MODBUS_READ, file_dev, file_master);
  1061. if(MODBUS_RT_EOK != ret) {
  1062. pika_platform_printf("modbus_rtu_upload error, code: %d.\n", ret);
  1063. return 0;
  1064. }
  1065. return 1;
  1066. #endif
  1067. }