modbus_handle.c 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  1. #include "modbus_handle.h"
  2. #include <sys/ioctl.h>
  3. #include <fcntl.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <unistd.h>
  7. #include <string.h>
  8. #include <asm/ioctls.h>
  9. #include <errno.h>
  10. #include <termios.h>
  11. #include <string.h>
  12. struct rs485_ctrl {
  13. unsigned short rts_on_send;
  14. unsigned short rts_after_sent;
  15. unsigned int delay_rts_before_send;
  16. unsigned short enabled;
  17. };
  18. /// @brief 初始化modbus
  19. /// @param manger
  20. /// @param port_name
  21. /// @param type
  22. /// @param saddr
  23. /// @param name
  24. /// @return
  25. int g_modbus_init(void* manger,
  26. const char* port_name,
  27. unsigned int baud,
  28. unsigned char type,
  29. unsigned char saddr,
  30. const char* name)
  31. {
  32. Modbus_Manger *modbus_manger = (Modbus_Manger *)manger;
  33. modbus_manger->port_name = port_name;
  34. modbus_manger->baud = baud;
  35. modbus_manger->type = type;
  36. modbus_manger->saddr = saddr;
  37. strcpy(modbus_manger->name,name);
  38. //初始化
  39. modbus_manger->mb = modbus_new_rtu(modbus_manger->port_name, modbus_manger->baud,'N', 8, 1);
  40. printf(modbus_strerror(errno));
  41. if(modbus_manger->mb == NULL)
  42. return -1;
  43. manger = modbus_manger;
  44. //设置从机地址
  45. if(modbus_manger->saddr > 0){
  46. modbus_set_slave(modbus_manger->mb, modbus_manger->saddr);
  47. modbus_manger->mmp = modbus_mapping_new_start_address(0,0,0,0,0x1770,22,0x177B,10);
  48. }
  49. //链接
  50. int ret = modbus_connect(modbus_manger->mb);
  51. //if (ret!=0)
  52. //{
  53. // return -5;
  54. /* code */
  55. // }
  56. //int fd;
  57. //struct rs485_ctrl ctrl485;
  58. //fd = modbus_get_socket(modbus_manger->mb);
  59. //ctrl485.rts_on_send = 0; // It means that DE is at 3.3 volt on send
  60. //ctrl485.rts_after_sent = 1; // It means that DE is at 0 volt on send
  61. //ctrl485.delay_rts_before_send = 0; // DE will be active at same time of data
  62. //ctrl485.enabled = 1;
  63. //ret = ioctl(fd, TIOCSRS485, &ctrl485);
  64. //if (ret) {
  65. // printf("ERROR PORT 1! TIOCSERSETRS485 failed %i\n", ret);
  66. // return -2;
  67. //}
  68. //设置为485模式
  69. //int nModeType = modbus_rtu_get_rts(modbus_manger->mb);
  70. //if (nModeType != MODBUS_RTU_RTS_NONE)
  71. //{
  72. //}
  73. //ret = modbus_set_debug(modbus_manger->mb,TRUE);
  74. ret = modbus_rtu_set_serial_mode(modbus_manger->mb, MODBUS_RTU_RS485);
  75. if (ret != 0)
  76. {
  77. printf(modbus_strerror(errno));
  78. //return -2;
  79. /* code */
  80. }
  81. //启用RTS模式并同时设置极性
  82. ret = modbus_rtu_set_rts(modbus_manger->mb, MODBUS_RTU_RTS_NONE);
  83. if (ret != 0)
  84. {
  85. return -3;
  86. /* code */
  87. }
  88. ret =modbus_set_error_recovery(modbus_manger->mb,MODBUS_ERROR_RECOVERY_PROTOCOL | MODBUS_ERROR_RECOVERY_LINK);
  89. //设置超时时间为2S
  90. struct timeval response_timeout;
  91. response_timeout.tv_sec = 4;
  92. response_timeout.tv_usec = 0;
  93. // modbus_set_response_timeout(modbus_manger->mb,2,1500000);
  94. // modbus_set_byte_timeout(modbus_manger->mb,0,1000000);
  95. //modbus_set_debug(modbus_manger->mb,1);
  96. //modbus_set_response_timeout(modbus_manger->mb,3,100000);
  97. //初始化锁
  98. ret = pthread_mutex_init(&modbus_manger->mutex,NULL);
  99. if (ret!=0)
  100. {
  101. return -4;
  102. /* code */
  103. }
  104. return 0;
  105. }
  106. int d_g_modbus_init(void* manger,
  107. const char* port_name,
  108. unsigned int baud,
  109. unsigned char type,
  110. unsigned char saddr,
  111. const char* name)
  112. {
  113. Modbus_Manger *modbus_manger = (Modbus_Manger *)manger;
  114. modbus_manger->port_name = port_name;
  115. modbus_manger->baud = baud;
  116. modbus_manger->type = type;
  117. modbus_manger->saddr = saddr;
  118. strcpy(modbus_manger->name,name);
  119. //初始化
  120. modbus_manger->mb = modbus_new_rtu(modbus_manger->port_name, modbus_manger->baud,'N', 8, 1);
  121. printf(modbus_strerror(errno));
  122. if(modbus_manger->mb == NULL)
  123. return -1;
  124. manger = modbus_manger;
  125. //设置从机地址,主机默认为0
  126. if(modbus_manger->saddr > 0 ){
  127. modbus_set_slave(modbus_manger->mb, modbus_manger->saddr);
  128. modbus_manger->mmp = modbus_mapping_new_start_address(0,0,0,0,0x1770,22,0x177B,10);
  129. }
  130. //链接
  131. int ret = modbus_connect(modbus_manger->mb);
  132. //if (ret!=0)
  133. //{
  134. // return -5;
  135. /* code */
  136. // }
  137. //int fd;
  138. //struct rs485_ctrl ctrl485;
  139. //fd = modbus_get_socket(modbus_manger->mb);
  140. //ctrl485.rts_on_send = 0; // It means that DE is at 3.3 volt on send
  141. //ctrl485.rts_after_sent = 1; // It means that DE is at 0 volt on send
  142. //ctrl485.delay_rts_before_send = 0; // DE will be active at same time of data
  143. //ctrl485.enabled = 1;
  144. //ret = ioctl(fd, TIOCSRS485, &ctrl485);
  145. //if (ret) {
  146. // printf("ERROR PORT 1! TIOCSERSETRS485 failed %i\n", ret);
  147. // return -2;
  148. //}
  149. //设置为485模式
  150. //int nModeType = modbus_rtu_get_rts(modbus_manger->mb);
  151. //if (nModeType != MODBUS_RTU_RTS_NONE)
  152. //{
  153. //}
  154. ret = modbus_set_debug(modbus_manger->mb,TRUE);
  155. ret = modbus_rtu_set_serial_mode(modbus_manger->mb, MODBUS_RTU_RS485);
  156. if (ret != 0)
  157. {
  158. printf(modbus_strerror(errno));
  159. //return -2;
  160. /* code */
  161. }
  162. //启用RTS模式并同时设置极性
  163. ret = modbus_rtu_set_rts(modbus_manger->mb, MODBUS_RTU_RTS_NONE);
  164. if (ret != 0)
  165. {
  166. return -3;
  167. /* code */
  168. }
  169. //设置超时时间为2S
  170. struct timeval response_timeout;
  171. response_timeout.tv_sec = 4;
  172. response_timeout.tv_usec = 0;
  173. modbus_set_response_timeout(modbus_manger->mb,2,1500000);
  174. modbus_set_byte_timeout(modbus_manger->mb,0,1000000);
  175. //modbus_set_debug(modbus_manger->mb,1);
  176. //modbus_set_response_timeout(modbus_manger->mb,3,100000);
  177. //初始化锁
  178. ret = pthread_mutex_init(&modbus_manger->mutex,NULL);
  179. if (ret!=0)
  180. {
  181. return -4;
  182. /* code */
  183. }
  184. return 0;
  185. }
  186. /// @brief 写单个寄存器值
  187. /// @param manger
  188. /// @param reg
  189. /// @param data
  190. /// @return
  191. int g_modbus_write_reg(void* manger,int saddr,unsigned short reg,unsigned short data)
  192. {
  193. int ret = 0 ;
  194. Modbus_Manger *modbus_manger = (Modbus_Manger *)manger;
  195. pthread_mutex_lock(&modbus_manger->mutex);
  196. usleep(10000);
  197. modbus_set_slave(modbus_manger->mb, saddr);
  198. ret=modbus_write_register(modbus_manger->mb, reg, data);//06
  199. pthread_mutex_unlock(&modbus_manger->mutex);
  200. return ret;
  201. }
  202. /// @brief 写多个寄存器
  203. /// @param manger
  204. /// @param reg
  205. /// @param size
  206. /// @param data
  207. /// @return
  208. int g_modbus_write_x_reg(void* manger,int saddr,unsigned short reg,unsigned int size,unsigned short *data)
  209. {
  210. int ret = 0 ;
  211. Modbus_Manger *modbus_manger = (Modbus_Manger *)manger;
  212. pthread_mutex_lock(&modbus_manger->mutex);
  213. usleep(10000);
  214. modbus_set_slave(modbus_manger->mb, saddr);
  215. ret = modbus_write_registers(modbus_manger->mb, reg, size,data);//06
  216. pthread_mutex_unlock(&modbus_manger->mutex);
  217. return ret ;
  218. }
  219. /// @brief 读取单个寄存器值
  220. /// @param manger
  221. /// @param reg
  222. /// @param data
  223. /// @return
  224. int g_modbus_read_reg(void* manger,int saddr,unsigned short reg,unsigned short *data)
  225. {
  226. int ret = 0 ;
  227. Modbus_Manger *modbus_manger = (Modbus_Manger *)manger;
  228. pthread_mutex_lock(&modbus_manger->mutex);
  229. usleep(30000);
  230. modbus_set_slave(modbus_manger->mb, saddr);
  231. ret = modbus_read_registers(modbus_manger->mb, reg, 1, data);//0x03
  232. pthread_mutex_unlock(&modbus_manger->mutex);
  233. return ret;
  234. }
  235. /// @brief 读取多个寄存器值
  236. /// @param manger
  237. /// @param reg
  238. /// @param size
  239. /// @param data
  240. /// @return
  241. int g_modbus_read_x_reg(void* manger,int saddr,unsigned short reg,unsigned int size,unsigned short *data)
  242. {
  243. int ret = 0 ;
  244. Modbus_Manger *modbus_manger = (Modbus_Manger *)manger;
  245. pthread_mutex_lock(&modbus_manger->mutex);
  246. usleep(30000);
  247. modbus_set_slave(modbus_manger->mb, saddr);
  248. ret = modbus_read_registers(modbus_manger->mb, reg, size, data);//0x03
  249. pthread_mutex_unlock(&modbus_manger->mutex);
  250. return ret ;
  251. }
  252. /// @brief 读取多个寄存器值-延时版
  253. /// @param manger
  254. /// @param reg
  255. /// @param size
  256. /// @param data
  257. /// @return
  258. int g_modbus_read_x_reg_delay(void* manger,int saddr,unsigned short reg,unsigned int size,unsigned short *data)
  259. {
  260. int ret = 0 ;
  261. Modbus_Manger *modbus_manger = (Modbus_Manger *)manger;
  262. pthread_mutex_lock(&modbus_manger->mutex);
  263. usleep(30000);
  264. modbus_set_slave(modbus_manger->mb, saddr);
  265. ret = modbus_read_registers(modbus_manger->mb, reg, size, data);//0x03
  266. pthread_mutex_unlock(&modbus_manger->mutex);
  267. return ret ;
  268. }
  269. /// @brief 释放modbus接口
  270. /// @param manger
  271. void g_modbus_deinit(void* manger)
  272. {
  273. Modbus_Manger *modbus_manger = (Modbus_Manger *)manger;
  274. modbus_close(modbus_manger->mb);
  275. modbus_free(modbus_manger->mb);
  276. pthread_mutex_destroy(&modbus_manger->mutex);
  277. }