TechCraft – エンジニアのためのスキルアップメモ

エンジニアのスキルアップを少しでも加速する技術ブログ

STを高速化する

高速化を意識したST(Structured Text)の書き方

1. はじめに

Structured Text(ST)は、PLC(Programmable Logic Controller)で広く使われるプログラミング言語の一つであり、C言語Pascalに似た構文を持つ高級言語です。
PLCの制御プログラムを記述する際、処理速度の最適化は非常に重要です。本記事では、高速化を意識したSTの書き方を紹介します。


2. STプログラムの高速化の基本原則

STの処理速度を向上させるために、以下のポイントを押さえておきましょう。

  1. 不要なループの回避
    • ループを最適化し、可能な限り回数を削減する。
  2. 条件分岐を最適化
    • IF 文や CASE 文の評価回数を最小限に抑える。
  3. データ型の最適化
    • 不要な変数型の変換を避け、適切なデータ型を使用する。
  4. 不要な演算の削減
    • 計算回数を減らし、演算の効率化を図る。
  5. メモリアクセスの最適化

3. 高速化を意識したSTコードの実例

3.1 ループの最適化

NG例(非効率なループ):

FOR i := 0 TO 1000 DO
    data[i] := data[i] * 2;
END_FOR;

上記のコードは毎回ループを回すため、処理負荷が高い

OK例(ループ回数を削減):

FOR i := 0 TO 1000 BY 2 DO
    data[i] := data[i] * 2;
    data[i+1] := data[i+1] * 2;
END_FOR;

改善点: - BY 2 を使うことでループ回数を半減 - 1回のループで2つのデータを処理


3.2 条件分岐の最適化

NG例(条件判定の回数が多い):

IF sensor1 = TRUE THEN
    motor := TRUE;
ELSE
    IF sensor2 = TRUE THEN
        motor := TRUE;
    ELSE
        motor := FALSE;
    END_IF;
END_IF;

上記は条件評価が2回発生するため、PLCの処理負荷が増える。

OK例(論理演算を活用):

motor := sensor1 OR sensor2;

改善点: - IF 文を排除し、1回の演算で処理 - 条件分岐を減らし、評価負荷を軽減


3.3 データ型の最適化

NG例(不適切なデータ型):

VAR
    counter: REAL;
END_VAR

counter := counter + 1.0;

上記は REAL 型を使用しているが、整数演算であれば INT の方が高速

OK例(適切なデータ型を使用):

VAR
    counter: INT;
END_VAR

counter := counter + 1;

改善点: - INT 型を使用することで、浮動小数点演算を回避 - REAL の演算はPLCによっては処理負荷が高い


3.4 演算の最適化

NG例(不要な計算の繰り返し):

FOR i := 0 TO 1000 DO
    value := x * y;
    data[i] := value + z;
END_FOR;

変数 x * y はループのたびに毎回計算されるため、処理負荷が大きい。

OK例(事前計算して再利用):

VAR
    precomputed: INT;
END_VAR

precomputed := x * y;  // 事前計算

FOR i := 0 TO 1000 DO
    data[i] := precomputed + z;
END_FOR;

改善点: - x * y をループの外で事前計算し、ループ内での計算回数を削減


3.5 メモリアクセスの最適化

NG例(グローバル変数の多用):

FOR i := 0 TO 1000 DO
    globalData[i] := globalData[i] + 1;
END_FOR;

グローバル変数 globalData へのアクセスはPLCによっては低速になる

OK例(ローカル変数の活用):

VAR
    localData: ARRAY[0..1000] OF INT;
END_VAR

FOR i := 0 TO 1000 DO
    localData[i] := localData[i] + 1;
END_FOR;

改善点: - ローカル変数を使用し、メモリアクセスの速度を向上 - キャッシュ効率が良くなり、処理が高速化


4. まとめ

STを高速化するためのポイントを整理すると、以下のようになります。

最適化項目 高速化のポイント
ループ最適化 ループ回数を削減、まとめて処理
条件分岐の最適化 IF 文の回数を減らす、論理演算を活用
データ型の適正化 REAL より INT を優先
演算の最適化 事前計算を活用し、無駄な計算を減らす
メモリアクセスの最適化 グローバル変数よりローカル変数を使う

PLCの制御プログラムでは、リアルタイム処理が求められるため、STの記述方法を工夫することで処理速度を大幅に向上できます。

適切な最適化を施し、より効率的なPLCプログラムを実装していきましょう!