2016-11-21 4 views
1

Ich verwende eine Anwendung auf meinem Mikrocontroller (MSP432), die Daten auf ein Ethernet-Kabel schreibt, um es an den PC zu senden.Wie funktioniert die Portnummerierung für den Empfang von MODBUS TCP-Paketen?

Ich verwende Packet Sender, um die Daten auf dem Port (502) auf dem PC von MC empfangen zu sehen.

Wie im obigen Bild zu sehen ist, werden die Portnummern von MC für jedes gesendete Paket inkrementiert. Was passiert, wenn die maximale Anzahl erreicht wird? Wird es bei einer anderen Portnummer neu starten und mit dem Prozess fortfahren oder wird es aufhören?

Edit1: Modbus-Protokoll-Bibliothek von http://myarduinoprojects.com/modbus.html

EDIT2 verwendet: einen Aufruf dieser Funktion jedes Mal machen ich eine neue Daten über MODBUS zu senden. Mb.Req (MB_FC_WRITE_MULTIPLE_REGISTERS, 0,111,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(); 
} 
+0

Gibt es eine Möglichkeit, alle TCP-Nachrichten zu sehen? Ich meine, einschließlich 3-Wege-Handshake? Wie senden Sie die Nachrichten im MC? TCP-Sockets verwenden? Oder senden Sie einfach einen Ethernet-Frame mit einem IP-Datagramm, das eine TCP-Nachricht enthält? – rodolk

+0

Ich habe eine Verbindung mit IP-Adresse (Ethernet IP am PC), Port-Nummer. Hast du das gefragt? – JKV

+0

Es sieht aus wie es eine neue Verbindung pro Nachricht verwendet, die ziemlich schlecht ist.Die Portnummern werden umgebrochen, oder wenn sie zu schnell verwendet werden, erhält der Client Bind-Fehler. – EJP

Antwort

0

Es scheint, Sie verwenden this Modbus example Ich habe noch nie mit dem gearbeitet, aber ich nehme an, dass, weil der Zielport im Code der gleiche ist, Sie haben in your sniffing image: 502

Wahrscheinlich werden Sie wiederholt aufrufen diese Methode:

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

Innerhalb dieser Methode können Sie diese Zeile sehen:

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

Also jedes Mal, wenn Sie diese Funktion aufrufen, ist eine neue Verbindung geöffnet. Wenn Sie eine Verbindung über einen Socket öffnen, muss das Betriebssystem oder der Netzwerkstack einen Quellport und eine IP-Adresse auswählen, von der die TCP-Nachricht gesendet wird.

Aus diesem Grund sehen Sie immer einen neuen Quellport und dieser Port wird größer. Dies ist ein kurzlebiger Port. Wie der Quellport von dem TCP-Stack ausgewählt wird, den Sie verwenden, ist implementierungsabhängig, obwohl es sehr üblich ist, mit einem Port zu beginnen, und bei jedem Öffnen einer Verbindung wählt er den nächsten verfügbaren Port aus.

Wenn der Stack gut programmiert ist, wird sich Ihr TCP-Stack höchstwahrscheinlich um einen bestimmten Port von 1024 aufwärts erstrecken (die ersten 1024 Ports sind eingeschränkt). Der Code, den ich gesehen habe, scheint den Port mit dieser Funktion zu schließen:

MbmClient.stop() 

Sie müssen überprüfen, dass die Ports nach der Verwendung geschlossen sind. Sonst werden Sie irgendwann keine verfügbaren Ports mehr haben (Ressourcenleck).

Wenn Sie Ihre Steckdose an einen bestimmten Quellport gebunden wollen, müssen Sie eine Funktion verwenden, ähnlich wie Linux socket bind

Nun wird ein weiser Weg ist die gleiche Verbindung die ganze Zeit zu nutzen. Möglicherweise müssen Sie dieses Beispiel ändern.

+0

Ich habe Code auf dem ursprünglichen Beitrag hinzugefügt. Also, wenn ich eine Verbindung durch Aufruf von ** MbmClient.connect (ServerIp, 502) ** mache, schließe ich auch die Verbindung. Warum verbindet es sich immer noch mit einem anderen Port? Könnten Sie mich anweisen, wie Sie den gleichen Port-Ansatz verwenden? Danke – JKV

+0

@JanakVarma, jedes Mal, wenn Ihre Anwendung eine Verbindung initiiert, wählt sie einen [ephemeren Port] (https://en.wikipedia.org/wiki/Ephemeral_port). Dies wird oft zufällig gewählt, aber Ihre TCP-Implementierung scheint das nicht zu tun. Ihre Anwendung fordert TCP auf, einen Quellport dafür zu wählen. Sie sollten TCP mitteilen, welcher Port verwendet werden soll, anstatt es TCP zu überlassen, um den Port zu wählen. –

+0

@ JanakVarma, ich denke, meine Antwort ist klar zu erklären, warum es immer einen anderen Quellport verwendet. Es verbindet sich immer mit dem gleichen Ziel-Port 502. Ich fügte mehr Worte hinzu, um es klarer zu machen. Sie können sich auch Ron Maupins Kommentar ansehen und den von ihm bereitgestellten Link lesen. – rodolk

Verwandte Themen