14#ifndef __PKG_AGILE_MODBUS_H
15#define __PKG_AGILE_MODBUS_H
34#define AGILE_MODBUS_FC_READ_COILS 0x01
35#define AGILE_MODBUS_FC_READ_DISCRETE_INPUTS 0x02
36#define AGILE_MODBUS_FC_READ_HOLDING_REGISTERS 0x03
37#define AGILE_MODBUS_FC_READ_INPUT_REGISTERS 0x04
38#define AGILE_MODBUS_FC_WRITE_SINGLE_COIL 0x05
39#define AGILE_MODBUS_FC_WRITE_SINGLE_REGISTER 0x06
40#define AGILE_MODBUS_FC_READ_EXCEPTION_STATUS 0x07
41#define AGILE_MODBUS_FC_WRITE_MULTIPLE_COILS 0x0F
42#define AGILE_MODBUS_FC_WRITE_MULTIPLE_REGISTERS 0x10
43#define AGILE_MODBUS_FC_REPORT_SLAVE_ID 0x11
44#define AGILE_MODBUS_FC_MASK_WRITE_REGISTER 0x16
45#define AGILE_MODBUS_FC_WRITE_AND_READ_REGISTERS 0x17
53#define AGILE_MODBUS_VERSION_STRING "AMB_1.1.0"
55#define AGILE_MODBUS_BROADCAST_ADDRESS 0
67#define AGILE_MODBUS_MAX_READ_BITS 2000
68#define AGILE_MODBUS_MAX_WRITE_BITS 1968
85#define AGILE_MODBUS_MAX_READ_REGISTERS 125
86#define AGILE_MODBUS_MAX_WRITE_REGISTERS 123
87#define AGILE_MODBUS_MAX_WR_WRITE_REGISTERS 121
88#define AGILE_MODBUS_MAX_WR_READ_REGISTERS 125
102#define AGILE_MODBUS_MAX_PDU_LENGTH 253
116#define AGILE_MODBUS_MAX_ADU_LENGTH 260
191 int nb, uint8_t *req);
197 const uint8_t *rsp,
int rsp_length);
302 int write_addr,
int write_nb,
304 int read_addr,
int read_nb);
void agile_modbus_set_compute_data_length_after_meta_cb(agile_modbus_t *ctx, int(*cb)(agile_modbus_t *ctx, uint8_t *msg, int msg_length, agile_modbus_msg_type_t msg_type))
设置 modbus 对象的计算数据元之后要接收的数据长度回调函数
void agile_modbus_common_init(agile_modbus_t *ctx, uint8_t *send_buf, int send_bufsz, uint8_t *read_buf, int read_bufsz)
初始化 modbus 句柄
int agile_modbus_receive_judge(agile_modbus_t *ctx, int msg_length, agile_modbus_msg_type_t msg_type)
校验接收数据正确性
int agile_modbus_set_slave(agile_modbus_t *ctx, int slave)
设置地址
void agile_modbus_set_compute_meta_length_after_function_cb(agile_modbus_t *ctx, uint8_t(*cb)(agile_modbus_t *ctx, int function, agile_modbus_msg_type_t msg_type))
设置 modbus 对象的计算功能码后要接收的数据元长度回调函数
struct agile_modbus_backend agile_modbus_backend_t
Agile Modbus 后端接口结构体
agile_modbus_backend_type_t
Modbus 后端类型
struct agile_modbus_sft agile_modbus_sft_t
包含 modbus 头部参数结构体
agile_modbus_msg_type_t
Modbus 收到消息类型
@ AGILE_MODBUS_EXCEPTION_GATEWAY_PATH
@ AGILE_MODBUS_EXCEPTION_UNKNOW
@ AGILE_MODBUS_EXCEPTION_ILLEGAL_FUNCTION
@ AGILE_MODBUS_EXCEPTION_GATEWAY_TARGET
@ AGILE_MODBUS_EXCEPTION_ACKNOWLEDGE
@ AGILE_MODBUS_EXCEPTION_SLAVE_OR_SERVER_BUSY
@ AGILE_MODBUS_EXCEPTION_NOT_DEFINED
@ AGILE_MODBUS_EXCEPTION_ILLEGAL_DATA_VALUE
@ AGILE_MODBUS_EXCEPTION_MEMORY_PARITY
@ AGILE_MODBUS_EXCEPTION_SLAVE_OR_SERVER_FAILURE
@ AGILE_MODBUS_EXCEPTION_ILLEGAL_DATA_ADDRESS
@ AGILE_MODBUS_EXCEPTION_NEGATIVE_ACKNOWLEDGE
@ AGILE_MODBUS_BACKEND_TYPE_RTU
RTU
@ AGILE_MODBUS_BACKEND_TYPE_TCP
TCP
@ AGILE_MODBUS_MSG_CONFIRMATION
服务器端的请求消息
@ AGILE_MODBUS_MSG_INDICATION
主机端的请求消息
int agile_modbus_serialize_write_register(agile_modbus_t *ctx, int addr, const uint16_t value)
int agile_modbus_serialize_write_and_read_registers(agile_modbus_t *ctx, int write_addr, int write_nb, const uint16_t *src, int read_addr, int read_nb)
int agile_modbus_deserialize_write_and_read_registers(agile_modbus_t *ctx, int msg_length, uint16_t *dest)
int agile_modbus_deserialize_mask_write_register(agile_modbus_t *ctx, int msg_length)
int agile_modbus_deserialize_write_registers(agile_modbus_t *ctx, int msg_length)
int agile_modbus_deserialize_write_bit(agile_modbus_t *ctx, int msg_length)
int agile_modbus_serialize_read_registers(agile_modbus_t *ctx, int addr, int nb)
int agile_modbus_deserialize_read_input_bits(agile_modbus_t *ctx, int msg_length, uint8_t *dest)
int agile_modbus_serialize_write_bits(agile_modbus_t *ctx, int addr, int nb, const uint8_t *src)
int agile_modbus_serialize_read_bits(agile_modbus_t *ctx, int addr, int nb)
int agile_modbus_serialize_write_registers(agile_modbus_t *ctx, int addr, int nb, const uint16_t *src)
int agile_modbus_deserialize_report_slave_id(agile_modbus_t *ctx, int msg_length, int max_dest, uint8_t *dest)
int agile_modbus_deserialize_read_input_registers(agile_modbus_t *ctx, int msg_length, uint16_t *dest)
int agile_modbus_deserialize_read_bits(agile_modbus_t *ctx, int msg_length, uint8_t *dest)
int agile_modbus_serialize_write_bit(agile_modbus_t *ctx, int addr, int status)
int agile_modbus_deserialize_write_register(agile_modbus_t *ctx, int msg_length)
int agile_modbus_serialize_mask_write_register(agile_modbus_t *ctx, int addr, uint16_t and_mask, uint16_t or_mask)
int agile_modbus_deserialize_write_bits(agile_modbus_t *ctx, int msg_length)
int agile_modbus_serialize_read_input_registers(agile_modbus_t *ctx, int addr, int nb)
int agile_modbus_deserialize_read_registers(agile_modbus_t *ctx, int msg_length, uint16_t *dest)
int agile_modbus_serialize_report_slave_id(agile_modbus_t *ctx)
int agile_modbus_serialize_read_input_bits(agile_modbus_t *ctx, int addr, int nb)
int agile_modbus_deserialize_raw_response(agile_modbus_t *ctx, int msg_length)
解析响应原始数据
int agile_modbus_serialize_raw_request(agile_modbus_t *ctx, const uint8_t *raw_req, int raw_req_length)
将原始数据打包成请求报文
int(* agile_modbus_slave_callback_t)(agile_modbus_t *ctx, struct agile_modbus_slave_info *slave_info)
从机回调函数
int agile_modbus_slave_handle(agile_modbus_t *ctx, int msg_length, uint8_t slave_strict, agile_modbus_slave_callback_t slave_cb, int *frame_length)
从机数据处理
uint8_t agile_modbus_slave_io_get(uint8_t *buf, int index)
读取从机 IO 状态
void agile_modbus_slave_io_set(uint8_t *buf, int index, int status)
从机 IO 设置
uint16_t agile_modbus_slave_register_get(uint8_t *buf, int index)
读取从机寄存器数据
void agile_modbus_slave_register_set(uint8_t *buf, int index, uint16_t data)
从机寄存器设置
int(* check_integrity)(agile_modbus_t *ctx, uint8_t *msg, const int msg_length)
检查接收数据完整性接口
int(* set_slave)(agile_modbus_t *ctx, int slave)
设置地址接口
uint32_t max_adu_length
后端 ADU 长度
int(* pre_check_confirmation)(agile_modbus_t *ctx, const uint8_t *req, const uint8_t *rsp, int rsp_length)
预检查确认接口
int(* build_response_basis)(agile_modbus_sft_t *sft, uint8_t *rsp)
构建基础响应报文接口
uint32_t header_length
头部长度,不包含功能码
uint32_t backend_type
后端类型
int(* send_msg_pre)(uint8_t *req, int req_length)
预发送数据接口
int(* prepare_response_tid)(const uint8_t *req, int *req_length)
准备响应接口
int(* build_request_basis)(agile_modbus_t *ctx, int function, int addr, int nb, uint8_t *req)
构建基础请求报文接口
uint32_t checksum_length
校验数据长度
uint8_t * buf
不同功能码需要使用的数据域
agile_modbus_sft_t * sft
sft 结构体指针
int(* compute_data_length_after_meta)(agile_modbus_t *ctx, uint8_t *msg, int msg_length, agile_modbus_msg_type_t msg_type)
自定义计算数据长度接口
uint8_t(* compute_meta_length_after_function)(agile_modbus_t *ctx, int function, agile_modbus_msg_type_t msg_type)
自定义计算数据元长度接口
const agile_modbus_backend_t * backend
后端接口
void * backend_data
后端数据,指向 RTU 或 TCP 结构体