今回も作ったツールを公開してみます。
今回のツールはPLCと通信してどうこうではなく、逆にPLCの代わりに通信応答を返すツールです。
なんちゃってPLC、ダミー通信ツール、と表現するのが妥当と思います。少しかっこつけて言えば「PLC通信エミュレータ」でしょうか。
とりあえずココからダウンロードできます。
ソースコードが気になる方はこちらを参照ください。
開発環境
以前に作成したデバイスモニタやチャートモニタと同様にVisual Studio2022のC#、ターゲットフレームワークは.NET6.0です。
※ランタイムはココからダウンロードできます。必要なものは「.NET デスクトップ ランタイム 6.*.* 」のランタイムです。
対応しているプロトコルはEthernet通信のみで、
・三菱(MCプロトコル/SLMP)
・OMRON(FINS)
・KEYENCE(上位リンク/MCプロトコル)
・横河(パソコンリンク)
で使える、、予定です。
注意事項
多分動くと思いますが、、サクッとデバッグのみでたいしたテストをしていないため予期せぬ不具合が発生する可能性が多分にあります。また本ツールを使用したことによる如何なる損害についても一切責任を負いません。ご使用については全て自己責任でお願いします。
もはやテンプレという名の言い訳。。。
まあ今回のツールはPLCに対してアクセスするものではないので、何かあってもモノを壊すことは無くパソコン上で何か発生するだけ。
主な機能
- 最大4台のPLC通信を模擬
- デバイスのRead/Writeにのみ対応(ラベル・変数には未対応)
⇒対応コマンドの詳細は下記参照 - 対象デバイスの値は共有メモリを使用してツール側で保持
⇒Writeした値の保持およびツール側でデバイス値の任意操作も可能
(当然ながら同じデバイスに対しての書込は後操作が優先) - デバイス値はファイルにて保存&復元
- 通信ログの表示および保存
MCプロトコルの対応コマンド (三菱 or KEYENCE)
種別 | コマンド | サブコマンド |
ワード単位の一括読出し | 0401 | 0000 |
ビット単位の一括読出し | 0401 | 0001 |
ワード単位の一括書込み | 1401 | 0000 |
ビット単位の一括書込み | 1401 | 0001 |
ワード単位のランダム読出し | 0403 | 0000 |
ワード単位のランダム書込み | 1402 | 0000 |
ビット単位のランダム書込み | 1402 | 0001 |
※複数ブロックの一括読み書き(0406/1406)やモニタ・モニタ登録(0801/0802)には未対応
※サブコマンドの0002/0003には未対応(SLMP側で対応)
※内部デバイスのみに対応(バッファメモリ(U*\G****)やリンクダイレクトデバイス(J*\B****など)には未対応)
※KEYENCEでのMCプロトコルも対応コマンドは同じ
SLMPの対応コマンド (三菱)
種別 | コマンド | サブコマンド |
ワード単位の一括読出し | 0401 | 0002 |
ビット単位の一括読出し | 0401 | 0003 |
ワード単位の一括書込み | 1401 | 0002 |
ビット単位の一括書込み | 1401 | 0003 |
ワード単位のランダム読出し | 0403 | 0002 |
ワード単位のランダム書込み | 1402 | 0002 |
ビット単位のランダム書込み | 1402 | 0003 |
※複数ブロックの一括読み書き(0406/1406)やモニタ・モニタ登録(0801/0802)には未対応
※サブコマンドの0000/0001には未対応(MCプロトコル側で対応)
※通常内部デバイスのみに対応(バッファメモリ(U*\G****)やリンクダイレクトデバイス(J*\B****など)には未対応)
FINSの対応コマンド (OMRON)
種別 | コマンドコード |
I/Oメモリエリアの読出 | 01 01 |
I/Oメモリエリアの書込 | 01 02 |
I/Oメモリエリアの複合読出 | 01 04 |
※I/Oメモリエリアの一括書込(01 03)やI/Oメモリエリアの転送(01 05)には未対応
※タスクフラグ(TK)やインデックスレジスタ(IR/DR)、クロックやコンディションフラグには未対応
上位リンクの対応コマンド (KEYENCE)
種別 | コマンド |
データ読み出し | RD |
連続データ読み出し | RDS or RDE |
データ書き込み | WR |
連続データ書き込み | WRS or WRE |
※強制セット/リセット(ST/RS)やモニタ登録/読み出し(MBS/MWS/MBR/MWR)には未対応
パソコンリンクの対応コマンド (横河)
種別 | コマンド(Ascii) | コマンド(Binary) |
ビット単位の読出し | BRD | 01 |
ビット単位の書込み | BWR | 02 |
ビット単位のランダム読出し | BRR | 04 |
ビット単位のランダム書込み | BRW | 05 |
ワード単位の読出し | WRD | 11 |
ワード単位の書込み | WWR | 12 |
ワード単位のランダム読出し | WRR | 14 |
ワード単位のランダム書込み | WRW | 15 |
※同一データの書込み(BFL/WFL/03/13)やモニタ指定/モニタリング(BRS/BRM/WRS/WRM/06/07/16/17)には未対応
※特殊モジュールアクセスコマンド(アナログユニットや高速カウンタユニット等へのアクセス)には未対応
使い方
通信設定
設定は
①通信プロトコル選択
②TCP or UDP選択
③ポート番号入力(1024~65535)
④Binary or Ascii選択
⑤通信ログ保存 *常時変更可
⑥エラー応答 *常時変更可
⑦共有メモリIndex入力(0~3)
です。(それぞれ回線No.0~3の4台分)
共有メモリIndexはこのツール内でのデバイス値を共有メモリで保持(0~3の4台分)しており、この共有メモリ≒デバイス値のアクセス先を指定するものになります。基本的にはPLC4台分を別々に想定していますが実際には場合によって複数の通信回線を使用して1台のPLCにアクセスすることもあり得るため、このような経路にも対応できるようにしています。
設定後は開始・停止ボタンで通信処理の開始・停止が可能となります。
一番下側にある”デバイス値のリセット”のボタンはデバイス値≒共有メモリの値をすべて0にクリアします。
PLCとの通信アプリケーション(デバイスモニタやチャートモニタなど)から本ツールへアクセスするには別のPCを用意してIPアドレスを適切に設定することで使えるワケですが、、
わざわざ複数のPCを準備するのは面倒なので同一のPC内で確認するのがオススメです。というよりPLC無しでサクッと通信をチェックするためのツールなので同じPC内で使うことがほとんどだと思います。
方法は特に難しいことはなく、PLCにアクセスする側の設定でIPアドレスを“127.0.0.1”(いわゆるループバック、localhostと呼ばれるもの)に設定すればOKです。
当然ですが
①サーバ側=本ツール側の通信を開始
②クライアント側(デバイスモニタなど)の通信を開始
の順に操作しないとエラーが発生するのでご注意ください。。
終了する場合は逆に
①クライアント側の通信を停止
②サーバ側=本ツール側の通信を停止
とするのがベターです。(どちらから停止しても問題はないハズですが)
通信ログ
通信を開始するとログを表示します。画面上部のラジオボタンで表示回線を切り替えます。
(読出か書込かがすぐに分かる程度のログですが。。)
※ログをファイルに保存するとこのテキストがそのまま出力されます。
デバイス値
デバイス値≒共有メモリの値を確認・操作出来ます。
デバイスと点数を指定すると右側のグリッド表示が変わり、左側で表示するデータ型を選択できます。ビット表示(● or 〇)部分をダブルクリックすると反転、ワード値表示部分はクリックすると入力ダイアログが表示されるので値を入力すると操作可能です。
このあたりはデバイスモニタと同様です。
クライアント側(デバイスモニタなど)から書込要求があれば共有メモリの値が書き換わります。
注意事項 その2
TCPで通信する場合ですが、、
動作自体は確認できましたが切断に問題アリです。。。
クライアント側で回線切断(ソケットを閉じる)をするとサーバ側で切断を検出できるかと思っていたのですが予想どおりには動作せず。。。同一PCだからなのかどうかは不明です。(複数PCで試していないので)
極稀に回線切断を検出できることもあったのですが基本ダメです。TCPで使用する場合はクライアント側の回線切断に合わせて、本ツール側で通信停止→開始としないと次の通信が出来ませんのであしからず。。(私の力不足orz)
UDPの場合はTCPと違ってConnectという概念がないので上記のような切断の問題は発生しません。
感想?
今回のツールは、、、かなり使う人を選ぶツールと思います。
大半の人には「ふ~ん、あーそう」的なものですが極々限られた人にはそれなりに有用なもの、、と思いたい。
(PLCとの通信ツールを”作る側の人”にはちょっと需要あるかも)
ちなみに今回作成したツールの原型といいますか、簡易版のツールは以前から使っていたのですがイマイチ使えなかったのでリニューアルした感じです。(たぶん1カ月くらいかかった)
ちなみに以前公開したデバイスモニタやチャートモニタの作成時は実機PLCとの接続テストはゼロです。。が、何のテストも無しでいきなり公開する勇気はないので、最低限の通信テストはダミーの通信ツールを使っていたワケです。
(実際にPLCと接続してもいないのに多分使える、、として公開したのはこういうカラクリがあります。いくら個人のサイトとはいえ、何の根拠もなくホイホイと無責任に公開はムリ。バグはあるけどw)
今後また何かツールを作る場合はデバッグ・動作確認が楽になる、、ハズ。
コメント
コメント一覧 (2件)
普段よりPLCと通信するアプリを作成しているものです。
日本でどれくらいの人にこのツールの便利さが伝わるのか不明ですが、私にはわかります笑
これでビットの立ち上がりをトリガに開始する処理のデバッグなどする際、いちいち評価用PLCを引っ張り出さずに済みます。
自己責任で使わせていただきます。ありがとうございます。
評価していただきありがとうございます!
最初から「めちゃめちゃ人を限定するツール」と分かってはいましたが、、伝わる人には伝わるのですね。妙にうれしくなりました。
何かしら役に立っていれば幸いです。