1

我必须使用类似于 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]);
      }
    }

这是我的客户

您可以看到字节不是连续接收的。但是我的整个数组就像对客户端的命令。有没有办法得到它:

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

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

请帮忙!

4

2 回答 2

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

上述功能将收集整个包,然后将其“发布”到您的引擎。该算法适用于您的设置的双方。(德克萨斯州硬件和个人电脑。)

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

于 2016-06-23T08:41:51.423 回答
0

谢谢伊利沙尔!

我找到了一种方法。在 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(buffer,number of elements) 帮助我在一个数据包中发送整个内容。它就像一个魅力:)

于 2016-06-23T16:37:28.017 回答