grblHAL core  20250514
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-2025 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 #ifndef MODBUS_MAX_ADU_SIZE
28 #define MODBUS_MAX_ADU_SIZE 12
29 #endif
30 #ifndef MODBUS_QUEUE_LENGTH
31 #define MODBUS_QUEUE_LENGTH 8
32 #endif
33 
34 #include <stdint.h>
35 #include <stdbool.h>
36 
37 #define MODBUS_SET_MSB16(v) ((v) >> 8)
38 #define MODBUS_SET_LSB16(v) ((v) & 0xFF)
39 
40 typedef enum {
45 
46 typedef enum {
58 
59 typedef struct {
60  void *context;
61  bool crc_check;
62  uint8_t tx_length;
63  uint8_t rx_length;
64  uint8_t adu[MODBUS_MAX_ADU_SIZE];
66 
67 typedef struct {
68  uint8_t retries;
69  uint16_t retry_delay;
70  void (*on_rx_packet)(modbus_message_t *msg);
71  void (*on_rx_exception)(uint8_t code, void *context);
73 
74 typedef union {
75  uint16_t timeout[6];
76  struct {
77  uint16_t b2400;
78  uint16_t b4800;
79  uint16_t b9600;
80  uint16_t b19200;
81  uint16_t b38400;
82  uint16_t b115200;
83  };
85 
86 typedef union {
87  uint8_t ok;
88  struct {
89  uint8_t rtu :1,
90  ascii :1,
91  tcp :1,
93  };
94 } modbus_cap_t;
95 
96 typedef bool (*modbus_is_up_ptr)(void);
97 typedef void (*modbus_flush_queue_ptr)(void);
98 typedef void (*modbus_set_silence_ptr)(const modbus_silence_timeout_t *timeout);
99 typedef bool (*modbus_send_ptr)(modbus_message_t *msg, const modbus_callbacks_t *callbacks, bool block);
100 
101 typedef struct {
107 } modbus_api_t;
108 
110 bool modbus_enabled (void);
111 void modbus_flush_queue (void);
112 void modbus_set_silence (const modbus_silence_timeout_t *timeout);
113 bool modbus_send (modbus_message_t *msg, const modbus_callbacks_t *callbacks, bool block);
114 uint16_t modbus_read_u16 (uint8_t *p);
115 void modbus_write_u16 (uint8_t *p, uint16_t value);
116 bool modbus_register_api (const modbus_api_t *api);
117 
118 #endif
modbus_function_t
Definition: modbus.h:46
@ ModBus_WriteCoil
Definition: modbus.h:51
@ ModBus_ReadHoldingRegisters
Definition: modbus.h:49
@ ModBus_WriteRegisters
Definition: modbus.h:56
@ ModBus_Diagnostics
Definition: modbus.h:54
@ ModBus_ReadCoils
Definition: modbus.h:47
@ ModBus_WriteCoils
Definition: modbus.h:55
@ ModBus_ReadInputRegisters
Definition: modbus.h:50
@ ModBus_WriteRegister
Definition: modbus.h:52
@ ModBus_ReadExceptionStatus
Definition: modbus.h:53
@ ModBus_ReadDiscreteInputs
Definition: modbus.h:48
void(* modbus_flush_queue_ptr)(void)
Definition: modbus.h:97
#define MODBUS_MAX_ADU_SIZE
Definition: modbus.h:28
void(* modbus_set_silence_ptr)(const modbus_silence_timeout_t *timeout)
Definition: modbus.h:98
void modbus_write_u16(uint8_t *p, uint16_t value)
Definition: modbus.c:96
bool(* modbus_send_ptr)(modbus_message_t *msg, const modbus_callbacks_t *callbacks, bool block)
Definition: modbus.h:99
modbus_if_t
Definition: modbus.h:40
@ Modbus_InterfaceASCII
Definition: modbus.h:42
@ Modbus_InterfaceTCP
Definition: modbus.h:43
@ Modbus_InterfaceRTU
Definition: modbus.h:41
bool modbus_register_api(const modbus_api_t *api)
Definition: modbus.c:102
bool modbus_send(modbus_message_t *msg, const modbus_callbacks_t *callbacks, bool block)
Definition: modbus.c:81
void modbus_set_silence(const modbus_silence_timeout_t *timeout)
Definition: modbus.c:75
uint16_t modbus_read_u16(uint8_t *p)
Definition: modbus.c:91
bool modbus_enabled(void)
Definition: modbus.c:61
void modbus_flush_queue(void)
Definition: modbus.c:66
bool(* modbus_is_up_ptr)(void)
Definition: modbus.h:96
modbus_cap_t modbus_isup(void)
Definition: modbus.c:35
Definition: modbus.h:101
modbus_set_silence_ptr set_silence
Definition: modbus.h:105
modbus_flush_queue_ptr flush_queue
Definition: modbus.h:104
modbus_send_ptr send
Definition: modbus.h:106
modbus_if_t interface
Definition: modbus.h:102
modbus_is_up_ptr is_up
Definition: modbus.h:103
Definition: modbus.h:67
uint8_t retries
Definition: modbus.h:68
uint16_t retry_delay
Definition: modbus.h:69
Definition: modbus.h:59
uint8_t rx_length
Definition: modbus.h:63
uint8_t tx_length
Definition: modbus.h:62
bool crc_check
Definition: modbus.h:61
void * context
Definition: modbus.h:60
Definition: modbus.h:86
uint8_t unassigned
Definition: modbus.h:92
uint8_t ok
Definition: modbus.h:87
uint8_t rtu
Definition: modbus.h:89
uint8_t ascii
Definition: modbus.h:90
uint8_t tcp
Definition: modbus.h:91
Definition: modbus.h:74
uint16_t b9600
Definition: modbus.h:79
uint16_t b38400
Definition: modbus.h:81
uint16_t b19200
Definition: modbus.h:80
uint16_t b115200
Definition: modbus.h:82
uint16_t b2400
Definition: modbus.h:77
uint16_t b4800
Definition: modbus.h:78