こんにちはー、りびぃです。
普段はFA(ファクトリー・オートメーション)の業界で電気制御の設計など、さまざまな仕事をしています。
FAの機械の多くは「ラダー回路(ラダープログラム)」というツールを使って挙動・動作を定義し、それをPLCへ転送することによって実際の機械を動作させることができます。
ラダー回路は直感的に挙動がわかりやすいデザインをしているため、たとえ未経験者だとしても実際に手を動かしてプログラムを作成してみると意外と簡単に完成できてしまうという方も多いです(私もわずか数週間程度で、簡単な半自動機のラダー回路を作成できるぐらいにまでなりました)。
しかしこれが生産ライン規模ぐらいにまでなると、そう簡単にはいかなくなります。
生産ライン規模になりますと多くのボタン、ランプ、センサ、アクチュエータを使用することになりますので、それに伴いプログラム作成に必要なデバイスの数も数千~数万にまで及ぶことがあります。
さらにそのような膨大な数のデバイスを「A接点/B接点/コイル」「AND/OR」などで組み合わせて使用する必要があるため、必然とプログラムも膨大かつ複雑になりやすくなり、当然プログラムのミスも生まれやすくなります。
このような大規模なラダー回路を作成する際には
- 効率的にラダー回路を作成できること
- ミスが起こりにくいラダー回路を作成できること
- ラダー回路のミスを発見しやすい形でプログラムを作成すること
といったテクニックがとても重要になります。
そのようなときにぜひ覚えたいのが「INV(反転)命令」です。
INV命令とは「その直前までの演算結果(ON/OFFの状態)をひっくり返す命令」であり(論理演算を習ったことがある方は「NOT回路」と同じだと思ってください)、ラダー回路上では斜め線で表示される場合が多いです。

つまり例えば
- 1つのA接点の直後にINV命令をつけると、B接点になる
- 1つのB接点の直後にINV命令をつけると、A接点になる
という挙動になります。

ただこれだけではINV命令を使うことのメリットや、実践でどのように活用していけばいいのかがわかりづらいですよね。
一方で他の方が作ったラダー回路を引き継いだ際、以下のようなINV命令を使った回路を見かけることがあります。

このような回路はどういう動作をするのかが直感的にわかりづらいので、見慣れておかないと回路を理解したり、そのうえで修正作業をする際に困惑してしまいます。
そこで今回は、実際の自動機向けのラダー回路においてINV命令を使う活用事例や注意点について、わかりやすく解説をしていきます。
目次
INV命令の活用事例
事例1: 信号入力のON/OFF回路をスマートにする
生産設備には、光電センサ、近接センサ、オートスイッチなどといった多数のセンサが導入され、そこからの信号は入力ユニットを介してPLC内で割り当てられたデバイスにて受け取る方式がとられることが一般的です。
ですが、入力デバイスをそのまま各制御回路の接点として使用してしまうと、センサ信号のノイズによるチャタリングなどの影響で制御回路の誤作動が発生するリスクがあります。
そのためセンサ信号のOFFからON、あるいはONからOFFに対して以下のようにタイマを設置し、制御回路が安定的に動作するようにします。

しかしこの回路を作成する際「X1デバイスのA接点をタイマに割り当てて、X1のB接点を別のタイマに割り当てて、X2についても同様に・・・」ということをする必要があるため、回路作成が若干煩雑になります。
コピー&ペーストを使えば効率的に作成できるもののコピー&ペースト後にデバイスの割振り(X1やX2など)を結局手作業で修正する必要があるため、「うっかり修正しそびれた!」というようなデバイスの割り当てミスが起こりやすいです。
そこで以下のようにINV命令を導入することで、一つの接点だけを使って2つの異なるタイマのON/OFFを実装することができます。

一見ちょっとした改良にしか見えないかもしれませんが、接点の数が減ったことによって割り当てミスを起こりにくくすることができます。
事例2: 冗長なOR回路をすっきりする
規模の大きい生産設備のラダー回路を作成している中で、大量の接点をORでつなぐ必要がある箇所が出てきます。
よくあるのが異常関係の回路で、「○○の異常がなく、かつ○○の異常がなく、かつ○○の異常がなく・・・」というように、たくさん(多い場合ですと100個近くになります)の接点をORで繋いで回路をつくることが多くなります。
その際、単純に以下のようにOR回路を組んでも間違いではないのですが、回路の確認やモニタをするために画面を上下に何度もスクロールしなければならなくなりますし、回路の修正作業等もしづらくなります。

中には「小分けにデバイスをまとめることで、上下スクロールを最小限にする」という方もいますが、
- 特定したいデバイスにたどりつくまでに何度もクロスリファレンスで参照先を渡っていかなければならず特定に時間がかかる
- デバイスの数が多くなりがちになる
ということから、あまり得策とも言えません。

このようなときには
- 接点を逆にする(A接点のものはB接点に、B接点のものはA接点に)
- 各接点をANDで繋ぐ
- コイルの直前にINV命令を入れる
というようにすると回路がすっきりし、ラダー回路のモニタの際に各接点の状況把握がしやすくなります。

OR回路の変換の解説
先ほどOR回路はINV命令で置き換え可能であるという説明をしましたが、初めて見た方にとってはこの回路がOR回路と同じであると言われても理解が難しいかと思います。
そこでここでは事例2で紹介した回路がOR回路と同じかどうかについて説明をします。
まず最初は入力2つ(M001とM002)出力1つ(M100)を使って説明をします。
OR回路の挙動は「入力のいずれか一つでもONすれば出力がON」となることから、入力は2つともA接点であるとして論理表で表すと以下の通りとなります。

一方でINV命令で変換した方の論理表ですが、
- 入力がB接点に変わること
- 入力がANDで繋がれていること
の2点に注意をしながら作成をしていくと、以下のようになります。

ということでOR回路と全く同じであることがわかります。
上の例では2つの入力の場合で説明しましたが、これは接点の数が何個であろうと同じ結果が得られます。
INV命令による変換回路は直感的にはわかりづらく、慣れるまでに少々時間がかかることもありますが、活用できるようになるととても効率的に作業を進めることができるので、ぜひチャレンジしてみてください。
ちなみに「全部を直列で繋ぐとかえってわかりにくい。ある程度行ごとに分けて回路を作りたい」という場合には、以下のように行分けして表記することもできます。

事例3: 2つ以上のANDの塊がOR回路で繋がれたものを変換する
事例2では、1つ1つの接点がOR回路になっているものをINV命令を使ってすっきり表現するという事例について紹介しました。
しかし実際の自動機のラダー回路を作成している中では、「2つ以上のANDの塊がOR回路で繋がれた回路」というものも必要になってきます。
個人的に一番多いと思うのは以下の例の通り、「動作指令」と「インタロック」とをANDで繋いで出力信号用のコイルへ接続するような回路です。

このような回路をINV命令で変換すると以下のように表現できます。

この変換のポイントは
- A接点はB接点に、B接点はA接点に
- ANDで接続していた箇所はORに、ORで接続していた箇所はANDに
- 回路の最後にINV命令を足す
となります。
各ポイントは事例2と同様なのですが、複雑な回路でいざやろうとすると意外と「どうすればいいんだろ?」とつまずきやすくなります。
なのでしっかりとポイントを押さえていただければと思います。
ただしここまで複雑な回路は周囲のソフトエンジニアから好まれないことも多いので、この場合のようなINV命令の導入はそこまで積極的にやらなくてもいいかなと思います。
もし他の方が作成したラダー回路内でこのような回路が出てきた際に読めれば、とりあえず十分かと思います。
よくあるINV命令の使い方ミス
ここまで話を聞くと「よし、さっそく今度から自分もINV命令を使ってみよう!」と思いたいところです。
ですが実際に活用いただく前に「INV命令を活用し始めた方がよくやってしまいがちなミス」について紹介したいと思います。
例えば「M0~M6で定義したインタロックの直列A接点の箇所は共通で使いたいが、M7で定義したインタロックについては自動モードはA接点を、手動モードではB接点を使用したい」という場合があったとします(実際にもしばしばあります)。
まずこれを単純にラダー回路で表すと以下のようになります。

この回路を見て「M7が2つも出てきているな・・・。よし、INV命令を使って1つにまとめよう」ということで、事例1にならって以下のように修正します。

「よし、これで回路がすっきりしたぞ!」・・・と言いたいところなのですが、実はこの2つの回路は同じにはなりません。
といいますのもINV命令とは「直前の論理を反転する」というものになるからです。
ここでいう「直前の論理」というのは「M7だけ」のことではなく「M0 AND M1 AND ・・・ AND M7」のことを指しています。
ですからこの場合の手動モードの回路は「M0~M7のうち、いずれか一つでもOFFであれば手動モードがON」つまり「本来手動モードでもかかっているべきM0~M6のインタロックの条件がおかしくなってしまう」という挙動をします。
そのためこの場合はINV命令を使って変換することができません。
特にインタロックに関わる回路の場合でこのようなミスが起こると、機械の誤動作によって作業員の安全が脅かされたり機械が故障する原因になりますから、注意して活用するようにしてください。
