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:
parent
b132ab556c
commit
669d3e9e91
3 changed files with 47 additions and 9 deletions
|
@ -8,6 +8,10 @@ if(CONFIG_MODBUS)
|
||||||
|
|
||||||
zephyr_library_sources(
|
zephyr_library_sources(
|
||||||
modbus_core.c
|
modbus_core.c
|
||||||
|
)
|
||||||
|
|
||||||
|
zephyr_library_sources_ifdef(
|
||||||
|
CONFIG_MODBUS_SERIAL
|
||||||
modbus_serial.c
|
modbus_serial.c
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
# Copyright (c) 2020 PHYTEC Messtechnik GmbH
|
# Copyright (c) 2020 PHYTEC Messtechnik GmbH
|
||||||
# SPDX-License-Identifier: Apache-2.0
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
config MODBUS
|
DT_COMPAT_MODBUS_RTU := zephyr,modbus-serial
|
||||||
|
|
||||||
|
menuconfig MODBUS
|
||||||
bool "Modbus support"
|
bool "Modbus support"
|
||||||
depends on SERIAL && SERIAL_HAS_DRIVER
|
|
||||||
|
|
||||||
if MODBUS
|
if MODBUS
|
||||||
|
|
||||||
|
@ -39,7 +40,15 @@ config MODBUS_CLIENT
|
||||||
bool
|
bool
|
||||||
default y if MODBUS_ROLE_CLIENT || MODBUS_ROLE_CLIENT_SERVER
|
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
|
config MODBUS_ASCII_MODE
|
||||||
|
depends on MODBUS_SERIAL
|
||||||
bool "Modbus transmission mode ASCII"
|
bool "Modbus transmission mode ASCII"
|
||||||
help
|
help
|
||||||
Enable ASCII transmission mode.
|
Enable ASCII transmission mode.
|
||||||
|
|
|
@ -40,9 +40,11 @@ DT_INST_FOREACH_STATUS_OKAY(MB_RTU_DEFINE_GPIO_CFGS)
|
||||||
.re = MB_RTU_ASSIGN_GPIO_CFG(n, re_gpios), \
|
.re = MB_RTU_ASSIGN_GPIO_CFG(n, re_gpios), \
|
||||||
},
|
},
|
||||||
|
|
||||||
|
#ifdef CONFIG_MODBUS_SERIAL
|
||||||
static struct modbus_serial_config modbus_serial_cfg[] = {
|
static struct modbus_serial_config modbus_serial_cfg[] = {
|
||||||
DT_INST_FOREACH_STATUS_OKAY(MODBUS_DT_GET_SERIAL_DEV)
|
DT_INST_FOREACH_STATUS_OKAY(MODBUS_DT_GET_SERIAL_DEV)
|
||||||
};
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
#define MODBUS_DT_GET_DEV(n) { \
|
#define MODBUS_DT_GET_DEV(n) { \
|
||||||
.iface_name = DT_INST_LABEL(n), \
|
.iface_name = DT_INST_LABEL(n), \
|
||||||
|
@ -66,8 +68,10 @@ static void modbus_rx_handler(struct k_work *item)
|
||||||
switch (ctx->mode) {
|
switch (ctx->mode) {
|
||||||
case MODBUS_MODE_RTU:
|
case MODBUS_MODE_RTU:
|
||||||
case MODBUS_MODE_ASCII:
|
case MODBUS_MODE_ASCII:
|
||||||
modbus_serial_rx_disable(ctx);
|
if (IS_ENABLED(CONFIG_MODBUS_SERIAL)) {
|
||||||
ctx->rx_frame_err = modbus_serial_rx_frame(ctx);
|
modbus_serial_rx_disable(ctx);
|
||||||
|
ctx->rx_frame_err = modbus_serial_rx_frame(ctx);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
LOG_ERR("Unknown MODBUS mode");
|
LOG_ERR("Unknown MODBUS mode");
|
||||||
|
@ -85,7 +89,8 @@ static void modbus_rx_handler(struct k_work *item)
|
||||||
switch (ctx->mode) {
|
switch (ctx->mode) {
|
||||||
case MODBUS_MODE_RTU:
|
case MODBUS_MODE_RTU:
|
||||||
case MODBUS_MODE_ASCII:
|
case MODBUS_MODE_ASCII:
|
||||||
if (respond == false) {
|
if (IS_ENABLED(CONFIG_MODBUS_SERIAL) &&
|
||||||
|
respond == false) {
|
||||||
LOG_DBG("Server has dropped frame");
|
LOG_DBG("Server has dropped frame");
|
||||||
modbus_serial_rx_enable(ctx);
|
modbus_serial_rx_enable(ctx);
|
||||||
}
|
}
|
||||||
|
@ -101,7 +106,8 @@ void mb_tx_frame(struct modbus_context *ctx)
|
||||||
switch (ctx->mode) {
|
switch (ctx->mode) {
|
||||||
case MODBUS_MODE_RTU:
|
case MODBUS_MODE_RTU:
|
||||||
case MODBUS_MODE_ASCII:
|
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");
|
LOG_ERR("Unsupported MODBUS serial mode");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -171,8 +177,17 @@ static struct modbus_context *mb_cfg_iface(const uint8_t iface,
|
||||||
mbs_reset_statistics(ctx);
|
mbs_reset_statistics(ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (modbus_serial_init(ctx, baud, parity, ascii_mode) != 0) {
|
switch (ctx->mode) {
|
||||||
LOG_ERR("Failed to init MODBUS over serial line");
|
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;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -254,7 +269,17 @@ int modbus_disable(const uint8_t iface)
|
||||||
|
|
||||||
ctx = &mb_ctx_tbl[iface];
|
ctx = &mb_ctx_tbl[iface];
|
||||||
|
|
||||||
modbus_serial_disable(ctx);
|
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->rxwait_to = 0;
|
||||||
ctx->node_addr = 0;
|
ctx->node_addr = 0;
|
||||||
ctx->mode = MODBUS_MODE_RTU;
|
ctx->mode = MODBUS_MODE_RTU;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue