modbus: make MODBUS support over serial line optional

Make MODBUS support over serial line optional.

Signed-off-by: Johann Fischer <johann.fischer@nordicsemi.no>
This commit is contained in:
Johann Fischer 2021-03-03 17:55:14 +01:00 committed by Carles Cufí
commit 669d3e9e91
3 changed files with 47 additions and 9 deletions

View file

@ -8,6 +8,10 @@ if(CONFIG_MODBUS)
zephyr_library_sources(
modbus_core.c
)
zephyr_library_sources_ifdef(
CONFIG_MODBUS_SERIAL
modbus_serial.c
)

View file

@ -1,9 +1,10 @@
# Copyright (c) 2020 PHYTEC Messtechnik GmbH
# SPDX-License-Identifier: Apache-2.0
config MODBUS
DT_COMPAT_MODBUS_RTU := zephyr,modbus-serial
menuconfig MODBUS
bool "Modbus support"
depends on SERIAL && SERIAL_HAS_DRIVER
if MODBUS
@ -39,7 +40,15 @@ config MODBUS_CLIENT
bool
default y if MODBUS_ROLE_CLIENT || MODBUS_ROLE_CLIENT_SERVER
config MODBUS_SERIAL
bool "Modbus over serial line support"
depends on SERIAL && SERIAL_HAS_DRIVER
default $(dt_compat_enabled,$(DT_COMPAT_MODBUS_RTU))
help
Enable Modbus over serial line support.
config MODBUS_ASCII_MODE
depends on MODBUS_SERIAL
bool "Modbus transmission mode ASCII"
help
Enable ASCII transmission mode.

View file

@ -40,9 +40,11 @@ DT_INST_FOREACH_STATUS_OKAY(MB_RTU_DEFINE_GPIO_CFGS)
.re = MB_RTU_ASSIGN_GPIO_CFG(n, re_gpios), \
},
#ifdef CONFIG_MODBUS_SERIAL
static struct modbus_serial_config modbus_serial_cfg[] = {
DT_INST_FOREACH_STATUS_OKAY(MODBUS_DT_GET_SERIAL_DEV)
};
#endif
#define MODBUS_DT_GET_DEV(n) { \
.iface_name = DT_INST_LABEL(n), \
@ -66,8 +68,10 @@ static void modbus_rx_handler(struct k_work *item)
switch (ctx->mode) {
case MODBUS_MODE_RTU:
case MODBUS_MODE_ASCII:
if (IS_ENABLED(CONFIG_MODBUS_SERIAL)) {
modbus_serial_rx_disable(ctx);
ctx->rx_frame_err = modbus_serial_rx_frame(ctx);
}
break;
default:
LOG_ERR("Unknown MODBUS mode");
@ -85,7 +89,8 @@ static void modbus_rx_handler(struct k_work *item)
switch (ctx->mode) {
case MODBUS_MODE_RTU:
case MODBUS_MODE_ASCII:
if (respond == false) {
if (IS_ENABLED(CONFIG_MODBUS_SERIAL) &&
respond == false) {
LOG_DBG("Server has dropped frame");
modbus_serial_rx_enable(ctx);
}
@ -101,7 +106,8 @@ void mb_tx_frame(struct modbus_context *ctx)
switch (ctx->mode) {
case MODBUS_MODE_RTU:
case MODBUS_MODE_ASCII:
if (modbus_serial_tx_frame(ctx)) {
if (IS_ENABLED(CONFIG_MODBUS_SERIAL) &&
modbus_serial_tx_frame(ctx)) {
LOG_ERR("Unsupported MODBUS serial mode");
}
break;
@ -171,10 +177,19 @@ static struct modbus_context *mb_cfg_iface(const uint8_t iface,
mbs_reset_statistics(ctx);
}
if (modbus_serial_init(ctx, baud, parity, ascii_mode) != 0) {
switch (ctx->mode) {
case MODBUS_MODE_RTU:
case MODBUS_MODE_ASCII:
if (IS_ENABLED(CONFIG_MODBUS_SERIAL) &&
modbus_serial_init(ctx, baud, parity, ascii_mode) != 0) {
LOG_ERR("Failed to init MODBUS over serial line");
return NULL;
}
break;
default:
LOG_ERR("Unknown MODBUS mode");
return NULL;
}
LOG_DBG("Modbus interface %s initialized", ctx->iface_name);
@ -254,7 +269,17 @@ int modbus_disable(const uint8_t iface)
ctx = &mb_ctx_tbl[iface];
switch (ctx->mode) {
case MODBUS_MODE_RTU:
case MODBUS_MODE_ASCII:
if (IS_ENABLED(CONFIG_MODBUS_SERIAL)) {
modbus_serial_disable(ctx);
}
break;
default:
LOG_ERR("Unknown MODBUS mode");
}
ctx->rxwait_to = 0;
ctx->node_addr = 0;
ctx->mode = MODBUS_MODE_RTU;