〜実践的なPLCプログラミングを学ぼう〜
1. はじめに
前回の「第一回 ST言語入門techcraft.hatenablog.com」では、ST(Structured Text)言語の基本構文や変数、制御構造(条件分岐・ループ)について学びました。今回は、実践的なPLCプログラムの作成に焦点を当て、より高度な制御ロジックや、関数ブロック(FB)の活用について解説します。
ST言語を使いこなすことで、複雑な制御を簡潔に記述し、PLCプログラムの可読性や保守性を向上させることができます。
2. 実践編:シンプルなモーター制御プログラム
ここでは、ST言語を使って簡単なモーターのON/OFF制御を行うプログラムを作成します。
(1) 要件
- スタートボタンを押すとモーターがON
- ストップボタンを押すとモーターがOFF
- 非常停止ボタンを押すと強制的にモーターを停止
(2) プログラム例
PROGRAM MotorControl VAR StartButton : BOOL; (* スタートボタン *) StopButton : BOOL; (* ストップボタン *) EmergencyStop : BOOL; (* 非常停止ボタン *) MotorStatus : BOOL := FALSE; (* モーターの状態 *) END_VAR BEGIN IF EmergencyStop THEN MotorStatus := FALSE; (* 非常停止時はモーターをOFF *) ELSIF StartButton THEN MotorStatus := TRUE; (* スタートボタンが押されたらON *) ELSIF StopButton THEN MotorStatus := FALSE; (* ストップボタンが押されたらOFF *) END_IF; END_PROGRAM
このように、ST言語ではシンプルに条件分岐を使って制御ロジックを記述できます。
3. タイマーを使った制御
PLCでは、タイマーを利用することで、一定時間後に動作するような処理を実装できます。
(1) タイマーの種類
タイマー型 | 説明 |
---|---|
TON (オンディレイ) | 指定時間経過後に出力をONにする |
TOF (オフディレイ) | 指定時間経過後に出力をOFFにする |
TP (パルスタイマー) | 一定時間だけ出力をONにする |
(2) ONディレイタイマーの実装
PROGRAM TimerExample VAR StartButton : BOOL; MotorStatus : BOOL := FALSE; Timer : TON; (* オンディレイタイマー *) END_VAR BEGIN Timer(IN := StartButton, PT := T#5s); (* 5秒後にON *) IF Timer.Q THEN MotorStatus := TRUE; (* 5秒経過後にモーターON *) ELSE MotorStatus := FALSE; END_IF; END_PROGRAM
このプログラムでは、スタートボタンを押して5秒後にモーターがONになります。
4. カウンターを使った制御
PLCでは、カウンターを利用してイベントの回数を記録し、特定の回数に達したら処理を実行することができます。
(1) カウンターの種類
カウンター型 | 説明 |
---|---|
CTU (アップカウンター) | インクリメントし、指定値に達すると出力をON |
CTD (ダウンカウンター) | デクリメントし、0に達すると出力をOFF |
(2) アップカウンターの実装
PROGRAM CounterExample VAR Pulse : BOOL; Reset : BOOL; Counter : CTU; CountValue : INT := 0; END_VAR BEGIN Counter(CU := Pulse, R := Reset, PV := 10); CountValue := Counter.CV; (* 現在のカウント値を取得 *) IF Counter.Q THEN (* 10回カウントされたら何らかの処理を実行 *) END_IF; END_PROGRAM
このプログラムでは、Pulse
信号が10回入力されるとQ
がTRUEになります。
5. 関数ブロック(FB)を活用した汎用カウンター
ST言語では、関数ブロックを活用することで、汎用的な処理を作成し、再利用することができます。
(1) 汎用カウンターの関数ブロック
FUNCTION_BLOCK GenericCounter VAR_INPUT Increment : BOOL; Reset : BOOL; MaxValue : INT; END_VAR VAR_OUTPUT Count : INT; ReachedMax : BOOL; END_VAR VAR InternalCount : INT := 0; END_VAR IF Reset THEN InternalCount := 0; ELSIF Increment THEN InternalCount := InternalCount + 1; END_IF; Count := InternalCount; ReachedMax := (InternalCount >= MaxValue); END_FUNCTION_BLOCK
(2) 関数ブロックの使用例
PROGRAM CounterTest VAR Pulse : BOOL; Reset : BOOL; Counter1 : GenericCounter; CountValue : INT; MaxReached : BOOL; END_VAR BEGIN Counter1(Increment := Pulse, Reset := Reset, MaxValue := 5); CountValue := Counter1.Count; MaxReached := Counter1.ReachedMax; END_PROGRAM
このように関数ブロックを使うことで、汎用的なカウンターを作成し、異なる場所で簡単に再利用できます。
6. 実践課題:PLCによる生産ライン制御
(1) 要件
- コンベアのスイッチを入れると、5秒後にモーターがONになる
- 製品が10個流れると、モーターを一時停止する
- リセットボタンを押すとカウントをリセットし、再スタート可能
(2) プログラム例
PROGRAM ProductionLineControl VAR StartButton : BOOL; ResetButton : BOOL; ProductDetected : BOOL; Motor : BOOL := FALSE; Timer : TON; Counter : CTU; END_VAR BEGIN Timer(IN := StartButton, PT := T#5s); Counter(CU := ProductDetected, R := ResetButton, PV := 10); IF Timer.Q THEN Motor := TRUE; END_IF; IF Counter.Q THEN Motor := FALSE; (* 製品が10個流れたら停止 *) END_IF; END_PROGRAM
このプログラムでは、スタートボタンを押すと5秒後にモーターがONになり、10個の製品が流れたら自動的に停止します。
7. まとめ
今回は、ST言語を用いた実践的な制御プログラムの作成について学びました。特に、以下のポイントを解説しました。
- モーター制御の基本
- タイマー(TON)の使い方
- カウンター(CTU)の使い方
- 関数ブロックを活用した汎用的な設計
- 実践的な生産ライン制御プログラムの作成
次回は、さらに高度なエラーハンドリングやデータロギングの実装について学びます。