無停電電源装置(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をご検討ください。

図 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のシャットダウンを開始する。
クラスモジュール設計#
図 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データを永続化しながらシャットダウンを行うプログラムを実現します。
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);
必要ライブラリ#
列挙体の定義#
DUTsに、UPSの状態(リスト 4.2)、および、シャットダウンまでの状態定義(リスト 4.3)を定義します。
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
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次電源の復活を待っている状態。 |
3 |
E_ShutdownMode.shutting_down |
UPSのバッテリ残量が継続運転できないエラーを発した、または、設定したバッテリ駆動時間を超過したことによりシャットダウンを実行する状態。 |
12行目のiUPS.watch_tstaus()
が毎サイクル実行される事により、実装されたUPSオブジェクトはE_UPSState
の状態を更新します。この状態によりシャットダウン状態マシンを制御します。
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プログラムを紹介します。