1

Modbus TCP/IP を使用してデバイスと通信しようとしています。C# 4.0 .NET ソケットを使用していますが、デバイスからの応答を取得する際に問題が発生しました。デバイス/ネットワークの性質上、非同期通信でなければなりません。

これで、デバイスに接続できます。コマンドが実行されるConnectと、デバイスの LED が点灯し、アクティブな接続があることを示します。次に、Sendコマンドを実行するとライトが消え (接続が失われたことを意味します)、受信しても何も得られません。さまざまなデータ パケットを試しましたが、いずれの場合も成功しませんでした。私は考えています、それSocketTypeはソケットを初期化するときの何かですか?使用しようとしているポート (現在ポート 4 を使用) でしょうか?

これが私が使用しようとした Modbus TCP/IP ドキュメントです: Modbus Documentation

ここに私のコードがあります:

sockPort = new Socket(IPAddress.Parse(_commInfo.IPAddress).AddressFamily, SocketType.Stream, ProtocolType.Tcp);   
IPEndPoint m_localhost = new IPEndPoint(IPAddress.Parse(addr.Address.ToString()), 4);    
sockPort.Bind(m_localhost);
sockPort.Connect(new IPEndPoint(IPAddress.Parse(_commInfo.IPAddress), 502));
byte[] rx = new byte[260];

byte[] data = { 0x03, 0x00, 0x20, 0x00, 0x04, 0x45, 0xf0 };

sockPort.Send(data);
var asf = sockPort.Receive(rx);
4

1 に答える 1

1

問題はおそらく、アプリケーション (modbus) プロトコルの解釈 (エンディアン、パケット レイアウトなど) にあります。wireshark を使用するtcpdump(1)、デバイスとの間で送受信されるものを把握します。その他のポイント:

  • bind(2)ソケットのローカル エンドは必要ありません。カーネルがエフェメラルローカル ポートを選択します。
  • connect(2)が完了すると、ソケットでの双方向通信の準備が整います。
  • send および receive 呼び出しからの戻り値を無視しないでください。期待値よりも小さい場合があります。

デバイス自体の動作については、メーカーのドキュメントを探し、デバイス固有のメーリング リスト、ユーザー グループ、およびフォーラムを検索するのがおそらく最善です。

お役に立てれば。

于 2012-08-23T16:01:46.970 に答える