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

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

第三回 ST言語

〜実践的なPLCプログラミングを学ぼう〜 第3回: エラーハンドリングとデータロギング

1. はじめに

前回の[第2回 実践的なPLCプログラムの作成](

techcraft.hatenablog.com

)では、ST言語を用いたモーター制御、タイマー、カウンター、関数ブロックの活用について学びました。

今回は、エラーハンドリングデータロギング に焦点を当て、PLCプログラムの信頼性とメンテナンス性を向上させる方法を解説します。


2. エラーハンドリングの重要性

PLCプログラムでは、予期しない異常(センサー故障、モーターの過負荷、通信エラーなど)が発生する可能性があります。適切なエラーハンドリングを実装することで、異常発生時の安全性とシステムの安定性を確保できます。

(1) 代表的なエラーの種類

エラーの種類 説明
センサー異常 センサーの信号が一定時間変化しない
モーター過負荷 モーターが一定時間以上動作し続けている
通信エラー PLCと外部機器間の通信が途絶えた

3. エラーハンドリングの実装

エラー処理を実装する際、以下の3つのステップが重要です。

  1. エラーの検知
  2. エラーの記録
  3. エラーに応じた処理

(1) センサー異常の検知

PROGRAM SensorErrorDetection
    VAR
        SensorInput : BOOL;
        SensorTimer : TON;
        SensorError : BOOL := FALSE;
    END_VAR

    BEGIN
        (* 10秒間センサーがOFFのままだとエラーと判定 *)
        SensorTimer(IN := NOT SensorInput, PT := T#10s);
        
        IF SensorTimer.Q THEN
            SensorError := TRUE;
        ELSE
            SensorError := FALSE;
        END_IF;
    END_PROGRAM

このコードでは、センサーが10秒以上反応しない場合にエラーを検出します。


(2) モーター過負荷の監視

PROGRAM MotorOverload
    VAR
        MotorRunning : BOOL;
        OverloadTimer : TON;
        OverloadError : BOOL := FALSE;
    END_VAR

    BEGIN
        (* 30秒以上モーターが動作している場合、過負荷と判定 *)
        OverloadTimer(IN := MotorRunning, PT := T#30s);

        IF OverloadTimer.Q THEN
            OverloadError := TRUE;
        ELSE
            OverloadError := FALSE;
        END_IF;
    END_PROGRAM

30秒以上連続運転した場合に過負荷エラーを発生させます。


4. データロギングの実装

エラー発生時や運転状況を記録することで、後の解析やメンテナンスが容易になります。

(1) 基本的なロギング処理

PLCでは、データをアレイファイル に記録する方法があります。

PROGRAM ErrorLogging
    VAR
        ErrorHistory : ARRAY[1..10] OF STRING;
        CurrentError : STRING;
        ErrorIndex : INT := 1;
    END_VAR

    BEGIN
        IF SensorError THEN
            CurrentError := 'Sensor Error Detected';
        ELSIF OverloadError THEN
            CurrentError := 'Motor Overload Detected';
        ELSE
            CurrentError := '';
        END_IF;

        IF CurrentError <> '' THEN
            ErrorHistory[ErrorIndex] := CurrentError;
            ErrorIndex := (ErrorIndex MOD 10) + 1;
        END_IF;
    END_PROGRAM

このコードでは、最新の10件のエラーをアレイに保存します。


(2) タイムスタンプ付きロギング

時間情報を記録すると、いつ異常が発生したのかが明確になります。

PROGRAM ErrorLoggingWithTimestamp
    VAR
        ErrorLog : ARRAY[1..10] OF STRING;
        TimeStamp : ARRAY[1..10] OF TIME;
        ErrorIndex : INT := 1;
    END_VAR

    BEGIN
        IF SensorError THEN
            ErrorLog[ErrorIndex] := 'Sensor Error';
            TimeStamp[ErrorIndex] := T#NOW;
            ErrorIndex := (ErrorIndex MOD 10) + 1;
        END_IF;
    END_PROGRAM

T#NOW で現在の時間を取得し、エラーと共に記録します。


5. 実践課題:PLCのエラーロギングシステム

(1) 要件

  • 異常発生時にエラーメッセージを記録
  • 直近の10件を保存し、FIFO先入れ先出し)方式で管理
  • 非常停止 ボタンが押されたらすべてのエラーをクリア

(2) プログラム例

PROGRAM ErrorManagementSystem
    VAR
        ErrorLog : ARRAY[1..10] OF STRING;
        ErrorIndex : INT := 1;
        EmergencyReset : BOOL;
    END_VAR

    BEGIN
        IF SensorError THEN
            ErrorLog[ErrorIndex] := 'Sensor Error';
            ErrorIndex := (ErrorIndex MOD 10) + 1;
        END_IF;

        IF OverloadError THEN
            ErrorLog[ErrorIndex] := 'Motor Overload';
            ErrorIndex := (ErrorIndex MOD 10) + 1;
        END_IF;

        IF EmergencyReset THEN
            FOR i := 1 TO 10 DO
                ErrorLog[i] := '';
            END_FOR;
            ErrorIndex := 1;
        END_IF;
    END_PROGRAM

このプログラムでは、異常発生時にエラーメッセージを保存し、非常停止時にログをクリアします。


6. まとめ

今回は、PLCのエラーハンドリングとデータロギングの実装方法について解説しました。

  • エラー検知 :センサー異常やモーター過負荷の検出
  • エラーロギング :エラー履歴を保存し、後の解析を容易に
  • タイムスタンプ を使ったエラー管理
  • 非常停止時のエラーログクリア の実装

これらの技術を活用することで、より信頼性の高いPLCシステムを構築できます。


7. 次回予告

次回は、HMI(ヒューマン・マシン・インターフェース) との連携方法について学びます。PLCとタッチパネルを連携し、視覚的なインターフェース で制御やエラー監視を行う方法を解説します。


参考文献

次回もお楽しみに!