PLC通信ライブラリ(Ethernet)

ツール

このカテゴリではこれまでPLCとの通信に関連することを記事にしてきました。
こんな風にすれば、、
こんな感じに考えれば、、
というだけでは上から目線言うだけ番長感が満載なので、Ethernet通信でデバイス読み書きが出来るなんちゃって通信ライブラリを作ってみました。

ここからダウンロード出来ます。
(通信ライブラリとそれを使うVBとC#のサンプルコード付きzipファイル)

開発・動作環境

VB2008で通信ライブラリを作成してます。(え?イマドキ?とか言わないよーに!)
※Visual Studio 2010以降は環境自体が重い感じなので意識的に避けてるだけです。

.Net Frameworkは2.0を指定してます。
※別に3.5でも良いのですが、3.5が必要な事情・理由が無いだけです。

このため通信ライブラリを使うにはVBかC#などVisual Studio 2005以降の開発環境なら使えます。当然ながら.Net Framework 2.0(or 3.0 or 3.5)を使えるWindowsが必要です。(≒XP以降なら大丈夫)

またちょっと自信薄いですがCOM参照できる形にもしてありますのでVB6.0やVBAなどでも使おうと思えば使えます。(少しインテリセンスに難ありですが。。)
ファイルレジスタ等の値をまとめてExcelから扱いたい、といった用途に有効です。
※COMで使う場合はレジストリへの登録が必要になります。

レジストリ登録はココとかココが参考になります。”vb c# マネージdll ライブラリ vbaから使う”あたりのキーワードで調べればすぐにヒットすると思います。

注意事項

通信ライブラリが正常に動作しない可能性があります。(キッチリとはデバッグしていませんので。。)
また通信ライブラリやサンプルコードを使用したことによる如何なる損害についても一切責任を負いません。ご使用については全て自己責任でお願いします。

サンプルコードは自由に編集・使用していただいて構いませんが、通信ライブラリをそのまま商用利用はご遠慮ください。非商用ならそのまま使用していただいて構いません。

対応PLC・プロトコル

【三菱】
 MCプロトコルの3Eフレームに対応(4Eには未対応)
 Q/LシリーズのCPU内蔵EthernetまたはEthernetユニットに対応
 QnAは読み書きのサイズを気にすれば使えるかも?
 iQ-Rはラベルとロングタイマ以外なら使えるかも?

【OMRON】
 FINSに対応
 CS/CJシリーズのCPU内蔵Ethernet/IPまたはEthernet(/IP)ユニットに対応
 NX/NJは変数にAT指定すれば使えるかも?

【KEYENCE】
 上位リンクとMCプロトコルに対応(プロトコルによってアクセス可能なデバイスが異なる)
 KV-3000/5000/7000/8000シリーズのCPU内蔵Ethernet/IPまたはEthernet(/IP)ユニットに対応
 KV-Nanoは読み書きのサイズを気にすれば使えるかも?

通信ライブラリの使い方

参照設定

通信ライブラリの本体は”ライブラリ本体”フォルダ内にあるPLCCommLib.dllです。このdllを任意のフォルダにコピーし、参照設定として追加すれば他のプロジェクトでも使えるようになります。
※同じフォルダにPLCCommLib.xmlもあるのでdllと同じフォルダにセットでコピーするとインテリセンスが使えて便利です。

参照の追加後はNamespace(PLCCommLib)を使えるようにして下さい。

使用する通信クラス

以下のクラスを使用して下さい。
 三菱: PLC_MCクラス
 OMRON: PLC_Finsクラス
 KEYENCE: PLC_HiLinkクラス(上位リンク用)
 KEYENCE: PLC_MCKVクラス(MCプロトコル用)
※全てPLCCommという基本クラス(インスタンス生成不可)を継承した派生クラス
 ⇒インスタンスを生成するクラスが異なるだけで以降の処理は基本的に共通

通信設定

通信設定はプロパティとして実装しています。

プロパティ名説明設定値
TimeoutTCPのConnect時や
送受信のTimeout
ms単位の整数
IPAddress接続先PLCのIPアドレス“192.168.1.1”形式の文字列
PortNumber通信ポート番号0~65535
IsUDPTCPかUDPの選択False=TCP, True=UDP
IsAsciiBinaryかAsciiの選択False=Binary, True=Ascii

※他にMCプロトコルでのみ使用するもの、FINSのみで使用するものもあります。

通信処理

通信処理はメソッドとして実装しています。

メソッド名説明備考
Open通信回線の接続最初に実行
Close通信回線の切断最後に実行
ReadDeviceBlock指定デバイスを先頭にワード単位で連続読出
WriteDeviceBlock指定デバイスを先頭にワード単位で連続書込
ReadDeviceRandom任意の指定デバイスをワード単位で読出
WriteDeviceRandom任意の指定デバイスをワード単位で書込
SetBitビットデバイスのSET(1)
ResetBitビットデバイスのRST(0)
InverseBitビットデバイスの反転

※デバイスは文字列で指定(“M100″とか”D5000″とか)
※ワード単位のデータ型はShort(2Byte)の配列
※ワード単位の指定点数の上限は無し
 (通信ライブラリ側でループ処理しているので10000点でも指定は可能)
※ビットは1点のみでワードのビット扱いも可(“D100.0″とか)
 但しPLC側の処理内容によっては予期せぬ不具合となる可能性あり
※戻り値は正常終了で0、異常終了で0以外(エラーコード)を返す仕様
 PLCComm.RET_**** という定数(4Byte)を定義
 定数以外の値はプロトコル上のエラーコード(1 or 2byte)

ちなみに気付いた方もいるかも知れませんが、、
この通信ライブラリのインターフェースは三菱のMX Componentを参考にしてます。

その他

これまでいろいろツールを作ってきたうえで、あると便利だったものを実装してます。
・RemakeDevice (デバイス文字列を指定し、オフセットしたデバイス文字列を返す)
・IsDevice (文字列がデバイスと認識可能かチェック)
・IsLogging/LogPath (指定フォルダに通信ログデータの保存が可能)

・DataConvクラス
 Byte、Word(2Byte)、DoubleWord(4Byte)、Ascii(上位⇔下位)のデータ変換処理
 Singed⇔Unsigned変換やBIN⇔BCD変換

他にもちょいちょいありますが、、
詳細はサンプルコードを参照するか、通信ライブラリ(PLCCommLib.dll)を参照設定した開発環境上からオブジェクトブラウザで参照してください。(xmlファイルもあるのでいろいろ説明コメント付きで参照できます)

サンプルコードについて

VBとC#のサンプルコードがありますが、どちらも処理内容は同じです。
通信ライブラリのすべて、、とまではいきませんが基本的な使い方はおさえているつもりです。説明コメントが少しウザいかもしれませんが。

またNumericTextというTextBoxを継承したカスタムコンポーネントを使用する小技を効かせたつもりなので参考になれば幸いです。
※マウスのホイール操作かCtrl+Shift+Up/Downキー操作で数値文字列をIncrement/Decrementさせる機能を追加したTextBoxです。素直にNumericUpDown使っても良かったのですが16進数表記を考慮するとカスタムコンポーネントが良いかな~という程度です。

コメント

  1. yuki より:

    DLL作られたんですね!しかもキーやOMRONのプロトコルまで・・
    こういうのってなんかはまっちゃう・・。

    • さきちゃん さきちゃん より:

      仕事柄、、良くも悪くも三菱・OMRON・KEYENCEを扱わなければならないため、いずれか1つのメーカだけに特化した通信ライブラリでは個人的に使い勝手がイマイチだったので改造を重ねた結果こうなった、という感じです。さすがに仕事で使っているものを公開は出来ないので趣味と実益を兼ねてゼロから作り直したものをアップしています。
      複数メーカのプロトコルに対応させるときに試行錯誤しホントここ数年でようやく”オブジェクト指向言語”の便利さを理解した気がして、楽しさが増した感じです。
      本業はラダー屋ですけど。。

  2. yuki より:

    >”オブジェクト指向言語”の便利さ

    わかりますw

    私の場合、言語系プログラミングの経験がなく、そういったソースも見る機会がなかったから、文法仕様が何のためにあるかいまいちピンとこなくて、

    DLLを作成するときにユーザインタフェースを考えたときに、はじめて「ああ、だからこういう仕様があるのね」って気づいたクチです・・

    「作る対象」が異なっていたら、一生気づかなかったと思うとたまにゾっとします。やっぱり、意識的に使うクセが必要なのかもしれません。。。

    • さきちゃん さきちゃん より:

      たしかに、、、
      DLLやらライブラリやらをいざまとめる段階になっていろいろ調べて気付かされたモノは多いです。
      継承やインターフェースなど、
      単語と機能はなんとなく知っていたものの、実際に使わないとなぜこういった仕組みがあるのか?
      またその恩恵を理解するのは難しいと思います。
      実際に自分もライブラリを作らなければ完全にスルーしていたハズ。。
      仕事で追い込まれるか、意識して学習しないとなかなか身に付かないのかな~と思ってます。