mb_sample_rtu_slave.c 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. /*
  2. * mb_sample_rtu_slave.c
  3. *
  4. * Change Logs:
  5. * Date Author Notes
  6. * 2024-04-02 qiyongzhong first version
  7. */
  8. #include "rtthread.h"
  9. #include "modbus.h"
  10. #ifdef MB_USING_SAMPLE_RTU_SLAVE
  11. #define DBG_TAG "mb.rtu.slave"
  12. #define DBG_LVL DBG_LOG
  13. #include <rtdbg.h>
  14. static const mb_backend_param_t mb_bkd_prm = {
  15. .rtu.dev = "uart1", //设备名
  16. .rtu.baudrate = 9600, //波特率
  17. .rtu.parity = 0, //校验位, 0-无, 1-奇, 2-偶
  18. .rtu.pin = -1, //控制引脚, <0 表示不使用
  19. .rtu.lvl = 0 //控制发送电平
  20. };
  21. #define MB_REG_ADDR_BEGIN 4000 //寄存器起始地址
  22. static u16 regs[] = {//寄存器数据
  23. 2210,
  24. 2220,
  25. 2230,
  26. 111,
  27. 112,
  28. 113,
  29. 3000,
  30. 1111,
  31. 1112,
  32. 1113,
  33. 600,
  34. 201,
  35. 202,
  36. 203,
  37. 4000,
  38. 8008,
  39. 9009,
  40. 2001,
  41. 2002,
  42. 2003,
  43. 2004,
  44. 101,
  45. 102,
  46. 103,
  47. 104,
  48. 1111,
  49. 1112,
  50. 1113,
  51. 1114
  52. };
  53. //重新实现 modbus_port_slave.c 中的回调函数
  54. int mb_port_read_hold(u16 addr, u16 *preg)//读保持寄存器, 返回 : 0-成功, -2-地址错误
  55. {
  56. MB_ASSERT(preg != NULL);
  57. if (addr < MB_REG_ADDR_BEGIN)
  58. {
  59. return(-2);
  60. }
  61. if (addr >= (MB_REG_ADDR_BEGIN + sizeof(regs)/sizeof(regs[0])))
  62. {
  63. return(-2);
  64. }
  65. *preg = regs[addr - MB_REG_ADDR_BEGIN];
  66. return(0);
  67. }
  68. //重新实现 modbus_port_slave.c 中的回调函数
  69. int mb_port_write_hold(u16 addr, u16 reg)//写保持寄存器, 返回 : 0-成功, -2-地址错误, -3-值非法, -4-设备故障
  70. {
  71. if (addr < MB_REG_ADDR_BEGIN)
  72. {
  73. return(-2);
  74. }
  75. if (addr >= (MB_REG_ADDR_BEGIN + sizeof(regs)/sizeof(regs[0])))
  76. {
  77. return(-2);
  78. }
  79. regs[addr - MB_REG_ADDR_BEGIN] = reg;
  80. return(0);
  81. }
  82. static void mb_sample_thread(void *args)//线程服务函数
  83. {
  84. mb_inst_t *hinst = mb_create(MB_BACKEND_TYPE_RTU, &mb_bkd_prm);
  85. RT_ASSERT(hinst != NULL);
  86. //mb_set_slave(hinst, 1);//修改从机地址, 默认地址为1, 可根据实际情况修改
  87. //mb_set_prot(hinst, MB_PROT_TCP);//修改通信协议类型, RTU后端默认使用MODBUS-RTU通信协议
  88. //mb_set_tmo(hinst, 500, 15);//修改超时时间, 应答超时500ms(默认300ms), 字节超时15ms(默认32ms)
  89. while(1)
  90. {
  91. mb_slave_fsm(hinst);//循环调用从机状态机
  92. }
  93. }
  94. static int mb_sample_rtu_slave_startup(void)
  95. {
  96. rt_thread_t tid = rt_thread_create("mb-rtu-slave", mb_sample_thread, NULL, 2048, 5, 20);
  97. RT_ASSERT(tid != NULL);
  98. rt_thread_startup(tid);
  99. return(0);
  100. }
  101. INIT_APP_EXPORT(mb_sample_rtu_slave_startup);
  102. #endif