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次電源断後、再度復活した際に状態がeSUPS_PowerOKになるまでの遅延時間。キャパシタ充電が十分でないままこの状態にすると、再度停電になった際に保持変数を行おうとし、この間に電源が完全に失われると保持データが壊れる可能性があります。これを防止するための再充電時間です。

出力変数#

変数名

説明

bPowerFailDetect

BOOL

1次電源供給されていることを検出されるとTRUEとなる。

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を実装します。

リスト 4.5 変数定義部#
 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
リスト 4.6 UPSStateプロパティの実装#
1{warning 'add property implementation'}
2PROPERTY UPSState : E_UPSState
3
4GET:
5    UPSState := eUPSState;
リスト 4.7 シャットダウン遅延時間プロパティ実装#
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が計時され、設定値に達すると、UPSStateE_UPSState.critical_errorに遷移します。

FB_ShutdownFB(リスト 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に戻ります。

リスト 4.8 watch_statusメソッドの実装#
 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
リスト 4.9 persist_dataメソッドの実装#
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はただちにシャットダウンを開始します。

リスト 4.10 shutdownメソッドの実装#
1METHOD shutdown : BOOL
2
3fbShutdown(START := TRUE);