grblHAL core  20260824
modbus.h
Go to the documentation of this file.
1 /*
2 
3  modbus.h - a lightweight ModBus implementation
4 
5  Part of grblHAL
6 
7  Copyright (c) 2023-2026 Terje Io
8 
9  grblHAL is free software: you can redistribute it and/or modify
10  it under the terms of the GNU General Public License as published by
11  the Free Software Foundation, either version 3 of the License, or
12  (at your option) any later version.
13 
14  grblHAL is distributed in the hope that it will be useful,
15  but WITHOUT ANY WARRANTY; without even the implied warranty of
16  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  GNU General Public License for more details.
18 
19  You should have received a copy of the GNU General Public License
20  along with grblHAL. If not, see <http://www.gnu.org/licenses/>.
21 
22 */
23 
24 #ifndef _MODBUS_H_
25 #define _MODBUS_H_
26 
27 #include <stdint.h>
28 #include <stdbool.h>
29 
30 #include "errors.h"
31 #include "stream.h"
32 
33 #ifndef MODBUS_MAX_ADU_SIZE
34 #define MODBUS_MAX_ADU_SIZE 12
35 #endif
36 #ifndef MODBUS_QUEUE_LENGTH
37 #define MODBUS_QUEUE_LENGTH 8
38 #endif
39 
40 #define MODBUS_SET_MSB16(v) ((v) >> 8)
41 #define MODBUS_SET_LSB16(v) ((v) & 0xFF)
42 #define MODBUS_MAX_REGISTERS ((MODBUS_MAX_ADU_SIZE - 6) / 2)
43 
44 #if MODBUS_MAX_ADU_SIZE < 12
45 #error 'MODBUS_MAX_ADU_SIZE has to be at least 12'
46 #endif
47 
48 typedef enum {
53 
54 typedef enum {
66 
67 typedef enum {
68  ModBus_NoException = 0, // For internal use, not defined in standard
78 // Internal exception codes, not defined in standard
82  ModBus_Timeout = 255
83 } __attribute__ ((__packed__)) modbus_exception_t;
84 
85 typedef struct {
86  void *context;
87  bool crc_check;
88  uint8_t tx_length;
89  uint8_t rx_length;
90  uint8_t adu[MODBUS_MAX_ADU_SIZE];
92 
93 typedef struct {
94  uint8_t retries;
95  uint16_t retry_delay;
96  void (*on_rx_packet)(modbus_message_t *msg);
97  void (*on_rx_exception)(uint8_t code, void *context);
98  void (*on_rx_timeout)(uint8_t code, void *context); // Set to modbus_null_exception_handler() to disable.
100 
101 typedef union {
102  uint16_t timeout[6];
103  struct {
104  uint16_t b2400;
105  uint16_t b4800;
106  uint16_t b9600;
107  uint16_t b19200;
108  uint16_t b38400;
109  uint16_t b115200;
110  };
112 
113 typedef union {
114  uint8_t ok;
115  struct {
116  uint8_t rtu :1,
117  ascii :1,
118  tcp :1,
120  };
121 } modbus_cap_t;
122 
123 struct modbus_response;
124 
125 typedef void (*modbus_callback_ptr)(struct modbus_response *response);
126 
127 typedef struct modbus_response {
128  uint8_t function;
130  uint8_t num_values;
133 
134 typedef struct {
136  bool is_write;
139 
140 typedef bool (*modbus_is_up_ptr)(void);
141 typedef void (*modbus_flush_queue_ptr)(void);
142 typedef void (*modbus_set_silence_ptr)(const modbus_silence_timeout_t *timeout);
143 typedef bool (*modbus_send_ptr)(modbus_message_t *msg, const modbus_callbacks_t *callbacks, bool block);
144 typedef bool (*modbus_is_busy_ptr)(void);
145 
146 typedef struct {
153 } modbus_api_t;
154 
155 typedef struct {
166 
168 bool modbus_isbusy (void);
169 bool modbus_enabled (void);
170 void modbus_flush_queue (void);
171 void modbus_set_silence (const modbus_silence_timeout_t *timeout);
172 bool modbus_send (modbus_message_t *msg, const modbus_callbacks_t *callbacks, bool block);
173 void modbus_null_exception_handler (uint8_t code, void *context);
174 uint16_t modbus_read_u16 (uint8_t *p);
175 void modbus_write_u16 (uint8_t *p, uint16_t value);
176 bool modbus_register_api (const modbus_api_t *api);
178 
179 // Experimental high level API
180 
182 status_code_t modbus_message (uint8_t server, modbus_function_t function, uint16_t address, uint16_t *values, uint8_t registers, modbus_callback_ptr callback);
183 
184 #endif
status_code_t
Definition: errors.h:31
modbus_function_t
Definition: modbus.h:54
@ ModBus_WriteCoil
Definition: modbus.h:59
@ ModBus_ReadHoldingRegisters
Definition: modbus.h:57
@ ModBus_WriteRegisters
Definition: modbus.h:64
@ ModBus_Diagnostics
Definition: modbus.h:62
@ ModBus_ReadCoils
Definition: modbus.h:55
@ ModBus_WriteCoils
Definition: modbus.h:63
@ ModBus_ReadInputRegisters
Definition: modbus.h:58
@ ModBus_WriteRegister
Definition: modbus.h:60
@ ModBus_ReadExceptionStatus
Definition: modbus.h:61
@ ModBus_ReadDiscreteInputs
Definition: modbus.h:56
const modbus_function_properties_t * modbus_get_function_properties(modbus_function_t function)
Definition: modbus.c:246
void(* modbus_flush_queue_ptr)(void)
Definition: modbus.h:141
#define MODBUS_MAX_ADU_SIZE
Definition: modbus.h:34
void(* modbus_set_silence_ptr)(const modbus_silence_timeout_t *timeout)
Definition: modbus.h:142
status_code_t modbus_message(uint8_t server, modbus_function_t function, uint16_t address, uint16_t *values, uint8_t registers, modbus_callback_ptr callback)
Definition: modbus.c:256
void modbus_write_u16(uint8_t *p, uint16_t value)
Definition: modbus.c:129
bool(* modbus_send_ptr)(modbus_message_t *msg, const modbus_callbacks_t *callbacks, bool block)
Definition: modbus.h:143
modbus_rtu_stream_t * modbus_get_rtu_stream(void)
Definition: modbus_rtu.c:558
modbus_if_t
Definition: modbus.h:48
@ Modbus_InterfaceASCII
Definition: modbus.h:50
@ Modbus_InterfaceTCP
Definition: modbus.h:51
@ Modbus_InterfaceRTU
Definition: modbus.h:49
bool modbus_register_api(const modbus_api_t *api)
Definition: modbus.c:135
bool modbus_send(modbus_message_t *msg, const modbus_callbacks_t *callbacks, bool block)
Definition: modbus.c:108
void modbus_set_silence(const modbus_silence_timeout_t *timeout)
Definition: modbus.c:102
bool(* modbus_is_busy_ptr)(void)
Definition: modbus.h:144
uint16_t modbus_read_u16(uint8_t *p)
Definition: modbus.c:124
void(* modbus_callback_ptr)(struct modbus_response *response)
Definition: modbus.h:125
bool modbus_enabled(void)
Definition: modbus.c:88
struct modbus_response modbus_response_t
#define MODBUS_MAX_REGISTERS
Definition: modbus.h:42
void modbus_null_exception_handler(uint8_t code, void *context)
Definition: modbus.c:119
void modbus_flush_queue(void)
Definition: modbus.c:93
bool modbus_isbusy(void)
Definition: modbus.c:61
modbus_exception_t
Definition: modbus.h:67
@ ModBus_IllegalDataValue
Definition: modbus.h:71
@ ModBus_IllegalSize
Definition: modbus.h:80
@ ModBus_MemoryParityError
Definition: modbus.h:75
@ ModBus_IllegalFunction
Definition: modbus.h:69
@ ModBus_GatewayTargetUnresponsive
Definition: modbus.h:77
@ ModBus_Acknowledge
Definition: modbus.h:73
@ ModBus_ServerDeviceFailure
Definition: modbus.h:72
@ ModBus_GatewayPathUnavailable
Definition: modbus.h:76
@ ModBus_UnknownException
Definition: modbus.h:79
@ ModBus_NoException
Definition: modbus.h:68
@ ModBus_IllegalDataAddress
Definition: modbus.h:70
@ ModBus_Timeout
Definition: modbus.h:82
@ ModBus_CRCError
Definition: modbus.h:81
@ ModBus_ServerDeviceBusy
Definition: modbus.h:74
bool(* modbus_is_up_ptr)(void)
Definition: modbus.h:140
modbus_cap_t modbus_isup(void)
Definition: modbus.c:35
uint16_t(* get_stream_buffer_count_ptr)(void)
Pointer to function for getting number of characters available or free in a stream buffer.
Definition: stream.h:217
bool(* set_format_ptr)(serial_format_t format)
Pointer to function for setting the stream format.
Definition: stream.h:279
int32_t(* stream_read_ptr)(void)
Pointer to function for reading a single character from a input stream.
Definition: stream.h:222
void(* stream_write_n_ptr)(const uint8_t *s, uint16_t len)
Pointer to function for writing a n character long string to the output stream.
Definition: stream.h:235
void(* flush_stream_buffer_ptr)(void)
Pointer to function for flushing a stream buffer.
Definition: stream.h:288
bool(* set_baud_rate_ptr)(uint32_t baud_rate)
Pointer to function for setting the stream baud rate.
Definition: stream.h:285
void(* stream_set_direction_ptr)(bool tx)
Pointer to function for setting the transfer direction control signal for half-duplex connections (RS...
Definition: stream.h:253
Definition: modbus.h:146
modbus_set_silence_ptr set_silence
Definition: modbus.h:150
modbus_flush_queue_ptr flush_queue
Definition: modbus.h:149
modbus_send_ptr send
Definition: modbus.h:151
modbus_if_t interface
Definition: modbus.h:147
modbus_is_busy_ptr is_busy
Definition: modbus.h:152
modbus_is_up_ptr is_up
Definition: modbus.h:148
Definition: modbus.h:93
uint8_t retries
Definition: modbus.h:94
uint16_t retry_delay
Definition: modbus.h:95
Definition: modbus.h:134
bool single_register
Definition: modbus.h:137
bool is_write
Definition: modbus.h:136
Definition: modbus.h:85
uint8_t rx_length
Definition: modbus.h:89
uint8_t tx_length
Definition: modbus.h:88
bool crc_check
Definition: modbus.h:87
void * context
Definition: modbus.h:86
Definition: modbus.h:127
uint16_t values[MODBUS_MAX_REGISTERS]
Definition: modbus.h:131
uint8_t num_values
Definition: modbus.h:130
modbus_exception_t exception
Definition: modbus.h:129
Definition: modbus.h:155
flush_stream_buffer_ptr flush_rx_buffer
Definition: modbus.h:164
set_format_ptr set_format
Optional handler for setting the stream format.
Definition: modbus.h:157
get_stream_buffer_count_ptr get_rx_buffer_count
Definition: modbus.h:160
flush_stream_buffer_ptr flush_tx_buffer
Definition: modbus.h:163
get_stream_buffer_count_ptr get_tx_buffer_count
Definition: modbus.h:159
stream_write_n_ptr write
Definition: modbus.h:161
stream_set_direction_ptr set_direction
NULL if auto direction.
Definition: modbus.h:158
set_baud_rate_ptr set_baud_rate
Definition: modbus.h:156
stream_read_ptr read
Definition: modbus.h:162
Definition: modbus.h:113
uint8_t unassigned
Definition: modbus.h:119
uint8_t ok
Definition: modbus.h:114
uint8_t rtu
Definition: modbus.h:116
uint8_t ascii
Definition: modbus.h:117
uint8_t tcp
Definition: modbus.h:118
Definition: modbus.h:101
uint16_t b9600
Definition: modbus.h:106
uint16_t b38400
Definition: modbus.h:108
uint16_t b19200
Definition: modbus.h:107
uint16_t b115200
Definition: modbus.h:109
uint16_t b2400
Definition: modbus.h:104
uint16_t b4800
Definition: modbus.h:105