このカテゴリではこれまでPLCとの通信に関連することを記事にしてきました。
こんな風にすれば、、
こんな感じに考えれば、、
というだけでは上から目線や言うだけ番長感が満載なので、Ethernet通信でデバイス読み書きが出来るなんちゃって通信ライブラリを作ってみました。
ここからダウンロード出来ます。
(通信ライブラリとそれを使うVBとC#のサンプルコード付きzipファイル)
※サンプルコードはVisual Studio 2008です。2008よりも新しいVisual Studioならソリューションファイルを開けば自動でコードのUpgradeをしてくれるハズです。
2022/5/7 追加
こちらをダウンロードするとAny CPU対応(x86に縛られない)、、、の予定です。
※中身は基本的に上記と同じで.NET Framework 2.0(or 3.0 or 3.5)が必要です。
2022/5/22 追加
こちらのダウンロードは.NET Framework 4.8と.NET 6.0に対応したものです。通信ライブラリ本体のみでフォルダで分けてあり、使用方法は上記のサンプルと同じです。
開発・動作環境
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から使う”あたりのキーワードで調べればすぐにヒットすると思います。
2022/5/22 追加
さすがに.NET Framework 3.5ではそのうち使えなくなりそうなので、新しい環境にも対応してみました。
⇒ Visual Studio 2022で.NET Framework 4.8用と.NET 6.0用を作ってみました。
(開発環境自体が重くてイライラしますが。。)
注意事項
通信ライブラリが正常に動作しない可能性があります。(キッチリとはデバッグしていませんので。。)
また通信ライブラリやサンプルコードを使用したことによる如何なる損害についても一切責任を負いません。ご使用については全て自己責任でお願いします。
サンプルコードは自由に編集・使用していただいて構いませんが、通信ライブラリをそのまま商用利用はご遠慮ください。非商用ならそのまま使用していただいて構いません。
対応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という基本クラス(インスタンス生成不可)を継承した派生クラス
⇒インスタンスを生成するクラスが異なるだけで以降の処理は基本的に共通
通信設定
通信設定はプロパティとして実装しています。
プロパティ名 | 説明 | 設定値 |
Timeout | TCPのConnect時や 送受信のTimeout | ms単位の整数 |
IPAddress | 接続先PLCのIPアドレス | “192.168.1.1”形式の文字列 |
PortNumber | 通信ポート番号 | 0~65535 |
IsUDP | TCPかUDPの選択 | False=TCP, True=UDP |
IsAscii | Binaryか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進数表記を考慮するとカスタムコンポーネントが良いかな~という程度です。
コメント
コメント一覧 (13件)
DLL作られたんですね!しかもキーやOMRONのプロトコルまで・・
こういうのってなんかはまっちゃう・・。
仕事柄、、良くも悪くも三菱・OMRON・KEYENCEを扱わなければならないため、いずれか1つのメーカだけに特化した通信ライブラリでは個人的に使い勝手がイマイチだったので改造を重ねた結果こうなった、という感じです。さすがに仕事で使っているものを公開は出来ないので趣味と実益を兼ねてゼロから作り直したものをアップしています。
複数メーカのプロトコルに対応させるときに試行錯誤しホントここ数年でようやく”オブジェクト指向言語”の便利さを理解した気がして、楽しさが増した感じです。
本業はラダー屋ですけど。。
>”オブジェクト指向言語”の便利さ
わかりますw
私の場合、言語系プログラミングの経験がなく、そういったソースも見る機会がなかったから、文法仕様が何のためにあるかいまいちピンとこなくて、
DLLを作成するときにユーザインタフェースを考えたときに、はじめて「ああ、だからこういう仕様があるのね」って気づいたクチです・・
「作る対象」が異なっていたら、一生気づかなかったと思うとたまにゾっとします。やっぱり、意識的に使うクセが必要なのかもしれません。。。
たしかに、、、
DLLやらライブラリやらをいざまとめる段階になっていろいろ調べて気付かされたモノは多いです。
継承やインターフェースなど、
単語と機能はなんとなく知っていたものの、実際に使わないとなぜこういった仕組みがあるのか?
またその恩恵を理解するのは難しいと思います。
実際に自分もライブラリを作らなければ完全にスルーしていたハズ。。
仕事で追い込まれるか、意識して学習しないとなかなか身に付かないのかな~と思ってます。
お世話になります。
PLCのデバイスをPCで直接モニタ出来そう(ラダーデバッグの際に便利そう)なのでサンプルプロジェクトをVB2015の環境でテストして見ました。
ところがR500からの1ワードを読み出す際、最上位ビットR515がONしていると演算オーバーフローの例外が発生します。
PLCはキーエンスKV-8000で上位リンクです。
何が問題でしょうか?
宜しくお願い致します。
お世話になります。
演算オーバーフローですが、、、すみません、ライブラリ内の処理ミスでした。
また指摘のコメントありがとうございます。
下記のアスキー文字列を数値に変換する処理はどちらでも同じ結果になると思っていたのですが前者はNG、後者はOKです。
data = CShort(“&HFFFF”)
data = Short.Parse(“FFFF”, Globalization.NumberStyles.HexNumber)
ライブラリを修正したので再度ダウンロードして試していただければと思います。
お礼が遅くなり申し訳ありません。すっかり連休モードでした(^^;
ライブラリ修正ありがとうございました。例外出なくなりました。
これから色々試してみたいと思います。
良いサイトに出会えて良かった。
何かしら役に立ったようで良かったです!
ライブラリはもう少し手を加えてみようかと考え中です。
(スローペースになると思いますが。。)
お世話になります。
こちらのライブラリの対象プラットフォームはx86のみ使用できるライブラリでしょうか。
x64でアプリケーションを起動するとエラーで「System.BadImageFormatException: ‘Could not load file or assembly ‘PLCCommLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null’. 間違ったフォーマットのプログラムを読み込もうとしました。’」と表示されます。
環境は.NET6.0です。
原因は何でしょうか。
お忙しいところお手数おかけしますが、ご確認のほどよろしくお願いいたします。
訂正
x64でアプリケーションを起動するとエラーで
↓
x64でアプリケーションをコンパイルするとエラーで
ライブラリは推測されているとおり、x86でのみ使用可能となっています。
⇒理由は内部処理でWin32 APIを使っているためです。
(気が向いたらx64でも使えるように改造してみるかどうか。ただVisual Studio 2008だと若干怪しそう。。)
さきちゃん より:
もったいないですね。おそらく Visual Studioが古いんだと思います。
最新の VS2022をダウンロードして、.NET4.5に移植したらどうでしょうか。
少し前にVS2022を使ってみましたが環境自体が重くてイラっときましたね。。。
それはともかく、せっかく移植するなら.NET Frameworkではなく.NET6ですかね。。
Microsoftはちょいちょい過去をバッサリと切り捨てるので。