「変数の設定まではなんとなく分かった。でも、いざ真っ白な画面にコードを書こうとすると手が止まる……」 「参考書を買ってみたけど、WHILEとかREPEATとか多すぎて、そっと本を閉じた」
そんな経験はありませんか? 私も昔はそうでした。C言語などのプログラミングには何十種類もの文法がありますが、FAの現場で使うST言語の文法は、実質2つだけです。この2つさえ使えれば、実務の9割はこなせます。今日はその「IF」と「CASE」だけを持ち帰ってください。
今回は、実務9年の現場エンジニアが複雑なラダー回路をスッキリ書き換えるための「IF」と「CASE」の使い方を解説します。この2つだけを覚えれば、もうST言語の分厚い参考書は不要です。
ただし、「FOR文」や「WHILE文」などの繰り返し処理には要注意です。 PLC特有の「スキャン実行」という仕組みを理解せずにこれらを多用すると、演算処理が長引いてCPUが異常と判断し、設備が急停止する大事故(WDTエラー)につながります。
たった2つの文法で制御する「yada流 ST入門」を始めましょう!
※「ラダーとどっちがいいの?」と迷っている方は、先にこちらの記事をご覧ください。
▶【言語比較】ラダーvsST論争に終止符!現場で役立つ「ハイブリッド設計」3つの極意
また、ST言語をやるなら「Dレジスタ」は卒業必須です。まだExcel管理している方はこちらから。
▶【変数プログラム】脱・エクセル管理!PLCで「ラベル(変数)」を使うべき3つの理由
武器①:IF文 = 「もし〜なら」
ST言語の基本にして奥義です。これさえあれば、ラダー回路の大部分は書き換えられます。
ラダー脳で考える
直列回路(AND)をイメージしてください。
「スイッチA(X0) と スイッチB(X1) が入ったら、ランプ(Y0) が点く」
これをラダーで書くとこうなりますよね。
──||(X0)──||(X1)────(Y0)──
ST脳で考える
これをSTで書くと、中学校の英語の授業そのままです。
// もし スタートボタン と 許可スイッチ がONなら
IF bStartBtn AND bPermitSw THEN
bLamp := TRUE; // ランプを点灯せよ
END_IF;
構造は IF (条件) THEN (やるべきこと); END_IF; 。これだけです。
現場での使いどころ
「複雑な条件分岐」こそ、IF文の独壇場です。 ラダーで、「AかつB、またはCかつD、ただしEではない時……」なんて回路を組むと、接点が多すぎてモニタ画面からはみ出しますよね?
// (AかつB) または (CかつD、かつEではない)
IF (bCondA AND bCondB) OR (bCondC AND bCondD AND NOT bCondE) THEN
bRunCmd := TRUE;
END_IF;
STなら、カッコ ( ) を使うだけでスッキリ書けます。「条件が見やすい」=「バグを見つけやすい」。これが最大のメリットです。
💡 挫折しないコツ:構文は「打たずに呼ぶ」
「IFとかTHENとか、打ち間違えそうで怖い…」という方も安心してください。GX Works3には、最強の入力補助機能があります。
①「if」と入力した後、

②Ctrl + Alt + F1 (テンプレート呼び出しのショートカット)

エディタ上でこれを押すだけで、IF ?条件式? THEN ... という型枠がパッと現れます。あとは「?条件式?」の部分を書き換えるだけ。
さらに、Alt + → を押せば、次の入力ポイントへ瞬時にジャンプできます。これを知っているだけで、ST言語の入力スピードは3倍速くなりますよ!



【結論】複雑なインターロック回路は、カッコで括れる「IF文」でスッキリまとめよ。
武器②:CASE文 = 「ステップ制御」の神
2つ目の武器は、「CASE」。
「ケース? 場合分け?」と難しく考える必要はありません。ラダー屋さんが大好きな設備の動きを管理する「工程歩進(ステップ制御)」をやるための専用コマンドだと思ってください。
ラダーの悩み:自己保持地獄
「原点復帰して(Step10)、吸着して(Step20)、上昇する(Step30)」 これをラダーで書くと、自己保持やSET/RST命令が大量に並びます。 「あれ、今どの工程?」「なんで止まってるの?」「RSTし忘れで二重動作した!」 そんなトラブルで夜を明かしたことはありませんか?
CASE文なら「番号」で選ぶだけ
CASE文は、「変数の数字によって、やることを切り替える」文法です。(※慣れてきたら数字の代わりに「列挙体」という名前付きの定数も使えますが、まずは分かりやすく数字で覚えましょう!)
CASE iStepNo OF
10: // 工程10:原点復帰
bOriginStart := TRUE;
IF bOriginComp THEN iStepNo := 20; END_IF; // 完了したら次へ
20: // 工程20:吸着動作
bVacuumOn := TRUE;
IF bVacuumSens THEN iStepNo := 30; END_IF;
30: // 工程30:上昇
bLiftUp := TRUE;
// ...
ELSE
// 10,20,30以外の数値が入った時(異常時)
bError := TRUE; // エラーを出力
iStepNo := 0; // 初期状態に戻す
END_CASE;
このように、番号ごとに処理を並べるだけ。 数字ごとに処理が分かれているので、今何をしているかが一目瞭然です。// 工程20:吸着動作 と日本語でコメントを入れれば、もう英語の壁なんてありません。ラダーの行間コメントよりよっぽど読みやすく管理できます。
- 今の工程が一目瞭然:
iStepNoが20なら、間違いなく「吸着」のところにいます。 - インターロック不要: CASEの中にいる限り、他の番号(工程)のプログラムは動きません。勝手に二重動作することがないので安全です。
ワンポイント:もし「存在しない番号」になっちゃったら?
CASE文には、どの番号にも当てはまらなかった場合の処理として `ELSE`(その他)を書くことができます。ノイズやバグで iStepNo に変な数値が入ってしまった時、装置が暴走しないように ELSE でエラー処理を入れておくと安全です。(余裕があれば覚えましょう!)
ステップ制御(10→20→30…と進む回路)において、万が一 iStepNo が「55」みたいな謎の数字になってしまった時、ELSEがないと装置が「沈黙(何もしない状態)」してしまい、原因究明に時間がかかります。
ここで bError を出しておくと、「あ、変な番号に飛んだんだな」 と一発でわかるので、この書き方はプロっぽくて非常におすすめです!
「ラダーで書くより、CASE文の方が圧倒的に安全じゃん……」 そう気づいた瞬間、あなたはもうST言語の虜です。
【結論】SET/RST地獄から抜け出し、工程管理は安全確実な「CASE文」に任せよ。
初心者が「FOR文」を使ってはいけない理由(WDTエラーの恐怖)
「あれ? C言語などでは『FOR文(繰り返し)』をよく使うのでは?」と思った鋭い方。 その感覚は正しいですが、実務1年目のうちは現場でFOR文を使うのは封印してください。
結論、PLC特有の「スキャン」という仕組みを阻害し、工場全体のラインを急停止させるリスクがあるからです。
PLCは電源が入っている限り、プログラムの最初から最後までを常に高速でループ(スキャン実行)し続けています。
ここで初心者が陥るのが、以下の致命的なミスです。
🚨 FOR文の本当の恐怖:「スキャンタイムの超過(WDTエラー)」
FOR文で「1万回処理する」と書いた場合、PLCはその1万回の計算が終わるまで次の回路へ進めません。 すると、あらかじめ設定された1周あたりの制限時間(ウォッチドッグタイマ)をオーバーし、CPUが「異常発生」と判断してシステムを強制停止させます。
「数千件の製品データを一瞬で検索・並び替えしたい」といった高度な情報処理を除き、初心者が現場でラインを止めるリスクを冒してまで、プログラム内にさらにループ(FOR文)を作るメリットはありません。
PLC自体がすでに「巨大なループ」であることを理解し、まずは安全確実な「IF」と「CASE」だけで組む思考を身につけてください。
まとめ:まずは「IF」だけでいい
「ST言語は難しい」というイメージは、勝手な思い込みです。
- IF: 条件分岐(複雑な接点の代わり)
- CASE: 工程歩進(SET/RST地獄の解消)
いきなり全部をSTで書く必要はありません。 「明日の仕事で、簡単なインターロック回路を1つだけ、IF文で書いてみる」 まずはそこから始めてみませんか?そのたった1行が、あなたのエンジニアとしてのスキルを大きく広げる第一歩になります。
※本記事で使用している画面は、三菱電機株式会社「GX Works3」の操作画面です。
※GX Works3、MELSECは、三菱電機株式会社の登録商標です。
※本記事で紹介しているプログラムや回路図は、技術解説のためのサンプルです。実機での動作を保証するものではありません。
※実際に使用する際は、十分な検証を行った上で、安全に配慮して運用してください。