2016-11-21 21 views
1

マイクロコントローラ(MSP432)でアプリケーションを実行していますが、データをイーサネットケーブルに書き込んでPCに送信します。MODBUS TCPパケットを受信するポート番号はどのように機能しますか?

私は、パケット送信者を使用して、MCからPC上のポート(502)で受信したデータを表示しています。 Data received on PC

上記の図から分かるように、MCのポート番号は送信されるパケットごとに増分されます。 最大数に達するとどうなりますか? 他のポート番号で再起動し、処理を続行するか、停止しますか?

EDIT1:私はMODBUS経由で送信するための新たなデータを持って、この関数たびに電話をかける :http://myarduinoprojects.com/modbus.html

から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(); 
} 
+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に任せるのではなく、どのポートを使用するかをTCPに伝える必要があります。 –

+0

@ JanakVarma、私は自分の応答が、常に異なるソースポートを使用している理由を明確に説明していると思います。常に同じ宛先ポート502に接続しています。私は、より明確にするために、より多くの言葉を追加しました。 Ron Maupinのコメントを見て、彼が提供したリンクを読むこともできます。 – rodolk

関連する問題