故障検出ロジックと冗長ロジックをもつチャートのテスト
操作点とは、シミュレーション中の特定の時間における Simulink® モデルのステートのスナップショットです。Stateflow® チャートの場合、操作点には以下が含まれます。
チャートステートのアクティビティ
チャートのローカル データの値
チャートの出力データの値
MATLAB® 関数内および Truth Table ブロック内の固定データの値
詳細については、Stateflow での操作点の使用を参照してください。
チュートリアルの目的
エレベーター システムのアクチュエータが 1 台以上故障した場合の sf_aircraft
モデルの応答をテストするとします。このモデルの仕組みの詳細については、航空機用エレベーターの制御システムの故障の検出を参照してください。
この Mode Logic チャートでは、2 基のエレベーターに使用されているアクチュエータのステートが監視されます。各エレベーターには、外部 (第 1) アクチュエータと内部 (第 2) アクチュエータがあります。正常運転では、外部アクチュエータがアクティブになり、内部アクチュエータは待機状態にあります。
4 台のアクチュエータが正常に機能している場合、左右のエレベーターは 3 秒後に定常位置に達します。
1 台以上のアクチュエータが故障した場合に t = 3 で何が起こるのかを知りたいとします。そこでこのモデルをシミュレーションし、t = 3 で操作点を保存してから、この操作点を読み込んで変更します。その後、t = 3 ~ 10 の範囲で再びシミュレーションします。
手順 | タスク | 参照 |
---|---|---|
1 | チャートの操作点を定義します。 | 操作点の定義 |
2 | 操作点を読み込み、アクチュエータが 1 台故障したという想定で値を変更します。 | アクチュエータ 1 台の故障を想定した操作点の値の変更 |
3 | モデルを実行して、変更した操作点をテストします。 | 1 台の故障を想定した操作点のテスト |
4 | アクチュエータが 2 台故障したという想定で操作点の値を変更します。 | アクチュエータ 2 台の故障を想定した操作点の値の変更 |
5 | モデルを再度実行して、変更した操作点をテストします。 | 2 台の故障を想定した操作点のテスト |
操作点の定義
sf_aircraft
モデルを開きます。openExample("stateflow/FaultDetectionControlLogicInAnAircraftControlSystemExample")
[コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。
操作点の保存を有効にします。[データのインポート/エクスポート] ペインで次を行います。
[最終状態] を選択します。
名前を入力します。例:
xFinal
[最終の操作点を保存] を選択します。
このシミュレーション セグメントの終了時間を定義します。[ソルバー] ペインで、[終了時間] を
3
に設定します。[OK] をクリックします。
シミュレーションを開始します。
このモデルをシミュレーションするとき、t = 3 におけるすべての操作点を MATLAB ベース ワークスペース内の変数
xFinal
に保存します。操作点の保存を無効にします。[コンフィギュレーション パラメーター] ダイアログ ボックスの [データのインポート/エクスポート] ペインで、[最終の操作点を保存] パラメーターと [最終状態] パラメーターをクリアし、[OK] をクリックします。
こうしておけば、前の手順で保存した操作点が上書きされることはありません。
アクチュエータ 1 台の故障を想定した操作点の値の変更
操作点の読み込みを有効にします。[コンフィギュレーション パラメーター] ダイアログ ボックスの [データのインポート/エクスポート] ペインで、[初期状態] を選択し、チャートの操作点を含んでいる変数
xFinal
を入力します。Mode Logic チャートの操作点の値のオブジェクト ハンドルを定義します。
コマンド プロンプトで、以下のように入力します。
blockpath = "sf_aircraft/Mode Logic"; c = xFinal.get(blockpath);
操作点のコンテンツを調べます。
c
c = Block: "Mode Logic" (handle) (active) Path: sf_aircraft/Mode Logic Contains: + Actuators "State (OR)" (active) + LI_act "Function" + LO_act "Function" + L_switch "Function" + RI_act "Function" + RO_act "Function" + R_switch "Function" + LI_mode "State output data" sf_aircraft_ModeType [1,1] + LO_mode "State output data" sf_aircraft_ModeType [1,1] + RI_mode "State output data" sf_aircraft_ModeType [1,1] + RO_mode "State output data" sf_aircraft_ModeType [1,1]
チャートの操作点には、ステート、関数およびデータのリストを階層順に収納しています。
チャートの t = 3 でアクティブになっているステートを強調表示します。
コマンド プロンプトで、以下のように入力します。
c.highlightActiveStates;
アクティブなステートが強調表示されます。既定の設定では、外部アクチュエータ 2 台がアクティブになっており、内部アクチュエータ 2 台は待機状態にあります。
ヒント
ある単一のステートがアクティブであるかどうかをチェックするために、
isActive
メソッドを使用することができます。たとえば以下のように入力します。c.Actuators.LI.L1.Standby.isActive
このコマンドの戻り値は、ステートがアクティブである場合は true (1)、アクティブでない場合は false (0) です。その他のメソッドについての詳細は、チャートの操作点を操作するためのメソッド を参照してください。
アクチュエータ 1 台の故障を反映するようにチャート内のステート アクティビティを変更します。
左側の外部 (LO) アクチュエータが故障したと仮定します。ステートを変更するには、以下のコマンドを使用します。
c.Actuators.LO.Isolated.setActive;
新たにアクティブになったサブステートが、チャート内で強調表示されます。
setActive
メソッドにより、チャートが適切なステートから出て適切なステートに入るようにすることで、ステートの整合性が維持されます。しかし、新たにアクティブになったサブステートに対するentry
アクションは実行されません。同様に、以前アクティブであったサブステートに対するexit
アクションも実行されません。次のコマンドを使用して、変更した操作点を保存します。
xFinal = xFinal.set(blockpath,c);
1 台の故障を想定した操作点のテスト
テストするシミュレーション セグメントの終了時間を新たに定義します。[コンフィギュレーション パラメーター] ダイアログ ボックスの [ソルバー] ペインで、[終了時間] を
10
に設定します。開始時間は新たに入力する必要がありません。シミュレーションは、前回中断したところから再開されます。
シミュレーションを開始します。
チャートのアニメーションを見ると、その他 3 台のアクチュエータが、左側の外部 (LO) アクチュエータの故障に適切に対応していることが分かります。
アクチュエータ 切替わり 理由 左側の内部 (LI) 待機状態からアクティブへ 左側のエレベーターが左側の外部 (LO) アクチュエータの故障を補正する必要があるため。 右側の内部 (RI) 待機状態からアクティブへ 内部アクチュエータ 2 台は同じ油圧系統に接続されているため。 右側の外部 (RO) アクティブから待機状態へ アクチュエータはエレベーター 1 基につき 1 台のみがアクティブになることができるため。 どちらのエレベーターも、定常位置を維持し続けています。
アクチュエータ 2 台の故障を想定した操作点の値の変更
アクチュエータ 2 台の故障を反映するようにチャート内のステート アクティビティを変更します。
左側の内部 (LI) アクチュエータも故障したと仮定します。ステートを変更するには、以下のコマンドを使用します。
c.Actuators.LI.Isolated.setActive;
次のコマンドを使用して、変更した操作点を保存します。
xFinal = xFinal.set(blockpath,c);
2 台の故障を想定した操作点のテスト
[コンフィギュレーション パラメーター] ダイアログ ボックスを開き、[ソルバー] ペインで [終了時間] が
10
になっていることを確認します。シミュレーションを再開します。
アクチュエータが 2 台とも故障しているため、左側のエレベーターは機能しなくなります。右側のエレベーターは、定常位置を維持しています。
チャートの操作点を変更して、アクチュエータの故障について右側のエレベーターの応答をテストすると、同様の結果が得られます。