SimpleModbusRTUPacket
Modbus.h
浏览该文件的文档.
1 
9 #ifndef __MODBUS_H__
10 #define __MODBUS_H__
11 
12 
13 #include "stdint.h"
14 #include "stdbool.h"
15 #include "stdlib.h"
16 #include "string.h"
17 
18 #ifdef __cplusplus
19 extern "C" {
20 #endif
21 
22 #define MODBUS_BROADCAST_ADDRESS 0
23 
24 /* Modbus_Application_Protocol_V1_1b.pdf (chapter 6 section 1 page 12)
25  * Quantity of Coils to read (2 bytes): 1 to 2000 (0x7D0)
26  * (chapter 6 section 11 page 29)
27  * Quantity of Coils to write (2 bytes): 1 to 1968 (0x7B0)
28  */
29 #define MODBUS_MAX_READ_BITS 2000
30 #define MODBUS_MAX_WRITE_BITS 1968
31 
32 /* Modbus_Application_Protocol_V1_1b.pdf (chapter 6 section 3 page 15)
33  * Quantity of Registers to read (2 bytes): 1 to 125 (0x7D)
34  * (chapter 6 section 12 page 31)
35  * Quantity of Registers to write (2 bytes) 1 to 123 (0x7B)
36  * (chapter 6 section 17 page 38)
37  * Quantity of Registers to write in R/W registers (2 bytes) 1 to 121 (0x79)
38  */
39 #define MODBUS_MAX_READ_REGISTERS 125
40 #define MODBUS_MAX_WRITE_REGISTERS 123
41 #define MODBUS_MAX_WR_WRITE_REGISTERS 121
42 #define MODBUS_MAX_WR_READ_REGISTERS 125
43 
44 /* The size of the MODBUS PDU is limited by the size constraint inherited from
45  * the first MODBUS implementation on Serial Line network (max. RS485 ADU = 256
46  * bytes). Therefore, MODBUS PDU for serial line communication = 256 - Server
47  * address (1 byte) - CRC (2 bytes) = 253 bytes.
48  */
49 #define MODBUS_MAX_PDU_LENGTH 253
50 
51 
52 /* Modbus_Application_Protocol_V1_1b.pdf Chapter 4 Section 1 Page 5
53  * RS232 / RS485 ADU = 253 bytes + slave (1 byte) + CRC (2 bytes) = 256 bytes
54  */
55 #define MODBUS_RTU_MAX_ADU_LENGTH 256
56 
57 
65 bool Modbus_Payload_Check_CRC(uint8_t *payload,size_t payload_length);
66 
67 
68 
76 bool Modbus_Payload_Append_CRC(uint8_t *payload,size_t payload_length);
77 
78 
79 typedef struct
80 {
81 
82 
83  uint8_t slave_addr;
92  void (*output)(uint8_t *data,size_t data_length);
93 
100  bool (*read_IX)(size_t addr);
101 
109  void (*write_OX)(size_t addr,uint16_t data);
116  bool (*read_OX)(size_t addr);
117 
124  uint16_t (*read_hold_register)(size_t addr);
132  void (*write_hold_register)(size_t addr,uint16_t data);
133 
140  uint16_t (*read_input_register)(size_t addr);
141 
142 
144 
145 
146 
158 bool Modbus_Slave_Parse_Input(modbus_slave_context_t *ctx,uint8_t *input_data,size_t input_data_length,uint8_t *buff,size_t buff_length);
159 
160 
161 typedef struct
162 {
163  uint8_t slave_addr;
172  void (*output)(uint8_t *data,size_t data_length);
173 
174 
182  size_t (*request_reply)(uint8_t *data,size_t data_length);
183 
185 
186 
187 
199 bool Modbus_Master_Read_IX(modbus_master_context_t *ctx,uint16_t start_addr,bool *data,size_t number,uint8_t *buff,size_t buff_length);
200 
212 bool Modbus_Master_Read_OX(modbus_master_context_t *ctx,uint16_t start_addr,bool *data,size_t number,uint8_t *buff,size_t buff_length);
213 
225 bool Modbus_Master_Read_Hold_Register(modbus_master_context_t *ctx,uint16_t start_addr,uint16_t *data,size_t number,uint8_t *buff,size_t buff_length);
226 
238 bool Modbus_Master_Read_Input_Register(modbus_master_context_t *ctx,uint16_t start_addr,uint16_t *data,size_t number,uint8_t *buff,size_t buff_length);
239 
251 bool Modbus_Master_Write_OX(modbus_master_context_t *ctx,uint16_t start_addr,bool *data,size_t number,uint8_t *buff,size_t buff_length);
252 
264 bool Modbus_Master_Write_Hold_Register(modbus_master_context_t *ctx,uint16_t start_addr,uint16_t *data,size_t number,uint8_t *buff,size_t buff_length);
265 
266 #ifdef __cplusplus
267 }
268 #endif
269 
270 
271 #endif
272 
bool Modbus_Master_Read_OX(modbus_master_context_t *ctx, uint16_t start_addr, bool *data, size_t number, uint8_t *buff, size_t buff_length)
Modbus主机读取输出线圈
Definition: Modbus.c:453
bool Modbus_Master_Write_Hold_Register(modbus_master_context_t *ctx, uint16_t start_addr, uint16_t *data, size_t number, uint8_t *buff, size_t buff_length)
Modbus主机写保持寄存器
Definition: Modbus.c:812
bool Modbus_Master_Write_OX(modbus_master_context_t *ctx, uint16_t start_addr, bool *data, size_t number, uint8_t *buff, size_t buff_length)
Modbus主机写输出线圈
Definition: Modbus.c:703
bool Modbus_Slave_Parse_Input(modbus_slave_context_t *ctx, uint8_t *input_data, size_t input_data_length, uint8_t *buff, size_t buff_length)
Modbus从机解析输入。 当从机接收到一帧数据后,调用此函数。 此函数会自动调用相关回调函数完成Modbus输出。
Definition: Modbus.c:90
bool Modbus_Master_Read_IX(modbus_master_context_t *ctx, uint16_t start_addr, bool *data, size_t number, uint8_t *buff, size_t buff_length)
Modbus主机读取输入点
Definition: Modbus.c:504
bool Modbus_Payload_Check_CRC(uint8_t *payload, size_t payload_length)
检查一帧数据的crc
Definition: Modbus.c:52
bool Modbus_Master_Read_Input_Register(modbus_master_context_t *ctx, uint16_t start_addr, uint16_t *data, size_t number, uint8_t *buff, size_t buff_length)
Modbus主机读取输入寄存器
Definition: Modbus.c:606
bool Modbus_Master_Read_Hold_Register(modbus_master_context_t *ctx, uint16_t start_addr, uint16_t *data, size_t number, uint8_t *buff, size_t buff_length)
Modbus主机读取保持寄存器
Definition: Modbus.c:555
bool Modbus_Payload_Append_CRC(uint8_t *payload, size_t payload_length)
在数据帧末尾的添加crc校验
Definition: Modbus.c:71
uint8_t slave_addr
Definition: Modbus.h:83