端口编号如何用于接收MODBUS TCP数据包?

时间:2016-11-21 20:56:49

标签: networking port msp430 modbus-tcp

我正在我的微控制器(MSP432)上运行一个应用程序,它将数据写入以太网电缆以将其发送到PC。

我正在使用数据包发送方在MC上查看PC上端口(502)上收到的数据。 Data received on PC

正如我们在上图中所看到的,MC的端口号对于每个发送的数据包都是递增的。 达到最大数量时会发生什么? 它会在某个其他端口号重新启动并继续该过程还是会停止?

Edit1:从http://myarduinoprojects.com/modbus.html

使用的Modbus协议库

EDIT2: 每当我有一个通过MODBUS发送的新数据时调用此函数。 Mb.Req(MB_FC_WRITE_MULTIPLE_REGISTERS,0,11,0);

 if (MbmClient.connect(ServerIp,502)) {
  digitalWrite(GREEN_LED, HIGH);
#if DEBUG
  //Serial.println("connected with modbus slave");
 // Serial.print("Master : ");
  for(int i=0;i<MbmByteArray[5]+6;i++) {
    if(MbmByteArray[i] < 16){
    //Serial.print("0");
  }
    //Serial.print(MbmByteArray[i],HEX);
    if (i != MbmByteArray[5]+5) {
    //Serial.print(".");
  } else {
  //Serial.println();
  }
  }
#endif    
MbmClient.write(MbmByteArray,13+(Count*2));

MbmCounter = 0;
MbmByteArray[7] = 0;
MbmPos = Pos;
MbmBitCount = Count;

*state= true;
MbmClient.stop();
delay(100);
digitalWrite(GREEN_LED, LOW);   
} else {  

  *state= false;
  MbmClient.stop();
}

1 个答案:

答案 0 :(得分:0)

您似乎在使用this Modbus example 我从来没有使用过,但我想这是因为代码中的目标端口与your sniffing image中的目标端口相同:502

可能你反复称这种方法:

void MgsModbus::Req(MB_FC FC, word Ref, word Count, word Pos)

在此方法中,您可以看到以下行:

if (MbmClient.connect(ServerIp,502)) { 
...

因此,每次调用该函数时,都会打开一个新连接。当您通过套接字打开连接时,操作系统或网络堆栈需要选择发送TCP消息的源端口和IP地址。

这就是为什么你总是看到一个新的源端口,并且该端口正在增加。这就是所谓的短暂端口。您正在使用的TCP堆栈如何选择源端口是依赖于实现的,尽管从某个端口开始非常常见,并且每次打开连接时,它都会选择下一个可用端口。

如果堆栈编程良好,很可能你的TCP堆栈会回转并从1024开始的某个特定端口开始(前1024个端口受到限制)。我看到的代码似乎用这个函数关闭了端口:

MbmClient.stop()

您需要在使用后检查端口是否已关闭。否则,在某些时候,您将耗尽可用端口(资源泄漏)。

如果您希望套接字绑定到特定的源端口,则需要使用类似于Linux socket bind的函数

现在,更明智的方法是始终使用相同的连接。您可能需要修改该示例。