hs7624
hs7624

Reputation: 693

Modbus TCP/IP on Arduino

I am trying to implement Modbus TCP on arduino uno + ethernet shield using the following code. I am using a modbus slave simulator on a pc to check the following code. However, the code doesn't seem to be working. I have downloaded the code & the libraries from http://myarduinoprojects.com/modbus.html. Please suggest me corrections if necessary. Also is there another working example available for modbus tcp/ip on arduino.

Thanks.

#include <SPI.h>
#include <Ethernet.h>
#include "MgsModbus.h"

MgsModbus Mb;
int inByte = 0; // incoming serial byte

// Ethernet settings (depending on MAC and Local network)
byte mac[] = {0x00, 0x1A, 0xB6, 0x02, 0xD1, 0x14 };
IPAddress ip(192, 168, 0, 35);



void setup()
{

  // serial setup
  Serial.begin(9600);
  Serial.println("Serial interface started");

  // initialize the ethernet device
  Ethernet.begin(mac, ip);   // start etehrnet interface
  Serial.println("Ethernet interface started"); 

  // print your local IP address:
  Serial.print("My IP address: ");
  for (byte thisByte = 0; thisByte < 4; thisByte++) {
    // print the value of each byte of the IP address:
    Serial.print(Ethernet.localIP()[thisByte], DEC);
    Serial.print("."); 
  }
  Serial.println();

  // slave address
  Mb.remSlaveIP = (192,168,0,1);

  // Fill MbData
//  Mb.SetBit(0,false);
  Mb.MbData[0] = 1;
  Mb.MbData[1] = 2;
  Mb.MbData[2] = 3;
  Mb.MbData[3] = 4;
  Mb.MbData[4] = 5;
  Mb.MbData[5] = 6;
  Mb.MbData[6] = 0;
  Mb.MbData[7] = 0;
  Mb.MbData[8] = 0;
  Mb.MbData[9] = 0;
  Mb.MbData[10] = 0;
  Mb.MbData[11] = 0;

  // print MbData
  for (int i=0;i<12;i++) {
    Serial.print("address: "); Serial.print(i); Serial.print("Data: "); Serial.println(Mb.MbData[i]);
  }
  // print menu
  Serial.println("0 - print the first 12 words of the MbData space");
  Serial.println("1 - FC 1 - read the first 5 coils from the slave and store them in the lower byte of MbData[1]");
  Serial.println("2 - FC 2 - read the first 5 discrete inputs from the slave and store them in the higer of the MbData[1]");
  Serial.println("3 - FC 3 - read the first 5 registers from the slave and store them in MbData[3..7");
  Serial.println("4 - FC 4 - read the first 5 input registers from the slave and store them in MbData[8..12]");
  Serial.println("5 - FC 5 - write coil 0 of the slave with the bit valeu of MbData[0.0]");
  Serial.println("6 - FC 6 - write register 0 of the slave with MbData[2]");
  Serial.println("7 - FC 15 - write 5 coils of the slave starting with coil 0 with GetBit(16..20");
  Serial.println("8 - Fc 16 - write 5 registers of the slave starting on register 0 with MbData[0..4]");

  Serial.println(Mb.remSlaveIP);
}

void loop()
{
  if (Serial.available() > 0) {
    // get incoming byte:
    inByte = Serial.read();
    if (inByte == '0') {                                          // print MbData
      for (int i=0;i<12;i++) {
        Serial.print("address: "); Serial.print(i); Serial.print("Data: "); Serial.println(Mb.MbData[i]);
      }
    }  
    if (inByte == '1') {Mb.Req(MB_FC_READ_COILS,               6,6,6);} // 1 // ref, count, pos
    if (inByte == '2') {Mb.Req(MB_FC_READ_DISCRETE_INPUT,      6,6,6);} // 2
    if (inByte == '3') {Mb.Req(MB_FC_READ_REGISTERS,           6,6,6);} // 3
    if (inByte == '4') {Mb.Req(MB_FC_READ_INPUT_REGISTER,      6,6,6);} // 4
    if (inByte == '5') {Mb.Req(MB_FC_WRITE_COIL,               0,0,0);} // 5 // count can be x
    if (inByte == '6') {Mb.Req(MB_FC_WRITE_REGISTER,           7,0,0);} // 6 // count can be x
    if (inByte == '7') {Mb.Req(MB_FC_WRITE_MULTIPLE_COILS,     0,6,0);} // 15
    if (inByte == '8') {Mb.Req(MB_FC_WRITE_MULTIPLE_REGISTERS, 0,6,0);} // 16
  }

  Mb.MbmRun();
//  Mb.MbsRun();
}

Upvotes: 1

Views: 10556

Answers (2)

hs7624
hs7624

Reputation: 693

Serial monitor works fine. Following lines are printed on first debugging the program

Serial interface started Ethernet interface started My IP address: 192.168.0.35. address: 0Data: 1 address: 1Data: 2 address: 2Data: 3 address: 3Data: 4 address: 4Data: 5 address: 5Data: 6 address: 6Data: 0 address: 7Data: 0 address: 8Data: 0 address: 9Data: 0 address: 10Data: 0 address: 11Data: 0 0 - print the first 12 words of the MbData space 1 - FC 1 - read the first 5 coils from the slave and store them in the lower byte of MbData[1] 2 - FC 2 - read the first 5 discrete inputs from the slave and store them in the higer of the MbData[1] 3 - FC 3 - read the first 5 registers from the slave and store them in MbData[3..7 4 - FC 4 - read the first 5 input registers from the slave and store them in MbData[8..12] 5 - FC 5 - write coil 0 of the slave with the bit valeu of MbData[0.0] 6 - FC 6 - write register 0 of the slave with MbData[2] 7 - FC 15 - write 5 coils of the slave starting with coil 0 with GetBit(16..20 8 - Fc 16 - write 5 registers of the slave starting on register 0 with MbData[0..4] 1.0.0.0

however it seems that the TCP communication does not work since there is nothing on the serial monitor after this @graham.reeds

Upvotes: 1

Pr_123
Pr_123

Reputation: 31

I am using mgsmodbus for my modbuswork at office. What I have is a Master TI board and a Slave simulator. However I am using Wifi.h instead of ethernet.h. I am able to do all the operations.

Did you check if the ethernet connection is properly established?

If so try IBH Modbus slave simulator. That works perfect. You would have to change the setting to TCP and select the port. Sometimes the port number you are trying for could be wrong. I use port 502 which is the default one.

Also, make sure that the slave IP in the .cpp code is also changed.

Upvotes: 0

Related Questions