6

PC(C#.NET)からPLCイーサネットモジュール(Omron)にUDPを介してFINSコマンドを送信しようとしましたが、PLCから応答がなく、トラブルシューティングを開始できる手がかりがありません。

PLCには、次のような非常に単純なラダーロジックがあります。DM100の値がの場合#0001、出力でトリガーします101.00。(ここで、「トリガー」はメモリ領域の単なるシンボル名でD100あり、「出力」は出力のシンボルです101.00ここに画像の説明を入力してください

次に、コマンドコードが「MemoryArea Write」のFINSコマンドを実行するC#を作成し01 02、その後に開始アドレス、書き込み項目数、データを記述しました。C#コードは、オンをトリガーする0001ためにPLCの領域に#の値を書き込む必要があります。D100101.00

[機能しない削除されたコード]..

出力101.00がトリガーされず、例外も発生しませんでした。私は次のことを確認しました:

  1. ポート、ノード、およびアドレスは、CX-Programmerの「WorkOnline」で確認されたとおりに正しく構成されています。また、ノードが接続されていることを確認するために、各IPにpingを実行しました。
  2. UdpClientパケットを正常に送受信する非常に単純なサーバー/クライアントコードを記述したので、コードは有効です 。
  3. ラダーロジックは問題ありません。ラダーをPLCに転送し、モニターモードでWork Onlineを使用してテストし、D100手動で値を設定しました。

配列に間違いがあるのではないかfins_cmndと思いますが、私のコードに見られるように、各値について可能な限り詳細にコメントしています。私はおそらく自分が何かを逃しているのを見つけることができません。16進数を正しく解析していない可能性があると思いますが、繰り返しになりますが、私をガイドする例外はありません。

どこでどのようにトラブルシューティングできるかわかりません。FINSプログラミングまたはPLCの経験を持つ誰かが私に助けを提供してくれることを願っています。

[回答] リンクを提供してくれたPorge
に 感謝します-それで問題が見つかりました。いくつかのトレイルの後、最終的にそれを機能させます。動作するコードについては、以下を参照してください。

string SERV_IP_ADDR = "192.168.250.1";
const int FINS_UDP_PORT = 9600;

byte[] sendPacket = new byte[]
{
    // Full UDP packet: 80 00 02 00 00 00 00 05 00 19 01 02 82 00 64 00 00 01 00 01

    // Header
    0x80, //0.(ICF) Display frame information: 1000 0001
    0x00, //1.(RSV) Reserved by system: (hex)00
    0x02, //2.(GCT) Permissible number of gateways: (hex)02
    0x00, //3.(DNA) Destination network address: (hex)00, local network
    0x00, //4.(DA1) Destination node address: (hex)00, local PLC unit
    0x00, //5.(DA2) Destination unit address: (hex)00, PLC
    0x00, //6.(SNA) Source network address: (hex)00, local network
    0x05, //7.(SA1) Source node address: (hex)05, PC's IP is 192.168.250.5
    0x00, //8.(SA2) Source unit address: (hex)00, PC only has one ethernet
    0x19, //9.(SID) Service ID: just give a random number 19

    // Command
    0x01, //10.(MRC) Main request code: 01, memory area write
    0x02, //11.(SRC) Sub-request code: 02, memory area write

    // PLC Memory Area
    0x82, //12.Memory area code (1 byte): 82(DM)

    // Address information
    0x00, //13.Write start address (2 bytes): D100
    0x64, 
    0x00, //15.Bit address (1 byte): Default 0
    0x00, //16.No. of items (2 bytes): only one address which is D100
    0x01,

    // Write Data
    0x00, //18.Data to write (2 bytes): value is 1
    0x01,
};  

UdpClient client = new UdpClient(); //create a UdpClient instance

try
{
    client.Send(sendPacket, sendPacket.Length, SERV_IP_ADDR, FINS_UDP_PORT);
}
catch (SocketException se)
{
    Console.WriteLine(se.ErrorCode + ": " + se.Message);
}

client.Close();
4

1 に答える 1

6

これらの文字列はいずれも 16 進数として解析されません。NumberStyles.AllowHexSpecifier 16 進数のプレフィックス「0x」を許可しますが、存在しない限り、数値を 16 進数として解析しません。

だからあなたはしたいでしょう(char)Int16.Parse("0x64", NumberStyles.AllowHexSpecifier)

ただし、C# の数値リテラルは 16 進数にすることができるため、すべてを実行する代わりに、代わりに記述できます0x64

プロトコルのリファレンスとしてこのページを見ただけですが、Unicode コード ポイントを指定して ASCII としてバイトにデコードするよりも、メッセージをバイトとして直接作成する方がよいでしょう。配列指定構文を使用して、多くの混乱を取り除くこともできます。

var message = new byte[]
{
    // header
    0x80, //(ICF) Display frame information: 1000 0001
    0x00, //(RSV) Reserved by system: (hex)00
    0x02, //(GCT) Permissible number of gateways: (hex)02
    0x00, //(DNA) Destination network address: (hex)00, local network
    0x00, //(DA1) Destination node address: (hex)00, local PLC unit
    0x00, //(DA2) Destination unit address: (hex)00, PLC
    0x00, //(SNA) Source network address: (hex)00, local network
    0x05, //(SA1) Source node address: (hex)05, PC's IP is 192.168.250.5
    0x00, //(SA2) Source unit address: (hex)00, PC only has one ethernet
    0x19, //(SID) Service ID: just give a random number 19

    // command
    0x01, //(MRC) Main request code: 01, memory area write
    0x02, //(SRC) Sub-request code: 02, memory area write

    // data
    0x82, //Memory area code, 2 bytes: 82(DM)
    0x00, //Write start address DM100
    0x64,
    0x00,
    0x00, //Word write: only one address
    0x01,
    0x00, //Write value of 1 to address DM100 (0000 0000 0000 0001)
    0x01, // - this value is 0xaabbccdd -> cc dd aa bb
    0x00, 
    0x00, 
};

また、データ セクションに問題があるようです。リンクされたドキュメントによると、メモリ アドレスは 4 バイト、書き込み長は 2 バイト、値はそれぞれ 4 バイトである必要があります。これらはあなたが持っているものと一致しないので、そのセクションを拡張しました。

于 2012-03-14T04:08:02.213 に答える