Nexus Embedded Platform 1.0.0
Statically assembled reusable embedded mechanisms
Loading...
Searching...
No Matches
modbus_rtu.h
Go to the documentation of this file.
1
6#ifndef NX_MODBUS_RTU_H
7#define NX_MODBUS_RTU_H
8
9#include <stdbool.h>
10#include <stddef.h>
11#include <stdint.h>
12
13#ifdef __cplusplus
14extern "C" {
15#endif
16
17#define NX_MODBUS_ADU_MAX 256u
18#define NX_MODBUS_REGISTER_MAX 125u
19
27
28/* Task context only. The caller serializes feed/poll/recover. No allocations.
29 * read returns a coherent snapshot; write_atomic either commits EVERY value or
30 * changes NONE. authorize is required and applies to broadcasts as well.
31 * Critical writes check product authorization/interlocks here and recheck them
32 * atomically inside write_atomic if product state has concurrent owners. RTU
33 * itself authenticates neither a peer nor a request. All callbacks are bounded.
34 */
35typedef struct {
36 void* context;
37 nx_modbus_register_result_t (*read)(void*, uint16_t, uint16_t, uint16_t*);
38 nx_modbus_register_result_t (*authorize_write)(void*, uint16_t, uint16_t,
39 const uint16_t*);
40 nx_modbus_register_result_t (*write_atomic)(void*, uint16_t, uint16_t,
41 const uint16_t*);
43
44/* All deadlines are absolute monotonic microseconds. write may use DMA, but
45 * drain must observe the final stop bit before success. After any write/drain
46 * error, abort_and_settle MUST stop DMA and settle all callbacks before
47 * success. If abort fails the link is latched FAULTED, its TX storage is
48 * retained, and DE remains asserted until recover settles the port. This is a
49 * port failure, not a normal timeout. A port must never retain bytes after
50 * successful drain or abort. direction(false) must leave the transceiver in
51 * receive mode.
52 */
53typedef struct {
54 void* context;
55 uint64_t (*now_us)(void*);
56 bool (*direction)(void*, bool transmit);
57 bool (*write)(void*, const uint8_t*, size_t, uint64_t deadline_us);
58 bool (*drain)(void*, uint64_t deadline_us);
59 bool (*abort_and_settle)(void*, uint64_t deadline_us);
61
68
69typedef struct {
70 uint64_t frames;
71 uint64_t accepted;
72 uint64_t crc_errors;
73 uint64_t timing_errors;
74 uint64_t overflows;
75 uint64_t exceptions;
76 uint64_t broadcasts;
77 uint64_t tx_errors;
78 uint64_t clock_errors;
80
81typedef struct {
82 uint8_t address; /* 1..247; zero is broadcast, never a device identity. */
83 uint32_t baudrate;
84 uint8_t bits_per_character; /* start + data + parity + stop, e.g. 11. */
85 uint32_t tx_timeout_us;
90
91/* Public storage permits static allocation. Treat fields as private. */
108
115uint16_t nx_modbus_crc16(const uint8_t* bytes, size_t length);
127 const nx_modbus_config_t* config);
138bool nx_modbus_rtu_feed(nx_modbus_rtu_t* server, uint8_t byte,
139 uint64_t arrival_us);
151bool nx_modbus_rtu_poll(nx_modbus_rtu_t* server, uint64_t now_us);
158void nx_modbus_rtu_rx_error(nx_modbus_rtu_t* server, uint64_t now_us);
177
178#ifdef __cplusplus
179}
180#endif
181#endif
bool nx_modbus_rtu_init(nx_modbus_rtu_t *server, const nx_modbus_config_t *config)
Initialize an unused or fully quiesced protocol instance.
#define NX_MODBUS_ADU_MAX
Definition modbus_rtu.h:17
void nx_modbus_rtu_rx_error(nx_modbus_rtu_t *server, uint64_t now_us)
Discard an errored or overrun receive frame.
bool nx_modbus_rtu_feed(nx_modbus_rtu_t *server, uint8_t byte, uint64_t arrival_us)
Feed an externally timestamped UART byte.
#define NX_MODBUS_REGISTER_MAX
Definition modbus_rtu.h:18
uint16_t nx_modbus_crc16(const uint8_t *bytes, size_t length)
Compute standard Modbus CRC16 over caller bytes.
nx_modbus_register_result_t
Definition modbus_rtu.h:20
@ NX_MODBUS_DEVICE_BUSY
Definition modbus_rtu.h:25
@ NX_MODBUS_OK
Definition modbus_rtu.h:21
@ NX_MODBUS_DEVICE_FAILURE
Definition modbus_rtu.h:24
@ NX_MODBUS_ILLEGAL_ADDRESS
Definition modbus_rtu.h:22
@ NX_MODBUS_ILLEGAL_VALUE
Definition modbus_rtu.h:23
bool nx_modbus_rtu_stop(nx_modbus_rtu_t *server)
Settle the port before reclaiming protocol storage.
nx_modbus_link_state_t
Definition modbus_rtu.h:62
@ NX_MODBUS_LINK_FAULTED
Definition modbus_rtu.h:66
@ NX_MODBUS_RX_IDLE
Definition modbus_rtu.h:63
@ NX_MODBUS_RX_FRAME
Definition modbus_rtu.h:64
@ NX_MODBUS_RX_DISCARD
Definition modbus_rtu.h:65
bool nx_modbus_rtu_recover(nx_modbus_rtu_t *server)
Settle retained TX then restore receive silence acquisition.
bool nx_modbus_rtu_poll(nx_modbus_rtu_t *server, uint64_t now_us)
Service RTU silence and bounded synchronous RS485 response.
uint32_t tx_timeout_us
Definition modbus_rtu.h:85
nx_modbus_registers_t registers
Definition modbus_rtu.h:87
uint32_t abort_timeout_us
Definition modbus_rtu.h:86
nx_modbus_rs485_port_t port
Definition modbus_rtu.h:88
uint8_t bits_per_character
Definition modbus_rtu.h:84
nx_modbus_register_result_t(* read)(void *, uint16_t, uint16_t, uint16_t *)
Definition modbus_rtu.h:37
nx_modbus_register_result_t(* write_atomic)(void *, uint16_t, uint16_t, const uint16_t *)
Definition modbus_rtu.h:40
nx_modbus_register_result_t(* authorize_write)(void *, uint16_t, uint16_t, const uint16_t *)
Definition modbus_rtu.h:38
bool(* write)(void *, const uint8_t *, size_t, uint64_t deadline_us)
Definition modbus_rtu.h:57
bool(* direction)(void *, bool transmit)
Definition modbus_rtu.h:56
bool(* drain)(void *, uint64_t deadline_us)
Definition modbus_rtu.h:58
uint64_t(* now_us)(void *)
Definition modbus_rtu.h:55
bool(* abort_and_settle)(void *, uint64_t deadline_us)
Definition modbus_rtu.h:59
uint64_t last_event_us
Definition modbus_rtu.h:99
uint16_t rx_length
Definition modbus_rtu.h:100
uint16_t values[NX_MODBUS_REGISTER_MAX]
Definition modbus_rtu.h:104
nx_modbus_config_t config
Definition modbus_rtu.h:93
uint64_t last_byte_us
Definition modbus_rtu.h:98
uint8_t rx[NX_MODBUS_ADU_MAX]
Definition modbus_rtu.h:102
uint8_t tx[NX_MODBUS_ADU_MAX]
Definition modbus_rtu.h:103
uint32_t t1_5_us
Definition modbus_rtu.h:96
nx_modbus_counters_t counters
Definition modbus_rtu.h:94
uint32_t t3_5_us
Definition modbus_rtu.h:97
uint16_t tx_length
Definition modbus_rtu.h:101
nx_modbus_link_state_t state
Definition modbus_rtu.h:95