2012-03-14 83 views
6

FINSコマンドをPC(C#.NET)からPLC Ethernetモジュール(Omron)にUDP経由で送信しようとしましたが、PLCから応答が得られず、トラブルシューティングを開始できます。C#からPLCにFINSコマンドを送信する

PLCは、次のように非常に単純なラダーロジックを持っています DM100#0001の価値を持っている場合、出力101.00でトリガ。 (ここでは、「トリガー」は、メモリ領域D100のためだけのシンボル名で、「出力」は出力101.00のシンボルである) enter image description here

それから私は、「メモリ領域を書く」のFINSコマンドを実行C#のの作品を書きましたコマンドコードが01 02であり、開始アドレス、書き込まれるアイテムの数、およびデータが続く。 C#コードは、PLCのD100領域に#0001の値を書き込み、101.00でONにトリガする必要があります。

[動作しません削除されたコード] ..

出力101.00がトリガされませんでした、また私は、任意の例外を受け取ります。 私は次のことを確認しましたています

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

私はそこfins_cmnd配列に誤りがあるが、私のコードに見られるように、私はそれぞれの値にできるだけ詳しくとしてコメントしている疑いがあります。私はおそらく自分が何かを逃しているとは思えない。私は正しく16進数を解析していない可能性がありますが、再び私は私を導く例外はありません。

トラブルシューティングの場所と方法についてはわかりません。プログラマやPLCの経験FINSとここに誰かが私にいくつかの助けを提供することができます願っています。

[ANSWER]
おかげ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(); 

答えて

6

これらの文字列のいずれも16進数として解析されません。 NumberStyles.AllowHexSpecifierは、に16進数のプレフィックス "0x"を付けますが、存在しない場合は16進数として解析しません。

だから、(char)Int16.Parse("0x64", NumberStyles.AllowHexSpecifier)が必要です。

しかし、C#の数値リテラルは16進数にすることができるので、代わりに0x64と書くことができます。

プロトコルについてはthis page as a referenceを見てきましたが、Unicodeコードポイントを指定してASCIIとしてバイトにデコードするのではなく、メッセージをバイトとして直接作成する方がよいでしょう。 4バイト、書き込みでなければなりませんメモリアドレスリンクされたドキュメントによると - あなたのデータセクションといくつかの問題があるようですが、また見え

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, 
}; 

:あなたはまた、混乱の多くを削除するには、アレイの仕様構文を使用することができます長さは2バイト、値はそれぞれ4バイトです。これらはあなたが持っているものと一致しないので、私はそのセクションを拡張しました。

+0

メモリは、はい、4バイトです。したがって、2つの配列アイテム1つと0x00と0x64が一緒に4バイトあります。各 "セクション"は16ビットしか取らないからです。 – KMC

+0

@KMC:私はそれが与えられたページのように見えると思っているものに基づいて 'データ'部分を拡張しました。助けてくれますか? – porges

関連する問題