1 second UPS 制御FB実装#
1second UPSの仕様#
TwinCATが提供している1 second UPSおよびそのファンクションブロックの仕様は以下のとおりです。
FB_S_UPS_**** ファンクションブロック#
機種毎に異なるファンクションブロックがあり、概ね共通して次の仕様となっている。(例:FB_S_UPS_CX51x0)
入力変数#
変数名 |
型 |
デフォルト値 |
説明 |
---|---|---|---|
sNetID |
T_AmsNetId |
‘’ |
ターゲットコントローラのAmsNetId。自ホストは’’ |
iPLCPort |
UINT |
0 |
複数PLCモジュールがある場合の対象PLCのポート番号の順番。851を先頭とし、0を起点に繰り上げる。 |
iUPSPort |
UINT |
16#4A8 |
1 second UPS状態監視ポート |
tTimeout |
TIME |
DEFAULT_ADS_TIMEOUT |
ADS通信のタイムアウト |
eUpsMode |
E_S_UPS_Mode |
eSUPS_WrPersistData_Shutdown |
次表参照 |
ePersistentMode |
E_PersistentMode |
SPDM_2PASS |
|
tRecoverTime |
TIME |
T#10S |
1次電源断後、再度復活した際に状態が |
出力変数#
変数名 |
型 |
説明 |
---|---|---|
bPowerFailDetect |
BOOL |
1次電源供給されていることを検出されると |
eState |
E_S_UPS_State |
次表参照 |
UPS動作モード#
次の通り4種類のUPS動作モードを持ちます(リンク)
記号 |
データ型 |
説明 |
---|---|---|
PS |
eSUPS_WrPersistData_Shutdown |
一次電源を失ったら即座にPERSISTENTデータを保存し、その後ただちにシャットダウンする。 |
P |
eSUPS_WrPersistData_NoShutdown |
一次電源を失ったら即座にPERSISTENTデータを保存する。その後は運転を継続する。 |
S |
eSUPS_ImmediateShutdown |
一次電源を失ったら即座にシャットダウンする。 |
N |
eSUPS_CheckPowerStatus |
何もしない。(状態監視のみ) |
UPS状態#
次の表の通りUPS状態をモニタすることができます。(リンク)各動作モード毎に使われる状態が異なります。(モード記号毎に使用される状態にX
を示します)
データ型 |
説明 |
PS |
P |
S |
N |
---|---|---|---|---|---|
eSUPS_PowerOK |
1次電源供給 |
X |
X |
X |
X |
eSUPS_PowerFailure |
1次電源断(1サイクルのみ) |
X |
X |
X |
X |
eSUPS_WritePersistentData |
保持変数書込中 |
X |
X |
||
eSUPS_QuickShutdown |
シャットダウン中 |
X |
X |
||
eSUPS_WaitForRecover |
1次電源断、復活待ち |
X |
X |
||
eSUPS_WaitForPowerOFF |
シャットダウン動作開始待ち |
X |
X |
本フレームワークによる動作仕様#
TwinCATが提供するファンクションブロックでは、保持変数保存後ただちにシャットダウンするか、シャットダウンを行わないか、の二択だけしか選べません。次の要件を満たすには、eSUPS_WrPersistData_NoShutdown
モードで制御した上で、電源復活を確認する遅延時間後、FB_NT_QuickShutdown
によりPLCからの制御でシャットダウンを行う必要があります。
一次電源を失うと、ただちに保持変数を保存する。
指定した時間の間電源復活を待つ。この間、および電源復活後もRUNを継続することができる。
指定した時間を経過しても1次電源が復活しなかった場合は、直ちにシャットダウンする。
本フレームワークを用いてこれを実現します。
実装#
次の通り、iUPSのインターフェースからFB_SUPS_CX51x0を実装します。
1FUNCTION_BLOCK FB_SUPS_CX51x0 IMPLEMENTS iUPS
2VAR_INPUT
3END_VAR
4VAR_OUTPUT
5END_VAR
6VAR
7 eUPSState :E_UPSState;
8 tShutdownDelay : TIME := T#1S;
9 fbShutdownTimer :Tc2_Standard.TON;
10 fbS_UPS_CX51x0 :Tc2_SUPS.FB_S_UPS_CX51x0;
11 fbShutdown :FB_NT_QuickShutdown;
12END_VAR
1{warning 'add property implementation'}
2PROPERTY UPSState : E_UPSState
3
4GET:
5 UPSState := eUPSState;
1{warning 'add property implementation'}
2PROPERTY shutdown_delay : TIME
3
4GET:
5 shutdown_delay := tShutdownDelay;
6SET:
7 tShutdownDelay := shutdown_delay;
リスト 4.8ではFB_S_UPS_CX51x0.eStateの状態に応じて、本UPSオブジェクトFBの状態eUPSState
を制御します。
核心部は、FB_S_UPS_CX51x0.eState
の状態がE_S_UPS_State.eSUPS_WaitForRecover
となった場合(保持変数の保存終了後)の制御部分です。この状態のときpersist_data
メソッド(リスト 4.9)を実行します。ここで1次電源が失われた状態が連続する時間計測を行うfbShutdownTimer
が計時され、設定値に達すると、UPSState
をE_UPSState.critical_error
に遷移します。
FB_Shutdown
FB(リスト 4.4) はUPSオブジェクトのこの状態検出により、shutdown
メソッド(リスト 4.10)の実行に切り替えます。
その前に1次電源が復活するとFB_S_UPS_CX51x0.bPowerFailDetect
はFailとなるためタイマをリセットします。その後、FB_S_UPS_CX51x0.tRecoverTime
の設定時間に達すると、FB_S_UPS_CX51x0.eState
の状態はE_S_UPS_State.eSUPS_PowerOK
に戻ります。
1METHOD watch_status : BOOL
2
3
4fbS_UPS_CX51x0(eUpsMode := Tc2_SUPS.E_S_UPS_Mode.eSUPS_WrPersistData_NoShutdown);
5
6CASE fbS_UPS_CX51x0.eState OF
7 Tc2_SUPS.E_S_UPS_State.eSUPS_PowerOK:
8 eUPSState := E_UPSState.on_power;
9 Tc2_SUPS.E_S_UPS_State.eSUPS_PowerFailure:
10 eUPSState := E_UPSState.on_battery;
11 Tc2_SUPS.E_S_UPS_State.eSUPS_WritePersistentData:
12 eUPSState := E_UPSState.on_battery;
13 Tc2_SUPS.E_S_UPS_State.eSUPS_WaitForRecover:
14 IF fbShutdownTimer.Q THEN
15 eUPSState := E_UPSState.critical_error;
16 ELSE
17 eUPSState := E_UPSState.on_battery;
18 END_IF
19 Tc2_SUPS.E_S_UPS_State.eSUPS_WaitForPowerOFF:
20 eUPSState := E_UPSState.critical_error;
21 Tc2_SUPS.E_S_UPS_State.eSUPS_QuickShutdown:
22 eUPSState := E_UPSState.critical_error;
23 ELSE
24 eUPSState := E_UPSState.init;
25END_CASE
1METHOD persist_data : BOOL
2
3
4IF fbS_UPS_CX51x0.eState = Tc2_SUPS.E_S_UPS_State.eSUPS_WaitForRecover THEN
5 fbShutdownTimer(IN:=fbS_UPS_CX51x0.bPowerFailDetect, PT:=tShutdownDelay);
6END_IF
リスト 4.10が実行されるとEPCはただちにシャットダウンを開始します。
1METHOD shutdown : BOOL
2
3fbShutdown(START := TRUE);