Code examples and extended information

For more information about the Waspmote hardware platform go to:

http://www.libelium.com/waspmote

http://www.libelium.com/development/waspmote

In the Waspmote Development section you can find complete examples:

http://www.libelium.com/development/waspmote/examples

Example:

/*
 *  ------ [RS-485_12] - Modbus Registers Map --------
 *
 *  This sketch shows the use of the Modbus communication protocol over
 *  RS-485 standard, and the use of the main functions of the library.
 *  Modbus allows for communication between many devices connected
 *  to the same network. There are many variants of Modbus protocols,
 *  but Waspmote implements the RTU format. Modbus RTU is the most
 *  common implementation available for Modbus.
 *
 *  Copyright (C) 2016 Libelium Comunicaciones Distribuidas S.L.
 *  http://www.libelium.com
 *
 *  This program 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.
 *
 *  This program 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 program. If not, see <http://www.gnu.org/licenses/>.
 *
 *  Version:           3.1
 *  Design:            David Gascón
 *  Implementation:    Ahmad Saad
 */

///////////////////////////////////////////////////////////////////////////////
// RS-485 Modbus parameters
///////////////////////////////////////////////////////////////////////////////

// Include these libraries for using the RS-485 and Modbus functions
#include <ModbusMaster.h>

// TABLE contents
#define NAME 0
#define ADDRESS 1
#define BYTES 2
#define FCODE 3

// Define the size of the TABLE
#define NUM_REGISTERS 5
#define NUM_PARAMETERS 4

// Registers names
#define SERIALNUMBER 0
#define SOFTVERSION 1
#define MODBUSADDRESS 2
#define TEMPERATURE 3
#define HUMIDITY 4

// Function codes used
#define READ_HOLDING_REGISTERS 0x03


// Modbus Table Registers
static const int TABLE[NUM_REGISTERS][NUM_PARAMETERS] =
{
  // NAME,         ADDRESS,  BYTES,   FCODE
  { SERIALNUMBER,     0,      4,    READ_HOLDING_REGISTERS } ,
  { SOFTVERSION,      4,      2,    READ_HOLDING_REGISTERS } ,
  { MODBUSADDRESS,    6,      2,    READ_HOLDING_REGISTERS } ,
  { TEMPERATURE,    101,      2,    READ_HOLDING_REGISTERS } ,
  { HUMIDITY,       304,      2,    READ_HOLDING_REGISTERS }
};

// Default address of Modbus device
#define DEFAULTADDRESS 254

// Instantiate ModbusMaster object as slave ID 254
ModbusMaster node(DEFAULTADDRESS);

// Variable to store the results of Modbus communication
int result;

// Serial monitor messages
static const char* messages[] =
{
  "SERIAL NUMBER",
  "SOFTWARE VERSION",
  "MODBUS ADDRESS",
  "TEMPERATURE",
  "HUMIDITY",
};

void setup()
{
  // Initialize USB port for debugging
  USB.ON();
  USB.println(F("Modbus table registers example"));

  // Initialize Modbus communication baud rate
  node.begin(19200);
}


void loop()
{
  // Initial message
  USB.println(F("Reading Modbus device..."));
  USB.println(F("*****************************************"));

  // This loop will read all the registers
  // And prints in the serial monitor the results
  for ( int i = SERIALNUMBER ; i <= HUMIDITY; i++) {
    // General function to read registers
    result = node.readRegisters(TABLE[i][ADDRESS] , TABLE[i][BYTES], TABLE[i][FCODE]);

    // result = 0: no errors
    // result != 0: error occurred
    if (result !=0) {
      // If no response from the slave, print an error message
      USB.print(F("Communication error while trying to read"));
      USB.println(messages[i]);
      USB.print(F("Result: "));
      USB.println(result);
      delay(100);
    }
    else {
      USB.print(messages[i]);
      USB.print(F(" => "));

      // Some registers return more than one value
      for (int i = 0; i < node.available(); i++)
      {
        USB.print(node.getResponseBuffer(i) , DEC);
      }
    }
    USB.println();
  }

  USB.println(F("*****************************************"));
  USB.println();
  delay(10000);
}

Last updated