PLCサンプルプログラム#

次の機能仕様で全てのパターンのUPSに対応したモジュールを作成します。

  • UPSに対する電源供給を失うとPERSISTENT属性のデータを保存し、再起動時にそのデータを再現するユースケース

    UPS一次電源を失った瞬間は必ずその時点のでPERSISTENTデータを保存する。その後はUPSのタイプにより次の通りふるまう。

    • 1 second UPS

      原則として短時間での保持を前提とするUPSシステムであるため、初回の保存時のみで以後は保存動作を行わない。

    • 汎用UPS

      shutdown_delayプロパティ設定時間周期毎にPERSISTENTデータの保持を行う。

  • UPSに対する電源供給を失った後、指定時間以内に電源が復活すると運転を継続できるユースケース

    • 1 second UPS

      shutdown_delayプロパティ設定時間以内ではシャットダウンを行わず継続運転を可能とする。ただしバッテリーが劣化して継続できない場合は除く。

    • 汎用UPS

      WindowsのUPS Software Componentにて設定した時間、またはUPSのCritical alarm発生するまでは継続運転を可能とする。

  • UPSに対する電源供給を失って初回のPERSISTENTデータ保持後、設定した時間内は稼働を継続し、その後にシャットダウンを開始するユースケース

    • 1 second UPS

      shutdown_delayプロパティ設定時間継続してUPSに対する電源供給が失われた場合は、ただちにシャットダウンを開始する。

    • 汎用PC

      WindowsのUPS Software Componentにて設定した時間、またはUPSのCritical alarm発生すると、UPS Software ComponentによってIPCのシャットダウンを開始する。

図 4.4 UPSのタイプ別PERSISTENT変数データの永続化フロー#

サンプルコードプロジェクトの置き場所#

本フレームワークのサンプルコードは以下のgithubリポジトリから取得いただけます。

Beckhoff-JP/UPSPersistentData

クラスモジュール設計#

図 4.5のモジュール構成でUPSの制御とPERSISTENT変数の永続化を管理します。1 second UPSは、多様なドライバが個々に存在し、インターフェース化されていませんので、FB_SUPS_BASEという基底クラスである程度共通制御プログラムを実装し、ドライバに応じたサブクラスを作成します。UPS Software componentsで制御しているシステムについては、FB_GenericUPSを実装して制御を行います。

また、実際のUPSが無い場合に挙動を確認するための、FB_UPS_STUBを用意しています。

図 4.5 UPSによるデータ永続化制御プログラムクラス図#

またこのモジュールを実装する方法は、リスト 4.2の通りシンプルになります。

それぞれに応じたUPS実装ファンクションブロックをfbUPS入力変数にセットしたFB_ShutDownを毎サイクル実行することで、UPSを常時監視し、一次電源ダウンを検出すると図 4.4に示すフローによりPERSISTENTデータを永続化しながらシャットダウンを行うプログラムを実現します。

リスト 4.2 本モジュールのうちFB_UPS_STUBを用いた実装例#
 1PROGRAM MAIN
 2VAR
 3    fbShutdown    :FB_ShutDown; // Safely shutdown feature
 4    fbUPS        :FB_UPS_STUB; // UPS type for test use
 5    //fbUPS       :FB_GenericUPS; //UPS type based on Windows driver
 6    //fbUPS       :FB_SUPS; // UPS type for 1sec UPS on CX50x0
 7    //fbUPS       :FB_SUPS_CB3011; // UPS type for 1sec UPS on CB3011 board
 8    //fbUPS       :FB_SUPS_CX51x0; // UPS type for 1sec UPS on CX51x0
 9    //fbUPS       :FB_SUPS_CX9020_U900; // UPS type for 1sec UPS on CX9020_U900
10    //fbUPS       :FB_SUPS_BAPI; // UPS type for 1sec UPS using BIOS-API
11
12END_VAR
13
14fbUPS.shutdown_delay := T#3S;
15fbShutdown(fbUPS := fbUPS);

必要ライブラリ#

  • UPS向けライブラリ

    1 second UPSライブラリFB_S_UPS****Tc2_SUPSに含まれます。また、FB_GetUpsStatusTc2_IoFunctionsに含まれます。

  • FB_WritePersistentDataは、Tc2_Utilitiesに含まれます。

列挙体の定義#

DUTsに、UPSの状態(リスト 4.3)、および、シャットダウンまでの状態定義(リスト 4.4)を定義します。

リスト 4.3 UPS状態定義#
 1{attribute 'qualified_only'}
 2{attribute 'strict'}
 3TYPE E_UPSState :
 4(
 5    init := 0,        // UPS not working
 6    on_power,        // power supplied normally
 7    on_battery,        // continue working on battery
 8    critical_error,    // system shutdown
 9    facility_error    // UPC failure
10);
11END_TYPE
リスト 4.4 シャットダウンまでの状態定義#
1{attribute 'qualified_only'}
2{attribute 'strict'}
3TYPE E_ShutdownMode :
4(
5    init := 0,            // system is working
6    persistent_data,    // persist data
7    shutting_down        // system shutting down
8);
9END_TYPE

インターフェース定義#

InterfaceiUPSを追加します。

種別

名称

説明

引数

初期値

戻り値

プロパティ

UPSState

GETのみ。UPSの状態を取得する

なし

E_UPSState.init

E_UPSState

プロパティ

shutdown_delay

一次電源を失ってからシャットダウンを開始するまでの遅延時間

なし

T#1S

TIME

メソッド

watch_status

UPSの状態を更新する

なし

なし

BOOL

メソッド

persist_data

永続化変数を保存します

なし

なし

BOOL

メソッド

shutdown

IPCのシャットダウン処理を行います

なし

なし

BOOL

FB_ShutDownファンクションブロック#

インターフェースを実装したUPSオブジェクトを使ってUPSの状態を監視し、シャットダウン制御を行います。シャットダウン制御には次の状態マシンを使います。

順序

状態

説明

1

E_ShutdownMode.init

UPSに1次電源が供給されている初期状態。

2

E_ShutdownMode.persistent_data

UPSのバッテリのみで操作する状態で、保持変数を保存し、1次電源の復活を待っている状態。iUPS.persist_data()メソッドを実行する。

3

E_ShutdownMode.shutting_down

UPSのバッテリ残量が継続運転できないエラーを発した、または、設定したバッテリ駆動時間を超過したことによりシャットダウンを実行する状態。iUPS.shutdown()メソッドを実行する。

12行目のiUPS.watch_tstaus()が毎サイクル実行される事により、実装されたUPSオブジェクトはE_UPSStateの状態を更新します。この状態によりシャットダウン状態マシンを制御します。

リスト 4.5 シャットダウンシーケンス制御FB#
 1FUNCTION_BLOCK FB_ShutDown
 2VAR_INPUT
 3    fbUPS            :iUPS; // UPS object    
 4END_VAR
 5VAR_OUTPUT
 6END_VAR
 7VAR
 8    eShutdownMode    :E_ShutdownMode; // State machine when shutting down
 9END_VAR
10
11// watch power fail
12fbUPS.watch_tstaus();
13
14CASE fbUPS.UPSState OF 
15    E_UPSState.on_battery:
16        eShutdownMode := E_ShutdownMode.persistent_data;
17    E_UPSState.critical_error:
18        eShutdownMode := E_ShutdownMode.shutting_down;
19    ELSE
20        eShutdownMode := E_ShutdownMode.init;
21END_CASE
22
23CASE eShutdownMode OF 
24    E_ShutdownMode.persistent_data:
25        fbUPS.persist_data();
26        IF fbUPS.UPSState = E_UPSState.facility_error THEN
27            eShutdownMode := E_ShutdownMode.shutting_down;
28        END_IF
29    E_ShutdownMode.shutting_down:
30        fbUPS.shutdown();
31END_CASE

UPS制御ファンクションブロックの実装#

次のページよりタイプ別UPSプログラムを紹介します。