2016-11-21 228 views
1

我在我的微控制器(MSP432)上運行一個應用程序,它將數據寫入以太網電纜並將其發送到PC。端口編號如何工作以接收MODBUS TCP數據包?

我正在使用數據包發件人查看從MC上的PC端口(502)上收到的數據。 Data received on PC

正如我們在上圖中看到的,MC的端口號對於每個發送的包都是遞增的。 達到最大數量時會發生什麼? 它會重新啓動其他端口號並繼續進行或停止?從http://myarduinoprojects.com/modbus.html

EDIT2使用Modbus協議庫:

EDIT1 使這一功能,每次我有一個新的數據通過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(); 
} 
+0

有沒有辦法看到所有的TCP消息?我的意思是包括3次握手?在MC中,你如何發送消息?使用TCP套接字?或者只是發送一個包含含有TCP消息的IP數據報的以太網幀? – rodolk

+0

我使用IP地址(PC上的以太網IP),端口號進行了連接。那是你問的嗎? – JKV

+0

它看起來像是每個消息使用一個新的連接,這是非常糟糕的。端口號將環繞,或者如果它們使用得太快,客戶端將會出現綁定錯誤。 – EJP

回答

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

現在,一個更明智的方法是用所有的時間相同的連接。您可能需要修改該示例。

+0

我在原帖中添加了代碼。 因此,只要我通過調用** MbmClient.connect(ServerIp,502)**來建立連接,我也將關閉連接。那麼爲什麼每次都連接到不同的端口呢? 您可以指導我如何繼續使用相同的端口方法。謝謝 – JKV

+0

@JanakVarma,每當您的應用程序啓動連接時,它都會選擇一個[臨時端口](https://en.wikipedia.org/wiki/Ephemeral_port)。這通常是隨機選擇的,但你的TCP實現似乎不是這樣做的。你的應用程序要求TCP爲它選擇一個源端口。您可以告訴TCP要使用哪個端口,而不是將其留給TCP來選擇端口。 –

+0

@JanakVarma,我認爲我的回答很明顯,解釋了爲什麼它總是使用不同的源端口。它始終連接到相同的目標端口502.我添加了更多的措辭,試圖使其更清晰。你也可以看看Ron Maupin的評論,並閱讀他提供的鏈接。 – rodolk