Main Content

フォールトトレラント燃料制御システムのモデル化

この例では、Stateflow® を Simulink® と組み合わせてハイブリッド システムをモデル化する方法を示します。このタイプのモデル化は、離散イベントに基づいて多数の動作モードが考えられるシステムで特に便利です。従来の信号の流れは Simulink で処理されますが、制御構成の変更は Stateflow で実装されます。この例で説明するモデルは、ガソリン エンジンの燃料制御システムを表します。このシステムは、個々のセンサーの故障が検出され、制御システムが中断せずに稼働するよう動的に再構成されるという点でロバストです。

解析と物理学

物理的および経験的関係が、このモデルのスロットルおよびインテーク マニホールドのダイナミクスの基礎となっています。空燃比を計算するには、インテーク マニホールドから送り込まれる空気の質量流量を、バルブで噴射される燃料の質量流量で除算します。理論混合比は、パワー、燃費、および排気の間での最適なバランスを提供します。このシステムのターゲット空燃比は 14.6 です。通常、センサーが排気ガス (EGO) 中の残留酸素量を決定します。これにより、混合比が明示され、閉ループ制御でのフィードバック測定が可能になります。センサーが高い酸素レベルを示した場合、制御則は燃料比を増加させます。センサーが燃料リッチ混合気を検出すると、コントローラーは燃料比を減少させます。

モデル化

モデルを開きます。シミュレーションを実行するには、Simulink ツールストリップの [シミュレーション] タブで [実行] をクリックします。

モデルはコールバック関数を使用して、シミュレーションに必要なデータを sldemo_fuelsys_data.m からモデル ワークスペースに読み込みます。モデル ワークスペースに初期条件を読み込むと、シミュレーション データが、開いている他のモデルのデータから分離されたままになり、MATLAB ワークスペースが乱雑にならないようにするために役立ちます。モデル ワークスペースの内容を表示するには、Simulink エディターの [モデル化] タブの [設計] セクションでギャラリーを展開し、Model Explorer を選択します。モデル エクスプローラー ウィンドウの左側の [モデルの階層構造] リストで、sldemo_fuelsys を展開し、Model Workspace を選択します。コールバックを使用してシミュレーション データを読み込む方法の詳細については、Automatically Initialize Variables and Load Data (Simulink)を参照してください。

このモデルは MATLAB ワークスペースの sldemo_fuelsys_output というデータ構造体に関連データをログ記録し、シミュレーション データ インスペクターにデータをストリーミングします。ログ記録された信号には青のバッジが付きます。データ ログの詳細については、信号ログを使用した信号データの保存 (Simulink)を参照してください。

モデルおよびサブシステム アイコンと信号線上に単位が表示されることがわかります。単位は端子とバス オブジェクトに指定されます。

Dashboard サブシステムを使用すると、シミュレーション中にモデルを操作できます。Fault Injection スイッチを Normal から Fail 位置に動かしてセンサーの故障をシミュレートし、Engine Speed セレクター スイッチを切り替えてエンジン スピードを変更できます。燃料信号と空燃比信号はゲージとスコープを使用して可視化されます。Dashboard サブシステムのブロックは、Dashboard ライブラリから取得したものです。Dashboard ブロックについては、対話型表示を使用したシミュレーションの制御 (Simulink)を参照してください。

fuel_rate_control は、システムのセンサーからの信号を使用して、理論混合気を得られる燃料比を決定します。燃料比はエンジンの気体力学モデル内で実際の空気流量と組み合わされて、排気時に検出される最終的な混合比を決定します。

Dashboard サブシステムの対応するスライダー スイッチをオフにすることで、4 つのセンサー (スロットル角度、速度、EGO、マニホールド絶対圧 [MAP]) のそれぞれの故障をシミュレーションできます。スイッチにアクセスするには、Dashboard という名前の Subsystem ブロックをダブルクリックします。スイッチを切り替えるには、スイッチのハンドルを動かす場所をクリックします。シミュレーションを停止したら、Slider Switch ブロックを選択し、ハンドルを移動する場所をクリックします。各スライダー スイッチは、Constant ブロックの値パラメーターに接続します。スライダー スイッチをオフにすると、Constant ブロックの値が変更されます。

同様に、Dashboard サブシステムのエンジン角速度スイッチを切り替えることにより、高速のエンジンによる故障状態を引き起こすことができます。Repeating Table ブロックは、スロットル角度の入力を提供し、マスク内で指定されたデータのシーケンスを周期的に繰り返します。

fuel_rate_control サブシステムは、センサー入力とフィードバック信号を使用して、理論混合比を得られるように燃料比を調整します。このモデルでは、この手法を実装するために、制御ロジック、空気流量計算、および燃料計算の 3 つのサブシステムを使用しています。通常の動作では、モデルは空気流量を推定し、その推定値に目標混合比の逆数を乗算して燃料比を求めます。酸素センサーからのフィードバックによって、比率推定値の閉ループ調整を行い、理想混合比を維持します。

制御ロジック

6 つのパラレル ステートの集合で構成される単一の Stateflow チャートにより、制御ロジック全体が実装されます。チャートの上部に示す 4 つのパラレル ステートは、4 つの個別のセンサーに対応しています。下部にある残りの 2 つのパラレル ステートは、4 つのセンサーのステータスを同時に検討し、システム全体の動作モードを決定します。このモデルは Stateflow ブロック線図全体を一定のサンプル時間間隔 0.01 秒で同期的に呼び出します。これにより、正しいモードへの遷移に対する条件を適時にテストできます。

Stateflow デバッガーでアニメーションを有効にした場合、さまざまなステートがアクティブになると、Stateflow ブロック線図でステート遷移が強調表示されます。アクティブ化の順序は、色を変更することで示されます。このように密接に連結した Stateflow と Simulink 間の相乗効果により、完全な制御システムのモデル化および開発が促進されます。

Stateflow チャート control_logic を開くには、fuel_rate_control サブシステムでこのチャートをダブルクリックします。

実行が開始されると、酸素センサー (EGO) を除いて、すべてのステートが normal モードで開始します。ウォームアップ期間が完了するまで最初は O2_warmup ステートに入ります。システムがスロットルおよび圧力センサーの故障を検出するのは、それらの測定値がノミナル範囲から外れた場合です。速度信号がないときにマニホールドが真空になる場合は、速度センサーの故障を示しています。酸素センサーにも故障状態を表すノミナル範囲がありますが、最小信号レベルと範囲の下限が共に 0 であるため、故障が検出されるのは、上限を超えた場合に限定されます。

どのセンサーが故障したかにかかわらず、モデルは常に指示のあるイベント ブロードキャスト Fail.INC を生成します。こうすることで、汎用のセンサー故障ロジックのトリガーはセンサーに依存しません。モデルは、対応するセンサー回復イベント Fail.DEC も使用します。Fail ステートは、故障したセンサーの数を追跡します。カウンターは、Fail.INC イベントごとにインクリメントし、Fail.DEC イベントごとにデクリメントします。モデルはスーパーステート Multi を使用して、1 つを超えるセンサーが故障したすべてのケースをグループ化します。

一番下のパラレル ステートは、エンジンの燃料供給モードを表しています。1 つのセンサーが故障した場合、動作は続行されますが、混合気をよりリッチにして高い排気の犠牲のもとに、より円滑なエンジン回転を実現します。1 つを超えるセンサーが故障した場合は、空燃比を確実に制御できないため、安全対策としてエンジンを停止させます。

酸素センサーのウォームアップ中、モデルは混合気を正常レベルに保ちます。ウォームアップ ステートを Rich_Mixture スーパーステート内に移動することで、設計を変更できます。ウォームアップ期間中にセンサーの故障が発生した場合、ウォームアップ期間の経過後に Single_Failure ステートに入ります。それ以外の場合は、この時点で Normal ステートがアクティブになります。

Fuel_Disabled スーパーステート内に新しいステートを作成することによって、モデルに過速度保護機能が追加されています。ヒストリ ジャンクションを使用することによって、モデルが過速度ステートから出ると、それによりチャートが確実に適切なステートに戻ります。このアプローチでは、エンジンの安全要件が追加で指定された場合、Fuel_Disabled スーパーステートにさらに停止ステートを追加できます。

センサー補正

センサーが故障すると、モデルはセンサーの推定値を計算します。たとえば、圧力センサーの計算を開きます。通常のセンサー動作では、モデルは圧力センサーの値を使用します。それ以外の場合、モデルは値を推定します。

モデルは、マニホールド圧の推定値を、エンジン速度とスロットル位置の関数として計算します。この値を計算するため、モデルは Stateflow で Simulink 関数を使用します。

空気流量計算

airflow_calc という名前のサブシステムは、中央の制御則の位置です。このブロックは、fuel_rate_control サブシステム内にあります (このブロックを開く)。このサブシステムは吸入空気流量を推定して、適切な空燃比を得られる燃料比を決定します。閉ループ制御は、混合比を正確に維持するために、残留酸素フィードバックに応じてこの推定値を調整します。センサーの故障により開ループ動作が要求された場合でも、制御目的を最適に満たすために最新の閉ループ調整が保持されます。

方程式 1

エンジンの吸入空気流量は、エンジン速度、マニホールド圧、および時変スケール係数の積として定式化できます。

$$q=\frac{N}{4\pi}V_{cd}\nu \frac{P_m}{RT} = C_{pump}(N,P_m) N P_m =
\mbox{ intake mass flow}$$

$$N = \mbox{ engine angular speed (Rad/sec)}$$

$$V_{cd} = \mbox{ engine cylinder displacement volume}$$

$$\nu = \mbox{ volumetric efficiency}$$

$$P_m = \mbox{ manifold pressure}$$

$$R, T =\mbox{ specific gas constant, gas temperature}$$

Cpump はルックアップ テーブルによって計算され、速度と圧力が乗算されて、初期流量が推定されます。過渡時に、スロットル流量と、ハイパス フィルターで近似された導関数により、充填動力学に対して空気流量が補正されます。制御アルゴリズムが方程式 2 に従って追加補正を行います。

方程式 2

$$e_0 = 0.5 \mbox{ for } EGO\le 0.5$$

$$e_0 = -0.5 \mbox{ for } EGO > 0.5$$

$$e_1 = K_i (N,P_m) e_0 \mbox{ for } EGO\le 0.5$$

$$\dot{e_2} = e_1 \mbox{ for LOW mode with valid EGO signal} $$

$$\dot{e_2} = 0 \mbox{ for RICH, DISABLE or EGO warmup} $$

$$ e_0, e_1, e_2 = \mbox{ intermediate error signals}$$

非線形酸素センサーは、EGO Sensor という名前の MATLAB® Function ブロックを使用してモデル化されます。ブロックを表示するには、モデルの最上位レベルから Engine Gas Dynamics という名前のサブシステムに入ります。次に、Mixing & Combustion という名前のサブシステムに入ります。

EGO センサーは、双曲線正接関数としてモデル化されており、0.5 ボルトに近づくと、意味のある信号を提供します。方程式 2 に示されているように、フィードバック ループ内の生の誤差は切り替えしきい値で検出されます。空燃比が低い (混合気がリーンである) 場合、元の空気推定値は小さすぎるため、増やす必要があります。逆に、酸素センサー出力が高い場合、空気推定値が大きすぎるため、減らす必要があります。補正項が、混合比で定常偏差を 0 にするレベルを実装できるように、積分制御が利用されます。

通常の閉ループ動作モード、LOW では、誤差を最小限に抑えるために積分器を動的に調整します。積分は離散時間で実行され、10 ミリ秒ごとに更新されます。ただし、RICH または O2 故障モードで、開ループで動作する場合、フィードバック誤差は無視され、積分器が保持されます。これにより、最新の有効なフィードバックに基づいて最適な補正が行われます。

燃料計算

fuel_rate_control という名前のサブシステムには、fuel_calc という名前のサブシステムが含まれています。fuel_calc サブシステムは、所与の空気流量計算および故障ステータスと一致するようにインジェクター信号を設定します。サブシステムへの最初の入力は、計算された空気流量推定値です。これにターゲット空燃比を乗算すると、指令燃料比が得られます。通常、ターゲットは理論空燃比、つまり、最適な空燃比 14.6 と等しくなります。センサーの故障が発生すると、Stateflow 制御ロジックは、モード入力を値 2 または 3 (RICH または DISABLED) に設定し、混合気が理論混合気よりわずかにリッチになるか、または完全に停止されるようにします。

fuel_calc という名前のサブシステムは、モードによって異なる目的を達成するために調整可能な補償を使用します。通常の動作では、フィードバック補正信号の位相進み補償が閉ループの安定余裕を広げます。ただし、RICH モードでかつ EGO センサーの故障時 (開ループ) には、推定プロセスで発生したノイズを減衰させるために複合燃料信号がローパス フィルター処理されます。最終結果は、実際のシステムでは、インジェクターのパルス時間に変換される燃料流量を表す信号になります。

結果とまとめ

シミュレーション実行時に使用されるスロットル入力は、2 秒間にわたって 10 度から 20 度に傾斜してから、次の 2 秒間にわたって 10 度に戻ります。ユーザーがさまざまな故障状態と故障モードを実験できるように、このサイクルは連続的に繰り返されますが、エンジンは一定の速度に保たれます。

Dashboard サブシステムのセンサー故障スイッチをクリックして、関連付けられたセンサーの故障をシミュレートします。この操作を繰り返し、スイッチをスライドさせて通常の動作に戻します。

次に、さまざまなセンサーをオフにしてシミュレーションを実行します。次のシナリオについて、燃料流量と空燃比をプロットします。

  • すべてのセンサーが正常に機能

  • スロットル センサーの故障

  • 速度センサーの故障

  • EGO センサーの故障

  • MAP センサーの故障

燃料流量プロットを確認します。ベースラインの場合、燃料比は厳密に調整され、EGO センサーの入力回路がもつ切り替えの性質により小さな波形を示します。他の 4 つの場合、システムは開ループで動作します。この制御手法は、単一故障モードで適正な燃料プロファイルを維持するのに効果的であると証明されています。各故障状態で、燃料比は基本的にベースライン流量の 125% であり、設計目標の 80% リッチを達成します。

いずれの場合にも、燃料流量と三角形のスロットル コマンド間の非線形の関係に注目してください。

次に、空燃比プロットを確認します。ベースライン プロットは、閉ループ動作の効果を示しています。混合比は、理論目標の 14.6 に非常に厳密に調整されています。下の 4 つのプロットには、リッチな混合比が示されています。閉ループの場合とは異なり、これらは厳密に調整されていませんが、空燃比の目標に近似しています (0.8*14.6=11.7)。

システムの過渡動作を確認します。スロットル角度が一定の 12 度で、システムが定常状態の場合に、スロットルの故障が t = 2 で発生し、t = 5 で補正されています。故障の発生時に、燃料比が直ちに増加します。リッチな空燃比がシステム中に伝播されるため、排気時に効果が現れます。その後、閉ループ動作に戻ると、定常状態条件が迅速に回復します。

関連するトピック