Help for Modbus TCP/IP on Arduino

Hi,
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();
}

The code does something. At the very least, it produces some serial output. Without knowing what it actually does, we can't possibly help you make it do what you want (which you also failed to define).

I have used modbus slave simulator from the following website http://www.modbustools.com/download.html.

What I expect is that the data in the slave(server) simulator of PC should be displayed on the serial monitor of Arduino IDE.

Is there anything else that isn't clarified? Please let me know.

Thanks.

Is there anything else that isn't clarified?

What does the program ACTUALLY do?

This is what is stated on the website: http://myarduinoprojects.com/modbus.html

"The Modbus functions 1, 2, 3, 4, 5, 6 15 and 16 are implemented. The port 502 is used as standard. The library uses a single data space for all the Modbus data. This means that all the Modbus data spaces are overlapping and all starting with 0 (zero). This means that several Modbus functions can reach the same data. The user must assign the correct Modbus address to the data."

I am trying to use arduino as Modbus TCP client(Master) and display data from Modbus slave simulator on arduino serial monitor using this code.

I am not sure how it is implemented using this sample code and library as I am new to arduino.

Please go through the above link and code and help me with your suggestions.

Thanks.

Please go through the above link and code and help me with your suggestions.

I don't think so. YOU need to run the program on the Arduino and tell us what it actually does. Like I said, at the least, it produces some serial output. Share that!

It prints this

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

It prints this

Some println() calls in place of print() calls would be good, then.

The Arduino program appears to be working. Why do you think it is not?

komalhm: I am trying to use arduino as Modbus TCP client(Master) and display data from Modbus slave simulator on arduino serial monitor using this code.

Hi PaulS,

Yes, it does print data on the serial port only once when programmed. However it does not print Modbus TCP slave simulator data when slave updates.

So I am assuming Modbus TCP portion is not working. Can you please confirm?

Thanks.

1.) What is: "Modbus TCP slave simulator data"

Is this a 'feed'? a web service? an API?

This URL: "http://myarduinoprojects.com/modbus.html" (to me at least) doesnt provide us with ANYTHING..

Have you set the correct ports and address for this?

I also need solution for this. If you found the solution please share to me.