FINSコマンドをPC(C#.NET)からPLC Ethernetモジュール(Omron)にUDP経由で送信しようとしましたが、PLCから応答が得られず、トラブルシューティングを開始できます。C#からPLCにFINSコマンドを送信する
PLCは、次のように非常に単純なラダーロジックを持っています DM100
は#0001
の価値を持っている場合、出力101.00
でトリガ。 (ここでは、「トリガー」は、メモリ領域D100
のためだけのシンボル名で、「出力」は出力101.00
のシンボルである)
それから私は、「メモリ領域を書く」のFINSコマンドを実行C#のの作品を書きましたコマンドコードが01 02
であり、開始アドレス、書き込まれるアイテムの数、およびデータが続く。 C#コードは、PLCのD100
領域に#0001
の値を書き込み、101.00
でONにトリガする必要があります。
[動作しません削除されたコード] ..
出力101.00
がトリガされませんでした、また私は、任意の例外を受け取ります。 私は次のことを確認しましたています
- ポート、CX-Programmerの中で「オンライン作業」によって確認されたように正しく構成されたノードとアドレスを。また、各IPにpingを実行して、ノードが接続されていることを確認します。
UdpClient
のコードは、パケットを正常に送受信する非常に単純なサーバー/クライアントコードを書いたので有効です。- ラダーロジックに問題はありません。私はラダーを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();
メモリは、はい、4バイトです。したがって、2つの配列アイテム1つと0x00と0x64が一緒に4バイトあります。各 "セクション"は16ビットしか取らないからです。 – KMC
@KMC:私はそれが与えられたページのように見えると思っているものに基づいて 'データ'部分を拡張しました。助けてくれますか? – porges