Modbus TCP - Arduino

时间:2016-06-22 18:22:31

标签: c arduino modbus modbus-tcp

我必须使用类似于Arduino的TI Launchpad板来实现Modbus TCP。我有以下代码段。

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

您可以看到不会连续接收字节。但我的整个数组就像是对客户端的命令。无论如何都有这样的方式:

2016-06-17 14:28:00.252:会话已创建

2016-06-17 14:28:00.254:会议开幕

2016-06-17 14:28:00.256:收到17个字节

  

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个字节

&LT; 00 01 00 00 00 06 01 10 00 00 00 02

请帮忙!

2 个答案:

答案 0 :(得分:1)

通常,在任何给定的行,文件或媒体上进行通信时,您可能会分散数据。以太网实际上具有可以/将要不间断地传送的包大小(MTU)。但这是另一个故事。如果你处理这个问题,无论是协议,硬件还是平台,它会更好。 (或者至少要注意它。)

当您阅读ModbusTCP时,您应该使用以下伪代码:

//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

上述功能将在将“释放”到发动机之前收集整个包裹。该算法适用于您的设置的两个方面。 (德克萨斯州的hw和PC都有。)

您也可能(很可能)摆弄TI TCP堆栈并使其返回更大的块。我想这就是你要求的。但同样,我不建议走那条路。

答案 1 :(得分:0)

谢谢Illishar!

我找到了办法。在Arduino中有一个客户端函数,它可以发送整个数组而不会一次发送一个值。

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

这个client.write(缓冲区,元素数量)帮助我在一个数据包中发送整个内容。它就像一个魅力:)