イーサネット経由で工場設備と通信するために、.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 ミリ秒になり、問題はなくなります。残念ながら、それは解決策ではありません。なぜなら、世界中の工場に設置された機器の大規模な基盤があり、私たちが変更することはできません.
これをデバッグして修正する方法について何か提案はありますか? 前もって感謝します!