You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
110 lines
5.7 KiB
110 lines
5.7 KiB
/*
|
|
* modbus.h
|
|
*
|
|
* Change Logs:
|
|
* Date Author Notes
|
|
* 2024-04-02 qiyongzhong first version
|
|
*/
|
|
|
|
#ifndef __MODBUS_H__
|
|
#define __MODBUS_H__
|
|
|
|
#include "modbus_cvt.h"
|
|
#include "modbus_rtu.h"
|
|
#include "modbus_tcp.h"
|
|
#include "modbus_port.h"
|
|
#include "modbus_backend.h"
|
|
|
|
#ifdef MB_TCP_FRM_MAX
|
|
#define MB_BUF_SIZE MB_TCP_FRM_MAX
|
|
#else
|
|
#define MB_BUF_SIZE MB_RTU_FRM_MAX
|
|
#endif
|
|
|
|
typedef enum{
|
|
MB_PROT_RTU = 0, //MODBUS-RTU通信协议
|
|
MB_PROT_TCP //MODBUS-TCP通信协议
|
|
}mb_prot_t;//通信协议定义
|
|
|
|
typedef int (*mb_read_bit_t)(u16 addr, u8 *pbit);//读bit位, 返回: 0-成功, -2-地址错误
|
|
typedef int (*mb_write_bit_t)(u16 addr, u8 bit);//写bit位, 返回: 0-成功, -2-地址错误, -4-设备故障
|
|
typedef int (*mb_read_reg_t)(u16 addr, u16 *pval);//读16位寄存器, 返回 : 0-成功, -2-地址错误
|
|
typedef int (*mb_write_reg_t)(u16 addr, u16 val);//写16位寄存器, 返回 : 0-成功, -2-地址错误, -3-值非法, -4-设备故障
|
|
typedef int (*mb_mask_write_t)(u16 addr, u16 mask_and, u16 mask_or);//屏蔽写寄存器, 返回 : 0-成功, -2-地址错误, -3-值非法, -4-设备故障
|
|
|
|
typedef struct{
|
|
mb_read_bit_t read_disc; //读离散量输入
|
|
mb_read_bit_t read_coil; //读线圈
|
|
mb_write_bit_t write_coil; //写线圈
|
|
mb_read_reg_t read_input; //读输入寄存器
|
|
mb_read_reg_t read_hold; //读保持寄存器
|
|
mb_write_reg_t write_hold; //写保持寄存器
|
|
}mb_cb_table_t;//从机回调函数表定义
|
|
|
|
typedef struct{
|
|
u8 saddr; //从机地址
|
|
mb_prot_t prot; //通信协议
|
|
u16 tid; //TCP传输标识计数
|
|
mb_backend_t *backend; //后端指针
|
|
mb_cb_table_t *cb; //从机回调函数表
|
|
u8 datas[256]; //读写数据缓冲区
|
|
u8 buf[MB_BUF_SIZE]; //收发缓冲区
|
|
}mb_inst_t;//MODBUS实例定义
|
|
|
|
//创建modbus实例, 成功返回实例指针, 失败返回NULL
|
|
mb_inst_t * mb_create(mb_backend_type_t type, const mb_backend_param_t *param);
|
|
//销毁modbus实例
|
|
void mb_destory(mb_inst_t *hinst);
|
|
//修改从机地址, 默认地址为1
|
|
void mb_set_slave(mb_inst_t *hinst, u8 saddr);
|
|
//修改协议, 默认使用与后端类型一致的协议类型
|
|
void mb_set_prot(mb_inst_t *hinst, mb_prot_t prot);
|
|
//修改超时时间, 默认应答超时300ms, 字节超时32ms
|
|
void mb_set_tmo(mb_inst_t *hinst, int ack_tmo_ms, int byte_tmo_ms);
|
|
//建立连接, 成功返回0, 失败返回-1, 如已建立连接则立即返回
|
|
int mb_connect(mb_inst_t *hinst);
|
|
//断开连接, 成功返回0, 失败返回-1, 如已断开连接则立即返回
|
|
int mb_disconn(mb_inst_t *hinst);
|
|
//接收数据, 返回收到数据长度, 超时返回0, 错误返回-1, 发生错误时会自动关闭后端
|
|
int mb_recv(mb_inst_t *hinst, u8 *buf, int bufsize);
|
|
//发送数据, 返回发送数据长度, 错误返回-1, 发生错误时会自动关闭后端
|
|
int mb_send(mb_inst_t *hinst, u8 *buf, int size);
|
|
//清空接收缓存, 成功返回0, 失败返回-1
|
|
int mb_flush(mb_inst_t *hinst);
|
|
|
|
#ifdef MB_USING_MASTER
|
|
//读请求, 功能码和数据由用户确定, 成功返回应答数据长度, 异常应答返回负值错误码, 其它错误返回0
|
|
int mb_read_req(mb_inst_t *hinst, u8 func, u16 addr, int nb, u8 *pdata);
|
|
//写请求, 功能码和数据由用户确定, 成功返回请求数量, 异常应答返回负值错误码, 其它错误返回0
|
|
int mb_write_req(mb_inst_t *hinst, u8 func, u16 addr, int nb, const u8 *pdata, int dlen);
|
|
//读多个线圈, 功能码-0x01, 成功返回读取位数量, 异常应答返回负值错误码, 其它错误返回0
|
|
int mb_read_bits(mb_inst_t *hinst, u16 addr, int nb, u8 *pbits);
|
|
//读多个离散量输入, 功能码-0x02, 成功返回读取位数量, 异常应答返回负值错误码, 其它错误返回0
|
|
int mb_read_input_bits(mb_inst_t *hinst, u16 addr, int nb, u8 *pbits);
|
|
//读多个保持寄存器, 功能码-0x03, 成功返回读取寄存器数量, 异常应答返回负值错误码, 其它错误返回0
|
|
int mb_read_regs(mb_inst_t *hinst, u16 addr, int nb, u16 *pregs);
|
|
//读多个输入寄存器, 功能码-0x04, 成功返回读取寄存器数量, 异常应答返回负值错误码, 其它错误返回0
|
|
int mb_read_input_regs(mb_inst_t *hinst, u16 addr, int nb, u16 *pregs);
|
|
//写单个线圈, 功能码-0x05, 成功返回1, 异常应答返回负值错误码, 其它错误返回0
|
|
int mb_write_bit(mb_inst_t *hinst, u16 addr, u8 bit);
|
|
//写单个保持寄存器, 功能码-0x06, 成功返回1, 异常应答返回负值错误码, 其它错误返回0
|
|
int mb_write_reg(mb_inst_t *hinst, u16 addr, u16 val);
|
|
//写多个线圈, 功能码-0x0F, 成功返回写位数量, 异常应答返回负值错误码, 其它错误返回0
|
|
int mb_write_bits(mb_inst_t *hinst, u16 addr, int nb, const u8 *pbits);
|
|
//写多个保持寄存器, 功能码-0x10, 成功返回写寄存器数量, 异常应答返回负值错误码, 其它错误返回0
|
|
int mb_write_regs(mb_inst_t *hinst, u16 addr, int nb, const u16 *pregs);
|
|
//屏蔽写保持寄存器, 功能码-0x16, 成功返回1, 异常应答返回负值错误码, 其它错误返回0
|
|
int mb_mask_write_reg(mb_inst_t *hinst, u16 addr, u16 mask_and, u16 mask_or);
|
|
//读/写多个保持寄存器, 功能码-0x17, 成功返回读取寄存器数量, 异常应答返回负值错误码, 其它错误返回0
|
|
int mb_write_and_read_regs(mb_inst_t *hinst, u16 wr_addr, int wr_nb, const u16 *p_wr_regs,
|
|
u16 rd_addr, int rd_nb, u16 *p_rd_regs);
|
|
#endif
|
|
|
|
#ifdef MB_USING_SLAVE
|
|
//修改从机回调函数表, 默认使用modbus_port中接口函数做回调函数
|
|
void mb_set_cb_table(mb_inst_t *hinst, const mb_cb_table_t *cb);
|
|
//从机状态机处理, 在线程中循环调用即可
|
|
void mb_slave_fsm(mb_inst_t *hinst);
|
|
#endif
|
|
|
|
#endif
|
|
|