Zephyr Project API 3.5.0
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
modbus.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2020 PHYTEC Messtechnik GmbH
3 * Copyright (c) 2021 Nordic Semiconductor ASA
4 *
5 * SPDX-License-Identifier: Apache-2.0
6 */
7
8/*
9 * Client API in this file is based on mbm_core.c from uC/Modbus Stack.
10 *
11 * uC/Modbus
12 * The Embedded Modbus Stack
13 *
14 * Copyright 2003-2020 Silicon Laboratories Inc. www.silabs.com
15 *
16 * SPDX-License-Identifier: APACHE-2.0
17 *
18 * This software is subject to an open source license and is distributed by
19 * Silicon Laboratories Inc. pursuant to the terms of the Apache License,
20 * Version 2.0 available at www.apache.org/licenses/LICENSE-2.0.
21 */
22
30#ifndef ZEPHYR_INCLUDE_MODBUS_H_
31#define ZEPHYR_INCLUDE_MODBUS_H_
32
33#include <zephyr/drivers/uart.h>
34#include <zephyr/sys/slist.h>
35#ifdef __cplusplus
36extern "C" {
37#endif
38
40#define MODBUS_MBAP_LENGTH 7
42#define MODBUS_MBAP_AND_FC_LENGTH (MODBUS_MBAP_LENGTH + 1)
43
47/* Modbus exception codes */
48#define MODBUS_EXC_NONE 0
49#define MODBUS_EXC_ILLEGAL_FC 1
50#define MODBUS_EXC_ILLEGAL_DATA_ADDR 2
51#define MODBUS_EXC_ILLEGAL_DATA_VAL 3
52#define MODBUS_EXC_SERVER_DEVICE_FAILURE 4
53#define MODBUS_EXC_ACK 5
54#define MODBUS_EXC_SERVER_DEVICE_BUSY 6
55#define MODBUS_EXC_MEM_PARITY_ERROR 8
56#define MODBUS_EXC_GW_PATH_UNAVAILABLE 10
57#define MODBUS_EXC_GW_TARGET_FAILED_TO_RESP 11
79
107int modbus_read_coils(const int iface,
108 const uint8_t unit_id,
109 const uint16_t start_addr,
110 uint8_t *const coil_tbl,
111 const uint16_t num_coils);
112
141int modbus_read_dinputs(const int iface,
142 const uint8_t unit_id,
143 const uint16_t start_addr,
144 uint8_t *const di_tbl,
145 const uint16_t num_di);
146
164int modbus_read_holding_regs(const int iface,
165 const uint8_t unit_id,
166 const uint16_t start_addr,
167 uint16_t *const reg_buf,
168 const uint16_t num_regs);
169
187int modbus_read_input_regs(const int iface,
188 const uint8_t unit_id,
189 const uint16_t start_addr,
190 uint16_t *const reg_buf,
191 const uint16_t num_regs);
192
205int modbus_write_coil(const int iface,
206 const uint8_t unit_id,
207 const uint16_t coil_addr,
208 const bool coil_state);
209
223int modbus_write_holding_reg(const int iface,
224 const uint8_t unit_id,
225 const uint16_t start_addr,
226 const uint16_t reg_val);
227
241int modbus_request_diagnostic(const int iface,
242 const uint8_t unit_id,
243 const uint16_t sfunc,
244 const uint16_t data,
245 uint16_t *const data_out);
246
274int modbus_write_coils(const int iface,
275 const uint8_t unit_id,
276 const uint16_t start_addr,
277 uint8_t *const coil_tbl,
278 const uint16_t num_coils);
279
297int modbus_write_holding_regs(const int iface,
298 const uint8_t unit_id,
299 const uint16_t start_addr,
300 uint16_t *const reg_buf,
301 const uint16_t num_regs);
302
320int modbus_read_holding_regs_fp(const int iface,
321 const uint8_t unit_id,
322 const uint16_t start_addr,
323 float *const reg_buf,
324 const uint16_t num_regs);
325
344 const uint8_t unit_id,
345 const uint16_t start_addr,
346 float *const reg_buf,
347 const uint16_t num_regs);
348
352 int (*coil_rd)(uint16_t addr, bool *state);
353
355 int (*coil_wr)(uint16_t addr, bool state);
356
358 int (*discrete_input_rd)(uint16_t addr, bool *state);
359
361 int (*input_reg_rd)(uint16_t addr, uint16_t *reg);
362
364 int (*input_reg_rd_fp)(uint16_t addr, float *reg);
365
367 int (*holding_reg_rd)(uint16_t addr, uint16_t *reg);
368
371
373 int (*holding_reg_rd_fp)(uint16_t addr, float *reg);
374
376 int (*holding_reg_wr_fp)(uint16_t addr, float reg);
377};
378
389int modbus_iface_get_by_name(const char *iface_name);
390
400typedef int (*modbus_raw_cb_t)(const int iface, const struct modbus_adu *adu,
401 void *user_data);
402
424typedef bool (*modbus_custom_cb_t)(const int iface,
425 const struct modbus_adu *const rx_adu,
426 struct modbus_adu *const tx_adu,
427 uint8_t *const excep_code,
428 void *const user_data);
429
434struct modbus_custom_fc {
435 sys_snode_t node;
437 void *user_data;
438 uint8_t fc;
439 uint8_t excep_code;
440};
446#define MODBUS_CUSTOM_FC_DEFINE(name, user_cb, user_fc, userdata) \
447 static struct modbus_custom_fc modbus_cfg_##name = { \
448 .cb = user_cb, \
449 .user_data = userdata, \
450 .fc = user_fc, \
451 .excep_code = MODBUS_EXC_NONE, \
452 }
453
465
486
496
501
509 union {
515 };
516 union {
518 struct modbus_serial_param serial;
520 struct modbus_raw_cb rawcb;
521 };
522};
523
532int modbus_init_server(const int iface, struct modbus_iface_param param);
533
542int modbus_init_client(const int iface, struct modbus_iface_param param);
543
553int modbus_disable(const uint8_t iface);
554
563int modbus_raw_submit_rx(const int iface, const struct modbus_adu *adu);
564
572void modbus_raw_put_header(const struct modbus_adu *adu, uint8_t *header);
573
580void modbus_raw_get_header(struct modbus_adu *adu, const uint8_t *header);
581
590
603int modbus_raw_backend_txn(const int iface, struct modbus_adu *adu);
604
621int modbus_register_user_fc(const int iface, struct modbus_custom_fc *custom_fc);
622
623#ifdef __cplusplus
624}
625#endif
626
631#endif /* ZEPHYR_INCLUDE_MODBUS_H_ */
Public APIs for UART drivers.
int modbus_read_coils(const int iface, const uint8_t unit_id, const uint16_t start_addr, uint8_t *const coil_tbl, const uint16_t num_coils)
Coil read (FC01)
bool(* modbus_custom_cb_t)(const int iface, const struct modbus_adu *const rx_adu, struct modbus_adu *const tx_adu, uint8_t *const excep_code, void *const user_data)
Custom function code handler function signature.
Definition modbus.h:424
int modbus_disable(const uint8_t iface)
Disable Modbus Interface.
void modbus_raw_get_header(struct modbus_adu *adu, const uint8_t *header)
Get MBAP header from a buffer.
modbus_mode
Modbus interface mode.
Definition modbus.h:457
int modbus_read_input_regs(const int iface, const uint8_t unit_id, const uint16_t start_addr, uint16_t *const reg_buf, const uint16_t num_regs)
Read input registers (FC04)
int modbus_raw_submit_rx(const int iface, const struct modbus_adu *adu)
Submit raw ADU.
int(* modbus_raw_cb_t)(const int iface, const struct modbus_adu *adu, void *user_data)
ADU raw callback function signature.
Definition modbus.h:400
int modbus_write_holding_regs_fp(const int iface, const uint8_t unit_id, const uint16_t start_addr, float *const reg_buf, const uint16_t num_regs)
Write floating-point holding registers (FC16)
int modbus_raw_backend_txn(const int iface, struct modbus_adu *adu)
Use interface as backend to send and receive ADU.
int modbus_read_holding_regs(const int iface, const uint8_t unit_id, const uint16_t start_addr, uint16_t *const reg_buf, const uint16_t num_regs)
Read holding registers (FC03)
void modbus_raw_put_header(const struct modbus_adu *adu, uint8_t *header)
Put MBAP header into a buffer.
int modbus_read_dinputs(const int iface, const uint8_t unit_id, const uint16_t start_addr, uint8_t *const di_tbl, const uint16_t num_di)
Read discrete inputs (FC02)
int modbus_init_client(const int iface, struct modbus_iface_param param)
Configure Modbus Interface as raw ADU client.
int modbus_read_holding_regs_fp(const int iface, const uint8_t unit_id, const uint16_t start_addr, float *const reg_buf, const uint16_t num_regs)
Read floating-point holding registers (FC03)
int modbus_iface_get_by_name(const char *iface_name)
Get Modbus interface index according to interface name.
int modbus_write_coils(const int iface, const uint8_t unit_id, const uint16_t start_addr, uint8_t *const coil_tbl, const uint16_t num_coils)
Write coils (FC15)
int modbus_request_diagnostic(const int iface, const uint8_t unit_id, const uint16_t sfunc, const uint16_t data, uint16_t *const data_out)
Read diagnostic (FC08)
int modbus_write_coil(const int iface, const uint8_t unit_id, const uint16_t coil_addr, const bool coil_state)
Write single coil (FC05)
int modbus_register_user_fc(const int iface, struct modbus_custom_fc *custom_fc)
Register a user-defined function code handler.
void modbus_raw_set_server_failure(struct modbus_adu *adu)
Set Server Device Failure exception.
int modbus_write_holding_regs(const int iface, const uint8_t unit_id, const uint16_t start_addr, uint16_t *const reg_buf, const uint16_t num_regs)
Write holding registers (FC16)
int modbus_init_server(const int iface, struct modbus_iface_param param)
Configure Modbus Interface as raw ADU server.
int modbus_write_holding_reg(const int iface, const uint8_t unit_id, const uint16_t start_addr, const uint16_t reg_val)
Write single holding register (FC06)
@ MODBUS_MODE_RAW
Modbus raw ADU mode.
Definition modbus.h:463
@ MODBUS_MODE_RTU
Modbus over serial line RTU mode.
Definition modbus.h:459
@ MODBUS_MODE_ASCII
Modbus over serial line ASCII mode.
Definition modbus.h:461
struct _snode sys_snode_t
Single-linked list node structure.
Definition slist.h:39
uart_config_parity
Parity modes.
Definition uart.h:77
uart_config_stop_bits
Number of stop bits.
Definition uart.h:86
state
Definition parser_state.h:29
#define bool
Definition stdbool.h:13
__UINT32_TYPE__ uint32_t
Definition stdint.h:90
__UINT8_TYPE__ uint8_t
Definition stdint.h:88
__UINT16_TYPE__ uint16_t
Definition stdint.h:89
Frame struct used internally and for raw ADU support.
Definition modbus.h:63
uint8_t fc
Function Code.
Definition modbus.h:73
uint16_t trans_id
Transaction Identifier.
Definition modbus.h:65
uint16_t crc
RTU CRC.
Definition modbus.h:77
uint8_t data[CONFIG_MODBUS_BUFFER_SIZE - 4]
Transaction Data.
Definition modbus.h:75
uint16_t length
Length of the data only (not the length of unit ID + PDU)
Definition modbus.h:69
uint8_t unit_id
Unit Identifier.
Definition modbus.h:71
uint16_t proto_id
Protocol Identifier.
Definition modbus.h:67
User parameter structure to configure Modbus interface as client or server.
Definition modbus.h:506
uint32_t rx_timeout
Amount of time client will wait for a response from the server.
Definition modbus.h:514
struct modbus_server_param server
Definition modbus.h:510
enum modbus_mode mode
Mode of the interface.
Definition modbus.h:508
Definition modbus.h:497
modbus_raw_cb_t raw_tx_cb
Definition modbus.h:498
void * user_data
Definition modbus.h:499
Modbus serial line parameter.
Definition modbus.h:469
enum uart_config_parity parity
parity UART's parity setting: UART_CFG_PARITY_NONE, UART_CFG_PARITY_EVEN, UART_CFG_PARITY_ODD
Definition modbus.h:477
enum uart_config_stop_bits stop_bits_client
stop_bits_client UART's stop bits setting if in client mode: UART_CFG_STOP_BITS_0_5,...
Definition modbus.h:484
uint32_t baud
Baudrate of the serial line.
Definition modbus.h:471
Modbus server parameter.
Definition modbus.h:490
uint8_t unit_id
Modbus unit ID of the server.
Definition modbus.h:494
struct modbus_user_callbacks * user_cb
Pointer to the User Callback structure.
Definition modbus.h:492
Modbus Server User Callback structure.
Definition modbus.h:350
int(* coil_wr)(uint16_t addr, bool state)
Coil write callback.
Definition modbus.h:355
int(* holding_reg_wr_fp)(uint16_t addr, float reg)
Floating Point Holding Register write callback.
Definition modbus.h:376
int(* coil_rd)(uint16_t addr, bool *state)
Coil read callback.
Definition modbus.h:352
int(* holding_reg_wr)(uint16_t addr, uint16_t reg)
Holding Register write callback.
Definition modbus.h:370
int(* holding_reg_rd_fp)(uint16_t addr, float *reg)
Floating Point Holding Register read callback.
Definition modbus.h:373
int(* input_reg_rd)(uint16_t addr, uint16_t *reg)
Input Register read callback.
Definition modbus.h:361
int(* discrete_input_rd)(uint16_t addr, bool *state)
Discrete Input read callback.
Definition modbus.h:358
int(* holding_reg_rd)(uint16_t addr, uint16_t *reg)
Holding Register read callback.
Definition modbus.h:367
int(* input_reg_rd_fp)(uint16_t addr, float *reg)
Floating Point Input Register read callback.
Definition modbus.h:364
static fdata_t data[2]
Definition test_fifo_contexts.c:15
static const intptr_t user_data[5]
Definition main.c:588