【ST言語入門】英語嫌いでも大丈夫! 覚える文法は「IF」と「CASE」だけでいい理由

  • URLをコピーしました!

「変数の設定まではなんとなく分かった。でも、いざ真っ白な画面にコードを書こうとすると手が止まる……」 「参考書を買ってみたけど、WHILEとかREPEATとか多すぎて、そっと本を閉じた」

そんな経験はありませんか? 私も昔はそうでした。

C言語などのプログラミングには何十種類もの文法がありますが、FAの現場で使うST言語の文法は、実質2つだけです。この2つさえ使えれば、実務の9割はこなせます。今日はその「IF」と「CASE」だけを持ち帰ってください。

まだ「ラダーとどっちがいいの?」と迷っている方は、先にこちらの記事をご覧ください。

あわせて読みたい
【ラダー vs ST言語】まだ戦ってるの? 「ラダーは時代遅れ」という極論への回答 & 賢い使い分け術 「ラダーは時代遅れ」「STは現場で使えない」という論争に終止符を打ちます。それぞれの致命的な弱点を補完し合う、現代の「ハイブリッド設計(インラインST・FB)」について解説します。

また、ST言語をやるなら「Dレジスタ」は卒業必須です。まだExcel管理している方はこちらから。

あわせて読みたい
【脱・Dレジスタ】まだエクセルで番号管理してるの? PLCで「ラベル(変数)」を使うべき3つの理由と、... 「Dレジスタの管理が限界…」と感じているエンジニアへ。PLCでラベル(変数)を使うべき理由と、挫折しがちな「インスタンス」の概念を、たこ焼きの例えで分かりやすく解説します。

準備はいいですか? それでは、たった2つの文法で制御する「yada流 ST入門」を始めましょう!


目次

武器①:IF文 = 「もし〜なら」

ST言語の基本にして奥義。これさえあれば、ラダー回路の9割は書き換えられます。

ラダー脳で考える

直列回路(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倍速くなりますよ!


武器②:CASE文 = 「ステップ制御」の神

2つ目の武器は、「CASE」。 「ケース? 場合分け?」と難しく考える必要はありません。ラダー屋さんが大好きな設備の動きを管理する「工程歩進(ステップ制御)」。あれをやるための専用コマンドだと思ってください。

ラダーの悩み:SET/RST地獄

「原点復帰して(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:吸着動作日本語でコメントを入れれば、もう英語の壁なんてありません。ラダーの行間コメントよりよっぽど読みやすく管理できます。

  • 今の工程が一目瞭然: iStepNo20 なら、間違いなく「吸着」のところにいます。
  • インターロック不要: CASEの中にいる限り、他の番号(工程)のプログラムは動きません。勝手に二重動作することがないので安全です。
ワンポイント:もし「存在しない番号」になっちゃったら?

CASE文には、どの番号にも当てはまらなかった場合の処理として `ELSE`(その他)を書くことができます。ノイズやバグで iStepNo に変な数値が入ってしまった時、装置が暴走しないように ELSE でエラー処理を入れておくと安全です。(余裕があれば覚えましょう!)

ステップ制御(10→20→30…と進む回路)において、万が一 iStepNo が「55」みたいな謎の数字になってしまった時、ELSEがないと装置が「沈黙(何もしない状態)」してしまい、原因究明に時間がかかります。

ここで bError を出しておくと、「あ、変な番号に飛んだんだな」 と一発でわかるので、この書き方はプロっぽくて非常におすすめです!

「ラダーで書くより、CASE文の方が圧倒的に安全じゃん……」 そう気づいた瞬間、あなたはもうST言語の虜です。


【おまけ】「FOR文」を使うと、ラダーで3日かかる作業が3分で終わる話

さて、約束通り「覚えるのは2つだけ」でOKです。ここから先は、「必須」ではありません。「楽をしたい人」だけ読んでください。でも、これを知ってしまうと、もうデータの山を扱うラダーには戻れなくなる「禁断の果実」です。

もしあなたが、大量のデータ転送や、インデックス修飾(Z0, Z1…)を使った複雑なラダー計算で、デバッグに何日も悩まされた経験があるなら… この「FOR(繰り返し)」という文法を知ると、世界が変わります。

  • ラダー: Zレジスタの管理でパニック、回路図が縦に果てしなく伸びる…
  • ST言語: たった3行で終了。

やりたいこと

「データレジスタ D0 〜 D99 までの100個の中に、エラーコード『999』が何個あるか数えたい」

ラダーの場合

インデックスレジスタ(Z0)を使って、ポインタを回して、カウンターをインクリメントして、比較命令を書いて……。 慣れていないと、回路を組むだけで時間がかかりますし、Z0の書き換えミスでCPUがエラー停止するリスクもあります。

STの場合(FOR文)

ラダーだと何十行にもなる処理が、3行に収まります。

iErrorCount := 0; // まず0にリセット

// 0から99までチェック
FOR i := 0 TO 99 DO
    IF wDataList[i] = 999 THEN
        iErrorCount := iErrorCount + 1; // 見つけたらカウントアップ
    END_IF;
END_FOR;

// ★ループが終わった瞬間、iErrorCount にエラー個数が入っています!
// 必要ならここで出力などを行います
// wErrorNum_Out := iErrorCount;

「データの集計」「検品データの並び替え」「平均値の計算」。 こういった処理が出たら、「あ、ここはFOR文の出番だな」と思い出してください。

先ほども書きましたが、初心者は必須ではありません。

C言語などのプログラミングでは必須の構文ですが、「PLC独自の仕組み(スキャン実行)」を理解していないまま使うと、以下の致命的なリスクがあります。

1. 設備を止めるリスク(WDTエラー): 書き方を間違えて「無限ループ」を作ってしまうと、PLCがその行から抜け出せなくなります。するとスキャンタイムオーバー(WDTエラー)と判定され、PLCが非常停止します。

2. そもそもPLCがループしている:PLCはプログラム全体を常に高速でループ(スキャン)しています。単純な繰り返しなら、わざわざFOR文を書かなくても実現可能です。 「ループ処理を書かないと実現できない」という場面に出くわすまでは、無理に使わず「IF」と「CASE」だけで組むのが安全です。

現場でラインを止めるリスクを冒してまで、初心者がFOR文を使うメリットはありません。「IF」と「CASE」だけで十分戦えます。


現場で役立つ「自習セット」

「IF文」と「CASE文」の使い方がわかったら、実際に手を動かしてみるのが習得への近道です。

📘 『実践 PLCプログラム設計』

今回解説した「構造化テキスト(ST)」を使った設計手法が体系的にまとまっています。「もっときれいなプログラムを書きたい」という方は必読です。

💻 実機で試すなら『三菱電機 FX5S』 変数や構造体をフル活用するなら、最新のiQ-Fシリーズ(FX5S)が安くて最適です。

⚠️ 注意:古い「FX3S」などはインラインSTに対応していません。

まとめ:まずは「IF」だけでいい

いかがでしたか? 「ST言語は難しい」というイメージは、勝手な思い込みだったかもしれません。

  1. IF: 条件分岐(ラダーの接点代わり)
  2. CASE: 工程歩進(ステップ制御)
  3. FOR: データの繰り返し処理

いきなり全部やる必要はありません。 「明日の仕事で、簡単なインターロック回路を1つだけ、IF文で書いてみる」 まずはそこから始めてみませんか?

そのたった1行が、あなたのエンジニアとしてのスキルを大きく広げる第一歩になります。

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

現場で役立つ!あわせて読みたい /

今回のST言語は、デバイス(D0など)ではなく「ラベル(変数)」を使って記述するのが基本です。
まだExcelでデバイス管理表を作っている方は、STを始める前にこちらをチェック!👇

あわせて読みたい
【脱・Dレジスタ】まだエクセルで番号管理してるの? PLCで「ラベル(変数)」を使うべき3つの理由と、... 「Dレジスタの管理が限界…」と感じているエンジニアへ。PLCでラベル(変数)を使うべき理由と、挫折しがちな「インスタンス」の概念を、たこ焼きの例えで分かりやすく解説します。

他にも「現場で役立つ」技術ノート公開中

\ 未経験から一人前の設計者へ /

知識ゼロから現場で戦えるレベルまで。FA電気設計の学習手順を体系的にまとめました。学習の迷子にならないための「地図」です。

👉 FA電気設計・完全学習ロードマップを見る

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

記事の更新通知や、現場で役立つ「電気制御の小ネタ」をツイートしています。「ねじ vs スプリング」のような実務の話に興味がある方は、ぜひフォローして繋がってください!

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

この記事を書いた人

目次