// LEARN · 上位リンク入門

上位リンク直書き・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つを並べて比べる

上位リンク直書きKcpXKV COM+ Library
追加するものなし(.NET 標準)NuGet パッケージ KcpX製品のインストールと ActiveX コントロールの参照
接続先の指定コードに IP とポートコンストラクタに IP とポートPLC(機種)と Peer(接続先)プロパティ
動く OS.NET が動く環境Windows・Linux・macOSWindows
開発環境.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・開発環境・対象機種)