自己保持の地獄から脱却!Dレジスタで作るステートマシン歩進制御の型

  • URLをコピーしました!
\ 迷子にならないための地図 /

未経験から一人前への
「最短ルート」公開中

独学で「何から勉強すれば…?」と悩んでいませんか?
現場で戦える知識を、体系的にまとめました。

FA電気設計ロードマップを見る

【実践プログラミング編:第5回】

本連載では、FA現場で戦うための実務特化型プログラミングを解説します。

  • 自動運転を「自己保持の連鎖」で作り、デバッグで地獄を見ている
  • 異常停止の条件を継ぎ足しすぎて、なぜ設備が止まるのか誰も分からない
  • 立ち上げ終盤に「工程を1つ追加して」と言われ、絶望したことがある

実務経験9年の現役電気設計エンジニアとして断言します。自動運転の歩進(ステップ)制御を「自己保持の連鎖(ON/OFFの回路)」で組む手法は、決して間違いではありません。しかし、複雑な要件が絡む現代の実務においては、プロジェクトの進行を著しく遅らせるリスクを秘めています。

この保守性の壁を突破する、より強固な設計手法。それがデータレジスタ(D)の数値で工程を管理する「ステートマシン(状態遷移)方式」の歩進制御です。

本記事を読めば、「今、設備がどこで止まっているか」が数値で一目でわかり、後からの工程追加や「途中再開」「逆送り」すら自在に操れる、一生モノのシーケンス設計の「型」が身につきます。これまでの接点思考を離れ、プログラムを「数値(ステート)」で支配する極意を解説します。

【本連載の前提】
本記事内のプログラム例や命令語は、国内FA業界で最もシェアの高い「三菱電機製PLC(MELSEC)」をベースに解説しています。しかし、ここで解説する「なぜその命令が必要なのか」「現場でどう使うのか」という設計思想は、オムロンやキーエンスなど、すべてのメーカーのPLCで共通して使える普遍的な技術です。メーカーの違いを恐れず、本質的な「設計の根幹」を身につけてください。

目次

なぜ「自己保持の連鎖」は複雑化に弱いのか

自己保持を用いた歩進制御の基本にして正攻法は、「一連のサイクルが終わるまで各工程の自己保持をキープし続け、最後に一括でリセットする」方式です。10工程程度の単純な装置であれば、この構成で全く問題ありません。

🔗 あわせて読みたい
本記事は複雑なシーケンスを前提としていますが、「まずは基本的な自己保持回路の作り方をおさらいしたい」「自己保持が切れなくて困った経験がある」という方は、ぜひこちらの基礎解説記事からご覧ください。
▶【PLC】自己保持回路の書き方と設計作法〜ラダー図のブロック思考でバグを防ぐ〜

しかし、実際のFA現場では「工程が数十個以上ある」「異常停止したら直前から再開させたい」「不良品を弾くために工程を戻したい(逆送り)」といった高度な要件が当たり前のように要求されます。

この時、「最後まで自己保持をキープする」という正攻法が、一気に牙を剥きます。

工程の途中でリトライさせたい場合や途中再開をさせたい場合、「戻りたい工程以降の自己保持だけをピンポイントでOFFにする」あるいは「途中から再開するために、それ以前の自己保持をすべて擬似的にONにする」といった、状態のつじつまを合わせるための複雑な「初期化・復帰回路」を別途組まなければならなくなります。

異常時のインターロックや復帰条件が絡み合うことで、あっという間に「誰も解読できないスパゲッティ回路」が行き着く先となります。複雑なシーケンスにおいて「接点のON/OFF」だけで状態を管理しようとするアプローチは、設計の難易度を跳ね上げてしまうのです。

🔗 あわせて読みたい
「複雑なシーケンスなら、自己保持(OUT)ではなくSET/RST命令でバトンを渡せばいいのでは?」とお考えの方へ。SET/RST命令にも、リセット忘れによる多重起動などの恐ろしい罠が潜んでいます。実務での正しい使い分けについては、こちらの記事で徹底解説しています。
▶【PLC】自己保持(OUT)とSET/RSTの使い分け〜ラダー図に潜む致命的な罠〜

ステートマシン方式の歩進制御とは

自己保持によるON/OFFの思考から、一段階ギアを上げてください。複雑なシーケンスを接点ではなく、「データレジスタ(D)の数値」で管理します。

概念は非常にシンプルです。例えば「D100」というデータレジスタを用意し、これを「現在の工程番号を示すハコ」として定義します。

  • D100 = 10 なら、工程1(シリンダ前進)の状態
  • D100 = 20 なら、工程2(ドリル下降)の状態
  • D100 = 30 なら、工程3(ドリル上昇)の状態

設備は常に「D100に入っている数値」の動作だけを実行します。
通常の順序で次へ進む場合は、条件成立時にD100の中身を「10」から「20」へと上書き(MOV命令)して歩進させます。

真価を発揮するのは「途中再開」と「逆送り」

この「数値による状態管理」の真価が発揮されるのは、異常停止後の「途中再開」や、特定の工程を飛ばす「スキップ」、不良排出のための「逆送り」といったイレギュラーな動作指示を出す時です。

自己保持の連鎖であれば、状態のつじつまを合わせるための複雑なリセット回路や、特定の接点を擬似的にON/OFFするような泥臭い回路変更を強いられます。

しかしステートマシン方式であれば、そのような操作は一切不要です。D100の中身を「再開(ジャンプ)させたい工程番号」へ、ポンと上書き(MOV命令)するだけで、一瞬にして設備の状態を任意のステップへ移行させることができます

ステートマシン歩進制御の具体的な「型」

ここからは、実際にDレジスタを使ったステートマシン方式の書き方を解説します。
プログラムの基本構造自体は、自己保持(Mリレー)でステップを組む時と変わりません。「状態を定義し、条件で次の状態へ進め、その状態に応じた出力を出す」というお決まりの流れです。

しかし、主役が「M接点のON/OFF」から「Dレジスタの数値」に変わるだけで、プログラムの拡張性と異常時の強さが劇的に変わります。具体的な組み方を以下の3ステップで見ていきましょう。

STEP1:まずは「状態(ステート)の定義」を設計する

いきなりラダーを書き始めてはいけません。まずは、データレジスタ(ここでは D100 とします)の数値が、設備のどの状態を指すのかを設計図として定義します。

  • D100 = 0 : 原点待機
  • D100 = 10: 工程1(シリンダ前進)
  • D100 = 20: 工程2(ドリル下降)
  • D100 = 30: 工程3(ドリル上昇)
  • D100 = 40: 工程4(シリンダ後退)

💡 実務の知恵:ステート番号は「10飛び」にする
数値を「1、2、3…」ではなく「10、20、30…」と10飛びで割り振るのが、実務における強力なテクニックです。こうしておけば、立ち上げ終盤に「工程1と工程2の間に、エアブロー(15)を追加して!」と無茶振りをされても、前後のプログラムをずらすことなく「D100 = 15」のステートを間に追記するだけで瞬時に対応できます。

また、自己保持(Mリレー)で番号を飛ばすと、使わないM11〜M19といったデバイス領域を無駄に消費してしまいますが、データレジスタの「数値」であれば、どれだけ間を空けても消費するデバイスは「D100(1ワード)のみ」です。無駄なデバイス消費を抑えられるのも、数値管理ならではのメリットです。

STEP2:MOV命令で「次の状態」へ遷移させる(歩進回路)

次に、「どの条件を満たしたら、次の状態へ移行するか」というルールだけを記述するブロックを作ります。出力のことは一旦忘れてください。

【状態遷移のラダー例】

(待機状態から起動ボタンで工程1へ)
[= D100 K0 ] ── [起動ボタン] ─────────────── [ MOV K10 D100 ]

(工程1実行中、前進端センサONで工程2へ)
[= D100 K10] ── [シリンダ前進端] ───────── [ MOV K20 D100 ]

(工程2実行中、下降端センサONで工程3へ)
[= D100 K20] ── [ドリル下降端] ─────────── [ MOV K30 D100 ]
PLCのラダーロジックプログラムのスクリーンショット。3つの工程遷移の例が示されています。

行0:待機状態(D100=K0)で起動ボタン(X0)がONになると、D100にK10を転送して工程1を開始します。
行24:工程1実行中(D100=K10)でシリンダ前進端(X10)がONになると、D100にK20を転送して工程2を開始します。
行50:工程2実行中(D100=K20)でドリル下降端(X20)がONになると、D100にK30を転送して工程3を開始します。

現在「D100が10(工程1)」であり、かつ「前進端センサー」が入ったら、D100の中身を「20(工程2)」に上書きする。M接点のON/OFFではなく、「数値の上書き」によって状態が切り替わっていることを確認してください。

💡 補足:MOV命令について
ここで初めて登場した MOV(ムーブ)は、「右のハコ(D100)に、左の数値(K10)を入れる(上書きする)」という非常にシンプルなデータ転送命令です。 データ転送のより高度な極意(一括転送やシフトなど)については、本連載の第9回で解説します。今の段階では、「Dレジスタの数値を書き換えるためのスイッチ」とだけ認識しておけば全く問題ありません。

STEP3:等価比較命令(=)で物理出力を駆動する(出力回路)

最後に、ラダーの全く別の場所(出力処理のブロック)で、現在の状態(ステート)に応じた出力を実行します。ここで活躍するのが「等価比較命令(=)」です。

【物理出力のラダー例】

(D100が10の時だけ、シリンダ前進ソレノイドをON)
[= D100 K10] ──────────────────────── ( Y10 シリンダ前進 )

(D100が20の時だけ、ドリル下降ソレノイドをON)
[= D100 K20] ──────────────────────── ( Y11 ドリル下降 )
ステートマシン歩進制御における物理出力回路のラダー図例。等価比較命令(=)を使用し、D100が10の時にシリンダ前進(Y10)、20の時にドリル下降(Y11)を出力するプログラム。

正直に申し上げます。順次動作させるだけであれば、この出力回路を書く手間は、自己保持で割り振ったMリレーの接点(M10など)を並べるのと大して変わりません。むしろ、接点入力よりも等価比較命令を入力する方が少し手間だと感じるはずです。

では、なぜわざわざDレジスタとMOV命令を使うのか?

もし設備が工程4(D100=40)で異常停止し、不良品を取り除いて「工程2(D100=20)からやり直したい(逆送り)」とします。

自己保持の連鎖であれば、「M40をOFFにして、M20をONにし直して…」と、状態のつじつまを合わせるための泥臭い復帰回路を考えなければなりません。

しかしステートマシン方式であれば、異常復帰の条件で [ MOV K20 D100 ] と指令を出すだけです。出力回路側は一切書き換える必要がありません。 D100が「20」に上書きされた瞬間に、上の出力回路は自動的に [= D100 K20] の条件を満たし、何事もなかったかのように工程2の出力(Y11)を再開します。

数値の書き換え(MOV)」というたった一つの動作で、複雑なインターロックやリセット回路を組むことなく、一瞬にして設備の状態を任意のステップへジャンプさせることができる。これこそが、異常復帰や仕様変更が日常茶飯事である実務において、ステートマシン方式が「最適解」として選ばれ続ける理由です

まとめ〜プログラムを「状態(ステート)」で支配せよ〜

本記事では、複雑なシーケンス制御における「自己保持」の限界と、それを突破する「ステートマシン(歩進制御)」の極意を解説しました。
重要なポイントを振り返ります。

  • 接点制御の限界: 自己保持の連鎖は、小規模なら正攻法だが、「途中再開」や「逆送り」が要求された瞬間に、つじつま合わせの泥沼(スパゲッティ回路)に陥る。
  • 状態の単一化: Dレジスタの数値で工程を管理することで、「2つの工程が同時に動く」という致命的なバグが構造上100%発生しなくなる。
  • 分離による圧倒的な保守性: 状態遷移(MOV)と出力(=)を完全に分離することで、MOV命令で数値を書き換えるだけで、出力回路を汚すことなく任意の工程へ一瞬でジャンプできる。

メーカーに依存しない「設計力」

冒頭でもお伝えした通り、私たちが身につけるべきは特定のメーカーの命令語の暗記ではありません。今回解説した「状態を数値で管理し、遷移と出力を切り離す」という設計の根幹は、あらゆるメーカーのPLCで通用する「設計の型」そのものです。

接点のON/OFFというミクロな視点から抜け出し、プログラム全体を「状態(ステート)」でマクロに支配する。この思考法さえインストールできれば、あなたはどんな現場の修羅場でも、初めて触る機器を前にしても、決して怯むことなく自信を持って戦い抜くことができます。

明日の設計から、ぜひ「Dレジスタでの状態管理」を取り入れてみてください。デバッグ時の景色が、劇的に変わるはずです。

※本記事で使用している画面は、三菱電機株式会社「GX Works2」の操作画面です。
※GX Works2、MELSECは、三菱電機株式会社の登録商標です。
※本記事で紹介しているプログラムや回路図は、技術解説のためのサンプルです。実機での動作を保証するものではありません。
※実際に使用する際は、十分な検証を行った上で、安全に配慮して運用してください。

💬 更新情報を X (Twitter) で発信中!

記事の更新通知や、現場で役立つ「電気制御の小ネタ」をツイートしています。 また、「記事のここが分からなかった」「現場でここが困っているけどどうしたらいい?」といった疑問があれば、DMで募集しています!個別のトラブル相談も、ブログのネタにさせていただけるなら大歓迎です!ぜひフォローして気軽に絡んでください!

自己保持の地獄から脱却!Dレジスタで作るステートマシン歩進制御の型。プロフェッショナルなPLCラダープログラムの画面を背景にしたアイキャッチ画像。

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!

この記事を書いた人

目次