Modbus TCP

Giampiero Baggiani edited this page Oct 29, 2018 · 33 revisions

This sketch implements a fully functional standard Modbus TCP server, configurable via serial console, to monitor and control all I/O lines of Iono.
It is compatible with Iono Arduino Ethernet and with Iono MKR + Arduino MKR WiFi 1010.

You can find it here.

Console

Initial configuration of the network parameters requires any serial communication application (e.g. the Serial Monitor of the Arduino IDE) a USB cable and, for Arduino Ethernet, the USB Serial Adapter.

Set the serial port speed to 9600, 8 bits, no parity, no flow-control and connect to the Arduino’s serial port or USB.

When you connect, the configuration console is displayed:

=== Sfera Labs - Modbus TCP server configuration menu - v2.0 ===
0. Print current configuration
1. MAC address (Eth only)
2. IP address
3. Network mask
4. DNS address
5. Default gateway
6. WiFi SSID
7. WiFi Password
8. Save configuration and restart
Type a menu number [0-8]: 0

Current network configuration:
MAC address (Eth only): 90.A2.DA.0E.D5.8C
IP address: 192.168.1.240
IP address assigned: 192.168.1.240
Network mask: 255.255.255.0
DNS address: 192.168.1.1
Default gateway: 192.168.1.1
WiFi SSID: MyWiFi
WiFi Password: S3cr3tK3y

This sketch does not support dynamically assigned (DHCP) addresses.

With Iono Arduino Ethernet you need to manually enter the MAC address of the board, while with Iono MKR you need to specify the SSID and the password of the WiFi network to use.

Enter 8 to review the configuration and confirm to save it. When the new configuration is saved, Arduino will automatically reset and restart with the new configuration.

From this point Iono will accept Modbus TCP requests on the standard 502 TCP/IP port on any Modbus address.

The configuration is permanently stored in the Arduino’s EEPROM/Flash memory and retained across restarts and power cycles.

Modbus address tables and functions

Relays

Use Modbus function Read Coils, at coil address 1 to 6, to read the status of the last command given to the output relays. Because the relays are latching, the status will return zero at boot, regardless of the actual position of the relays’ contacts.

Use functions Write Single Coil or Write Multiple Coils to control the relays output.

Address (decimal) Size [bit] Description R/W Functions
1 6 command output relays r/w 1,15
1 1 command relay 1 r/w 1,5,15
2 1 command relay 2 r/w 1,5,15
3 1 command relay 3 r/w 1,5,15
4 1 command relay 4 r/w 1,5,15
5 1 command relay 5 r/w 1,5,15
6 1 command relay 6 r/w 1,5,15

Analog (PWM) output

Use Modbus function Read Holding Registers at address 601 to read the status of the analog output AO1. The returned value is in mV, so the value range is 0 to 10000.

Use function Write Single Register to control the voltage output of AO1.

Address (decimal) Size [word] Description R/W Functions Type Range Unit
601 1 write analog voltage output AO1 r/w 3,6 unsigned short 0 - 10000 V/1000

Digital inputs

Digital inputs DI1 to DI6 can be read at two different address ranges, using function Read Discrete Inputs. Reading addresses 101 to 106 returns the value of the input pins filtered with a de-bounce function. This filter has a 50 ms time constant, so that a value change is reported only after being stable for at least 50 milliseconds.

Reading addresses 111 to 116 returns the instantaneous value of the input pins, with no de-bounce filter applied.

Address (decimal) Size [bit] Description R/W Functions
101 6 read digital inputs (with de-bounce) r 2
101 1 read digital input DI1 (with de-bounce) r 2
102 1 read digital input DI2 (with de-bounce) r 2
103 1 read digital input DI3 (with de-bounce) r 2
104 1 read digital input DI4 (with de-bounce) r 2
105 1 read digital input DI5 (with de-bounce) r 2
106 1 read digital input DI6 (with de-bounce) r 2
111 6 read digital inputs (no de-bounce) r 2
111 1 read digital input DI1 (no de-bounce) r 2
112 1 read digital input DI2 (no de-bounce) r 2
113 1 read digital input DI3 (no de-bounce) r 2
114 1 read digital input DI4 (no de-bounce) r 2
115 1 read digital input DI5 (no de-bounce) r 2
116 1 read digital input DI6 (no de-bounce) r 2

Analog inputs and digital counters

Use Modbus function Read Input Registers to read the values of analog inputs. Reading addresses 201 to 204 returns the voltage on AV1 to AV4 in mV, from 0 to 10000. Reading addresses 301 to 304 returns the current on AI1 to AI4 in mA/1000 (microAmperes), from 0 to 20000.

This sketch also implements counters on digital inputs. Reading input registers at address 1001 to 1006 returns unsigned short values from 0 to 65535. These counters are incremented by one (and rolled back to 0 after reaching 65535) on the positive rise of their respective inputs, after the de-bounce filter.

Address (decimal) Size [word] Description R/W Functions Type Range Unit
201 4 read analog voltage inputs r 4
201 1 read analog voltage input AV1 r 4 unsigned short 0-10000 V/1000
202 1 read analog voltage input AV2 r 4 unsigned short 0-10000 V/1000
203 1 read analog voltage input AV3 r 4 unsigned short 0-10000 V/1000
204 1 read analog voltage input AV4 r 4 unsigned short 0-10000 V/1000
301 4 read analog current inputs r 4
301 1 read analog current input AI1 r 4 unsigned short 0-20000 mA/1000
302 1 read analog current input AI2 r 4 unsigned short 0-20000 mA/1000
303 1 read analog current input AI3 r 4 unsigned short 0-20000 mA/1000
304 1 read analog current input AI4 r 4 unsigned short 0-20000 mA/1000
1001 6 read digital inputs counters r 4
1001 1 read digital input DI1 counter r 4 unsigned short 0-65535 n/a
1002 1 read digital input DI2 counter r 4 unsigned short 0-65535 n/a
1003 1 read digital input DI3 counter r 4 unsigned short 0-65535 n/a
1004 1 read digital input DI4 counter r 4 unsigned short 0-65535 n/a
1005 1 read digital input DI5 counter r 4 unsigned short 0-65535 n/a
1006 1 read digital input DI6 counter r 4 unsigned short 0-65535 n/a
You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.
Press h to open a hovercard with more details.