修复软件包
This commit is contained in:
1 parent
e99dd7a6c3
commit
ccd0acd07b
52 files changed
+229298
-886
No files matched your search
@@ -0,0 +1,111 @@
|
||||
/*
|
||||
* modbus.h
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2024-04-02 qiyongzhong first version
|
||||
*/
|
||||
|
||||
#ifndef __MODBUS_H__
|
||||
|
||||
#define __MODBUS_H__
|
||||
|
||||
#include <packages/qmodbus/inc/modbus_cvt.h>
|
||||
#include <packages/qmodbus/inc/modbus_rtu.h>
|
||||
#include <packages/qmodbus/inc/modbus_tcp.h>
|
||||
#include <packages/qmodbus/inc/modbus_port.h>
|
||||
#include <packages/qmodbus/inc/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
|
||||
@@ -0,0 +1,85 @@
|
||||
/*
|
||||
* modbus_backend.h
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2024-04-01 qiyongzhong first version
|
||||
*/
|
||||
|
||||
#ifndef __MODBUS_BACKEND_H__
|
||||
|
||||
#define __MODBUS_BACKEND_H__
|
||||
|
||||
#include <packages/qmodbus/inc/modbus_cfg.h>
|
||||
#include <packages/qmodbus/inc/typedef.h>
|
||||
|
||||
#define MB_BKD_ACK_TMO_MS_DEF 300
|
||||
#define MB_BKD_BYTE_TMO_MS_DEF 32
|
||||
|
||||
typedef enum{
|
||||
MB_BACKEND_TYPE_RTU = 0,//RTU后端
|
||||
MB_BACKEND_TYPE_TCP, //TCP后端
|
||||
MB_BACKEND_TYPE_SOCK //SOCK后端
|
||||
}mb_backend_type_t;//后端类型定义
|
||||
|
||||
typedef struct{
|
||||
char *dev; //设备名
|
||||
int baudrate; //波特率
|
||||
int parity; //校验位
|
||||
int pin; //收发控制引脚, <0 表示不使用
|
||||
int lvl; //发送控制电平
|
||||
}mb_backend_param_rtu_t;//RTU后端参数定义
|
||||
|
||||
typedef struct{
|
||||
char *host; //ip地址或域名
|
||||
int port; //端口
|
||||
}mb_backend_param_tcp_t;//TCP后端参数定义
|
||||
|
||||
typedef struct{
|
||||
int fd; //socket连接标识符
|
||||
}mb_backend_param_sock_t;//SOCK后端参数定义
|
||||
|
||||
typedef union{
|
||||
mb_backend_param_rtu_t rtu; //RTU后端参数
|
||||
mb_backend_param_tcp_t tcp; //TCP后端参数
|
||||
mb_backend_param_sock_t sock; //SOCK后端参数
|
||||
}mb_backend_param_t;//后端参数联合体定义
|
||||
|
||||
//打开, 成功返回实例指针或文件标识, 错误返回NULL
|
||||
typedef void * (* mb_bkd_ops_open_t)(const mb_backend_param_t *param);
|
||||
//关闭, 成功返回0, 错误返回-1
|
||||
typedef int (* mb_bkd_ops_close_t)(void *hinst);
|
||||
//接收数据, 返回接收到的数据长度, 0表示超时, 错误返回-1
|
||||
typedef int (* mb_bkd_ops_read_t)(void *hinst, u8 *buf, int bufsize);
|
||||
//发送数据, , 返回成功发送的数据长度, 错误返回-1
|
||||
typedef int (* mb_bkd_ops_write_t)(void *hinst, u8 *buf, int size);
|
||||
//清空接收缓存, 成功返回0, 错误返回-1
|
||||
typedef int (* mb_bkd_ops_flush_t)(void *hinst);
|
||||
|
||||
typedef struct{
|
||||
mb_bkd_ops_open_t open;
|
||||
mb_bkd_ops_close_t close;
|
||||
mb_bkd_ops_read_t read;
|
||||
mb_bkd_ops_write_t write;
|
||||
mb_bkd_ops_flush_t flush;
|
||||
}mb_backend_ops_t;
|
||||
|
||||
typedef struct{
|
||||
mb_backend_type_t type;//类型
|
||||
mb_backend_param_t param;//配置参数
|
||||
const mb_backend_ops_t *ops;//操作函数集
|
||||
int ack_tmo_ms;//应答超时
|
||||
int byte_tmo_ms;//字节间隔超时
|
||||
void *hinst;//实例指针或文件标识
|
||||
}mb_backend_t;
|
||||
|
||||
mb_backend_t *mb_backend_create(mb_backend_type_t type, const mb_backend_param_t *param);//创建后端, 成功返回后端指针, 失败返回NULL
|
||||
void mb_backend_destory(mb_backend_t *backend);//销毁后端
|
||||
int mb_backend_open(mb_backend_t *backend);//打开后端, 成功返回0, 错误返回-1
|
||||
int mb_backend_close(mb_backend_t *backend);//关闭后端, 成功返回0, 错误返回-1
|
||||
int mb_backend_config(mb_backend_t *backend, int ack_tmo_ms, int byte_tmo_ms);//配置后端超时参数, 成功返回0, 错误返回-1
|
||||
int mb_backend_read(mb_backend_t *backend, u8 *buf, int bufsize);//从后端读数据, 返回读取到数据长度, 0表示超时, 错误返回-1
|
||||
int mb_backend_write(mb_backend_t *backend, u8 *buf, int size);//向后端写数据, 返回已发送数据长度, 错误返回-1
|
||||
int mb_backend_flush(mb_backend_t *backend);//清空后端接收缓存, 成功返回0, 错误返回-1
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,57 @@
|
||||
/*
|
||||
* modbus_cfg.h
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2024-04-02 qiyongzhong first version
|
||||
*/
|
||||
|
||||
#ifndef __MODBUS_CFG_H__
|
||||
#define __MODBUS_CFG_H__
|
||||
|
||||
#include "rtconfig.h"
|
||||
|
||||
#ifndef MB_RTU_ADDR_DEF
|
||||
#define MB_RTU_ADDR_DEF 1//缺省从机地址
|
||||
#endif
|
||||
|
||||
//#define MB_USING_RAW_PRT //使用原始通信数据打印
|
||||
|
||||
//#define MB_USING_ADDR_CHK //使用从机地址检查
|
||||
//#define MB_USING_MBAP_CHK //使用MBAP头检查
|
||||
|
||||
//#define MB_USING_PORT_RTT //使用rt-thread系统接口
|
||||
//#define MB_USING_PORT_LINUX //使用linux系统接口
|
||||
#if (defined(MB_USING_PORT_RTT) && defined(MB_USING_PORT_LINUX))
|
||||
#error Only one of MB_USING_PORT_RTT and MB_USING_PORT_LINUX can be defined!
|
||||
#endif
|
||||
|
||||
//#define MB_USING_RTU_BACKEND //使用RTU后端
|
||||
//#define MB_USING_TCP_BACKEND //使用TCP后端
|
||||
//#define MB_USING_SOCK_BACKEND //使用SOCK后端, 用于TCP服务器从机模式应用
|
||||
#if (!defined(MB_USING_RTU_BACKEND) && !defined(MB_USING_TCP_BACKEND) && !defined(MB_USING_SOCK_BACKEND))
|
||||
#error MB_USING_RTU_BACKEND, MB_USING_TCP_BACKEND or MB_USING_SOCK_BACKEND must being defined!
|
||||
#endif
|
||||
|
||||
//#define MB_USING_RTU_PROTOCOL //使用RTU协议
|
||||
//#define MB_USING_TCP_PROTOCOL //使用TCP协议
|
||||
#if (!defined(MB_USING_RTU_PROTOCOL) && !defined(MB_USING_TCP_PROTOCOL))
|
||||
#error MB_USING_RTU_PROTOCOL or MB_USING_TCP_PROTOCOL must being defined!
|
||||
#endif
|
||||
|
||||
//#define MB_USING_MASTER //使用主机功能
|
||||
//#define MB_USING_SLAVE //使用从机功能
|
||||
#if (!defined(MB_USING_MASTER) && !defined(MB_USING_SLAVE))
|
||||
#error MB_USING_MASTER or MB_USING_SLAVE must being defined!
|
||||
#endif
|
||||
|
||||
//#define MB_USING_SAMPLE //使用示例
|
||||
#ifdef MB_USING_SAMPLE
|
||||
//#define MB_USING_SAMPLE_RTU_MASTER //使用基于RTU后端的主机示例
|
||||
//#define MB_USING_SAMPLE_RTU_SLAVE //使用基于RTU后端的从机示例
|
||||
//#define MB_USING_SAMPLE_TCP_MASTER //使用基于TCP后端的主机示例
|
||||
//#define MB_USING_SAMPLE_TCP_SLAVE //使用基于TCP后端的从机示例
|
||||
//#define MB_USING_SAMPLE_TCP_SRV_SLAVE //使用基于TCP服务器的从机示例
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,20 @@
|
||||
/*
|
||||
* modbus_crc.h
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2024-04-02 qiyongzhong first version
|
||||
*/
|
||||
|
||||
#ifndef __MODBUS_CRC_H__
|
||||
|
||||
#define __MODBUS_CRC_H__
|
||||
|
||||
#include <packages/qmodbus/inc/typedef.h>
|
||||
|
||||
#define MB_CRC_INIT_VOL 0xFFFF
|
||||
|
||||
u16 mb_crc_cyc_cal(u16 init, const u8 *pdata, int len);
|
||||
u16 mb_crc_cal(const u8 *pdata, int len) ;
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,26 @@
|
||||
/*
|
||||
* modbus_cvt.h
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2024-04-01 qiyongzhong first version
|
||||
*/
|
||||
|
||||
#ifndef __MODBUS_CVT_H__
|
||||
|
||||
#define __MODBUS_CVT_H__
|
||||
|
||||
#include <packages/qmodbus/inc/typedef.h>
|
||||
|
||||
int mb_cvt_u8_put(u8 *buf, u8 val);
|
||||
int mb_cvt_u8_get(const u8 *buf, u8 *pval);
|
||||
int mb_cvt_u16_put(u8 *buf, u16 val);
|
||||
int mb_cvt_u16_get(const u8 *buf, u16 *pval);
|
||||
int mb_cvt_u32_put(u8 *buf, u32 val);
|
||||
int mb_cvt_u32_get(const u8 *buf, u32 *pval);
|
||||
int mb_cvt_f32_put(u8 *buf, f32 val);
|
||||
int mb_cvt_f32_get(const u8 *buf, f32 *pval);
|
||||
u8 mb_bitmap_get(const u8 *pbits, int idx);//从位表中读指定索引的位
|
||||
void mb_bitmap_set(u8 *pbits, int idx, u8 bit);//向位表中写指定索引的位
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,132 @@
|
||||
/*
|
||||
* modbus_pdu.h
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2024-04-01 qiyongzhong first version
|
||||
*/
|
||||
|
||||
#ifndef __MODBUS_PDU_H__
|
||||
|
||||
#define __MODBUS_PDU_H__
|
||||
|
||||
#include <packages/qmodbus/inc/typedef.h>
|
||||
|
||||
#define MB_PDU_SIZE_MIN 2 //最小pdu尺寸
|
||||
#define MB_PDU_SIZE_MAX 253 //最大pdu尺寸
|
||||
|
||||
#define MODBUS_READ_BITS_MAX 2000 //最大可读位总数
|
||||
#define MODBUS_WRITE_BITS_MAX 1968 //最大可写位总数
|
||||
|
||||
#define MODBUS_READ_REG_MAX 125 //最大可读寄存器总数
|
||||
#define MODBUS_WRITE_REG_MAX 123 //最大可写寄存器总数
|
||||
#define MODBUS_WR_READ_REG_MAX 125 //写然后读时最大可读寄存器总数
|
||||
#define MODBUS_WR_WRITE_REG_MAX 121 //写然后读时最大可写寄存器总数
|
||||
|
||||
#define MODBUS_FC_READ_COILS 0x01 //读线圈
|
||||
#define MODBUS_FC_READ_DISCRETE_INPUTS 0x02 //读离散输入
|
||||
#define MODBUS_FC_READ_HOLDING_REGISTERS 0x03 //读保持寄存器
|
||||
#define MODBUS_FC_READ_INPUT_REGISTERS 0x04 //读输入寄存器
|
||||
#define MODBUS_FC_WRITE_SINGLE_COIL 0x05 //写单个线圈
|
||||
#define MODBUS_FC_WRITE_SINGLE_REGISTER 0x06 //写单个寄存器
|
||||
#define MODBUS_FC_READ_EXCEPTION_STATUS 0x07 //读异常状态
|
||||
#define MODBUS_FC_WRITE_MULTIPLE_COILS 0x0F //写多个线圈
|
||||
#define MODBUS_FC_WRITE_MULTIPLE_REGISTERS 0x10 //写多个寄存器
|
||||
#define MODBUS_FC_REPORT_SLAVE_ID 0x11 //上报从机标识
|
||||
#define MODBUS_FC_MASK_WRITE_REGISTER 0x16 //屏蔽写寄存器
|
||||
#define MODBUS_FC_WRITE_AND_READ_REGISTERS 0x17 //写然后读寄存器
|
||||
|
||||
#define MODBUS_FC_EXCEPT_MAKE(x) (x | 0x80)
|
||||
#define MODBUS_FC_EXCEPT_PARSE(x) (x & ~0x80)
|
||||
#define MODBUS_FC_EXCEPT_CHK(x) ((x & 0x80) != 0)
|
||||
|
||||
typedef enum {
|
||||
MODBUS_EC_ILLEGAL_FUNCTION = 0x01,
|
||||
MODBUS_EC_ILLEGAL_DATA_ADDRESS,
|
||||
MODBUS_EC_ILLEGAL_DATA_VALUE,
|
||||
MODBUS_EC_SLAVE_OR_SERVER_FAILURE,
|
||||
MODBUS_EC_ACKNOWLEDGE,
|
||||
MODBUS_EC_SLAVE_OR_SERVER_BUSY,
|
||||
MODBUS_EC_NEGATIVE_ACKNOWLEDGE,
|
||||
MODBUS_EC_MEMORY_PARITY,
|
||||
MODBUS_EC_NOT_DEFINED,
|
||||
MODBUS_EC_GATEWAY_PATH,
|
||||
MODBUS_EC_GATEWAY_TARGET,
|
||||
MODBUS_EC_MAX
|
||||
}modbus_except_code_t;
|
||||
|
||||
typedef enum{
|
||||
MB_PDU_TYPE_REQ = 0,//请求
|
||||
MB_PDU_TYPE_RSP //响应
|
||||
}mb_pdu_type_t;//PDU类型定义
|
||||
|
||||
typedef struct{
|
||||
u8 fc; //功能码
|
||||
u8 ec; //异常码
|
||||
}mb_pdu_except_t;//异常pdu定义
|
||||
|
||||
typedef struct{
|
||||
u8 fc; //功能码
|
||||
u16 addr; //寄存器地址
|
||||
u16 nb; //数量
|
||||
}mb_pdu_rd_req_t;//读请求pdu定义
|
||||
|
||||
typedef struct{
|
||||
u8 fc; //功能码
|
||||
u8 dlen; //数据长度
|
||||
u8 *pdata; //数据指针
|
||||
}mb_pdu_rd_rsp_t;//读响应pdu定义
|
||||
|
||||
typedef struct{
|
||||
u8 fc; //功能码
|
||||
u16 addr; //寄存器地址
|
||||
u16 val; //数据值
|
||||
}mb_pdu_wr_single_t;//写单个寄存器请求/响应pdu定义
|
||||
|
||||
typedef struct{
|
||||
u8 fc; //功能码
|
||||
u16 addr; //寄存器地址
|
||||
u16 nb; //数量
|
||||
u8 dlen; //数据长度
|
||||
u8 *pdata; //数据指针
|
||||
}mb_pdu_wr_req_t;//写多个寄存器请求pdu定义
|
||||
|
||||
typedef struct{
|
||||
u8 fc; //功能码
|
||||
u16 addr; //寄存器地址
|
||||
u16 nb; //输出数量
|
||||
}mb_pdu_wr_rsp_t;//写多个寄存器响应pdu定义
|
||||
|
||||
typedef struct{
|
||||
u8 fc; //功能码
|
||||
u16 addr; //寄存器地址
|
||||
u16 val_and; //与值
|
||||
u16 val_or; //或值
|
||||
}mb_pdu_mask_wr_t;//写多个寄存器请求/响应pdu定义
|
||||
|
||||
typedef struct{
|
||||
u8 fc; //功能码
|
||||
u16 rd_addr; //读取寄存器地址
|
||||
u16 rd_nb; //读取数量
|
||||
u16 wr_addr; //写寄存器地址
|
||||
u16 wr_nb; //写入数量
|
||||
u8 dlen; //数据长度
|
||||
u8 *pdata; //数据指针
|
||||
}mb_pdu_wr_rd_req_t;//写然后读请求pdu定义
|
||||
|
||||
typedef union{
|
||||
u8 fc; //功能码
|
||||
mb_pdu_except_t exc; //异常
|
||||
mb_pdu_rd_req_t rd_req; //读请求
|
||||
mb_pdu_rd_rsp_t rd_rsp; //读响应
|
||||
mb_pdu_wr_single_t wr_single; //写单个寄存器请求/响应
|
||||
mb_pdu_wr_req_t wr_req; //写多个寄存器请求
|
||||
mb_pdu_wr_rsp_t wr_rsp; //写多个寄存器响应
|
||||
mb_pdu_mask_wr_t mask_wr; //写多个寄存器请求/响应
|
||||
mb_pdu_wr_rd_req_t wr_rd_req; //写然后读请求
|
||||
}mb_pdu_t;//PDU数据联合体定义
|
||||
|
||||
int mb_pdu_make(u8 *buf, const mb_pdu_t *pdu, mb_pdu_type_t type);//生成pdu帧, 返回帧长度, 失败返回0
|
||||
int mb_pdu_parse(const u8 *buf, int len, mb_pdu_t *pdu, mb_pdu_type_t type);//解析pdu帧, 成功返回帧长度, 帧错误返回0, 功能码不支持返回-1
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,56 @@
|
||||
/*
|
||||
* modbus_port.h
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2024-04-02 qiyongzhong first version
|
||||
*/
|
||||
|
||||
#ifndef __MODBUS_PORT_H__
|
||||
|
||||
#define __MODBUS_PORT_H__
|
||||
|
||||
#include <packages/qmodbus/inc/modbus_backend.h>
|
||||
|
||||
#define MB_ASSERT(x) //ASSERT(x)
|
||||
#define MB_WEAK __attribute__((weak))
|
||||
|
||||
#if defined(MB_USING_PORT_RTT)
|
||||
#include "rtthread.h"
|
||||
#define MB_PRINTF rt_kprintf
|
||||
#elif defined(MB_USING_PORT_LINUX)
|
||||
#include <stdio.h>
|
||||
#define MB_PRINTF printf
|
||||
#else
|
||||
#define MB_PRINTF
|
||||
#endif
|
||||
|
||||
long long mb_port_get_ms(void);//获取毫秒时间
|
||||
void mb_port_delay_ms(int tmo_ms);//系统延时
|
||||
|
||||
#ifdef MB_USING_RTU_BACKEND
|
||||
void * mb_port_rtu_open(const mb_backend_param_t *param);//打开, 成功返回实例指针或文件标识, 错误返回NULL
|
||||
int mb_port_rtu_close(void *hinst);//关闭, 成功返回0, 错误返回-1
|
||||
int mb_port_rtu_read(void *hinst, u8 *buf, int bufsize);//接收数据, 返回接收到的数据长度, 0表示超时, 错误返回-1
|
||||
int mb_port_rtu_write(void *hinst, u8 *buf, int size);//发送数据, , 返回成功发送的数据长度, 错误返回-1
|
||||
int mb_port_rtu_flush(void *hinst);//清空接收缓存, 成功返回0, 错误返回-1
|
||||
#endif
|
||||
|
||||
#if (defined(MB_USING_TCP_BACKEND) || defined(MB_USING_SOCK_BACKEND))
|
||||
void * mb_port_tcp_open(const mb_backend_param_t *param);//打开, 成功返回实例指针或文件标识, 错误返回NULL
|
||||
int mb_port_tcp_close(void *hinst);//关闭, 成功返回0, 错误返回-1
|
||||
int mb_port_tcp_read(void *hinst, u8 *buf, int bufsize);//接收数据, 返回接收到的数据长度, 0表示超时, 错误返回-1
|
||||
int mb_port_tcp_write(void *hinst, u8 *buf, int size);//发送数据, , 返回成功发送的数据长度, 错误返回-1
|
||||
int mb_port_tcp_flush(void *hinst);//清空接收缓存, 成功返回0, 错误返回-1
|
||||
#endif
|
||||
|
||||
#ifdef MB_USING_SLAVE
|
||||
int mb_port_read_disc(u16 addr, u8 *pbit);//读离散量输入, 返回 : 0-成功, -2-地址错误
|
||||
int mb_port_read_coil(u16 addr, u8 *pbit);//读线圈, 返回 : 0-成功, -2-地址错误
|
||||
int mb_port_write_coil(u16 addr, u8 bit);//写线圈, 返回 : 0-成功, -2-地址错误, -4-设备故障
|
||||
int mb_port_read_input(u16 addr, u16 *preg);//读输入寄存器, 返回 : 0-成功, -2-地址错误
|
||||
int mb_port_read_hold(u16 addr, u16 *preg);//读保持寄存器, 返回 : 0-成功, -2-地址错误
|
||||
int mb_port_write_hold(u16 addr, u16 reg);//写保持寄存器, 返回 : 0-成功, -2-地址错误, -3-值非法, -4-设备故障
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,37 @@
|
||||
/*
|
||||
* modbus_rtu.h
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2024-04-01 qiyongzhong first version
|
||||
*/
|
||||
|
||||
#ifndef __MODBUS_RTU_H__
|
||||
|
||||
#define __MODBUS_RTU_H__
|
||||
|
||||
#include <packages/qmodbus/inc/modbus_cfg.h>
|
||||
#include <packages/qmodbus/inc/modbus_pdu.h>
|
||||
|
||||
#ifdef MB_USING_RTU_PROTOCOL
|
||||
|
||||
#define MB_RTU_SADDR_SIZE 1 //RTU从机地址尺寸
|
||||
#define MB_RTU_CRC_SIZE 2
|
||||
#define MB_RTU_FRM_MIN (MB_RTU_SADDR_SIZE + MB_RTU_CRC_SIZE + MB_PDU_SIZE_MIN)
|
||||
#define MB_RTU_FRM_MAX (MB_RTU_SADDR_SIZE + MB_RTU_CRC_SIZE + MB_PDU_SIZE_MAX)
|
||||
|
||||
#define MB_RTU_ADDR_BROADCAST 0 //广播地址
|
||||
#define MB_RTU_ADDR_MIN 1 //最小地址
|
||||
#define MB_RTU_ADDR_MAX 247 //最大地址
|
||||
#define MB_RTU_ADDR_DEF 1 //默认地址
|
||||
|
||||
typedef struct{
|
||||
u8 saddr; //从机地址
|
||||
mb_pdu_t pdu; //pdu
|
||||
}mb_rtu_frm_t;//RTU帧定义
|
||||
|
||||
int mb_rtu_frm_make(u8 *buf, const mb_rtu_frm_t *frm, mb_pdu_type_t type);//生成rtu帧, 返回帧长度
|
||||
int mb_rtu_frm_parse(const u8 *buf, int len, mb_rtu_frm_t *frm, mb_pdu_type_t type);//解析rtu帧, 返回pdu数据长度, 帧错误返回0, 功能码不支持返回-1
|
||||
|
||||
#endif
|
||||
#endif
|
||||
@@ -0,0 +1,40 @@
|
||||
/*
|
||||
* modbus_tcp.h
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2024-04-01 qiyongzhong first version
|
||||
*/
|
||||
|
||||
#ifndef __MODBUS_TCP_H__
|
||||
|
||||
#define __MODBUS_TCP_H__
|
||||
|
||||
#include <packages/qmodbus/inc/modbus_cfg.h>
|
||||
#include <packages/qmodbus/inc/modbus_pdu.h>
|
||||
|
||||
#ifdef MB_USING_TCP_PROTOCOL
|
||||
|
||||
#define MB_TCP_MBAP_SIZE 7 //MBAP头尺寸
|
||||
#define MB_TCP_FRM_MIN (MB_TCP_MBAP_SIZE + MB_PDU_SIZE_MIN)
|
||||
#define MB_TCP_FRM_MAX (MB_TCP_MBAP_SIZE + MB_PDU_SIZE_MAX)
|
||||
|
||||
#define MB_TCP_MBAP_PID 0x0000//使用的协议类型代码
|
||||
|
||||
typedef struct{
|
||||
u16 tid; //传输标识符, 响应须与请求一致
|
||||
u16 pid; //协议类型, 响应须与请求一致
|
||||
u16 dlen; //等于pdu数据长度加1, 打包时会自动计算处理不需人工赋值
|
||||
u8 did; //逻辑设备ID, 响应须与请求一致
|
||||
}mb_tcp_mbap_t;//TCP协议MBAP头定义
|
||||
|
||||
typedef struct{
|
||||
mb_tcp_mbap_t mbap;//MBAP头
|
||||
mb_pdu_t pdu;//PDU数据
|
||||
}mb_tcp_frm_t;//TCP帧定义
|
||||
|
||||
int mb_tcp_frm_make(u8 *buf, const mb_tcp_frm_t *frm, mb_pdu_type_t type);//生成tcp帧, 返回帧长度
|
||||
int mb_tcp_frm_parse(const u8 *buf, int len, mb_tcp_frm_t *frm, mb_pdu_type_t type);//解析tcp帧, 返回pdu数据长度, 解析失败返回0, 功能码不支持返回-1
|
||||
|
||||
#endif
|
||||
#endif
|
||||
@@ -0,0 +1,35 @@
|
||||
/*
|
||||
* typedef.h
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2020-06-02 qiyongzhong first version
|
||||
*/
|
||||
//---------------------------------------
|
||||
#ifndef __TYPEDEF_H__
|
||||
#define __TYPEDEF_H__
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
typedef signed char s8;
|
||||
typedef signed short s16;
|
||||
typedef signed long s32;
|
||||
typedef signed long long s64;
|
||||
|
||||
typedef unsigned char u8;
|
||||
typedef unsigned short u16;
|
||||
typedef unsigned long u32;
|
||||
typedef unsigned long long u64;
|
||||
|
||||
typedef float f32;
|
||||
typedef double f64;
|
||||
|
||||
|
||||
typedef void (*PHOOK_t)(void);
|
||||
|
||||
#ifndef NULL
|
||||
#define NULL (void *)0
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
Reference in new issue
Block a user