注意:この項目ではオブジェクト指向がどんなものか伝えるのが目的なので、実際にプログラムでどう書くのかとかは完全に無視するのでよろしくお願いします。
同じ機能使いまわしたい!けど何行もあるプログラムをコピペしてると間違いが起きやすい…
じゃあその機能を「部品」として1個貼付したら使いまわせるようにしたら便利じゃね?
…というのがオブジェクト指向である。 が、理念だけ書いてもわかりにくい。
ところで、PLCには「タイマ」だとか「カウンタ」という機能がある。
これがまんまオブジェクト指向の考え方でできているのをご存じだろうか?
じゃあその機能を「部品」として1個貼付したら使いまわせるようにしたら便利じゃね?
…というのがオブジェクト指向である。 が、理念だけ書いてもわかりにくい。
ところで、PLCには「タイマ」だとか「カウンタ」という機能がある。
これがまんまオブジェクト指向の考え方でできているのをご存じだろうか?
どのシーケンサのどのラダーでも基本実装されているタイマデバイス。三菱だとこうですね。
おめでとうございます!!あなたはもうオブジェクト指向の入り口を突破しました!!
ワケワカンナイヨーとなる前に解説しましょう。
上記のプログラムをタイマやカウンタを使わずに作るとどうなるでしょうか。
タイマの設定デバイスをD1、接点コイルをM2、カウントデバイスをD2としましょう。
元の1行目が1〜4行目に化けました。
この一つだけならいいですが、これをいくつも使おうとするとデバイス管理も大変ですし、まず間違いなくどこかで間違えます。
ラダー回路ではタイマはしょっちゅう使うので、簡単に書けるようにタイマデバイスを使えばこれを省略できるようにしているのです。
ここで使っているタイマデバイスT0はオブジェクト指向における「オブジェクト」そのものです。
現実のリレー回路ではタイマという「もの」を使用しますが、その機能をソフトウェア内で実現した「もの」を「オブジェクト」と呼ぶのです。
ここまでわかりましたでしょうか。わかったのであればオブジェクト指向の初歩はもう理解したも同然です。
- |X0|------(T0 K10)
- |T0|------(M0)
- |SM400|---(MOV T0 D0)
おめでとうございます!!あなたはもうオブジェクト指向の入り口を突破しました!!
ワケワカンナイヨーとなる前に解説しましょう。
上記のプログラムをタイマやカウンタを使わずに作るとどうなるでしょうか。
タイマの設定デバイスをD1、接点コイルをM2、カウントデバイスをD2としましょう。
- |X0|----------------(MOV k10 D1)
- |X0|-|↑SM410|-[D2<D1]--(INC D2)
- [D2>=D1]--------------------(M2)
- |/X0|-------------------[rst D2]
- |M2|------------------------(M0)
- |SM400|--------------[MOV D2 D0]
元の1行目が1〜4行目に化けました。
この一つだけならいいですが、これをいくつも使おうとするとデバイス管理も大変ですし、まず間違いなくどこかで間違えます。
ラダー回路ではタイマはしょっちゅう使うので、簡単に書けるようにタイマデバイスを使えばこれを省略できるようにしているのです。
ここで使っているタイマデバイスT0はオブジェクト指向における「オブジェクト」そのものです。
現実のリレー回路ではタイマという「もの」を使用しますが、その機能をソフトウェア内で実現した「もの」を「オブジェクト」と呼ぶのです。
ここまでわかりましたでしょうか。わかったのであればオブジェクト指向の初歩はもう理解したも同然です。
前項目で挙げたこのプログラム
「最初のは数値代入?…あれ?直後にbool型で記述してるってことは型変換か?でもまたMOVで数値読みだしてる… え?タイマオブジェクトなの?メンバ記述しないでいいの?おかしくない??」
先ほども少し触れましたが、タイマデバイスは同じT0でもプログラム内で意味するところがコロコロと変わります。
オブジェクト指向プログラミングでは、このようにいろんな属性が含まれるT0の中に書き込んだり読み出したりする場合、属性を一括で設定し、その中に設定した要素名を書いて読み書きしなくてはいけません。
例に当てはめれば、
という感じのものを「タイマクラス」として設定してT0に当てはめれば、それぞれの要素として使用することができます。
この要素をまとめたものを「クラス」、一つ一つの要素を「メンバ」と呼びます。
シーケンサではこれを自動でタイマデバイスに設定してくれたうえ、メンバも命令ごとに勝手に切り替えてくれます。便利ですね。
- |X0|------(T0 K10)
- |T0|------(M0)
- |SM400|---(MOV T0 D0)
「最初のは数値代入?…あれ?直後にbool型で記述してるってことは型変換か?でもまたMOVで数値読みだしてる… え?タイマオブジェクトなの?メンバ記述しないでいいの?おかしくない??」
先ほども少し触れましたが、タイマデバイスは同じT0でもプログラム内で意味するところがコロコロと変わります。
- OUTに書くと起動用のT0
- OUT内に記述してT0に保存されるタイムアップ時間
- LDするとタイムアップ状態かどうかの判定のT0
- 数値として読み出すと現在のタイムカウントのT0
オブジェクト指向プログラミングでは、このようにいろんな属性が含まれるT0の中に書き込んだり読み出したりする場合、属性を一括で設定し、その中に設定した要素名を書いて読み書きしなくてはいけません。
例に当てはめれば、
- T0.out (起動用-bool)
- T0.comf (タイムアップ時間-long)
- T0.up (接点用-bool)
- T0.count (現在値-long)
という感じのものを「タイマクラス」として設定してT0に当てはめれば、それぞれの要素として使用することができます。
この要素をまとめたものを「クラス」、一つ一つの要素を「メンバ」と呼びます。
シーケンサではこれを自動でタイマデバイスに設定してくれたうえ、メンバも命令ごとに勝手に切り替えてくれます。便利ですね。
コメントをかく