R421A Relay Boards
These are inexpensive and readily available MODBUS multi-channel relay boards. Both 8 and 4-channel versions have been tested.
Device properties include:
- Address
The address of a modbus slave. Modbus docs. call this the slave ID.
- Node
Represents something a slave device does. Modbus relay boards have one node for each output it controls.
- Node ID
The channel a node lives on. For the R421Axx relay boards this is the address or channel number. In a modbus transaction this is the address field.
- 8-channel
DIP switches set the slave address, from 0x00 to 0x3f. e.g. A0 ON=#1, A1 ON=#2, etc.
- 4-channel
Set A5 ON for MODBUS RTU mode (OFF is for AT mode).
Set A0-A4 to slave address, from 0x00 to 0x1f.
API
-
namespace R421A
Modbus/R421A/Device.h
Created on: 1 May 2018
Copyright 2022 mikee47 mike@sillyhouse.net
This file is part of the IOControl Library
This library is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3 or later.
This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this library. If not, see https://www.gnu.org/licenses/.
R421A08 modbus 8-channel relay board
Channels are numbered 1 - 8. This is the 16-bit address field in a request.
To simplify operation we use a bitmask to specify relay states. We use the channel number directly so values can range between 0x0001 and 0x01FE
The query command returns a range of states, but other commands work with only a single channel. We therefore implement a mechanism to iterate through all requested channels using the same request.
There is a similar 4-channel board but with no markings and (as yet) no documentation. However all commands appear to work so a designation of R421A04 seems appropriate. Some typos in the 8-channel datasheet indicate that it was adapted from that of a 4-channel version.
R421A04 - 32 addresses set with DIP1-5, DIP6 ON for RTU mode R421A08 - 64 addresses set with DIP1-6, RTU mode only
Modbus/R421A/Request.h
Created on: 1 May 2018
Copyright 2022 mikee47 mike@sillyhouse.net
This file is part of the IOControl Library
This library is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3 or later.
This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this library. If not, see https://www.gnu.org/licenses/.
Variables
-
constexpr uint8_t R421_CHANNEL_MIN = 1
-
constexpr uint8_t R421A_MAX_CHANNELS = 16
-
struct StateMask
- #include <Device.h>
Tracks state of multiple relays.
Public Members
-
BitSet32 channelMask
Identifies valid channels.
-
BitSet32 channelMask
-
class Device : public IO::Modbus::Device
- #include <Device.h>
Public Functions
-
virtual IO::Request *createRequest() override
Create a request object for this device.
- Return values:
Request* – Caller must destroy or submit the request
-
inline virtual DevNode::ID nodeIdMin() const override
Get minimum valid Node ID for this device.
Typically devices have a contiguous valid range of node IDs
-
inline virtual uint16_t maxNodes() const override
Determine maximum number of nodes supported by the device.
- Return values:
uint16_t – 0 if device doesn’t support nodes
-
virtual DevNode::States getNodeStates(DevNode node) const override
Return the current set of states for all nodes controlled by this device.
Used to determine if, say, all nodes are ON, OFF or a combination.
-
virtual void handleEvent(IO::Request *request, Event event) override
Implementations may override this method to customise event handling.
-
struct Config
- #include <Device.h>
R421A device configuration.
-
class Factory : public IO::RS485::Device::FactoryTemplate<Device>
- #include <Device.h>
Public Functions
-
inline virtual const FlashString &deviceClass() const override
Return the Device class name, e.g. ‘r421a’.
-
inline virtual const FlashString &deviceClass() const override
-
virtual IO::Request *createRequest() override
-
class Request : public IO::Modbus::Request
- #include <Request.h>
Public Functions
-
virtual ErrorCode parseJson(JsonObjectConst json) override
Fill this request from a JSON description.
-
virtual void getJson(JsonObject json) const override
Get result of a completed request in JSON format.
-
virtual bool setNode(DevNode node) override
If nodes are supported, implement this method.
/
/**
-
virtual DevNode::States getNodeStates(DevNode node) override
Query node status from response.
-
virtual ErrorCode parseJson(JsonObjectConst json) override
-
constexpr uint8_t R421_CHANNEL_MIN = 1