NGルール
基本ルールどおりに記述していけばラダーは作れますが、NGパターンも知ってこそ基本です。
- 無条件にコイルや命令は記述できない
- 条件の無いブロックは記述できない
- 処理順のわかりにくい回路は書かない
- 2重コイルは悪
図で順に説明します。
1番。無条件に出力(コイル or 命令)出来てしまうのでは制御する意味がありませんのでNGです。開発環境によってユーザーにエラーであることを教えてくれます。
2番。条件が無い回路ブロックは作れません。条件が無ければそもそも記述してはいけません。
3番。実は少し特殊パターンです。見方や考え方によっては赤枠で囲まれた部分の判定順序・条件ってどうなの?という無駄な混乱を生じさせる可能性があります。
三菱では明確にNGとなりこの回路を確定させることは出来ませんが、OMRONやKEYENCEではこの回路はOKとなります。が、OKだからといってこの形の回路は多用すべきではありません。
(2019/11/25 追記)勘違いしてた。。KEYENCEもNG。
書けるもの使って何が悪い?という意見もあるだろうが
自分なら書かない、書かせない、ってだけ
4番。2重コイル(3重、4重とさらに多重になることもありえる)はラダーの文法として間違いではありませんが、やってはいけないことの代表例です。単なる入力ミスで2重コイルになることもあれば、複数人で作成して結合したら実は2重になっていた、などは良くあるパターンです。開発環境の設定によっては回路作成時に多重使用であることのチェック機能もあります。
2重コイルの何がマズいのか?ですが、スキャン内で値が変わってしまうことです。通常コイルは1回こっきりで使うので次回スキャンで更新されるまで値が変わらないという考えのもとに設計・実装していくのが一般的です。
実際に2重コイルをやらかしてしまうのは何千何百と作られた回路のどこかになるので、接点として使用しているある回路は動いたり別の回路は動かなかったりと予期せぬ動作となる場合があります。要はバグや不具合と呼ばれるものに直結しやすいので、2重コイルは悪と言われるわけです。
ちなみに以下のラダーを実行するとどうなるか分かるでしょうか?
- 1行目でM300がONします。
- 2行目はM300がON状態なのでM301もONします。
- 3行目でM300がOFFします。(ここで2重コイル)
- 4行目はM300がOFF状態なのでM302はOFFします。
動作は難しいものではないのですぐ分かると思いますがラダーをモニタした時にどう見えるのか?ということも合わせて覚えたほうが良いです。ポイントは2重コイルとなっているM300です。
この場合M300はOFFとしてモニタされます。ルールは単純でスキャンの1番最後に実行された状態がモニタ値として反映されます。もし次の5行目に常時ONでM300を3重コイルにする回路を追加したなら、M300はON状態としてモニタされることになります。
蛇足ですが、、
ここでは2重コイルの説明をしているので「あー、そだね~、ふ~ん」となるのですが以下のモニタ状態を見たらどうでしょう?
これだけを見たなら1行目は条件がONしているのにM300がONしない、2行目は逆に条件がOFFなのにM301がONしている、という違和感を感じるハズです。
コレを見て何が問題かわからないなら素人レベル、え?なんかおかしくない?と感じれば初級レベル、中級~上級レベルともなれば2重コイル?インデックスが悪さしてる?そもそも転送したラダーとモニタしているラダーが違ってる?等と何かしらの原因が推定できますが、即座に解決できるとは限りません。
結局何が言いたいのか、、
無駄にトラブるから2重コイルには注意しろ
です。
2重コイルは”犯罪です”ぐらいの心構えでちょうど良い
コイルとSET/RESET
リレーのコイル出力とSET/RST命令によるON/OFFは、ぶっちゃけどちらでも同じことは可能ですが違いもあります。マスタコントロール(MC/MCR命令、OMRONだとIL/ILC命令に相当)を使った場合の条件OFFの際にコイル出力はOFFとなりますが、SET/RSTの場合は命令が実行されないので値が維持されます。(マスタコントロール自体を邪道扱いする人もいたりしますが。。)
慣れた人ほどコイルを良く使い、セット/リセットを忌み嫌う傾向があります。理由は簡単でコイルならば一箇所確認すればON/OFF条件が分かるのに対してSET/RSTの場合は記述した数だけ確認しなければならないからです。前述の2重コイルの話とダブりますがSET/RST命令はどこに何回記述しても間違いではありませんが何度も使う=バグのもととなります。
たいていの場合はコイルでもSET/RSTでも同じ意味の記述はできますがコイルで記述したほうが都合が良い場合が圧倒的に多いです。(通信処理の場合はSET/RSTのほうが都合が良い場面もあったりしますがかなり限定的。)
コイルの場合はON/OFF条件をまとめて記述せざるを得ない=別々に書くことが出来ない、SET/RSTの場合は別々にしか書くことが出来ない、というのがポイントです。それなりの規模のプログラムでデバッグなり動作確認を経験するとON/OFF条件がまとまっていることのメリットを実感します。逆に別々に記述してあるとデメリット(というよりむしろ怒り)を感じることになるでしょう。
SET/RSTはなるべく使わないほうがベターですが、稀に使わざるを得ないような場面もあります。その際にはSET/RSTは1回ずつしか使わない、なるべく近くに記述する、といった制約を設けておくと後々不幸になる確率がグッと下がります。
ちなみに初心者はコイルよりもSET/RSTのほうが書きやすいと感じるかもしれませんが慣れと環境の問題です。実際のところ自分が初心者のころコイルは書きにくくて面倒だと思っていましたが、1~2ヵ月後にはSET/RSTは邪道だよね~とアッという間に考え方が変わりました。
メーカーの取説に記載されてる参考回路には
SET/RSTをガンガン使っているものもあるが、、
鵜呑みにしてそのまま使う阿呆は勘弁だな。
命令
命令はいろいろあるので一度で覚えるのは不可能ですし無意味なので必要なときに必要なものだけ調べて使えばOKなのですが、ざっくりどんなものがあるのかだけは把握しておく必要があります。といっても最近の開発環境ならヘルプが充実しているのでヘルプメニューから調べることが出来ます。最悪メーカーサイトからCPUのマニュアルをダウンロードすれば困ることは無いでしょう。
ただ毎度毎度命令を調べていたのでは時間がかかりすぎてしまうので良く使うものは覚えてしまったほうが良いです。(というより使っていればイヤでも覚えるんですけどね。。)
三菱 | OMRON | KEYENCE | 備考 | |
データ転送 | MOV DMOV $MOV | MOV MOVL MOV$ | MOV MOV.D SMOV | 16ビット 32ビット 文字列 |
ブロック転送 | BMOV | XFER | BMOV | |
同一データの 一括転送 | FMOV | BSET | FMOV | |
立上り出力 | PLS | DIFU | DIFU | |
立下り出力 | PLF | DIFD | DIFD | |
インクリメント | INC | ++ | INC | |
デクリメント | DEC | — | DEC | |
加算 | + | + | ADD, + | |
減算 | – | – | SUB, – | |
乗算 | * | * | MUL, * | |
除算 | / | / | DIV, / |
上表のものは良く使われる命令です。他に論理演算や対数・指数関数、三角関数、データテーブル(FIFOとか)、繰り返し処理、サブルーチンの命令はたいていのCPUで使用可能です。(使う頻度は別として。)最初にサラッと命令のヘルプや取説を確認すると良いでしょう。
ド・モルガンの定理
この定理の名前を知らずに使っている場合は多いと思います。
実際のラダーを書いているとOR条件が10個や20個という場面もありますが、バカ正直に接点を並べてしまうとものすごく縦長になって読みにくくなるというデメリットが発生します。その場合1~2行にまとめて記述する方法が良く使われます。
A接点⇔B接点、AND⇔ORを入れ替えて、全体を否定(NOT)すると元の論理と一致することを利用したものです。
説明では分かりにくいのでラダーを見比べるのが早いですね。
回路の形は違いますが論理は同じです。もっと複雑な条件回路になっても考え方は同じです。
- A接点→B接点
- B接点→A接点
- AND→OR回路
- OR→AND回路
- 最後に全体をNOT
接点2つのパターンで落ち着いて考えればおそらく理解しやすいと思います。もし分からなければド・モルガンの定理(または法則)でググれば優秀な先生がたくさんいらっしゃるかと。
コメント
コメント一覧 (4件)
PLC初心者です。
さきちゃんさんのサイトとても分かりやすいです。
フリップフロップをはじめてみたときは、さっぱり分かりませんでしたがこのサイトを拝見して理解することが出来ました。
ぜひ初心者カテゴリーを更新してほしいです。
説明も分かりやすいので助かりました。
ありがとうございました。
サイトをご覧いただきありがとうございます。
PLCに関するもの=仕事のパターンが多いと思うので何であれ役に立ったのであればサイトを作った甲斐がありました!
ちょいとネタに困っていた最中のここ半年ほど、、
ちょいと病気&ちょいと手術に見舞われてやる気がそがれて更新が止まってますが、、
時々コメントをいただいてやる気が復活しつつある、、
そんな気がしてます。頑張ります!
SET/RSTのところについては一長一短かなあと思いました。
まとめてかける = 可読性は下がる
別々にかける = 可読性は上がる
といったメリットもあるはずなので。(どちらか一方を支持しているわけではありません)
プログラマの出身分野によって、高級言語系の方はSET/RSTを好む傾向がありますし、
ラダーを最初からきっちり習ってきた方はコイルでの記述を好む傾向にある気がします。
言語系からPLCに入るとSET/RSTを好むのは分かります。自分もそうでしたし。。
SET/RSTを100%否定するわけではありませんが多用は禁物、くらいですかね。
(なんだかんだ自分もSET/RSTを使いますし。。)
要は書き方・使い方を工夫しておくのがポイントだと思います。
また少し話がそれますが、、
これまでの経験上、ラダーでSET/RSTを多用しているプログラムはあまり深く考えずに作られている(≒考え切れていない・不具合が多い)確率が高いです。
あくまでも私の中では、というだけなので一般的ではありません。
が、約10年前にSET/RSTを多用したマジで超絶クソなラダーを押し付けられて軽く殺意がわいたことも今では良い思い出ですw