PLC の状態遷移図の書き方 — 装置の状態を 1 枚に描き、描かなかった組み合わせを表で埋める
最終更新: 2026-09-24 / カテゴリ: PLC プログラミング・制御ロジック設計 / この記事は日本語のみです。
状態遷移図は、装置全体がいまどの状態にいて、どのボタン・どの異常でどこへ移るかを 1 枚に描く図です。 仕様に無い組み合わせをラダーを書く人に決めさせたくない、PLC の制御設計者に向けて書いています。
試運転で、自動で動いている最中に起動ボタンをもう一度押したら、最初の工程のフラグがもう一度立った。2 つの工程が同時に動いて、シリンダどうしがぶつかりかけた。 非常停止を解除してリセットしたら、原点復帰をしないまま続きから動き出した。 どちらも、動作のフローチャートの正常な流れには出てこない組み合わせです。仕様に書いていないので、ラダーを書いた人がその場で決めていました。 ただ、図に描けるのは思いついた矢印だけです。描かなかった組み合わせは、状態 × イベントの表を作って 1 マスずつ埋めます。 「状態遷移図」という言葉は、分野で指すものが違います。ソフトウェアのテストの記事では UML のステートマシン図(自動販売機や家電の例)。PLC の教材では、SFC のようなステップと移行条件の図を指すことがあります。 ここでは装置全体の状態の図を状態遷移図と呼び、運転中に進める工程の順番はフローチャートに分けます。 このサイトには状態遷移図を描くエディタは無いので、方眼紙・Excel・汎用の作図ソフトで描く前提です。
1. 状態遷移図には装置全体の状態だけを描き、工程はフローチャートへ
状態遷移図に描くのは、装置全体の状態です。例の図は 7 つで、運転中に進める「ワーク待ち → 搬送 → クランプ → ロボットの取出し」は描いていません。 工程は、フローチャートに工程の番号(10・20・30…)と次へ進む条件として描きます。 工程まで状態遷移図に入れると、矢印が工程の数だけ増えます。異常・非常停止・一時停止のように、どこからでも起きるイベントがあるからです。表も、工程の数 × イベントの数に膨らみます。
2 枚は、運転中の工程で結び付きます。一時停止中から起動したら、止めた工程の続きから。起動待ちから起動したときにどの工程から始めるかも、工程の番号で持ちます。 原点復帰のあとと、サイクル停止で止まったあとは最初の工程。続きから動かせる異常のリセットのあとは、止めた工程の頭です。
フローチャートの書き方で「ステップ(状態)」と呼んだのは、この記事の工程にあたります。その記事の「異常からの戻り道」の図は、この図を 1 本の輪に縮めたものです。 状態がこの例ほどに増えたら、起動待ちや異常停止中のような装置全体の状態はこの図に移すとよいでしょう。フローチャートの異常の出口は「異常停止中へ」とだけ書きます。 作業者が毎回ワークを置いて起動する装置なら、印の条件を外します。工程の区切りで毎回起動待ちへ戻す形です(フローチャートの書き方の図と同じ)。
2. 状態は「続いていること」、矢印は「起きたこと」で描く
- 状態は「続いていること」、矢印は「起きたこと」で名前を付ける 状態の名前は「〜中」「〜待ち」「〜未完了」のようにします。しばらく続くことを名前にするためです。 矢印の名前は、一瞬で起きることにします。「起動(押した)」「原点復帰の完了(手順が済んだ)」「異常(時間が切れた)」のように。 「起動」という名前の状態を作ると、押した瞬間のことなのか、動いている間のことなのかが決まりません。
- 処理をしている状態と、待っている状態を分ける 図の灰色の原点復帰中は、処理が終われば自分で起動待ちへ移ります。白の起動待ちは、人が起動を押すまで待ち続けます。 運転中も中で工程を処理しますが、終わりを決めるのは操作者(サイクル停止・一時停止)なので白にしました。 処理をしている状態には、終わったことを何で確かめるかと、終わらなかったときの時間切れを決めます。 原点復帰中なら、終わりは原点復帰の手順が最後の段まで進んだことです。原点復帰のサンプルなら、bHomeDone を ON にする段です。 bHomeDone の値そのものでは見ません。前の原点復帰から ON のまま残っていることがあるからです。軸がいま原点にいるかどうかでも見ません。 時間切れと、手順が途中で中止したとき(サンプルの「ワークを取り除いてください」など)は異常の 1 つです。内側の枠の矢印で異常停止中へ移り、リセットしてから原点復帰を押し直します。 包装機械から広まった状態のモデルの PackML(ISA-TR88.00.02)も、同じ分け方です。「〜ing」の名前の状態は処理が終われば自分で移り、待ちの状態は命令で出る、としています。
- 「どの状態からでも」の矢印は、枠から 1 本だけ引く 異常は、5 つの状態のどれからでも起きます。異常停止中と非常停止中のほかの 5 つです。 5 本の矢印を引く代わりに、5 つを囲む枠を描き、枠から異常停止中へ 1 本引きます。非常停止は、非常停止中のほかの 6 つを囲む外側の枠から 1 本です。 異常停止中を内側の枠の外に置いたのは、異常停止中に別の異常が起きても、状態は変えずに履歴に足すだけだからです。 枠を使わずに矢印を全部引いた図は、矢印が多すぎて、1 本抜けていても誰も気づきません。
- 電源を入れたらどこから始めるかを、矢印で描く 例の図では、電源投入の黒丸から原点未完了へ矢印を引いています。停電のあとは、ワークが途中に残っていることがあり、軸がどこにいるかも確かではありません。 途中のワークを確かめてから、操作者が原点復帰を押します。 安全リレーを手動リセットにしている装置では、電源を入れた直後は動力が入っていません。原点未完了からすぐ非常停止中へ移り、最初の操作は非常停止のリセットになります。 状態を持つ変数は、停電のあとも値が残る範囲に置きません。残る範囲に置くと、運転中に停電した装置は、電源を入れた瞬間に運転中から始まります。誰も起動を押していないのに動き出すでしょう。
- 同じイベントから 2 本出すときは、条件が重ならないように書く 異常停止中のリセットは、行き先が 2 つあります。続きから動かせるときは起動待ちへ、それ以外は原点未完了へ。 条件は矢印の名前のあとに[ ]で書き、中身は図の外で定義します。 例の「続きから動かせる」は、運転中に、ワークがまだロボットに渡っていない異常で止まったときです。制御仕様書の書き方の異常一覧の E01・E02 です。 ただし、2 つのことをリセットのときと起動のときの両方で見ます。止まっているあいだにほかの異常が出ていないこと。止めた工程の頭の条件が、センサでそろっていること。 頭の条件は、E01(搬送の工程から)ならクランプが開いていてロボットが退避していること。E02(クランプの工程から)なら、ワークが定位置にあってロボットが退避していることです。 手動で動かしたかどうかは見ません。E02 の復帰の手順のように手動でクランプを開閉しても、頭の条件がそろっていれば続きから動かせます。 手動のままリセットして起動待ちに入り、そこで手動で動かしても、起動のときに見直します。ずれたまま動き出すことはありません。 例の E01・E02 は、扉を開けずに直せる前提です。扉を開けると安全回路が動力を切るので、非常停止中から原点復帰です。 2 つの条件が両方成り立つことがあると、どちらへ移るかはプログラムに書いた順で黙って決まります。 SFC の選択分岐も、条件が重なったときに左の枝から判定する処理系があります。図の左右の並びが、優先の順になってしまうわけです。
- モードは別の軸にし、切り替えたときの行き先を状態ごとに決める 例の図は、自動モードの状態です。手動モードの間は、原点復帰と起動のボタンを受け付けません。自動へ戻しても状態は変えません。 手動へ切り替えたとき、原点未完了と異常停止中はそのまま手動で動かせます。起動待ちからは原点未完了へ移します。 起動待ちで手動にするのは段取りや調整のときで、装置のどこを動かしてもよいからです。自動へ戻す前に装置全体を確かめ直すことになり、それを原点復帰 1 回で済ませます。 異常停止中から続きで動かすときに確かめるのは、止めた工程の頭の条件だけなので、センサで足ります。 原点復帰中・運転中・一時停止中に切り替えられたら、異常の 1 つとして異常停止中へ。図では「異常」の矢印に含めています。 制御仕様書の書き方では原点復帰をモードの例に挙げましたが、この例では自動モードの中のボタンにしました。 セレクタスイッチに原点復帰の位置がある装置では、表の原点復帰の行を「原点復帰モードで起動を押したとき」と読み替えます。原点復帰モードの間は、起動の行が / です。 原点復帰モードへ回したときの行き先は、手動と同じく状態ごとに決めます。
3. 状態 × イベントの表で、描かなかった組み合わせを埋める
図の矢印は、電源投入のほかに 14 本です。表にすると、7 つの状態 × 10 のイベントで 70 マスあります。 枠の矢印は 1 本で何マスにも当たります。図の矢印を書き写すと 22 マス、「異常」に含めた手動への切り替えの 3 マスを足すと 25 マスです。 残りの 45 マスは、図には出てきません。原点未完了で起動を押したら。動いている最中にもう一度起動を押したら。表を作ると、そうした組み合わせを 1 マスずつ決めることになります。
マスに書くのは、次の 5 通りです。「受け付けない」と「起こりえない」は分けます。組込みソフトの設計で使われる表(JASA の設計の資料など)にならった分け方です。 ソフトウェアのテストの記事では両方を「-」1 つで書くことが多いのですが、装置では確かめ方が違います。 受け付けないマスは、立会いでボタンを押して何も起きないことを確かめます。起こりえないマスは押して試せません。もし起きたら、プログラムの誤りとして異常停止にします。
- → 状態の名前 — その状態へ移る。条件で分かれるときは「条件 → 行き先」を並べて書く
- 文字だけ — 状態は変えずに、書いた処理だけする(印を立てる・履歴に足す・表示を出す)
- / — 受け付けない。何もしない
- × — 起こりえない
- 空欄 — まだ決めていない。出荷までに残さない
| イベント \ 状態 | 原点未完了 | 原点復帰中 | 起動待ち | 運転中 | 一時停止中 | 異常停止中 | 非常停止中 |
|---|---|---|---|---|---|---|---|
| 原点復帰(ボタン) | → 原点復帰中 | / | → 原点復帰中 | / | / | / | / |
| 原点復帰の完了 | × | → 起動待ち | × | × | × | × | × |
| 起動 | 「原点復帰が済んでいません」と表示 | / | 再開の位置にそろっている → 運転中 そろっていない → 「再開の位置にありません」と表示 | / | → 運転中(止めた工程の続きから) | / | / |
| 一時停止 | / | → 原点未完了(復帰をやめる) | / | → 一時停止中 | / | / | / |
| サイクル停止 | / | / | / | 印を立てる | 印を立てる | / | / |
| 工程の区切り | × | × | × | 印あり → 起動待ち 印なし → そのまま次のワークを待つ | × | × | × |
| 異常 | → 異常停止中 | → 異常停止中 | → 異常停止中 | → 異常停止中 | → 異常停止中 | 別の番号の異常が新しく出たら履歴に足す(続きからは動かせなくなる) | 新しく出た異常を履歴に足す |
| リセット | / | / | / | / | / | 原因が残っている → / 続きから動かせる → 起動待ち それ以外 → 原点未完了 | 解除する前 → / 離したあと、動力が入った → 原点未完了 離してから 3 秒で入らない → 「動力が入らない」と表示 |
| 非常停止 | → 非常停止中 | → 非常停止中 | → 非常停止中 | → 非常停止中 | → 非常停止中 | → 非常停止中 | / |
| 手動へ切り替え | 手動で動かせる | → 異常停止中 | → 原点未完了 | → 異常停止中 | → 異常停止中 | 手動で動かせる | モードだけ切り替える |
「工程の区切り」は、運転中に成り立つ条件です。最初の工程(ワーク待ち)にいて、次のワークを待っている(コンベアを起動する前の)あいだです。運転中を条件に含めるので、ほかの状態では成り立ちません。 一時停止中は、動き出したシリンダを端まで行かせますが、工程は進めません。 起動待ちからの起動は、条件がそろっているときだけ受け付けます。最初の工程なら原位置、続きからなら止めた工程の頭の条件です。 サイクル停止の印は、起動待ち・異常停止中・非常停止中に入ったときに消します。異常の行は異常一覧の E01〜E04 で、非常停止(E05)は非常停止の行で扱います。
マスを埋めるときに迷うのは、次のようなところです。
- 運転中の起動は / — 状態を 1 つの変数で持ち、起動待ちか一時停止中のときだけ受け付けます。工程ごとのフラグを SET / RST でつないだラダーでは、冒頭の二重起動が起きます。動いている最中に起動を受け付けてしまうからです。表のとおりに決めれば、この条件は起動の回路 1 か所に入ります
- 原点未完了の起動は、受け付けずに表示を出す — 何も起きないと、操作者は起動を何度も押し、保全を呼びます。異常停止中の起動は / のままにしました。異常の表示がもう出ていて、動かない理由が画面から分かるからです
- 原因が残っているうちのリセットは / — 異常の信号は、原因が続いているあいだ入り直します。リセットで一度消えてすぐ出るより、受け付けずに出したままにするほうが、何を直せばよいかが画面に残ります
- 原点復帰中の一時停止は、原点未完了へ戻す — 途中で止めたら最初からやり直す、と決めれば、覚えることが無くなります。復帰の途中から続けるには、どの軸がどこまで戻ったかを覚えておく必要があるからです
表は Excel で作り、版の番号を付けて仕様書に入れます。A 列にイベント、1 行目に状態を並べると、例では B2:H11 がマスです。
マスを選び、[データの入力規則]のリストに「/,×」を入れます。[エラー メッセージ]タブの「無効なデータが入力されたらエラー メッセージを表示する」は外す設定です。
こうすると、リストから選ぶことも、「→ 起動待ち」のような文字を打つこともできます。
空欄は、条件付き書式の数式 =ISBLANK(B2) で赤く塗っておきましょう。イベントを 1 つ足したら行を 1 本足し、7 マスを全部埋めます。仕様を変えたのに表を直し忘れると、図と表とラダーが食い違いがちです。
4. 状態とイベントを拾い、正常の矢印を引いてから表で埋める
- 状態を書き出す 操作盤のランプと画面に出したい運転の状態から拾います。運転中に、センサの条件で次々に進む動き(搬送・クランプ)は工程です。画面に「搬送中」と出すとしても、フローチャートへ回します。状態にするのは、操作者のボタン・異常・原点復帰のような別の処理の完了で出入りするものです。
- イベントを拾う 操作盤のボタンとセレクタスイッチ、処理の完了、運転中にだけ見る条件、異常から拾います。処理の完了は原点復帰の完了、運転中にだけ見る条件は工程の区切りです。 異常一覧の異常は 1 行にまとめ、非常停止だけは別の行にします。 行にするのは、状態によって受け付けるかどうかや行き先が変わるものだけです。ブザー停止のように、どの状態でも同じことをする操作は表に入れません。
- 正常の矢印を引き、どこからでも起きるものを枠にする 電源投入から運転中までと、止めて戻る道を先に引きます。異常と非常停止は、枠から 1 本。
- 表にして、空欄を埋める 図の矢印を書き写してから、残りのマスを /・×・文字で埋める段階です。自分では決められないマスは空欄のまま残し、誰に聞けば決まるか(客先・機械設計・安全の担当)を横に書いておきます。
5. PLC では状態を 1 つの変数に持ち、1 スキャンで 1 回だけ移す
- 状態は 1 つの変数に番号で持つ 整数の変数(データレジスタなど)1 つに、状態の番号を入れます。同時に 2 つの状態にいることが起きません。 状態ごとにフラグを持つと、2 つのフラグが同時に立つことを作りの上で防げません。 番号には名前(定数かコメント)を付け、画面にも番号と名前を出します。止まったときに、どの状態で止まったかがすぐ分かるでしょう。 停電のあとに値が残らない範囲に置いた変数は、電源を入れると 0 になります。原点未完了を 0 番にするか、最初のスキャンだけ ON になる信号で原点未完了の番号を入れる作りです。 0 がどの状態でもない番号のままだと、下の 5 の決まりで毎朝異常停止になります。
- 遷移はスキャンの頭の状態で判定し、1 スキャンで 1 回だけ移す 判定は、スキャンの頭に写した状態で行います。次の状態は、最後にまとめて書き込む決まりです。 上から順に「状態が起動待ちで、起動が押されたら、運転中を入れる」と並べると、困ります。同じスキャンの下の行が、書き換えたばかりの運転中を見てさらに先へ進むことがあるからです。 ST の CASE 文なら、1 回のスキャンで実行される枝は 1 つ。書き換えた先の状態の処理は、次のスキャンからです。
- 「どこからでも」の遷移は、各状態の遷移のあとに書く 各状態の遷移 → 異常 → 非常停止 の順に書きます。後に書いた代入が残るので、同じスキャンで起動と非常停止が重なっても非常停止が勝ちます。 図の枠の矢印は、プログラムでもそれぞれ 1 か所です。
- 入ったときに 1 回だけする処理と、出し続ける出力を分ける 入ったときの処理は、番号が変わったスキャンだけ行います。例は次のとおりです。 異常停止中に入ったら、異常の履歴に時刻と番号を残す。起動待ちに入ったら、サイクル停止の印を消す。原点復帰中に入ったら、工程の番号を最初に戻す。非常停止中に入ったら、動かす指令を切る。 止めた工程の頭から動かすときは、その工程に入ったときの処理をもう一度。指令を出し直し、時間切れのタイマーを 0 から数えます。 これを状態にいるあいだ毎スキャン行うのは間違いです。履歴がスキャンの数だけ増えます。 状態だけで決まる出力(ランプ・ブザー・表示)は、状態から機器ごとに 1 か所で作ります。緑のランプは「運転中」、赤のランプは「異常停止中か非常停止中」のように、1 つの出力に 1 つの式です。 ある状態で SET して別の状態で RST する作りでは、RST を書き忘れた経路で出たままになります。 クランプや取出要求のように止まったあとも指令を保つ機器は、指令を覚える変数を持ちます。書き換えるのは、工程に入ったときの処理と手動の操作だけです。 モードの切り替えやリセットでは書き換えないので、切り替えた瞬間に動き出しません。 ただし非常停止中に入ったときは、制御仕様書の E05 のとおり、この変数も切ります。取出要求が残っていると、リセットで動力が戻った瞬間にロボットが取りに来るからです。 工程の時間切れのタイマーは、運転中のあいだだけ数えます。一時停止中から戻ったら数え直すか続きから数えるかを、決めておきましょう。
- 起こりえない番号に来たら、異常停止にする ELSE では、異常停止中へ移して番号を画面に出します。ST の CASE 文の ELSE に何も書かないか、起動待ちへ戻す処理を書くと、誤りが隠れます。 番号がありえない値になったこと(別の回路からの書き込み・番号の打ち間違い)です。表の × のマスが起きたときも同じです。
- ボタンは押した瞬間をイベントにし、非常停止と異常は成り立つあいだ見る ボタンは立ち上がりの 1 スキャンだけを見ます。起動・一時停止・サイクル停止・原点復帰・リセットのボタンが対象です。 こうすると、図のとおり「押した瞬間に条件がそろっていたら移る」になります。 UML の図のガード条件(矢印の[ ]の中)は、イベントが起きた瞬間に 1 回だけ見るものです。PLC のようにスキャンのたびに見るものではありません。 たとえば起動に「ワークが定位置にある」という条件を足したとします。起動のボタンを ON のあいだ受ける作りだと、押したままワークを置いた瞬間に動き出すでしょう。 JEMA の安全 PLC の事例集は、起動・再起動インターロックの起動スイッチを、離した瞬間で受けるよう求めています。接点が溶着しても起動しないためです。 押した瞬間か離した瞬間の 1 スキャンだけをイベントにする点は同じです。 非常停止中のリセットだけは、安全リレーに合わせて離した瞬間に受け、動力が入るまで待ちます(非常停止のサンプルと同じ)。 原点復帰の完了のような処理の完了も、済んだスキャンだけがイベントです。 非常停止(安全リレーのモニタが OFF)と異常は逆に、成り立っているあいだ毎スキャン見ます。非常停止を押したまま電源を入れたときにも、非常停止中へ移れるようにするためです。 異常停止中へ移す判定は毎スキャン行い、履歴に足すのは、異常の番号ごとに新しく立ったスキャンだけです。 サイクル停止も、ボタンの ON を条件に使いません。押した瞬間に印を立て、区切りで印を見ます。「サイクル停止のボタン」と「工程の区切り」の AND にすると、区切りに着くまで押し続けないと止まりません。
6. サイクル停止の表示・ワーク待ちの扱い・非常停止の役割でつまずく
- サイクル停止を押しても、画面に何も出ない — 印が立っているあいだは、画面に「サイクル停止を受け付けました」と出します。印にして運転中のまま区切りまで動かすと、操作者には止まる途中なのか押し損ねたのかが分かりません
- ワーク待ちの時間を、稼働に数えるか決めていない — どの状態の時間を稼働に数えるかは、立会いの前に客先と書面で決めます。稼働率を状態の時間から数える工場では、ワーク待ちをどちらに数えるかで数字が変わります。前の工程からワークが来ないときの待ちを、運転中に数えるか停止に数えるか。 例の図ではワーク待ちを運転中の工程(フローチャートの待ち)に入れています。PackML は 2 つを別の状態にしています。装置の中の事情で止めた Held と、前後の工程の事情で止まった Suspended です
- 非常停止中を、PLC が止める状態だと思う — 動力を切るのは安全回路です。PLC の非常停止中は、安全リレーのモニタを見て止まったことを受け取った結果です。標準の PLC の状態遷移で非常停止を作ろうとすると、PLC が止まったときに止められません。標準の PLC の仕事は、動かす出力と自己保持を切り、復帰の順番を守らせることです(非常停止のサンプル)
7. 表の × でない 58 マスが、そのまま立会いの試験項目になる
表の × でない 58 マスが、そのまま試験の項目になります。→ のマスは、移った先の状態と、入ったときの処理(履歴・印の消去)を確かめます。条件で分かれるマスは、どの分かれ道も対象です。 / のマスはボタンを押して何も起きないことを、文字だけのマスは状態が変わらず処理だけ行われることを確かめます。 異常と非常停止は、運転中だけでなく、枠の中の全部の状態から起こします。原点復帰中の時間切れや、一時停止中の非常停止は、試験から漏れやすい組み合わせです。
1 マスずつ確かめたら、操作を 2 つ続けた組み合わせも試します。サイクル停止を押してから一時停止し、起動したら、印が残っていて工程の区切りで起動待ちへ止まるか。 運転中に電源を切って入れ直したら、原点未完了から始まり、何も動かないか(安全リレーが手動リセットなら非常停止中)。 表を 1 マスずつ確かめるだけでは、こうした順番の誤りは見つかりません。
工程のフローチャートを描くエディタ
- Flowchart Editor — 運転中に進める工程(ワーク待ち・搬送・クランプ・取出し)を、工程の番号と次へ進む条件として描きます。状態遷移図そのものを描く機能はありません。
インストールも登録も要らず、ブラウザだけで使えます。
関連する記事
- PLC 制御フローチャートの書き方 — 状態と遷移条件を決めてからラダーを書く
- 制御仕様書の書き方 — 止まり方と戻し方まで、試運転の前に決めておく
- タイミングチャートの書き方 — 人とコード、人と人の共通インターフェース
- 非常停止のあとの PLC の処理と復帰のフローチャート(サンプル) — 止めるのは安全回路、PLC は後始末と復帰の手順
- 移載ユニットの原点復帰のフローチャート(サンプル) — Z を上げてから X を戻す、1 軸ずつ確かめる
- JSON データ構造の仕様 — 4 つのエディタが読み書きする形式と、Schema・検証・例
yk.builds