modbus.h 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. /*
  2. * modbus.h
  3. *
  4. * Change Logs:
  5. * Date Author Notes
  6. * 2024-04-02 qiyongzhong first version
  7. */
  8. #ifndef __MODBUS_H__
  9. #define __MODBUS_H__
  10. #include "modbus_cvt.h"
  11. #include "modbus_rtu.h"
  12. #include "modbus_tcp.h"
  13. #include "modbus_port.h"
  14. #include "modbus_backend.h"
  15. #ifdef MB_TCP_FRM_MAX
  16. #define MB_BUF_SIZE MB_TCP_FRM_MAX
  17. #else
  18. #define MB_BUF_SIZE MB_RTU_FRM_MAX
  19. #endif
  20. typedef enum{
  21. MB_PROT_RTU = 0,
  22. MB_PROT_TCP
  23. }mb_prot_t;
  24. typedef int (*mb_read_bit_t)(u16 addr, u8 *pbit);//读bit位, 返回: 0-成功, -2-地址错误
  25. typedef int (*mb_write_bit_t)(u16 addr, u8 bit);//写bit位, 返回: 0-成功, -2-地址错误, -4-设备故障
  26. typedef int (*mb_read_reg_t)(u16 addr, u16 *pval);//读16位寄存器, 返回 : 0-成功, -2-地址错误
  27. typedef int (*mb_write_reg_t)(u16 addr, u16 val);//写16位寄存器, 返回 : 0-成功, -2-地址错误, -3-值非法, -4-设备故障
  28. typedef int (*mb_mask_write_t)(u16 addr, u16 mask_and, u16 mask_or);//屏蔽写寄存器, 返回 : 0-成功, -2-地址错误, -3-值非法, -4-设备故障
  29. typedef struct{
  30. mb_read_bit_t read_disc; //读离散量输入
  31. mb_read_bit_t read_coil; //读线圈
  32. mb_write_bit_t write_coil; //写线圈
  33. mb_read_reg_t read_input; //读输入寄存器
  34. mb_read_reg_t read_hold; //读保持寄存器
  35. mb_write_reg_t write_hold; //写保持寄存器
  36. }mb_cb_table_t;
  37. typedef struct mb_cascade_fun{
  38. void (*slave_func)(uint16_t reg,void* r_w_data,uint32_t lenth);
  39. }mb_cascade_fun_t;
  40. typedef struct{
  41. u8 saddr; //从机地址
  42. mb_prot_t prot; //通信协议
  43. u16 tid; //TCP传输标识计数
  44. mb_backend_t *backend; //后端指针
  45. mb_cb_table_t *cb; //从机回调函数表
  46. u8 datas[256]; //读写数据缓冲区
  47. u8 buf[MB_BUF_SIZE]; //收发缓冲区
  48. mb_cascade_fun_t *func; //other func
  49. }mb_inst_t;
  50. //创建modbus实例, 成功返回实例指针, 失败返回NULL
  51. mb_inst_t * mb_create(mb_backend_type_t type, const mb_backend_param_t *param);
  52. //销毁modbus实例
  53. void mb_destory(mb_inst_t *hinst);
  54. //修改从机地址, 默认地址为1
  55. void mb_set_slave(mb_inst_t *hinst, u8 saddr);
  56. //修改协议, 默认使用与后端类型一致的协议类型
  57. void mb_set_prot(mb_inst_t *hinst, mb_prot_t prot);
  58. //修改超时时间, 默认应答超时300ms, 字节超时32ms
  59. void mb_set_tmo(mb_inst_t *hinst, int ack_tmo_ms, int byte_tmo_ms);
  60. //建立连接, 成功返回0, 失败返回-1, 如已建立连接则立即返回
  61. int mb_connect(mb_inst_t *hinst);
  62. //断开连接, 成功返回0, 失败返回-1, 如已断开连接则立即返回
  63. int mb_disconn(mb_inst_t *hinst);
  64. //接收数据, 返回收到数据长度, 超时返回0, 错误返回-1, 发生错误时会自动关闭后端
  65. int mb_recv(mb_inst_t *hinst, u8 *buf, int bufsize);
  66. //发送数据, 返回发送数据长度, 错误返回-1, 发生错误时会自动关闭后端
  67. int mb_send(mb_inst_t *hinst, u8 *buf, int size);
  68. //清空接收缓存, 成功返回0, 失败返回-1
  69. int mb_flush(mb_inst_t *hinst);
  70. #ifdef MB_USING_MASTER
  71. //读请求, 功能码和数据由用户确定, 成功返回应答数据长度, 异常应答返回负值错误码, 其它错误返回0
  72. int mb_read_req(mb_inst_t *hinst, u8 func, u16 addr, int nb, u8 *pdata);
  73. //写请求, 功能码和数据由用户确定, 成功返回请求数量, 异常应答返回负值错误码, 其它错误返回0
  74. int mb_write_req(mb_inst_t *hinst, u8 func, u16 addr, int nb, const u8 *pdata, int dlen);
  75. //读多个线圈, 功能码-0x01, 成功返回读取位数量, 异常应答返回负值错误码, 其它错误返回0
  76. int mb_read_bits(mb_inst_t *hinst, u16 addr, int nb, u8 *pbits);
  77. //读多个离散量输入, 功能码-0x02, 成功返回读取位数量, 异常应答返回负值错误码, 其它错误返回0
  78. int mb_read_input_bits(mb_inst_t *hinst, u16 addr, int nb, u8 *pbits);
  79. //读多个保持寄存器, 功能码-0x03, 成功返回读取寄存器数量, 异常应答返回负值错误码, 其它错误返回0
  80. int mb_read_regs(mb_inst_t *hinst, u16 addr, int nb, u16 *pregs);
  81. //读多个输入寄存器, 功能码-0x04, 成功返回读取寄存器数量, 异常应答返回负值错误码, 其它错误返回0
  82. int mb_read_input_regs(mb_inst_t *hinst, u16 addr, int nb, u16 *pregs);
  83. //写单个线圈, 功能码-0x05, 成功返回1, 异常应答返回负值错误码, 其它错误返回0
  84. int mb_write_bit(mb_inst_t *hinst, u16 addr, u8 bit);
  85. //写单个保持寄存器, 功能码-0x06, 成功返回1, 异常应答返回负值错误码, 其它错误返回0
  86. int mb_write_reg(mb_inst_t *hinst, u16 addr, u16 val);
  87. //写多个线圈, 功能码-0x0F, 成功返回写位数量, 异常应答返回负值错误码, 其它错误返回0
  88. int mb_write_bits(mb_inst_t *hinst, u16 addr, int nb, const u8 *pbits);
  89. //写多个保持寄存器, 功能码-0x10, 成功返回写寄存器数量, 异常应答返回负值错误码, 其它错误返回0
  90. int mb_write_regs(mb_inst_t *hinst, u16 addr, int nb, const u16 *pregs);
  91. //屏蔽写保持寄存器, 功能码-0x16, 成功返回1, 异常应答返回负值错误码, 其它错误返回0
  92. int mb_mask_write_reg(mb_inst_t *hinst, u16 addr, u16 mask_and, u16 mask_or);
  93. //读/写多个保持寄存器, 功能码-0x17, 成功返回读取寄存器数量, 异常应答返回负值错误码, 其它错误返回0
  94. int mb_write_and_read_regs(mb_inst_t *hinst, u16 wr_addr, int wr_nb, const u16 *p_wr_regs,
  95. u16 rd_addr, int rd_nb, u16 *p_rd_regs);
  96. #endif
  97. #ifdef MB_USING_SLAVE
  98. //修改从机回调函数表, 默认使用modbus_port中接口函数做回调函数
  99. void mb_set_cb_table(mb_inst_t *hinst, const mb_cb_table_t *cb);
  100. void mb_set_cb_cascade(mb_inst_t *hinst, const mb_cascade_fun_t *func);
  101. //从机状态机处理, 在线程中循环调用即可
  102. void mb_slave_fsm(mb_inst_t *hinst);
  103. #endif
  104. #endif