4

イーサネット経由で工場設備と通信するために、.Net/C# でコードを書いています。最初にハンドラーを割り当てます。

  _TCPConn.BeginReceive(
      _StateObject.sBuffer, 0, _StateObject.sBuffer.Length, SocketFlags.None,
      new AsyncCallback(Socket_DataArrival), _StateObject);

そして、ハンドラーで、最初にEndReceiveを実行し、ソケットのバッファーから自分の入力バッファーにデータを転送して、後でさらに処理しますハンドラを終了します。そう ...

....
   StateObject stateObject = (StateObject)ar.AsyncState;        
   int bytesReceived = stateObject.sSocket.EndReceive(ar);

// transfer bytes, log stuff,  then reenable receive and leave . . . 

   _TCPConn.BeginReceive(   _StateObject.sBuffer, 0,
   _StateObject.sBuffer.Length, SocketFlags.None,
   new AsyncCallback(Socket_DataArrival), _StateObject);

   return;

これはほとんどの場合問題なく動作しますが、工場の機器が 2 つのパケットを近接して送信すると失敗します。これは Wireshark (ネットワーク スニファー) の出力です。最初の列は、マイクロ秒単位の前のパケットからの時間差です (はい、「マイクロ」であり、「ミリ」ではありません)

002397  10.1.1.116  10.1.2.11  TCP  ....  Len=6
000024  10.1.1.116  10.1.2.11  TCP  ....  Len=9

これが発生すると、最初のパケットが消えたように見えます。ハンドラーは 6 バイトのパケットに対して呼び出されることはなく、9 バイトのパケットに対してのみ呼び出されます。Wireshark がそれを示しているので、パケットが PC に到着していることがわかります。

しかし、工場の設備に遅延を導入すると、24 マイクロ秒ではなく 10 ミリ秒になり、問題はなくなります。残念ながら、それは解決策ではありません。なぜなら、世界中の工場に設置された機器の大規模な基盤があり、私たちが変更することはできません.

これをデバッグして修正する方法について何か提案はありますか? 前もって感謝します!

4

1 に答える 1

0

なぜあなたはEndReceive(ar)をしているのですか?受信したパケットを個別に処理します。受信を停止する必要はありません。

于 2013-04-24T12:43:43.690 に答える