modbus_handle.c 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  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. int delay)
  32. {
  33. Modbus_Manger *modbus_manger = (Modbus_Manger *)manger;
  34. modbus_manger->port_name = (char*)port_name;
  35. modbus_manger->baud = baud;
  36. modbus_manger->type = type;
  37. modbus_manger->saddr = saddr;
  38. modbus_manger->delay = delay;
  39. strcpy(modbus_manger->name,name);
  40. //初始化
  41. modbus_manger->mb = modbus_new_rtu(modbus_manger->port_name, modbus_manger->baud,'N', 8, 1);
  42. printf(modbus_strerror(errno));
  43. if(modbus_manger->mb == NULL)
  44. return -1;
  45. manger = modbus_manger;
  46. //链接
  47. int ret = modbus_connect(modbus_manger->mb);
  48. //if (ret!=0)
  49. //{
  50. // return -5;
  51. /* code */
  52. // }
  53. //int fd;
  54. //struct rs485_ctrl ctrl485;
  55. //fd = modbus_get_socket(modbus_manger->mb);
  56. //ctrl485.rts_on_send = 0; // It means that DE is at 3.3 volt on send
  57. //ctrl485.rts_after_sent = 1; // It means that DE is at 0 volt on send
  58. //ctrl485.delay_rts_before_send = 0; // DE will be active at same time of data
  59. //ctrl485.enabled = 1;
  60. //ret = ioctl(fd, TIOCSRS485, &ctrl485);
  61. //if (ret) {
  62. // printf("ERROR PORT 1! TIOCSERSETRS485 failed %i\n", ret);
  63. // return -2;
  64. //}
  65. //设置为485模式
  66. //int nModeType = modbus_rtu_get_rts(modbus_manger->mb);
  67. //if (nModeType != MODBUS_RTU_RTS_NONE)
  68. //{
  69. //}
  70. //ret = modbus_set_debug(modbus_manger->mb,TRUE);
  71. ret = 0;//modbus_rtu_set_serial_mode(modbus_manger->mb, MODBUS_RTU_RS485);
  72. if (ret != 0)
  73. {
  74. printf("modbus_rtu_set_serial_mode failed, %s\n", modbus_strerror(errno));
  75. //return -2;
  76. /* code */
  77. }
  78. //启用RTS模式并同时设置极性
  79. ret = modbus_rtu_set_rts(modbus_manger->mb, MODBUS_RTU_RTS_NONE);
  80. if (ret != 0)
  81. {
  82. return -3;
  83. /* code */
  84. }
  85. ret =modbus_set_error_recovery(modbus_manger->mb,MODBUS_ERROR_RECOVERY_PROTOCOL);
  86. //设置超时时间为2S
  87. struct timeval response_timeout;
  88. response_timeout.tv_sec = 1;
  89. response_timeout.tv_usec = 0;
  90. modbus_set_response_timeout(modbus_manger->mb, 0,800000);
  91. modbus_set_byte_timeout(modbus_manger->mb,0,50000);
  92. //modbus_set_response_timeout(modbus_manger->mb,3,100000);
  93. //初始化锁
  94. ret = pthread_mutex_init(&modbus_manger->mutex,NULL);
  95. if (ret!=0)
  96. {
  97. return -4;
  98. /* code */
  99. }
  100. return 0;
  101. }
  102. /// @brief 写单个寄存器值
  103. /// @param manger
  104. /// @param reg
  105. /// @param data
  106. /// @return
  107. int g_modbus_write_reg(void* manger,int saddr,unsigned short reg,unsigned short data)
  108. {
  109. int ret = 0 ;
  110. Modbus_Manger *modbus_manger = (Modbus_Manger *)manger;
  111. pthread_mutex_lock(&modbus_manger->mutex);
  112. if(modbus_manger->delay>0) usleep(30000);
  113. modbus_set_slave(modbus_manger->mb, saddr);
  114. ret=modbus_write_register(modbus_manger->mb, reg, data);//06
  115. pthread_mutex_unlock(&modbus_manger->mutex);
  116. return ret;
  117. }
  118. /// @brief 写多个寄存器
  119. /// @param manger
  120. /// @param reg
  121. /// @param size
  122. /// @param data
  123. /// @return
  124. int g_modbus_write_x_reg(void* manger,int saddr,unsigned short reg,unsigned int size,unsigned short *data)
  125. {
  126. int ret = 0 ;
  127. Modbus_Manger *modbus_manger = (Modbus_Manger *)manger;
  128. pthread_mutex_lock(&modbus_manger->mutex);
  129. if(modbus_manger->delay>0) usleep(30000);
  130. modbus_set_slave(modbus_manger->mb, saddr);
  131. ret = modbus_write_registers(modbus_manger->mb, reg, size,data);//06
  132. pthread_mutex_unlock(&modbus_manger->mutex);
  133. return ret ;
  134. }
  135. //slave receive
  136. int g_modbus_receive(void* manger, uint8_t *req)
  137. {
  138. int ret = 0 ;
  139. Modbus_Manger *modbus_manger = (Modbus_Manger *)manger;
  140. pthread_mutex_lock(&modbus_manger->mutex);
  141. ret = modbus_receive(modbus_manger->mb, req);
  142. pthread_mutex_unlock(&modbus_manger->mutex);
  143. return ret ;
  144. }
  145. int g_modbus_reply(void* manger, uint8_t *req, int reqlen, modbus_mapping_t *map)
  146. {
  147. int ret = 0 ;
  148. Modbus_Manger *modbus_manger = (Modbus_Manger *)manger;
  149. pthread_mutex_lock(&modbus_manger->mutex);
  150. ret = modbus_reply(modbus_manger->mb, req, reqlen, map);
  151. pthread_mutex_unlock(&modbus_manger->mutex);
  152. return ret ;
  153. }
  154. int g_modbus_set_slave(void* manger, int saddr)
  155. {
  156. int ret = 0 ;
  157. Modbus_Manger *modbus_manger = (Modbus_Manger *)manger;
  158. pthread_mutex_lock(&modbus_manger->mutex);
  159. ret = modbus_set_slave(modbus_manger->mb, saddr);
  160. pthread_mutex_unlock(&modbus_manger->mutex);
  161. return ret ;
  162. }
  163. /// @brief 读取单个寄存器值
  164. /// @param manger
  165. /// @param reg
  166. /// @param data
  167. /// @return
  168. int g_modbus_read_reg(void* manger,int saddr,unsigned short reg,unsigned short *data)
  169. {
  170. int ret = 0 ;
  171. Modbus_Manger *modbus_manger = (Modbus_Manger *)manger;
  172. pthread_mutex_lock(&modbus_manger->mutex);
  173. if(modbus_manger->delay>0) usleep(30000);
  174. modbus_set_slave(modbus_manger->mb, saddr);
  175. ret = modbus_read_registers(modbus_manger->mb, reg, 1, data);//0x03
  176. pthread_mutex_unlock(&modbus_manger->mutex);
  177. return ret;
  178. }
  179. /// @brief 读取多个寄存器值
  180. /// @param manger
  181. /// @param reg
  182. /// @param size
  183. /// @param data
  184. /// @return
  185. int g_modbus_read_x_reg(void* manger,int saddr,unsigned short reg,unsigned int size,unsigned short *data)
  186. {
  187. int ret = 0 ;
  188. Modbus_Manger *modbus_manger = (Modbus_Manger *)manger;
  189. pthread_mutex_lock(&modbus_manger->mutex);
  190. if(modbus_manger->delay>0) usleep(10000);
  191. modbus_set_slave(modbus_manger->mb, saddr);
  192. ret = modbus_read_registers(modbus_manger->mb, reg, size, data);//0x03
  193. pthread_mutex_unlock(&modbus_manger->mutex);
  194. return ret ;
  195. }
  196. /// @brief 读取多个寄存器值-延时版
  197. /// @param manger
  198. /// @param reg
  199. /// @param size
  200. /// @param data
  201. /// @return
  202. int g_modbus_read_x_reg_delay(void* manger,int saddr,unsigned short reg,unsigned int size,unsigned short *data)
  203. {
  204. int ret = 0 ;
  205. Modbus_Manger *modbus_manger = (Modbus_Manger *)manger;
  206. pthread_mutex_lock(&modbus_manger->mutex);
  207. if(modbus_manger->delay>0) usleep(30000);
  208. modbus_set_slave(modbus_manger->mb, saddr);
  209. ret = modbus_read_registers(modbus_manger->mb, reg, size, data);//0x03
  210. pthread_mutex_unlock(&modbus_manger->mutex);
  211. return ret ;
  212. }
  213. /// @brief 释放modbus接口
  214. /// @param manger
  215. void g_modbus_deinit(void* manger)
  216. {
  217. Modbus_Manger *modbus_manger = (Modbus_Manger *)manger;
  218. modbus_close(modbus_manger->mb);
  219. modbus_free(modbus_manger->mb);
  220. pthread_mutex_destroy(&modbus_manger->mutex);
  221. }
  222. int g_modbus_set_timeout(void* manger,int timeout_ms)
  223. {
  224. int ret = 0 ;
  225. Modbus_Manger *modbus_manger = (Modbus_Manger *)manger;
  226. pthread_mutex_lock(&modbus_manger->mutex);
  227. ret = modbus_set_response_timeout(modbus_manger->mb, timeout_ms/1000, timeout_ms*1000);
  228. pthread_mutex_unlock(&modbus_manger->mutex);
  229. return ret;
  230. }
  231. //04
  232. int g_modbus_read_input_reg(void* manger,int saddr,unsigned short reg,unsigned int size,unsigned short *data)
  233. {
  234. int ret = 0 ;
  235. Modbus_Manger *modbus_manger = (Modbus_Manger *)manger;
  236. pthread_mutex_lock(&modbus_manger->mutex);
  237. if(modbus_manger->delay>0) usleep(30000);
  238. modbus_set_slave(modbus_manger->mb, saddr);
  239. ret = modbus_read_input_registers(modbus_manger->mb, reg, size, data);//0x04
  240. pthread_mutex_unlock(&modbus_manger->mutex);
  241. return ret ;
  242. }