Skip to content

Commit

Permalink
Add quirks flag MODBUS_QUIRK_IGNORE_RTU_SLAVE_CHECK.
Browse files Browse the repository at this point in the history
The Modbus RTU mode currently only allows a single slave,
the message is ignored when not from the expected slave.

The MODBUS_QUIRK_IGNORE_RTU_SLAVE_CHECK flag allow ignore the
Modbus unit identifier (slave) checking, in this way, the RTU
slave device can acts as a multi-channels gateway, receive the
request messages for different slave from upstream channel,
then forward those to the downstream channel in transparent mode.
  • Loading branch information
vancepym committed Feb 2, 2023
1 parent b25629b commit 568b9fc
Show file tree
Hide file tree
Showing 3 changed files with 5 additions and 1 deletion.
2 changes: 2 additions & 0 deletions docs/modbus_enable_quirks.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ offers the following flags:
- `MODBUS_QUIRK_MAX_SLAVE` allows slave adresses between 247 and 255.
- `MODBUS_QUIRK_REPLY_TO_BROADCAST` force a reply to a broacast request when the
device is a slave in RTU mode (should be enabled on the slave device).
- `MODBUS_QUIRK_IGNORE_RTU_SLAVE_CHECK` allows no filtering on the Modbus unit
identifier (slave) in RTU mode while checking integrity.
You can combine the flags by using the bitwise OR operator.
Expand Down
3 changes: 2 additions & 1 deletion src/modbus-rtu.c
Original file line number Diff line number Diff line change
Expand Up @@ -354,7 +354,8 @@ static int _modbus_rtu_check_integrity(modbus_t *ctx, uint8_t *msg, const int ms

/* Filter on the Modbus unit identifier (slave) in RTU mode to avoid useless
* CRC computing. */
if (slave != ctx->slave && slave != MODBUS_BROADCAST_ADDRESS) {
if (slave != ctx->slave && slave != MODBUS_BROADCAST_ADDRESS &&
!(ctx->quirks & MODBUS_QUIRK_IGNORE_RTU_SLAVE_CHECK)) {
if (ctx->debug) {
printf("Request for slave %d ignored (not %d)\n", slave, ctx->slave);
}
Expand Down
1 change: 1 addition & 0 deletions src/modbus.h
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,7 @@ typedef enum {
MODBUS_QUIRK_NONE = 0,
MODBUS_QUIRK_MAX_SLAVE = (1 << 1),
MODBUS_QUIRK_REPLY_TO_BROADCAST = (1 << 2),
MODBUS_QUIRK_IGNORE_RTU_SLAVE_CHECK = (1 << 3),
MODBUS_QUIRK_ALL = 0xFF
} modbus_quirks;

Expand Down

0 comments on commit 568b9fc

Please sign in to comment.