ツールの作り方 – 準備編

ツール

前回はツールの有用性・目的を記事としましたが、今回から何度かに分けて作り方を記事にしたいと思います。

PLCを相手とするPCツールを作成する場合、通信処理は避けて通れません。というよりPLCを相手にするなら通信処理=デバイス値のRead/Writeが基本であり全てです。この通信処理に市販のライブラリを使うことももちろん可能ですが、このサイトでは各PLCメーカが公開している通信プロトコルを使う方法を説明していきます。

天の声
天の声

仕事上で切羽詰っている状況ならば有無を言わさず市販ライブラリの一択です。通信処理を調べて作成する時間=人件費と販売価格を比較すれば買うほうが結果的に安く済みます。
ただし多数の人が使うものだったりするとライセンス料もハンパじゃなくなるので場合によって注意が必要です。
この手の通信処理はいったん作れば(多少の改造はあっても)基本的に使いまわすことが出来るので時間的な余裕があったり今後の展開を考えるならば自作をオススメします。PCソフトがメインの新人~経験浅めなエンジニアの学習にもちょうど良いかもしれません。

プロトコルを調べる

まずは対象となるPLCの通信プロトコルを調べる必要があります。各メーカサイトでユーザ登録(無料)をすませれば各種マニュアルがダウンロード可能になります。(電子ファイルなら無料です)

三菱ならばMCプロトコル(SH080003)、OMRONならばFINSコマンド(SBCA-304)、KEYENCEならば上位リンクまたはMCプロトコルです。(KEYENCEはCPUかEthernetユニットに記載)

まずはコレを理解しないことには始まりません。おそらく慣れない文言が並んでいるかもしれませんが読み解くのもある種スキルが必要です。ポイントはデバイス値の読出と書込に必要なコマンドと応答です。全てを理解しようとすると時間がいくらあっても足りないので止めましょう(笑)

ちなみに、、
国内メーカのPLCの場合は大半が通信プロトコルを公開していますが海外メーカの場合はこのような通信プロトコルを公開していないものもあるようです。(使ったことが無いから噂レベルですが。。)

プロトコルには大きく分けてシリアル用(RS-232/422/485)とEthernet用(TCP or UDP)に分けられており、それぞれにAsciiかBinaryかがあります。(プロトコルによって固定されるものもある)
最近のユニットを相手にするのであれば(CPU内蔵の)Ethernetだと思います。
※実際に送受信するデータの説明も必要と思いますが、とっても面倒くさいので次回以降に(笑)

三菱の場合

MCプロトコルは少しややこしいです。

シリアル用に1C、2C、3C、4Cというフレームがありそれぞれ形式1~4が存在し(4Cのみ形式5がある)、形式1~4はAscii、形式5はBinaryとなります。Ethernet用に1E、3E、4Eというフレームがあり(2Eは無い)、形式は無く、Ascii or Binaryは選択式となります。

1Cや1Eフレームは古いユニット(Aシリーズ)互換のものなので最近のユニットを相手にする場合は特に理由が無いかぎり3Eフレームが無難です。(あえてシリアルを選択するならば4Cですかね。。)

最近のCPUはEthernet内蔵タイプが多いですが、コレを使う場合4Eフレームは使えないので注意が必要です。またCPU内蔵Ethernetの場合は他局アクセスできない(たとえばCC-IE経由で別CPUにアクセス)のもポイントです。

OMRONの場合

MCプロトコルよりはシンプルです。

シリアル用はAsciiのみ、Ethernet用はBinaryのみとなります。ややこしいのはEthernetでTCPを使う場合です。この場合FINSコマンドマニュアルには記載されていない“FINS/TCPヘッダ”と呼ばれるデータを付加しないと通信できません。(たしかEthernetユニットのアプリケーション構築編(SBCD-330)のマニュアルに記載)

“マニュアルのたらいまわし”はエンジニア界隈によくある話と思いますが、個人的に○MRONは比較的多い気がしています。

KEYENCEの場合

上位リンクのプロトコルはものすごくシンプルです。シリアルでもEthernetでもAsciiのみ。(シリアルだとマニュアルには”KVモード(上位リンク)”の記載)

PLC的には後発メーカなので三菱ユーザを取り込もうとしているのが随所に見られます。通信に関しても例外ではなくMCプロトコルに対応というのはまさにそういう戦略なのでしょう。

ちなみにEthernetの3Eフレームが使えますが、三菱に存在しないデバイスにはアクセス出来ないのと多少デバイス番号の読み替えが必要となります。またシリアルの場合はプロトコルモード1=1Cフレームの形式1相当、プロトコルモード4=1Cフレームの形式4相当、というかたちでMCプロトコルが使えます。

プログラムの言語を決める

言語はある意味なんでもOKですが多少条件があります。
・画面=ユーザインターフェースが作りやすいもの
まずはコレが大前提です。次に、
・ソケット通信やシリアル通信が使いやすい
です。欲を言えば、
・ネットに情報が豊富
な言語であれば問題ないでしょう。

そして開発環境が無料もしくは安価なものを考えると、、
C#やVBなどVisual Studio系(ExpressでもCommunityでも)が一番手っ取り早いです。もちろんVisual Studioでなければダメということでは無いので慣れたものを使えば問題ありません。ツールの目的によってはExcelマクロ(VBA)も選択肢に入るでしょう。(但しそこそこのWinSockやAPIの知識が要求されます)

通信処理と画面は同じ言語で作成したほうがデバッグ的にもいろいろ楽になりますが、同じ言語が必須なわけではありません。通信処理はC/C++(dllの関数にしてしまう)、画面はC#ということも可能です。(結構面倒ですが、どんな言語からでも通信処理を呼び出せるメリットがある)

※個人的にC/C++、C#、VB、Excelマクロ(VBA)でそれぞれ通信処理を作ったことがありますが、通信処理そのものを一番記述しやすいのはC言語です。が、C#やVBから呼び出すのが面倒なのも確かです。。
とりあえずこのサイトではVB(もしくはC#)をメインに説明しようかと思います。

通信処理の構成を決める

まずは通信処理の基本的な流れです。それぞれの機能・動作毎に処理内容を考えるのが基本となります。

  1. 通信回線の接続
    (OpenやConnectなどと表現)
  2. コマンド・メッセージを送受信
    (Send/Recv、Tx/Rxなどと表現)
  3. 通信回線の切断
    (CloseやDisconnectなどと表現)

1.と3.は最初と最後に必須の決まり文句のようなもの、と考えてください。
ポイントは2.です。ツールとして必要なものはデバイス値の読出と書込です。(各社で少しずつ異なるものの)ビット単位の連続読出、ワード単位の連続読出、指定デバイスのランダム読出、ビット単位の連続書込、ワード単位の連続書込、指定デバイスのランダム書込といった機能を持っていることがほとんどです。全部盛り込んでしまうのもアリですが、実際に必要な機能を考えて実装するのが得策です。

私が考えるオススメ機能は以下です。

  1. ワード単位連続読出
    ビット単位はワード単位でも代用可なのであえて無視。
  2. ランダム読出
    任意だがツールの目的によっては必須。可能なかぎりワード単位がベター。
  3. ビットの書込
    セットとリセットに分け1点に絞るほうが使い勝手が良い。
    可能ならビット反転(読出→論理演算→セット or リセット)があるとさらに便利。
  4. ワード単位連続書込
    連続書込があればランダム書込は特に不要。

もちろん絶対的に上記のように作れ!というつもりはサラサラありません。ツールの目的に合わせて必要なものを取捨選択すれば良いと思います。

ただ、、作成する場合まず読出、次に書込をオススメします。先に書込処理を作ってバグがあった場合にPLC側に影響を及ぼす可能性が高いためです。読出処理を作ってデバッグし、ある程度プロトコルに対しての理解を深めてからの書込処理のほうがいろんな意味でリスクを軽減できます。

それと忘れてはいけないのがデバイスについてです。通信がAsciiの場合は文字列でデバイスを指定(桁数指定が必要な場合もある)しますが、Binaryの場合は種別(デバイスコード)とデバイス番号で指定する必要があります。(デバイスコードについては各マニュアルに記載されている)

プログラム内部で通信処理を呼び出す際にデバイスを文字列で指定するか、数値で指定するか、コレはもちろん製作者が自由に決めて構わないですが、結局のところデバイス文字列⇔数値(デバイスコードと番号)に変換する処理が必要になります。

必要な情報を整理する

通信において必要なパラメータを把握・整理しておきます。

【シリアルの場合】
COMポート番号: PC上で認識されている番号。COM1~COM256まで。
Baud Rate: 通信速度(9600bpsとか、115200とか)
データ長: 7 or 8ビット *5/6ビットは使われない
パリティ: None(なし) or Odd(奇数) or Even(偶数) *Mark/Spaceは使われない
ストップビット: 1 or 2ビット *1.5ビットは使われない
※COMポート以外はPLC側にも設定があるので互いに合わせる必要がある

【Ethernetの場合】
IPアドレス: 192.168.1.1 など
ポート番号: 1~65535 *通常1024以下は使わない
ソケット: TCP or UDP
※PLC側の設定に合わせる必要がある
※Ethernet通信の場合はPLC側がサーバー、PC側(ツール側)がクライアントとなる

上記とは別に通信プロトコル上で必要なパラメータも存在します。
MCプロトコルやFINSの場合はネットワーク越しの他局アクセスが可能なプロトコルのためそれらを指定する必要がありますが、大半は自局アクセスとなるためマニュアルに記載されている自局用の値を使えばOKです。KEYENCEの上位リンクの場合はそもそも他局アクセスという概念がないプロトコルなので別途パラメータは不要となります。

コメント