Agile Modbus  1.1.4
Lightweight modbus protocol stack.
agile_modbus.h
Go to the documentation of this file.
1 
14 #ifndef __PKG_AGILE_MODBUS_H
15 #define __PKG_AGILE_MODBUS_H
16 
17 #ifdef __cplusplus
18 extern "C" {
19 #endif
20 
21 #include <stdint.h>
22 
30 #ifndef AGILE_MODBUS_USING_RTU
31 #define AGILE_MODBUS_USING_RTU 1
32 #endif /* AGILE_MODBUS_USING_RTU */
33 
34 #ifndef AGILE_MODBUS_USING_TCP
35 #define AGILE_MODBUS_USING_TCP 1
36 #endif /* AGILE_MODBUS_USING_TCP */
48 #define AGILE_MODBUS_FC_READ_COILS 0x01
49 #define AGILE_MODBUS_FC_READ_DISCRETE_INPUTS 0x02
50 #define AGILE_MODBUS_FC_READ_HOLDING_REGISTERS 0x03
51 #define AGILE_MODBUS_FC_READ_INPUT_REGISTERS 0x04
52 #define AGILE_MODBUS_FC_WRITE_SINGLE_COIL 0x05
53 #define AGILE_MODBUS_FC_WRITE_SINGLE_REGISTER 0x06
54 #define AGILE_MODBUS_FC_READ_EXCEPTION_STATUS 0x07
55 #define AGILE_MODBUS_FC_WRITE_MULTIPLE_COILS 0x0F
56 #define AGILE_MODBUS_FC_WRITE_MULTIPLE_REGISTERS 0x10
57 #define AGILE_MODBUS_FC_REPORT_SLAVE_ID 0x11
58 #define AGILE_MODBUS_FC_MASK_WRITE_REGISTER 0x16
59 #define AGILE_MODBUS_FC_WRITE_AND_READ_REGISTERS 0x17
67 #define AGILE_MODBUS_VERSION_STRING "AMB_1.1.4"
69 #define AGILE_MODBUS_BROADCAST_ADDRESS 0
81 #define AGILE_MODBUS_MAX_READ_BITS 2000
82 #define AGILE_MODBUS_MAX_WRITE_BITS 1968
99 #define AGILE_MODBUS_MAX_READ_REGISTERS 125
100 #define AGILE_MODBUS_MAX_WRITE_REGISTERS 123
101 #define AGILE_MODBUS_MAX_WR_WRITE_REGISTERS 121
102 #define AGILE_MODBUS_MAX_WR_READ_REGISTERS 125
116 #define AGILE_MODBUS_MAX_PDU_LENGTH 253
117 
130 #define AGILE_MODBUS_MAX_ADU_LENGTH 260
146 enum {
159 };
160 
164 typedef enum {
168 
179 typedef enum {
183 
187 typedef struct agile_modbus_sft {
188  int slave;
189  int function;
190  int t_id;
192 
193 typedef struct agile_modbus agile_modbus_t;
198 typedef struct agile_modbus_backend {
199  uint32_t backend_type;
200  uint32_t header_length;
201  uint32_t checksum_length;
202  uint32_t max_adu_length;
203  int (*set_slave)(agile_modbus_t *ctx, int slave);
204  int (*build_request_basis)(agile_modbus_t *ctx, int function, int addr,
205  int nb, uint8_t *req);
206  int (*build_response_basis)(agile_modbus_sft_t *sft, uint8_t *rsp);
207  int (*prepare_response_tid)(const uint8_t *req, int *req_length);
208  int (*send_msg_pre)(uint8_t *req, int req_length);
209  int (*check_integrity)(agile_modbus_t *ctx, uint8_t *msg, const int msg_length);
210  int (*pre_check_confirmation)(agile_modbus_t *ctx, const uint8_t *req,
211  const uint8_t *rsp, int rsp_length);
213 
217 struct agile_modbus {
218  int slave;
219  uint8_t *send_buf;
221  uint8_t *read_buf;
223  uint8_t (*compute_meta_length_after_function)(agile_modbus_t *ctx, int function,
224  agile_modbus_msg_type_t msg_type);
226  int msg_length, agile_modbus_msg_type_t msg_type);
228  void *backend_data;
229 };
230 
248  int *rsp_length;
249  int address;
250  int nb;
251  uint8_t *buf;
253 };
254 
265 typedef int (*agile_modbus_slave_callback_t)(agile_modbus_t *ctx, struct agile_modbus_slave_info *slave_info, const void *data);
266 
278 void agile_modbus_common_init(agile_modbus_t *ctx, uint8_t *send_buf, int send_bufsz, uint8_t *read_buf, int read_bufsz);
279 int agile_modbus_set_slave(agile_modbus_t *ctx, int slave);
281  uint8_t (*cb)(agile_modbus_t *ctx, int function,
282  agile_modbus_msg_type_t msg_type));
284  int (*cb)(agile_modbus_t *ctx, uint8_t *msg,
285  int msg_length, agile_modbus_msg_type_t msg_type));
286 int agile_modbus_receive_judge(agile_modbus_t *ctx, int msg_length, agile_modbus_msg_type_t msg_type);
298 int agile_modbus_serialize_read_bits(agile_modbus_t *ctx, int addr, int nb);
299 int agile_modbus_deserialize_read_bits(agile_modbus_t *ctx, int msg_length, uint8_t *dest);
301 int agile_modbus_deserialize_read_input_bits(agile_modbus_t *ctx, int msg_length, uint8_t *dest);
303 int agile_modbus_deserialize_read_registers(agile_modbus_t *ctx, int msg_length, uint16_t *dest);
305 int agile_modbus_deserialize_read_input_registers(agile_modbus_t *ctx, int msg_length, uint16_t *dest);
306 int agile_modbus_serialize_write_bit(agile_modbus_t *ctx, int addr, int status);
307 int agile_modbus_deserialize_write_bit(agile_modbus_t *ctx, int msg_length);
308 int agile_modbus_serialize_write_register(agile_modbus_t *ctx, int addr, const uint16_t value);
310 int agile_modbus_serialize_write_bits(agile_modbus_t *ctx, int addr, int nb, const uint8_t *src);
311 int agile_modbus_deserialize_write_bits(agile_modbus_t *ctx, int msg_length);
312 int agile_modbus_serialize_write_registers(agile_modbus_t *ctx, int addr, int nb, const uint16_t *src);
314 int agile_modbus_serialize_mask_write_register(agile_modbus_t *ctx, int addr, uint16_t and_mask, uint16_t or_mask);
317  int write_addr, int write_nb,
318  const uint16_t *src,
319  int read_addr, int read_nb);
320 int agile_modbus_deserialize_write_and_read_registers(agile_modbus_t *ctx, int msg_length, uint16_t *dest);
322 int agile_modbus_deserialize_report_slave_id(agile_modbus_t *ctx, int msg_length, int max_dest, uint8_t *dest);
331 int agile_modbus_serialize_raw_request(agile_modbus_t *ctx, const uint8_t *raw_req, int raw_req_length);
332 int agile_modbus_deserialize_raw_response(agile_modbus_t *ctx, int msg_length);
348 int agile_modbus_slave_handle(agile_modbus_t *ctx, int msg_length, uint8_t slave_strict,
349  agile_modbus_slave_callback_t slave_cb, const void *slave_data, int *frame_length);
350 void agile_modbus_slave_io_set(uint8_t *buf, int index, int status);
351 uint8_t agile_modbus_slave_io_get(uint8_t *buf, int index);
352 void agile_modbus_slave_register_set(uint8_t *buf, int index, uint16_t data);
353 uint16_t agile_modbus_slave_register_get(uint8_t *buf, int index);
366 /* Include RTU and TCP module */
367 #if AGILE_MODBUS_USING_RTU
368 #include "agile_modbus_rtu.h"
369 #endif /* AGILE_MODBUS_USING_RTU */
370 
371 #if AGILE_MODBUS_USING_TCP
372 #include "agile_modbus_tcp.h"
373 #endif /* AGILE_MODBUS_USING_TCP */
374 
375 #ifdef __cplusplus
376 }
377 #endif
378 
379 #endif /* __PKG_AGILE_MODBUS_H */
Agile Modbus package RTU header file.
Agile Modbus package TCP header file.
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))
sets the data length callback function to be received after calculating the data element of the modbu...
Definition: agile_modbus.c:297
void agile_modbus_common_init(agile_modbus_t *ctx, uint8_t *send_buf, int send_bufsz, uint8_t *read_buf, int read_bufsz)
initialize modbus handle
Definition: agile_modbus.c:257
int agile_modbus_receive_judge(agile_modbus_t *ctx, int msg_length, agile_modbus_msg_type_t msg_type)
Verify the correctness of received data.
Definition: agile_modbus.c:312
int agile_modbus_set_slave(agile_modbus_t *ctx, int slave)
set address
Definition: agile_modbus.c:273
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))
sets the data element length callback function to be received after calculating the function code of ...
Definition: agile_modbus.c:284
struct agile_modbus_backend agile_modbus_backend_t
Agile Modbus backend interface structure.
agile_modbus_backend_type_t
@ brief Modbus backend type
Definition: agile_modbus.h:164
struct agile_modbus_sft agile_modbus_sft_t
contains the modbus header parameter structure
agile_modbus_msg_type_t
Modbus received message type.
Definition: agile_modbus.h:179
@ AGILE_MODBUS_EXCEPTION_GATEWAY_PATH
Definition: agile_modbus.h:156
@ AGILE_MODBUS_EXCEPTION_UNKNOW
Definition: agile_modbus.h:158
@ AGILE_MODBUS_EXCEPTION_ILLEGAL_FUNCTION
Definition: agile_modbus.h:147
@ AGILE_MODBUS_EXCEPTION_GATEWAY_TARGET
Definition: agile_modbus.h:157
@ AGILE_MODBUS_EXCEPTION_ACKNOWLEDGE
Definition: agile_modbus.h:151
@ AGILE_MODBUS_EXCEPTION_SLAVE_OR_SERVER_BUSY
Definition: agile_modbus.h:152
@ AGILE_MODBUS_EXCEPTION_NOT_DEFINED
Definition: agile_modbus.h:155
@ AGILE_MODBUS_EXCEPTION_ILLEGAL_DATA_VALUE
Definition: agile_modbus.h:149
@ AGILE_MODBUS_EXCEPTION_MEMORY_PARITY
Definition: agile_modbus.h:154
@ AGILE_MODBUS_EXCEPTION_SLAVE_OR_SERVER_FAILURE
Definition: agile_modbus.h:150
@ AGILE_MODBUS_EXCEPTION_ILLEGAL_DATA_ADDRESS
Definition: agile_modbus.h:148
@ AGILE_MODBUS_EXCEPTION_NEGATIVE_ACKNOWLEDGE
Definition: agile_modbus.h:153
@ AGILE_MODBUS_BACKEND_TYPE_RTU
RTU.
Definition: agile_modbus.h:165
@ AGILE_MODBUS_BACKEND_TYPE_TCP
TCP.
Definition: agile_modbus.h:166
@ AGILE_MODBUS_MSG_CONFIRMATION
Server-side request message.
Definition: agile_modbus.h:181
@ AGILE_MODBUS_MSG_INDICATION
Host-side request message.
Definition: agile_modbus.h:180
int agile_modbus_serialize_write_register(agile_modbus_t *ctx, int addr, const uint16_t value)
Definition: agile_modbus.c:673
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)
Definition: agile_modbus.c:852
int agile_modbus_deserialize_write_and_read_registers(agile_modbus_t *ctx, int msg_length, uint16_t *dest)
Definition: agile_modbus.c:893
int agile_modbus_deserialize_mask_write_register(agile_modbus_t *ctx, int msg_length)
Definition: agile_modbus.c:835
int agile_modbus_deserialize_write_registers(agile_modbus_t *ctx, int msg_length)
Definition: agile_modbus.c:796
int agile_modbus_deserialize_write_bit(agile_modbus_t *ctx, int msg_length)
Definition: agile_modbus.c:656
int agile_modbus_serialize_read_registers(agile_modbus_t *ctx, int addr, int nb)
Definition: agile_modbus.c:555
int agile_modbus_deserialize_read_input_bits(agile_modbus_t *ctx, int msg_length, uint8_t *dest)
Definition: agile_modbus.c:516
int agile_modbus_serialize_write_bits(agile_modbus_t *ctx, int addr, int nb, const uint8_t *src)
Definition: agile_modbus.c:703
int agile_modbus_serialize_read_bits(agile_modbus_t *ctx, int addr, int nb)
Definition: agile_modbus.c:445
int agile_modbus_serialize_write_registers(agile_modbus_t *ctx, int addr, int nb, const uint16_t *src)
Definition: agile_modbus.c:765
int agile_modbus_deserialize_report_slave_id(agile_modbus_t *ctx, int msg_length, int max_dest, uint8_t *dest)
Definition: agile_modbus.c:936
int agile_modbus_deserialize_read_input_registers(agile_modbus_t *ctx, int msg_length, uint16_t *dest)
Definition: agile_modbus.c:615
int agile_modbus_deserialize_read_bits(agile_modbus_t *ctx, int msg_length, uint8_t *dest)
Definition: agile_modbus.c:461
int agile_modbus_serialize_write_bit(agile_modbus_t *ctx, int addr, int status)
Definition: agile_modbus.c:643
int agile_modbus_deserialize_write_register(agile_modbus_t *ctx, int msg_length)
Definition: agile_modbus.c:686
int agile_modbus_serialize_mask_write_register(agile_modbus_t *ctx, int addr, uint16_t and_mask, uint16_t or_mask)
Definition: agile_modbus.c:813
int agile_modbus_deserialize_write_bits(agile_modbus_t *ctx, int msg_length)
Definition: agile_modbus.c:748
int agile_modbus_serialize_read_input_registers(agile_modbus_t *ctx, int addr, int nb)
Definition: agile_modbus.c:599
int agile_modbus_deserialize_read_registers(agile_modbus_t *ctx, int msg_length, uint16_t *dest)
Definition: agile_modbus.c:571
int agile_modbus_serialize_report_slave_id(agile_modbus_t *ctx)
Definition: agile_modbus.c:921
int agile_modbus_serialize_read_input_bits(agile_modbus_t *ctx, int addr, int nb)
Definition: agile_modbus.c:500
int agile_modbus_compute_response_length_from_request(agile_modbus_t *ctx, uint8_t *req)
Calculate the expected response data length.
Definition: agile_modbus.c:984
int agile_modbus_deserialize_raw_response(agile_modbus_t *ctx, int msg_length)
parses the original response data
int agile_modbus_serialize_raw_request(agile_modbus_t *ctx, const uint8_t *raw_req, int raw_req_length)
Pack the original data into a request message.
int(* agile_modbus_slave_callback_t)(agile_modbus_t *ctx, struct agile_modbus_slave_info *slave_info, const void *data)
Slave callback function.
Definition: agile_modbus.h:265
int agile_modbus_slave_handle(agile_modbus_t *ctx, int msg_length, uint8_t slave_strict, agile_modbus_slave_callback_t slave_cb, const void *slave_data, int *frame_length)
slave data processing
uint8_t agile_modbus_slave_io_get(uint8_t *buf, int index)
Read slave IO status.
void agile_modbus_slave_io_set(uint8_t *buf, int index, int status)
slave IO settings
uint16_t agile_modbus_slave_register_get(uint8_t *buf, int index)
Read slave register data.
void agile_modbus_slave_register_set(uint8_t *buf, int index, uint16_t data)
slave register settings
Agile Modbus backend interface structure.
Definition: agile_modbus.h:198
int(* check_integrity)(agile_modbus_t *ctx, uint8_t *msg, const int msg_length)
Check the receive data integrity interface.
Definition: agile_modbus.h:209
int(* set_slave)(agile_modbus_t *ctx, int slave)
Set address interface.
Definition: agile_modbus.h:203
uint32_t max_adu_length
Backend ADU length.
Definition: agile_modbus.h:202
int(* pre_check_confirmation)(agile_modbus_t *ctx, const uint8_t *req, const uint8_t *rsp, int rsp_length)
Pre-check confirmation interface.
Definition: agile_modbus.h:210
int(* build_response_basis)(agile_modbus_sft_t *sft, uint8_t *rsp)
Build a basic response message interface.
Definition: agile_modbus.h:206
uint32_t header_length
Header length, excluding function code.
Definition: agile_modbus.h:200
uint32_t backend_type
Backend type.
Definition: agile_modbus.h:199
int(* send_msg_pre)(uint8_t *req, int req_length)
Pre-send data interface.
Definition: agile_modbus.h:208
int(* prepare_response_tid)(const uint8_t *req, int *req_length)
Prepare response interface.
Definition: agile_modbus.h:207
int(* build_request_basis)(agile_modbus_t *ctx, int function, int addr, int nb, uint8_t *req)
Build a basic request message interface.
Definition: agile_modbus.h:204
uint32_t checksum_length
Check data length.
Definition: agile_modbus.h:201
contains the modbus header parameter structure
Definition: agile_modbus.h:187
int slave
slave address
Definition: agile_modbus.h:188
int t_id
Transaction identifier.
Definition: agile_modbus.h:190
Agile Modbus slave information structure.
Definition: agile_modbus.h:246
uint8_t * buf
Data fields required for different function codes.
Definition: agile_modbus.h:251
int send_index
Current index of sending buffer.
Definition: agile_modbus.h:252
agile_modbus_sft_t * sft
sft structure pointer
Definition: agile_modbus.h:247
int address
Register address.
Definition: agile_modbus.h:249
int * rsp_length
Response data length pointer.
Definition: agile_modbus.h:248
Agile Modbus structure.
Definition: agile_modbus.h:217
int(* compute_data_length_after_meta)(agile_modbus_t *ctx, uint8_t *msg, int msg_length, agile_modbus_msg_type_t msg_type)
Customized calculation data length interface.
Definition: agile_modbus.h:225
uint8_t(* compute_meta_length_after_function)(agile_modbus_t *ctx, int function, agile_modbus_msg_type_t msg_type)
Customized calculation data element length interface.
Definition: agile_modbus.h:223
int send_bufsz
Send buffer size.
Definition: agile_modbus.h:220
uint8_t * send_buf
Send buffer.
Definition: agile_modbus.h:219
uint8_t * read_buf
Receive buffer.
Definition: agile_modbus.h:221
const agile_modbus_backend_t * backend
Backend interface.
Definition: agile_modbus.h:227
int slave
slave address
Definition: agile_modbus.h:218
int read_bufsz
Receive buffer size.
Definition: agile_modbus.h:222
void * backend_data
Backend data, pointing to RTU or TCP structure.
Definition: agile_modbus.h:228