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

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

PLC制御の最適解?ST言語のスキャンタイム・インターロック・割り込み処理の実態

ST言語とC、JavaPythonの技術的な違い

1. ST言語の動作特性

(1) メインループがデフォルト

  • ST言語には main 関数のようなエントリポイントがなく、PLCのスキャンサイクルによってループ動作を繰り返す。
  • 入力 → 処理 → 出力 の順に処理され、次のサイクルで再び同じ動作を実行。
  • 意図的に抜ける処理やインターロックが必要

ST言語の動作イメージ

PROGRAM PLC_MAIN
VAR
    sensor_input : BOOL;
    motor_output : BOOL := FALSE;
END_VAR

(* PLCがスキャンごとにこのコードを実行する *)
IF sensor_input = TRUE THEN
    motor_output := TRUE;
ELSE
    motor_output := FALSE;
END_IF;

(2) インターロック(競合回避)の必要性

  • PLCのスキャン方式では、異なる処理が並行して実行されるため、適切な排他制御が必要
  • 明示的なフラグ管理によって、メモリ共有や出力競合を防ぐ。

インターロックの例

VAR
    motor_running : BOOL := FALSE;
    safety_lock : BOOL := FALSE;
END_VAR

IF NOT safety_lock THEN
    IF motor_running = FALSE THEN
        motor_running := TRUE; (* モーターをONにする *)
    END_IF;
ELSE
    motor_running := FALSE; (* インターロックで強制停止 *)
END_IF;

(3) タイミング制御(スキャンタイムと応答時間

  • PLCは一定周期(例: 10ms50ms)でスキャンを実行する。
  • FOR ループなどの時間のかかる処理を書くと、応答が遅延する可能性がある。

STの時間制御(TONタイマ)

VAR
    timer1 : TON; (* ONディレイタイマ *)
    start_button : BOOL;
    output_signal : BOOL;
END_VAR

timer1(IN := start_button, PT := T#3S); (* 3秒待つ *)

IF timer1.Q THEN
    output_signal := TRUE; (* 3秒後に出力ON *)
END_IF;

sleep(3) のようにスキャンを停止するのではなく、スキャンごとに条件を評価することで遅延を実現。


(4) 割り込み処理とイベント駆動

  • CやPythoninterruptasync/await とは異なり、STは通常スキャンループ内で処理を実行。
  • 一部のPLCでは「割り込みタスク(Interrupt Task)」を設定可能。

割り込みタスクの例

TASK fast_interrupt (PRIORITY := 1, INTERVAL := T#1MS)
VAR
    emergency_stop : BOOL;
    motor_output : BOOL;
END_VAR

IF emergency_stop THEN
    motor_output := FALSE; (* 非常停止時に即座に停止 *)
END_IF;

2. C / Java / Python とのタイミング的な違い

比較項目 ST(PLC) C言語 Java Python
プログラム実行モデル 常時ループ main() から実行 main() から実行 スクリプトとして実行
スキャン周期 10ms100ms 単位 無制限 JVMが管理 無制限
イベント処理 限定的(割り込みは一部対応) 割り込み可 イベントリスナーあり asyncio あり
タイミング制御 TON, TOF などのタイマ sleep(), usleep() Thread.sleep() time.sleep()
インターロック 明示的なフラグ管理 mutex, lock synchronized threading.Lock()

3. まとめ

  1. ST言語は「常時ループで動作する」ため、インターロックを適切に設計しないと競合が発生しやすい排他制御がOSで保証されていない)。
  2. スキャン時間の影響で、長時間かかる処理を書くと応答が遅れるため、タイマを適切に利用する必要がある
  3. CやPythonはイベント駆動やスレッド制御が可能だが、STではスキャン方式なので「明示的なタイミング管理」が必要

PLC制御に適したコードを書くには、「スキャンループの概念を理解し、適切なタイミング制御とインターロックを設計する」ことが重要。