FinsMes
ダウンロード
関連資料
FinsMesの説明はFinsMesのページを参照してください
FINS通信の説明はFINSメッセージ通信を参照してください
FINSコマンドの説明はCJ1W-ETN21にあるマニュアルの
通信コマンドリファレンスマニュアルとEthernetユニットユーザーズマニュアル(アプリケーション構築編)を参照してください
Osd.Omron.Finsクラス
コンストラクター
| Fins() | Finsクラスの新しいインスタンスを初期化します |
プロパティ
| MessageLog | 通信ログを取得します |
| ClientFinsAddress | 送信元FINSアドレスの設定と取得をします |
| ServerFinsAddress | 送信先FINSアドレスの設定と取得をします |
メソッド
| Connect(string, bool) | 接続先IPアドレスを指定してUDPまたはTCPで接続 |
| Close() | 接続を終了 |
| SendCommand(byte[]) | 接続しているホストにFINSコマンドを送信 |
| MemOffset(string, short) | メモリのアドレス表記をFINSコマンドのメモリ指定方法に変換 |
| read(string, int) | メモリエリアの読出し (0101) |
| write(string, byte[]) | メモリエリアの書込み (0102) |
| fill(string, int, byte[]) | メモリエリアの一括書込み (0103) |
| MultiRead(string) | メモリエリアの複合読出し (0104) |
| run(byte) | 運転モード変更 (0401) |
| stop() | 運転停止 (0402) |
| ReadUnitData() | CPUユニット情報の読出し (0501) |
| ReadUnitStatus() | CPUユニットステータスの読出し (0601) |
| ReadCycleTime() | サイクルタイム読出し (0620) |
| Clock() | 時間情報読出し (0701) |
| SetClock() | 時間情報書込み (0702) |
| ErrorClear(byte[]) | 異常解除 (2101) |
| ErrorLogRead(int, int) | 異常履歴読出し (2102) |
| ErrorLogClear() | 異常履歴クリア (2103) |
| WordToBin(byte[]) | バイト配列を2進数の0または1で表す文字列型に変換 |
| toBitArray(byte[]) | バイト配列をBitArray型に変換 |
| toBoolArray(byte[]) | バイト配列をBool型の配列に変換 |
| toInt16(byte[]) | バイト配列をInt16型の配列に変換 |
| toInt32(byte[]) | バイト配列をInt32型の配列に変換 |
| toInt64(byte[]) | バイト配列をInt64型の配列に変換 |
| toUInt16(byte[]) | バイト配列をUInt16型の配列に変換 |
| toUInt32(byte[]) | バイト配列をUInt32型の配列に変換 |
| toUInt64(byte[]) | バイト配列をUInt64型の配列に変換 |
| toFloat(byte[]) | バイト配列をFloat型の配列に変換 |
| toDouble(byte[]) | バイト配列をDouble型の配列に変換 |
| toString(byte[]) | バイト配列をString型に変換 |
コンストラクター
名前空間:Osd.Omron
アセンブリ:fins.dll
Finsクラスの新しいインスタンスを初期化します
public Fins();
Osd.Omron.Fins fins = new Osd.Omron.Fins();
プロパティ
Fins.MessageLogプロパティ
通信ログを取得します
public string MessageLog{ get; };
DM0の値を読出したときのコマンドとレスポンスを取得する例です
public staic viod ReadMemory()
{
Osd.Omron.Fins fins = new Osd.Omron.Fins();
fins.ServerFinsAddress = new byte[3] {0, 1, 0};
fins.ClientFinsAddress = new byte[3] {0, 10, 0}
fins.Connect("192.168.0.20");
byte[] res = fins.read("D0", 1);
string text = fins.MessageLog;
Console.WriteLine(text);
//[UDP]-> 80-00-02-00-14-00-00-0A-00-01-01-01-82-00-00-00-00-01
//[UDP]<- C0-00-02-00-0A-00-00-14-00-01-01-01-00-00-12-34
}
Fins.ClientFinsAddressプロパティ
送信元FINSアドレスの設定と取得をします
public byte[] ClientFinsAddress
fins.ClientFinsAddress = new byte[3] {0, 10, 0}
注釈
FINSアドレスはbyte[3]の内容は以下の通りです
ClientFinsAddress[0] : ネットワークアドレス
ClientFinsAddress[1] : ノードアドレス
ClientFinsAddress[2] : 号機アドレス
Fins.ServerFinsAddressプロパティ
送信先FINSアドレスの設定と取得をします
public byte[] ServerFinsAddress
fins.ServerFinsAddress = new byte[3] {0, 1, 0};
注釈
FINSアドレスはbyte[3]の内容は以下の通りです
ClientFinsAddress[0] : ネットワークアドレス
ClientFinsAddress[1] : ノードアドレス
ClientFinsAddress[2] : 号機アドレス
メソッド
Fins.Connectメソッド
指定したIPアドレスと接続します
public byte[] Connect(string TargetIP, bool TcpConnect = false);
- TargetIP
- string
- 接続先IPアドレス
- TcpConnect
- bool
- trueでTCP接続、falseでUDP接続 (省略時はUDP接続)
- 戻り値
- byte[]
- 送信元と送信先のFINSノードアドレスを格納したbyte配列
byte[0]:送信先ノード番号
byte[1]:送信元ノード番号
TCP接続する例です
public void FinsTcpConnect()
{
Osd.Omron.Fins fins = new Osd.Omron.Fins();
fins.ServerFinsAddress = new byte[3] {0, 1, 0};
fins.ClientFinsAddress = new byte[3] {0, 10, 0}
byte[] FinsNode = fins.Connect("192.168.0.1", true);
}
注釈
UDP接続の場合は、UdpClientのインスタンスを作成し指定したIPv4アドレスとポート番号9600番を接続先として設定します。
TCP接続の場合は、TcpClientのインスタンスを作成し指定したIPv4アドレスとポート番号9600番へ非同期接続し、接続先に「FINS ノードアドレス情報送信コマンド」を送信しノードアドレスを取得します。
以後は取得したノードアドレスを使ってコマンドを作成します
Fins.Closeメソッド
接続を終了します
public void Close();
すでにConnectしているfinsの接続を終了する例です
fins.Close();
注釈
UDP接続の場合は、UdpClientのリソースを解放します
TCP接続の場合は、TcpClientを閉じるように要求しインスタンスを破棄済みとしてマークします
Fins.SendCommandメソッド
FINSコマンドを送信してレスポンスを受信します
public byte[] SendCommand(byte[] command)();
- 戻り値
- byte[]
- レスポンスが格納されたbyte配列
IPアドレス(192.168.0.20)のPLCにUDP接続してFINSコマンドを送信する例です
public void FinsSend()
{
Osd.Omron.Fins fins = new Osd.Omron.Fins();
fins.Connect("192.168.0.20", "0.20.0", "0.10.0");
byte[] cmd = new byte[12];
cmd[0] = 0x80;
cmd[1] = 0x00;
cmd[2] = 0x02;
cmd[3] = 0; // 送信先FINSアドレス
cmd[4] = 20;
cmd[5] = 0;
cmd[6] = 0; // 送信元FINSアドレス
cmd[7] = 10;
cmd[8] = 0;
cmd[9] = 1; // SID
cmd[10] = 0x05; // CPU情報読出し0501
cmd[11] = 0x01;
byte[] res = fins.SendCommand(cmd);
Console.WriteLine(BitConverter.ToString(res));
}
Fins.MemOffsetメソッド
メモリのアドレス表記をFINSコマンドのメモリ指定方法に変換します
public byte[] MemOffset(string memstring, short offset);
- memstring
- string
- メモリを表す文字列
| メモリ種別 | 表記例 |
|---|---|
| DM | D100 |
| EM0 | E0_100 |
| WR | W100 |
| HR | H100 |
| CIO | 100 |
| offset | short | オフセット位置 |
- 戻り値
- byte[]
- FINSコマンドで使用するI/Oメモリの指定に従ったbyte配列
byte[0]:メモリタイプ
byte[1]:アドレス(上位)
byte[2]:アドレス(下位)
byte[3]:ビット位置 (0x00固定)
DM100からオフセット+1のアドレス(D101)を変換する例
byte[] mem = fins.MemOffset("D100", 1);
Console.WriteLine(BitConverter.ToString(mem));
// mem = 82-00-65-00
注釈
アドレスはチャネル(ワード)のみ指定可能です
アドレスとI/Oメモリ種別の対応は以下の通りです
| アドレス | I/Oメモリ種別 |
|---|---|
| DM | 0x82 |
| EM0-F | 0xA0-0xAF |
| EM10-18 | 0x60-0x68 |
| WR | 0xB1 |
| HR | 0xB2 |
| CIO | 0xB0 |
Fins.readメソッド
メモリエリアの読出し(0101)
public byte[] read(string memadrstr, int readsize);
- memstring
- string
- メモリを表す文字列
- readsize
- int
- 読み出すサイズ
- 戻り値
- byte[]
- 読出しデータ
DM0から3CH読み出す例
byte[] res = fins.read("D0", 3);
Console.WriteLine(BitConverter.ToString(res));
// res = 00-01-00-02-00-03
注釈
D0からD2までの3チャネルを読み出してバイト配列に格納します
バイト配列を数値などに変換するにはtoInt16()などの変換命令で変換します
Fins.writeメソッド
メモリエリアの書込み (0102)
public void write(string memadrstr, byte[] data);
- memstring
- string
- メモリを表す文字列
- data
- byte[]
- 書込みデータ
D1000からD1999までに連番を書き込む例
byte[] writedata = new byte[2000];
for (int cnt = 0; cnt < 1000; cnt++)
{
byte[] data = BitConverter.GetBytes((short)cnt).Reverse().ToArray();
Array.Copy(data, 0, writedata, cnt * 2, 2);
}
fins.write("D1000", writedata);
Fins.fillメソッド
メモリエリアの一括書込み (0103)
public void fill(string memadrstr, int size, byte[] data);
- memstring
- string
- メモリを表す文字列
- data
- byte[]
- 書込みデータ
DM2000からDM2099に数値100を書き込む例
int data = 100;
byte[] filldata = BitConverter.GetBytes((short)data).Reverse().ToArray();
fins.fill("D2000", 100, filldata);
Fins.MultiReadメソッド
メモリエリアの複合読出し (0104)
public byte[] MultiRead(string memaddresses);
- memaddresses
- string
- メモリを表す文字列(複数 カンマ区切り)
DM0とDM10とDM50の値を読み出す例
byte[] res = fins.MultiRead("D0,D10,D50");
Fins.runメソッド
運転モード変更 (0401)
public void run(byte Mode);
- Mode
- byte
- モード
モニタモードへ変更する例
fins.run(0x02);
注釈
モードの種類
0x02 :モニタモード
0x04 :運転モード
Fins.stopメソッド
運転停止 (0402)
public void stop();
モニタモードへ変更する例
fins.stop();
Fins.ReadUnitDataメソッド
CPUユニット情報の読出し (0501)
public byte[] ReadUnitData();
モニタモードへ変更する例
byte[] res = fins.ReadUnitData();
注釈
| CPUユニットの形式 |
| CPU高機能ユニットの構成 |
| CPUユニットの内部システムのバージョン |
| リモートI/O情報 |
| エリア情報 |
| CPUユニット情報 |
Fins.ReadUnitStatusメソッド
CPUユニットステータスの読出し (0601)
public byte[] ReadUnitStatus();
byte[] res = fins.ReadUnitStatus();
注釈
| 運転状態 |
| 運転モード |
| 運転停止異常情報 |
| 運転継続異常情報 |
| メッセージ有無 |
| 故障コード |
| 異常メッセージ |
Fins.ReadCycleTimeメソッド
サイクルタイム読出し (0620)
public byte[] ReadCycleTime();
byte[] res = fins.ReadCycleTime();
注釈
| 平均サイクルタイム |
| サイクルタイム最大値 |
| サイクルタイム最小値 |
Fins.Clockメソッド
時間情報読出し (0701)
public byte[] Clock();
byte[] res = fins.Clock();
Fins.SetClockメソッド
時間情報書込み (0702)
public void SetClock();
fins.SetClock();
注釈
Fins.ErrorClearメソッド
異常解除 (2101)
public void ErrorClear(byte[] code);
- code
- byte[]
- 故障コード
全ての異常を解除する例
fins.ErrorClear(new byte[2] { 0xFF, 0xFF });
注釈
Fins.ErrorLogReadメソッド
異常履歴読出し (2102)
public byte[] ErrorLogRead(int startIndex, int count);
- startIndex
- int
- 読出し開始レコードNo
- count
- int
- 読出しレコード数
全ての異常を読み出す例
byte[] res = fins.ErrorLogRead(0, 20);
注釈
| レコード最大数 |
| 格納数 |
| 読出レコード数 |
| 異常履歴データ 1~20 |
Fins.ErrorLogClearメソッド
異常履歴クリア (2103)
public void ErrorLogClear();
fins.ErrorLogClear();
Fins.WordToBinメソッド
バイト配列を2進数の0または1で表す文字列型に変換
public string WordToBin(byte[] data);
DM0から2CH分の値を読み出して文字列へ格納します
res = fins.read("D0", 2);
string WordToBin = fins.WordToBin(res);
Console.WriteLine(WordToBin);
//out 00010010001101000101011001111000
Fins.toBitArrayメソッド
バイト配列をBitArray型に変換
public BitArray toBitArray(byte[] data);
DM0から2CH分の値を読み出してBitArray型変数bitsへ格納します
res = fins.read("D0", 2);
BitArray bits = fins.toBitArray(res);
StringBuilder sb = new StringBuilder();
for (int i = bits.Length; i > 0; i--)
{
char c = bits[i - 1] ? '1' : '0';
sb.Append(c);
}
Console.WriteLine(sb.ToString());
//out 00010010001101000101011001111000
Fins.toBoolArrayメソッド
バイト配列をbool型の配列に変換
public bool[] toBoolArray(byte[] data);
DM0から2CH分の値を読み出してbool型の配列へ格納します
res = fins.read("D0", 2);
bool[] bools = fins.toBoolArray(res);
Console.WriteLine(String.Join(",", bools));
//out False,False,False,True,False,False,True,False, ...
Fins.toInt16メソッド
バイト配列をInt16型の配列に変換
public short[] toInt16(byte[] data);
DM10から10CH分の値を読み出してshort型の配列へ格納します
res = fins.read("D10", 10);
short[] data16 = fins.toInt16(res);
Console.WriteLine(String.Join(",", data16));
//out 10,11,12,13,14,15,16,17,18,19
Fins.toInt32メソッド
バイト配列をInt32型の配列に変換
public int[] toInt32(byte[] data);
DM20から10CH分の値を読み出してint型の配列へ格納します
res = fins.read("D20", 10);
int[] data32 = fins.toInt32(res);
Console.WriteLine(String.Join(",", data32));
//out 1376276,1507350,1638424,1769498,1900572
Fins.toInt64メソッド
バイト配列をInt64型の配列に変換
public long[] toInt64(byte[] data);
DM30から8CH分の値を読み出してlong型の配列へ格納します
res = fins.read("D30", 8);
long[] data64 = fins.toInt64(res);
Console.WriteLine(String.Join(",", data64));
//out 9288811672436766,10414728759410722
Fins.toUInt16メソッド
バイト配列をUInt16型の配列に変換
public ushort[] toUInt16(byte[] data);
DM40から10CH分の値を読み出してushort型の配列へ格納します
res = fins.read("D40", 10);
ushort[] datau16 = fins.toUInt16(res);
Console.WriteLine(String.Join(",", datau16));
//out 40,41,42,43,44,45,46,47,48,49
Fins.toUInt32メソッド
バイト配列をUInt32型の配列に変換
public uint[] toUInt32(byte[] data);
DM50から10CH分の値を読み出してuint型の配列へ格納します
res = fins.read("D50", 10);
uint[] datau32 = fins.toUInt32(res);
Console.WriteLine(String.Join(",", datau32));
//out 3342386,3473460,3604534,3735608,3866682
Fins.toUInt64メソッド
バイト配列をUInt64型の配列に変換
public ulong[] toUInt64(byte[] data);
DM60から8CH分の値を読み出してulong型の配列へ格納します
res = fins.read("D60", 8);
ulong[] datau64 = fins.toUInt64(res);
Console.WriteLine(String.Join(",", datau64));
//out 17733189824741436,18859106911715392
Fins.toFloatメソッド
バイト配列をfloat型の配列に変換
public float[] toFloat(byte[] data);
DM70から10CH分の値を読み出してfloat型の配列へ格納します
res = fins.read("D70", 10);
float[] dataf = fins.toFloat(res);
Console.WriteLine(String.Join(",", dataf));
//out 6.520418E-39,6.704092E-39,6.887766E-39,7.07144E-39,7.255113E-39
Fins.toDoubleメソッド
バイト配列をDouble型の配列に変換
public double[] toDouble(byte[] data);
DM80から8CH分の値を読み出してdouble型の配列へ格納します
res = fins.read("D80", 8);
double[] datad = fins.toDouble(res);
Console.WriteLine(String.Join(",", datad));
//out 4.22791874120785E-307,5.11796186559102E-307
Fins.toStringメソッド
バイト配列を文字列(UTF8)に変換
public string toString(byte[] data);
DM90から5CH分の値を読み出して文字列へ格納します
res = fins.read("D90", 5);
string datastr = fins.toString(res);
Console.WriteLine(datastr);
//out 1234567890

