キーエンスKV-X500/X300シリーズでは、ラダープログラムに加えて、IEC61131-3に準拠したST(Structured Text)言語を使用してプログラムを作成できます。
ST言語は、制御文や数式をテキストベースで記述するプログラミング言語です。特にラダープログラムでは記述が複雑になりがちな数値を扱う複雑な演算処理や、文字列を扱う処理を簡単に記述でき、プログラムの可読性と流用性を向上させるメリットがあります。
ST言語における前判定繰り返し制御(WHILE)文は、「繰り返し条件がTRUE(真)の間、繰り返し処理文を実行する」処理を行う制御文です。
この記事では、キーエンスKV-X500/X300シリーズにおける前判定繰り返し制御(WHILE)文の記述方法と具体的なST言語例について解説します。
目次
1. WHILE文の記述方法
ST言語における制御文とは、プログラムの流れを変えるもので、条件によって処理の流れを分岐させたり、繰り返しを実行したりするために使用されます。
WHILE文は、指定した条件が成立している間だけ処理を繰り返す文の代表的なものです。
WHILE <条件式> DO //条件式が成り立つ時、
<処理文>; //処理文を実行します。
END_WHILE; //文頭(WHILE)に戻ります。
処理の流れは以下のようになります。

WHILE文は条件の判定→処理文の順で処理される「前判定」の制御文です。条件が成立しない場合は処理文を一度も実行せずにループを終了します。これに対し、REPEAT(後判定繰り返し制御)文は後判定であり必ず1回は処理文を実行する制御文です。
2.【例題】配列型変数の合計値を求める(合計50以上で終了)
下記仕様のSTをWHILE文を用いて解説します。
Data00の値が50以上になると、算出はその場で終了する。
※算出はAry00[0]→[1]→[2]→[3]→[4]の順で行われる。
配列型変数Ary00の各要素を加算して合計値を算出するための繰り返し処理にWHILE文を使用します。
タッチパネルの動作イメージ
タッチパネルの動作イメージは以下のようになります。

配列型変数Ary00[0]~[4]の合計値を常時Data00に格納します。
Data00の値が50以上になると算出はその場で終了するため、以降の値は累積されません。
使用する変数
使用する変数は以下になります。
| 変数 | データ型 | コメント |
|---|---|---|
| Ary00 | ARRAY[0..4] OF UINT | 配列00 |
| Data00 | UINT | データ00(合計値) |
| i | UINT | ループ変数 |
ST言語
ST言語は下記のようになります。
Data00 := 0; //Data00(合計値)の値を初期化
i := 0; //i(ループ変数)の値を初期化
//Ary00[0]~[4]の値をData00に加算
WHILE Data00 < 50 AND i <= 4 DO
Data00 := Data00 + Ary00[i];
i := i + 1;
END_WHILE;Data00の値を初期化するため、先頭でData00に0を代入します。この処理が無いとData00の値が毎スキャン加算され続けてしまい正しい処理になりません。
同様に後述するWHILE文で配列の添え字として使用するループ変数iにも0を代入して初期化します。
WHILE Data00 < 50 AND i <= 4 DOは以下の条件がどちらも成立している(AND)間のみ処理文が実行されます。
1. Data00 < 50:合計値Data00が50未満の時
2. i <= 4:ループ変数iが4以下の時
WHILE文の処理文であるData00 := Data00 + Ary00[i];は、Ary00[0]~[4]の値を順番にData00に累積します。Ary00[i]はループ変数iがAry00の添え字として使用されており、iの値に応じて配列の要素が切り替わります。
i := i + 1;は、ループ変数iを1加算(インクリメント)しており、前述の累積処理での配列の添え字が更新されていきます。
ループ処理中に「合計値Data00が50以上になった場合」または「ループ変数iの値が5以上になった場合」はWHILE文の条件式が成り立たなくなり、WHILE文はループを抜けて累積処理は終了します。
同じ処理をFOR文にEXIT処理を用いて記述することも可能です。FOR文については以下のページで解説しております。※【例題③】が本例題と同じ仕様になります。
3. おわりに
キーエンスKV-X500/X300シリーズにおける前判定繰り返し制御(WHILE)文について解説しました。

