PLC(プログラマブル・ロジック・コントローラー)の覚え書き

注意:この項目ではオブジェクト指向がどんなものか伝えるのが目的なので、実際にプログラムでどう書くのかとかは完全に無視するのでよろしくお願いします。

オブジェクト指向って何?

同じ機能使いまわしたい!けど何行もあるプログラムをコピペしてると間違いが起きやすい…
じゃあその機能を「部品」として1個貼付したら使いまわせるようにしたら便利じゃね?
…というのがオブジェクト指向である。 が、理念だけ書いてもわかりにくい。

ところで、PLCには「タイマ」だとか「カウンタ」という機能がある。
これがまんまオブジェクト指向の考え方でできているのをご存じだろうか?

タイマデバイスはオブジェクト

どのシーケンサのどのラダーでも基本実装されているタイマデバイス。三菱だとこうですね。
  1. |X0|------(T0 K10)
  2. |T0|------(M0)
  3. |SM400|---(MOV T0 D0)
これらの意味は解りますね?

おめでとうございます!!あなたはもうオブジェクト指向の入り口を突破しました!!
ワケワカンナイヨーとなる前に解説しましょう。

上記のプログラムをタイマやカウンタを使わずに作るとどうなるでしょうか。
タイマの設定デバイスをD1、接点コイルをM2、カウントデバイスをD2としましょう。
  1. |X0|----------------(MOV k10 D1)
  2. |X0|-|↑SM410|-[D2<D1]--(INC D2)
  3. [D2>=D1]--------------------(M2)
  4. |/X0|-------------------[rst D2]
  5. |M2|------------------------(M0)
  6. |SM400|--------------[MOV D2 D0]
め、めんどくせえ…ってなりますね。
元の1行目が1〜4行目に化けました。
この一つだけならいいですが、これをいくつも使おうとするとデバイス管理も大変ですし、まず間違いなくどこかで間違えます。
ラダー回路ではタイマはしょっちゅう使うので、簡単に書けるようにタイマデバイスを使えばこれを省略できるようにしているのです。

ここで使っているタイマデバイスT0はオブジェクト指向における「オブジェクト」そのものです。
現実のリレー回路ではタイマという「もの」を使用しますが、その機能をソフトウェア内で実現した「もの」を「オブジェクト」と呼ぶのです。

ここまでわかりましたでしょうか。わかったのであればオブジェクト指向の初歩はもう理解したも同然です。

タイマの怖い話

前項目で挙げたこのプログラム
  1. |X0|------(T0 K10)
  2. |T0|------(M0)
  3. |SM400|---(MOV T0 D0)
ラダープログラムをやったことのある人には何の変哲もないタイマを使ったプログラムですが、PCのプログラムをやってから初めてラダーをやる人に見せたらビビり散らかすと思います。

「最初のは数値代入?…あれ?直後にbool型で記述してるってことは型変換か?でもまたMOVで数値読みだしてる… え?タイマオブジェクトなの?メンバ記述しないでいいの?おかしくない??」

先ほども少し触れましたが、タイマデバイスは同じT0でもプログラム内で意味するところがコロコロと変わります。
  1. OUTに書くと起動用のT0
  2. OUT内に記述してT0に保存されるタイムアップ時間
  3. LDするとタイムアップ状態かどうかの判定のT0
  4. 数値として読み出すと現在のタイムカウントのT0
命令の変化だけでこれらが切り替わるのはPCプログラムでは異常なことです。

オブジェクト指向プログラミングでは、このようにいろんな属性が含まれるT0の中に書き込んだり読み出したりする場合、属性を一括で設定し、その中に設定した要素名を書いて読み書きしなくてはいけません。
例に当てはめれば、
  • T0.out (起動用-bool)
  • T0.comf (タイムアップ時間-long)
  • T0.up (接点用-bool)
  • T0.count (現在値-long)

という感じのものを「タイマクラス」として設定してT0に当てはめれば、それぞれの要素として使用することができます。
この要素をまとめたものを「クラス」、一つ一つの要素を「メンバ」と呼びます。

シーケンサではこれを自動でタイマデバイスに設定してくれたうえ、メンバも命令ごとに勝手に切り替えてくれます。便利ですね。

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

編集にはIDが必要です