Pr_123
Pr_123

Reputation: 31

Modbus TCP - Arduino

I have to implement a Modbus TCP using a TI Launchpad board which is similar to Arduino. I have the following snippet.

MbmByteArray[0] = 0x00;
MbmByteArray[1] = 0x01;
MbmByteArray[2] = 0x00;
MbmByteArray[3] = 0x00;
MbmByteArray[4] = 0x00;
MbmByteArray[5] = 0x0B;
MbmByteArray[6] = 0x01;
MbmByteArray[7] = 0x10;
MbmByteArray[8] = 0x00;
MbmByteArray[9] = 0x00;
MbmByteArray[10] = 0x00;
MbmByteArray[11] = 0x02;
MbmByteArray[12] = 0x04;
MbmByteArray[13] = 0x00;
MbmByteArray[14] = 0x08;
MbmByteArray[15] = 0x00;
MbmByteArray[16] = 0x00;

Serial.println("Written:");
for(int i=0;i<MbmByteArray[5]+6;i++) {
  int a=0;
  a = MbmClient.write(MbmByteArray[i]);
  if(a)
  {
// if something is written to the client I check what it is !
      Serial.println(MbmByteArray[i]);
      }
    }

This is my client

You can see that the bytes are not received continuously. But my entire array is like a command to the client. Is there anyway to get it this way :

2016-06-17 14:28:00.252: Session created

2016-06-17 14:28:00.254: Session opened

2016-06-17 14:28:00.256: 17 bytes received

00 01 00 00 00 0B 01 10 00 00 00 02 04 00 07 00 00

2016-06-17 14:28:00.269: 12 bytes sent

< 00 01 00 00 00 06 01 10 00 00 00 02

Please help!

Upvotes: 1

Views: 391

Answers (2)

Pr_123
Pr_123

Reputation: 31

Thank you Illishar !

I found a way to do it. In Arduino there is a client function, that could send the entire array without sending one value at a time.

byte command[17] = {0x00,0x01,0x00,0x00,0x00,0x0B,0x01,0x10,0x00,0x00,0x00,0x02,0x04,0x00,0x07,0x00,0x00};
 MbmClient.write(command,17);

This client.write(buffer,number of elements) helps me to send the entire content in a single packet. It works like a charm :)

Upvotes: 0

Illishar
Illishar

Reputation: 916

In general, when doing communication on any given line, file or media, you risk breaking up the data. Ethernet actually has a package size (MTU) that can/will be delivered unbroken. But that's another story. It'll be better if you deal with the issue, no matter protocol, hardware or platform. (Or at least be aware of it.)

When you read your ModbusTCP, you should make something like the following pseudo:

//read all ModbusTCP header
while less than 6 bytes received and not timed out and not error
   read bytes

//read data
data_length = modbustcp_header position 5 and 6
while less than data_length and not timed out and not error
   read bytes

The above function will collect the whole package, before "releasing" it to your engine. The algorithm will work for both sides of your setup. (Both the Texas hw and the PC.)

You could also (most likely) fiddle with the TI TCP stack and make it return bigger blocks. And I guess this was what you were asking for. But again, I wouldn't recommend going down that road.

Upvotes: 1

Related Questions