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

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

第二回 ST言語入門

〜実践的な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)の使い方
  • 関数ブロックを活用した汎用的な設計
  • 実践的な生産ライン制御プログラムの作成

次回は、さらに高度なエラーハンドリングやデータロギングの実装について学びます。


参考文献