modbus.c 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. #include "modbus.h"
  2. #include "crcLib.h"
  3. #include "gd32e23x.h"
  4. #include "string.h"
  5. // #include "systick.h"
  6. #include "util.h"
  7. #include <stdlib.h>
  8. #include "modbus.h"
  9. #include <string.h>
  10. #include "FreeRTOS.h"
  11. #include "task.h"
  12. static modbus_slave_t slave;
  13. //static modbus_master_t master;
  14. static uint8_t modbus_mode = 0;
  15. int8_t modbus_slave_init(uint8_t address)
  16. {
  17. slave.address = address;
  18. slave.max_length = MODBUS_SLAVE_REG_MAX;
  19. slave.length = 0;
  20. slave.send_buffer_len = 0;
  21. memset(&(slave.send_buffer), 0, MODBUS_SLAVE_SEND_BUFF_LEX);
  22. slave.cmd_len = 0;
  23. return 0;
  24. }
  25. modbus_slave_t *modbus_slave_get(void)
  26. {
  27. return &slave;
  28. }
  29. int8_t modbus_slave_add_reg(uint16_t address, uint16_t data, uint8_t access, modbus_reg_read_cb_t read_cb, modbus_reg_write_cb_t write_cb)
  30. {
  31. if (slave.length < slave.max_length)
  32. {
  33. modbus_reg_t *reg = &(slave.regs[slave.length]);
  34. reg->address = address;
  35. reg->data = data;
  36. reg->access = access;
  37. reg->write_cb = write_cb;
  38. reg->read_cb = read_cb;
  39. slave.length++;
  40. return 0;
  41. }
  42. else
  43. {
  44. return -1;
  45. }
  46. }
  47. modbus_reg_t *modbus_slave_get_reg(uint16_t address)
  48. {
  49. for (int i = 0; i < slave.length; i++)
  50. {
  51. if (slave.regs[i].address == address)
  52. {
  53. return &slave.regs[i];
  54. }
  55. }
  56. return NULL;
  57. }
  58. int8_t modbus_slave_reg_read_raw(uint16_t address, uint16_t *data)
  59. {
  60. modbus_reg_t *reg = modbus_slave_get_reg(address);
  61. if (reg != NULL)
  62. {
  63. *data = reg->data;
  64. return 0;
  65. }
  66. else
  67. {
  68. return -1;
  69. }
  70. }
  71. int8_t modbus_slave_reg_write_raw(uint16_t address, uint16_t data)
  72. {
  73. modbus_reg_t *reg = modbus_slave_get_reg(address);
  74. if (reg != NULL)
  75. {
  76. reg->data = data;
  77. return 0;
  78. }
  79. else
  80. {
  81. return -1;
  82. }
  83. }
  84. int8_t modbus_slave_reg_read(uint16_t address, uint16_t *data)
  85. {
  86. modbus_reg_t *reg = modbus_slave_get_reg(address);
  87. if (reg != NULL)
  88. {
  89. if (reg->access == 1)
  90. {
  91. return -2;
  92. }
  93. if (reg->read_cb != NULL)
  94. {
  95. reg->data = reg->read_cb(address);
  96. }
  97. *data = reg->data;
  98. return 0;
  99. }
  100. else
  101. {
  102. return -1;
  103. }
  104. }
  105. int8_t modbus_slave_reg_write(uint16_t address, uint16_t data)
  106. {
  107. modbus_reg_t *reg = modbus_slave_get_reg(address);
  108. if (reg != NULL)
  109. {
  110. if (reg->access == 0)
  111. {
  112. return -2;
  113. }
  114. reg->data = data;
  115. if (reg->write_cb != NULL)
  116. {
  117. reg->write_cb(address, reg->data);
  118. }
  119. return 0;
  120. }
  121. else
  122. {
  123. return -1;
  124. }
  125. }
  126. int8_t modbus_slave_reg_read_mult(uint16_t address, uint16_t reg_num, uint16_t *data)
  127. {
  128. for (int i = 0; i < reg_num; i++)
  129. {
  130. if (modbus_slave_reg_read(address + i, data + i) != 0)
  131. {
  132. return -1;
  133. }
  134. }
  135. return 0;
  136. }
  137. int8_t modbus_slave_reg_write_mult(uint16_t address, uint16_t reg_num, uint16_t *data)
  138. {
  139. for (int i = 0; i < reg_num; i++)
  140. {
  141. if (modbus_slave_reg_write(address + i, data[i]) != 0)
  142. {
  143. return -1;
  144. }
  145. }
  146. return 0;
  147. }
  148. int8_t modbus_slave_cmd_add(uint8_t cmd, modbus_slave_cmd_cb_t cmd_cb)
  149. {
  150. if (slave.cmd_len < MODBUS_SLAVE_CMD_MAX)
  151. {
  152. modbus_cmd_t *box = &(slave.cmds[slave.cmd_len]);
  153. box->cmd = cmd;
  154. box->cb = cmd_cb;
  155. slave.cmd_len++;
  156. return 0;
  157. }
  158. else
  159. {
  160. return -1;
  161. }
  162. }
  163. modbus_cmd_t* modbus_slave_cmd_get(uint8_t cmd)
  164. {
  165. for (int i = 0; i < slave.cmd_len; i++)
  166. {
  167. if (slave.cmds[i].cmd == cmd)
  168. {
  169. return &slave.cmds[i];
  170. }
  171. }
  172. return NULL;
  173. }
  174. //void modbus_master_init(uint16_t timeout, modbus_master_reg_cb_t reg_cb)
  175. //{
  176. // master.state = 0;
  177. // master.timeout = timeout;
  178. // master.timeout_counter = 0;
  179. // master.address = 0;
  180. // master.function = 0;
  181. // master.error = 0;
  182. // master.error_code = 0;
  183. // master.data_length = 0;
  184. // master.reg_cb = reg_cb;
  185. // memset(master.data, 0, 256);
  186. //}
  187. //modbus_master_t *modbus_master_get(void)
  188. //{
  189. // return &master;
  190. //}
  191. //int8_t modbus_master_wait_for_response(void)
  192. //{
  193. // if (master.state != 3)
  194. // {
  195. // master.timeout_counter += MODBUS_MASTER_SLEEP_TIME;
  196. // if (master.timeout_counter >= master.timeout)
  197. // {
  198. // master.timeout_counter = 0;
  199. // master.state = 0;
  200. // master.error = 1;
  201. // master.error_code = 0;
  202. // if (master.reg_cb != NULL)
  203. // {
  204. // master.reg_cb(master.address, master.error, master.error_code);
  205. // }
  206. // return -1;
  207. // }
  208. // else
  209. // {
  210. // vTaskDelay(pdMS_TO_TICKS(MODBUS_MASTER_SLEEP_TIME));
  211. // }
  212. // }
  213. // master.state = 0;
  214. // if (master.reg_cb != NULL)
  215. // {
  216. // master.reg_cb(master.address, master.error, master.error_code);
  217. // }
  218. // return 0;
  219. //}
  220. void modbus_set_mode(uint8_t mode)
  221. {
  222. modbus_mode = mode;
  223. }
  224. uint8_t modbus_get_mode(void)
  225. {
  226. return modbus_mode;
  227. }