ST言語とC、Java、Pythonの技術的な違い
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は一定周期(例:
10ms
や50ms
)でスキャンを実行する。 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やPythonの
interrupt
やasync/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() から実行 |
スクリプトとして実行 |
スキャン周期 | 10ms ~ 100ms 単位 |
無制限 | JVMが管理 | 無制限 |
イベント処理 | 限定的(割り込みは一部対応) | 割り込み可 | イベントリスナーあり | asyncio あり |
タイミング制御 | TON , TOF などのタイマ |
sleep() , usleep() |
Thread.sleep() |
time.sleep() |
インターロック | 明示的なフラグ管理 | mutex , lock |
synchronized |
threading.Lock() |
3. まとめ
- ST言語は「常時ループで動作する」ため、インターロックを適切に設計しないと競合が発生しやすい(排他制御がOSで保証されていない)。
- スキャン時間の影響で、長時間かかる処理を書くと応答が遅れるため、タイマを適切に利用する必要がある。
- CやPythonはイベント駆動やスレッド制御が可能だが、STではスキャン方式なので「明示的なタイミング管理」が必要。
PLC制御に適したコードを書くには、「スキャンループの概念を理解し、適切なタイミング制御とインターロックを設計する」ことが重要。