This is an Arduino library for communicating with Modbus slaves over RS232/485 (via RTU protocol). Updated to support Arduino 1.6.
The following Modbus functions have been implemented:
Discrete Coils/Flags
- 0x01 - Read Coils
- 0x02 - Read Discrete Inputs
- 0x05 - Write Single Coil
- 0x0F - Write Multiple Coils
Registers
- 0x03 - Read Holding Registers
- 0x04 - Read Input Registers
- 0x06 - Write Single Register
- 0x10 - Write Multiple Registers
- 0x16 - Mask Write Register
- 0x17 - Read Write Multiple Registers
Arduinos prior to the Mega have one serial port which must be connected to USB (FTDI) for uploading sketches and to the RS232/485 device/network for running sketches. You will need to disconnect pin 0 (RX) while uploading sketches. After a successful upload, you can reconnect pin 0.
This library has been tested with an Arduino Duemilanove, PHOENIX CONTACT nanoLine controller, connected via RS485 using a Maxim MAX488EPA transceiver.
Arduino 17 (or later):
Determine the location of your sketchbook by selecting File > Preferences from within the Arduino IDE. If you don't already have a libraries folder within your sketchbook, create one and unzip the archive there. See this for more information.
Arduino 16 (or earlier):
Download the zip file, extract and copy the ModbusMaster folder to ARDUINO_HOME/hardware/libraries. If you are upgrading from a previous version, be sure to delete ModbusMaster.o.
Please report any bugs on the Issue Tracker.
I can be contacted at 4-20ma at wvfans dot net.
The library contains a few sketches that demonstrate use of the ModbusMaster library. You can find these in the examples folder.
/* Basic.pde - example using ModbusMaster library This file is part of ModbusMaster. ModbusMaster 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, either version 3 of the License, or (at your option) any later version. ModbusMaster 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 ModbusMaster. If not, see <http://www.gnu.org/licenses/>. Written by Doc Walker (Rx) Copyright © 2009-2013 Doc Walker <4-20ma at wvfans dot net>*/
#include<ModbusMaster.h>// instantiate ModbusMaster object as slave ID 2// defaults to serial port 0 since no port was specified
ModbusMaster node(2);
voidsetup()
{
// initialize Modbus communication baud rate
node.begin(19200);
}
voidloop()
{
staticuint32_t i;
uint8_t j, result;
uint16_t data[6];
i++;
// set word 0 of TX buffer to least-significant word of counter (bits 15..0)
node.setTransmitBuffer(0, lowWord(i));
// set word 1 of TX buffer to most-significant word of counter (bits 31..16)
node.setTransmitBuffer(1, highWord(i));
// slave: write TX buffer to (2) 16-bit registers starting at register 0
result = node.writeMultipleRegisters(0, 2);
// slave: read (6) 16-bit registers starting at register 2 to RX buffer
result = node.readHoldingRegisters(2, 6);
// do something with data if read is successfulif (result == node.ku8MBSuccess)
{
for (j = 0; j < 6; j++)
{
data[j] = node.getResponseBuffer(j);
}
}
}Project inspired by Arduino Modbus Master.