無停電電源装置(UPS)によるPERSISTENTデータの永続化#

Persistent属性の変数値は、IPCの正常シャットダウン操作時にファイルへ書き出され、次の起動時にはファイルから値が再度ロードされる、いわゆる永続化されます。しかし、不意な電源ダウン時にはファイルへ保存することができず、RUN中の活動により変動したPersistent変数の値の永続化ができません。

これを防ぐためには、UPS(無停電電源装置)を取り付け、電源供給が失われた事を検出して明示的な命令でPersistentデータをファイルへ保存する必要があります。

IPCに搭載可能なUPSには次の2タイプがあり、それぞれ実装方法が異なります。(図 4.4

1 second UPS

CXと呼ばれる組み込み型IPCに搭載される大容量キャパシタによる組み込み電源保持機構です。cFastメモリという特別な書き込み速度の速いストレージに変数を保持し、多くの機種でその最大容量は1Mbyteとなります。専用のファンクションブロックFB_S_UPS_****が用意され、RUN中は常時実行し続けることで、選択したモードにより不意の停電発生時には自動的にPERSISTENT変数の値をファイルへ永続化することができます。またPERSISTENTデータへの保存が完了したあと、FB_NT_QuickShutdownによりWindowsのシャットダウン処理を行う事ができます。

UPS Software Components(汎用UPS)

1 second UPSの搭載が無いIPCに電源保護を行う場合は外付けUPSの設置が必要です。UPS Software Componentsは、この汎用UPSをWindowsでマネジメントするユーティリティソフトウェアです。UPSの残量やバッテリのみの駆動時間により自動的にWindowsシャットダウンを実施するところまで管理してくれるソフトウェアとなっています。PLCではFB_GetUPSStatusによりUPSの稼働状態がモニタリングできますので、これによりWritePersistentDataファンクションブロックを実行し、PERSISTENT変数を永続化します。その後は、マネジメントソフトが自動的にシャットダウン処理まで行いますので、PLCからのシャットダウン処理は必要ありません。対応しているUPSはベッコフ製、APC製などがあります。ベッコフ製の場合はIPCとの間で電源線と通信線を共用するOCT(One Cable Technology)が採用されていますので、別途USBやシリアル通信ケーブルの設置が不要になります。次の通り容量別にラインナップされたコンパクトなUPSをご検討ください。

注釈

参考InfoSysサイト一覧

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

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のシャットダウンを開始する。

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

本フレームワークのサンプルコードは以下の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.1の通りシンプルになります。

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

リスト 4.1 本モジュールのうち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.2)、および、シャットダウンまでの状態定義(リスト 4.3)を定義します。

リスト 4.2 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.3 シャットダウンまでの状態定義#
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.4 シャットダウンシーケンス制御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プログラムを紹介します。