ラダー図でインデックス修飾(Zレジスタ)を使ったデータ処理を任され、画面のスクロールとデバイスのズレに発狂しそうになった経験は誰にでもあるはずです。
Z0に数値を入れ、ポインタを回し、比較して、カウントアップする。 この複雑怪奇なスパゲッティ回路は、あなたの貴重な時間を奪う最大の敵です。
実務9年の現場エンジニアである私が断言します。データの集計や一括処理において、ラダーで戦うのは今日で終わりにしてください。
今回は、前回の記事(▶【ST言語】覚える文法は2つだけ!「IF」と「CASE」で書く実践ST言語入門)で「危険だ」と封印した劇薬、ST言語の「FOR文(繰り返し処理)」を安全に使いこなす手順を解説します。
これを読めば、ラダーで数百行にも膨れ上がる面倒なデータ処理を、たった3行のコードでバグなく完了させる「最強の武器」が手に入ります。
禁断の果実「FOR文」とは何か?

FOR文の構文は非常にシンプルです。 FOR iIndex := 0 TO 49 DO (0から49まで繰り返せ)。
パソコンのプログラミング(C言語など)ではお馴染みですが、PLCで使う場合は「スキャンタイム」という特殊な概念を理解する必要があります。
PLCは、数ミリ秒という一瞬の間に、プログラムの最初から最後までを駆け抜けています。 FOR文を書くと、その1スキャン(一瞬)の間に、PLCが立ち止まって指定された回数(50回など)の処理を猛スピードで連続実行します。
💡 必須の基礎知識 「そもそもPLCが1スキャンで動くってどういうこと?」と疑問に思った方は、FOR文を使う前に以下の記事でおさらいしてください。スキャンの概念を知らずにFOR文を使うのは、目隠しでF1カーを運転するようなものです。
▶【PLC入門】回路図とラダー図は「別物」と思え!初心者がハマる「上から下へ」の罠
▶【命令比較】MOVとMOVPの違いから学ぶ、PLCの「連続実行」と「パルス実行」
【結論】FOR文とは、PLCが一瞬で指定回数のループ処理を行う「超高速モーター」である。
現場の鉄則:初心者がハマる「最大の落とし穴」を回避せよ
超高速であるがゆえに、FOR文は書き方を間違えると重大なトラブルを引き起こします。
FOR文の中で複雑すぎる計算をさせたり、ループ回数を「1万回」などむやみに大きくしすぎると、1スキャンの処理時間が長くなりすぎます。 すると、「WDT(ウォッチドッグタイマー)エラー」が発生し、CPUがダウン。PLCで制御しているライン全体が急停止します。
これを防ぐための現場の鉄則は以下の通りです。
- 対策:ループ回数は「固定の数字(定数)」にする(例:必ず100回で終わるようにする)。
【結論】FOR文は、必ず終わりが保証された「安全な回数」だけで回せ。
【配列 × FOR文】の最強コンボ
安全な使い方がわかったところで、以前の記事で作った「構造体の配列」と組み合わせます。
ここが、ラダーが苦手な「数の暴力」を、ST言語が完璧に補う瞬間です。
実例①:50本のシリンダの「オール原点(初期位置)」を一瞬で確認する
設備の起動前や自動運転の開始時に、「全てのシリンダが後退端(原点)にいるか」を確認するインターロック回路は必ず作りますよね。
これをラダーで書くと、50個のセンサ接点をズラーッと横一列に直列で繋ぐことになり、画面からはみ出してしまいます。もしシリンダが100本、200本と増えれば、永遠に続く接点地獄が待っています。
しかし、ST言語のFOR文ならたったこれだけです。
bAllHome := TRUE; // まず「全て原点にいる」と仮定する
// 配列に合わせて「0から49まで」の50回チェックする
FOR iIndex := 0 TO 49 DO
IF Cyl[iIndex].b_SensorBwd = FALSE THEN
bAllHome := FALSE; // 1つでも原点にいなければFALSE(失格)にする
EXIT; // ★小技:NGを見つけたら、残りの確認をキャンセルしてループを抜ける!
END_IF;
END_FOR;
// ★ループが終わった時、bAllHomeがTRUEのままなら「オール原点ヨシ!」
お分かりでしょうか。シリンダが50本でも、100本でも、1000本でも、プログラムの行数はこの「数行」から一切増えません。 数字を書き換えるだけで、どれだけ数が膨れ上がっても画面にスッキリ収まり続けます。これこそがFOR文の便利さです。
【小技:EXITでスキャンタイムを削る】
もし「2本目」が原点にいなかったら、残りの3〜50本目を確認する必要はありませんよね。EXIT 命令を使うと、その瞬間にFOR文を強制終了して外に出られます。無駄な処理を省き、PLCの負担を極限まで減らすのがセオリーです。
実例②:100個のデータから異常だけを数える
「D100〜D199の中に、エラーコード『999』が何個あるか数えろ」 これをZレジスタを使ってラダーで組むと、インクリメント命令とポインタ加算が入り乱れて地獄を見ます。ST言語なら、英語を読むように自然に書けます。
iErrorCount := 0; // まず0にリセット
// 0から99まで(100個分)チェック
FOR iIndex := 0 TO 99 DO
IF wDataList[iIndex] = 999 THEN
iErrorCount := iErrorCount + 1; // 見つけたらカウントアップ
END_IF;
END_FOR;
// ★ループが終わった瞬間、iErrorCount にエラー個数が入っています!
// 必要ならここで出力などを行います
// wErrorNum_Out := iErrorCount;
この美しさと圧倒的な可読性。これこそが、配列とFOR文を組み合わせた「最強のデータ処理」です。
【結論】配列のカッコの中を「index」にして回す。
まとめ:FOR文は「伝家の宝刀」である
- FOR文の強み: 配列と組み合わせることで、数十〜数百のデータをたった数行で一括処理できる。処理する数が増えても行数は変わらない。
- 現場の鉄則: WDTエラー(CPUダウン)を防ぐため、ループ回数は配列のサイズに合わせ、必要最低限の回数で回すこと。
- 小技:
EXITを使って、不要なループ処理を強制終了させる。
すべての回路をST言語やFOR文にする必要はありません。
シリンダを1本動かすだけなら「ラダー」の方がメンテナンス性が高く優秀です。簡単な条件分岐なら「IF文」で十分です。
しかし、「大量のデータを検索・集計・一括初期化する」という場面が来たら、迷わずこの伝家の宝刀(FOR文)を抜いてください。
ここまで当ブログの構造化プログラミング編を読破したあなたなら、すでに「現代のPLC設計スキル」が確実に身についています。 自信を持って、明日の設計ツールを開いてください!