上位リンク直書き・KcpX・KV COM+ Library を C# で書き比べる
キーエンス KV シリーズ PLC の DM100〜DM102 を読む同じ処理を3通りの方法で書き比べます。上位リンクのコマンドを自分で送る方法、.NET ライブラリ KcpX、キーエンスの KV COM+ Library それぞれのコード量・準備・対応環境・向いている場面を比べます。
更新
C# からキーエンス KV シリーズの PLC を読み書きする方法は、大きく3つあります。上位リンクのコマンドを自分で送る方法、KcpX のようなライブラリを使う方法、そしてキーエンスの KV COM+ Library を使う方法です。
この記事では、3つとも同じ処理を書きます。お題は「Ethernet でつないだ PLC から、DM100〜DM102 の3ワードを符号あり 16 ビットで読む」です。書いてみると、それぞれが何を引き受け、何を利用者に任せているのかがよく見えます。
1. 上位リンクを直接書く
.NET 標準の TcpClient だけで書きます。コマンドの書式の記事で読んだ RDS DM100.S 3 を、そのまま ASCII の文字列として送ります。
using System.Net.Sockets;
using System.Text;
using var client = new TcpClient();
client.Connect("192.168.0.10", 8501);
using var stream = client.GetStream();
// DM100 から 3 ワードを符号あり 16 ビット(.S)で連続読出し
stream.Write(Encoding.ASCII.GetBytes("RDS DM100.S 3\r"));
// レスポンスは CR LF で終わるので、そこまで読む
var buffer = new List<byte>();
while (buffer.Count < 2 || buffer[^2] != '\r' || buffer[^1] != '\n')
{
int b = stream.ReadByte();
if (b < 0)
throw new IOException("接続が切れました");
buffer.Add((byte)b);
}
string response = Encoding.ASCII.GetString(buffer.ToArray()).TrimEnd('\r', '\n');
// E0〜E6 はエラーレスポンス
if (response.Length == 2 && response[0] == 'E')
throw new Exception($"PLC がエラーを返しました: {response}");
// "+15025 -25400 +00000" のように空白区切りで返る
short[] values = response.Split(' ').Select(short.Parse).ToArray();バイナリの電文を組み立てる MCプロトコルと違い、上位リンクはコマンドがそのまま読める文字列なので、短く書けます。それでも、このコードが面倒を見ているのは「DM を3ワード、.S で読む」場合だけです。実際に使おうとすると、次のような処理を自分で足していくことになります。
- 1 回のコマンドの点数の上限(多くのデバイスで 1000 点、KV Nano では 256 点など)を超えるときに、コマンドを分けて送る
doubleやlongのように4ワードで1つの値になるデータを、ワードから組み立てる- R・MR のような「チャンネル+2 桁のビット番号」のデバイスや、B・W のような16進番号のデバイスを扱う
- タイマ・カウンタの「接点,現在値,設定値」の応答を分解する
- 応答が返らないときのタイムアウトと、その後の接続の立て直し
コマンドの中身を理解するには一番の方法です。ただ、アプリケーションに組み込むなら、これらをすべて自前でテストすることになります。
2. KcpX を使う
NuGet で KcpX を追加して、同じ処理を書きます。
using KcpXLib;
using KcpXLib.Enums;
using var kcpx = new KcpX("192.168.0.10", 8501);
short[] values = kcpx.BatchRead<short>(Prefix.DM, "100", 3);1 で組み立てたコマンドと応答の解析は、BatchRead<short> の1行が引き受けます。型を int や double に変えれば、データ形式(.L や .D)の選択とワードの組み立ても KcpX が行います。点数の上限を超える読み出しは、コンストラクタの series に指定した PLC シリーズの上限に合わせて、自動で分割して送ります。
PLC がエラーを返したときは HostLinkException が発生し、ErrorCode プロパティでエラーコード(E0〜E6)を取り出せます。応答が返らないときは TimeoutException が発生し、TCP なら遅れて届く古い応答を取り違えないよう接続を閉じます。
KcpX は .NET だけで書かれているので、Windows に加えて Linux・macOS でも動きます。そのかわり、対応している通信経路は Ethernet(TCP/UDP)の上位リンクと KV STUDIO のシミュレータです。対象の PLC は KV-8000/7000/5000 系と KV Nano(KV-NC1EP 経由)です。
3. KV COM+ Library を使う
KV COM+ Library は、キーエンスが提供する Windows 向けの通信ライブラリです。ActiveX コントロールとして提供され、製品ページでは Visual Basic・Visual C++・Excel・Access から使えると案内されています。使うには、製品を購入してインストールし、Visual Studio のツールボックスや参照にコントロールを追加します。
using AxDATABUILDERAXLibLB;
using DATABUILDERAXLibLB;
var plc = new AxDBCommManager();
plc.CreateControl();
plc.PLC = DBPlcId.DBPLC_DKV5000; // 接続する PLC の機種
plc.Peer = "192.168.0.10:8500"; // 接続先(IP アドレス:ポート)
plc.Connect();
try
{
int[] values = new int[3];
for (int i = 0; i < values.Length; i++)
values[i] = Convert.ToInt32(plc.ReadDevice(DBPlcDevice.KV5000_DM, (100 + i).ToString()));
}
finally
{
plc.Disconnect();
}このコードは、公開されている使用例で確認できた DBCommManager コントロールの PLC・Peer プロパティ、Connect・Disconnect・ReadDevice メソッドだけで書いています。そのため 1 点ずつ読んでいます。複数の点をまとめて読むメソッドや、戻り値の型・データ形式の指定、エラーの受け取り方は、KV COM+ Library のユーザーズマニュアルで確認してください。
PLC の機種は DBPlcId、デバイスは DBPlcDevice という列挙型で指定します。公開されている使用例では、ポートに上位リンクの 8501 ではなく 8500 を指定しています。
KV COM+ Library の強みは、対象機種と周辺機能の広さです。製品ページの対象機種には KV-8000 から KV-1000・KV-700 までの世代と KV Nano シリーズが並びます。また、DBDeviceManager によるデバイスの定期読出しや、メーターなどの表示用コントロールも含まれます。Excel に PLC のデータを取り込む KV COM+ for Excel も同じシリーズの製品です。
一方で動作環境は Windows に限られ、使うには製品の購入が必要です。
3つを並べて比べる
| 上位リンク直書き | KcpX | KV COM+ Library | |
|---|---|---|---|
| 追加するもの | なし(.NET 標準) | NuGet パッケージ KcpX | 製品のインストールと ActiveX コントロールの参照 |
| 接続先の指定 | コードに IP とポート | コンストラクタに IP とポート | PLC(機種)と Peer(接続先)プロパティ |
| 動く OS | .NET が動く環境 | Windows・Linux・macOS | Windows |
| 開発環境 | .NET | .NET 7〜9、.NET Framework 4.6.1+、.NET Core 2.0+ | Visual Basic、Visual C++、Excel、Access |
| 対象 PLC | 上位リンクに対応した機種 | KV-8000/7000/5000 系、KV Nano、KV STUDIO シミュレータ | KV-8000〜KV-700 の各世代、KV Nano |
| 値の型 | 文字列から自分で変換 | bool・short・int・float・double などを型で指定 | 列挙型でデバイスを指定(詳細はマニュアル) |
| エラーの扱い | E0〜E6 を自分で判定 | 例外(HostLinkException) | マニュアルを参照 |
| 1回に指定できる点数 | 上限を超えたら自分で分割 | 上限を超えると自動で分割 | マニュアルを参照 |
| ライセンス | — | MIT(無償・商用利用可) | 有償(ライセンス単位で購入) |
どれを選ぶか
選ぶときに考えるのは、次の3つの問いです。上から順に答えていけば、たいていはどれかに決まります。
1. KV-1000・KV-700 など古い世代の PLC とつなぐか
KcpX が対象にしているのは KV-8000/7000/5000 系と KV Nano です。それより前の世代の PLC とつなぐなら、対象機種に含まれている KV COM+ Library を選びます。
2. Windows 以外で動かすか
次は動かす環境を考えます。Linux のサーバー、Docker コンテナ、Raspberry Pi、macOS の開発機で動かすなら KcpX です。KV COM+ Library は Windows でしか動きません。
3. 配布とライセンスをどう考えるか
Windows で動かすなら、KcpX と KV COM+ Library のどちらでも実現できます。ここで決め手になるのは、アプリの作り方と配り方です。
- KcpX が向いている場合:新しく C# で作るアプリや、多くの PC に配るアプリ、社外に提供するアプリ。MIT ライセンスで無償なうえ、NuGet の参照だけでアプリに含まれるので、実行する PC ごとのインストールが要りません
- KV COM+ Library が向いている場合:すでに VB や Excel で KV COM+ を使った資産があるアプリや、メーターなどの表示用コントロールをそのまま使いたい社内ツール
よくある場面
| 場面 | 選ぶもの |
|---|---|
| 工場の稼働データを Linux サーバーで集め、Web ダッシュボードに表示する | KcpX |
| PLC のデータをクラウドへ送るゲートウェイを Docker で動かす | KcpX |
| ラダーの動作を KV STUDIO シミュレータ相手に CI で自動テストする | KcpX |
| 既存の Excel や VB のツールから KV-1000 のデータを読む | KV COM+ Library |
| C# 以外の言語やマイコンから PLC と通信する | 直書き(この入門のコマンドの知識) |
直書きの知識は、どれを選んでも役に立つ
実際のシステムをコマンドから自作することは少ないはずです。それでもコマンドの書式を知っていれば、ライブラリを使っていてもトラブルの原因を追えます。Wireshark で通信を覗いたときに各文字が何を意味するのか、PLC が返した E0 や E1 が何を指すのかがわかるからです。コマンドの書式とエラーレスポンスの記事が、そのための知識になります。
出典
- キーエンス KV-EP21V/KV-8000(A)/KV-7500/KV-5500/KV-NC1EP ユーザーズマニュアル EtherNet/IP 機能 8章 p.8-2〜8-7, 8-17〜8-22, 8-36
- キーエンス 製品ページ「KV COM+ library:1 ライセンス KV-DH1L」(対応 OS・開発環境・対象機種)