要件に基づくテストに対する仕様モデルの使用
この例では、仕様モデルを使用して、航空機の自動操縦コントローラーのモデルで形式的要件をモデル化およびテストする方法を説明します。この仕様モデルでは、2 つの Requirements Table ブロックを使用して、航空機の自動操縦コントローラー モデルの必要な入力と出力をモデル化します。モデリングの問題について Requirements Table ブロックを解析し、仕様モデルからテストを生成し、そのテストを航空機の自動操縦コントローラー モデルで実行します。テスト対象のモデルは "設計モデル" です。
Requirements Table ブロックを定義および設定する方法の詳細については、Requirements Table ブロックを使用した形式的要件の作成および形式的要件のプロパティの構成を参照してください。
上位レベルの要件の表示
要件エディターで要件セット AP_Controller_Reqs
を開きます。
slreq.open("AP_Controller_Reqs");
上位レベルの要件によって、モデルの出力と自動操縦コントローラー モードが指定されます。各要件の説明では、形式的要件で必要なロジックを明示的に定義するために使うことができる高水準言語が使用されます。
仕様モデルの最初の反復の表示
仕様モデル spec_model_partial
を開きます。
spec_model = "spec_model_partial";
open_system(spec_model);
このモデルには 2 つの Requirements Table ブロックが含まれていて、上位レベルの要件をテスト可能な論理式に変換する形式的要件を定義します。AP_Mode_Determination
ブロックは自動操縦コントローラー モードの形式的要件を指定し、Cmd_Determination
ブロックはコントローラーの出力を指定します。
形式的要件を表示するには、各 Requirements Table ブロックを検証します。
コントローラー モードの Requirements Table ブロック
AP_Mode_Determination
を開きます。ブロックは、自動操縦コントローラー モードの形式的要件を指定します。出力データ Mode
を決定するために、AP_Mode_Determination
は次の 2 つの入力データを使用して 3 つの要件を指定します。
AP_Engage_Switch
— 自動操縦の係合スイッチHDG_Engage_Switch
— 機首の係合スイッチ
各要件は入力の組み合わせを使用して、Mode
の一意の出力値を指定します。
コントローラー コマンドの Requirements Table ブロック
Cmd_Determination
を開きます。Cmd_Determination
は補助翼コマンドとロール参照コマンドの要件を指定します。Cmd_Determination
は次の 4 つの入力データを使用します。
Mode
—AP_Mode_Determination
の出力Mode
Roll_Ref_TK
— ロール参照ターゲット ノブの設定Roll_Angle_Phi
— 実際の航空機ロール角HDG_Ref_TK
— 機首参照ターゲット ノブの設定
このブロックでは、これらの入力データを使用して、コントローラーの出力データを決定します。
Roll_Ref_Cmd
— ロール参照コマンドAil_Cmd
— 補助翼コマンド
この例では、式に定数データが使用され、Roll_Ref_TK
および Roll_Angle_Phi
の値の範囲を定義します。値をパラメーター化するか、リテラル値を使用することもできます。Requirements Table ブロックのデータの定義を参照してください。これらの値を表示するには、[シンボル] ペインを開きます。[モデル化] タブの [データの設計] セクションで [シンボル] ペインをクリックします。
要件だけでなく、Cmd_Determination
は設計の仮定も定義します。要件への仮定の追加を参照してください。この例では、仮定により、物理的な制限に基づいてロール角とロール参照ターゲット ノブの値が制約されます。ロール角は 180
度を超えたり、-180
度を下回ることはできず、ロール参照ターゲット ノブは 30
を超えたり、-30
を下回ることはできません。テーブルで、[仮定] タブをクリックします。
また、データの [最小値] と [最大値] プロパティでデータ範囲の制限を指定するか、ブロックを使用して信号から範囲を明示的に指定することもできます。
要件テーブルの解析
次に、Requirements Table ブロックを解析します。ベスト プラクティスとして、ブロックを解析し、形式的要件が完全で一貫性があることを確認します。このベスト プラクティスは、形式的要件が完全で、一貫性があり、上位レベルの要件に対応していることを確認する前に仕様モデルからテストが生成されることを回避するのに役立ちます。
[解析] セクションで [テーブルの解析] をクリックします。Analyze Requirements Table Blocks for Modeling Problemsを参照してください。
この解析により、不完全さの問題が検出されます。
Cmd_Determination
の要件セットには要件 3 の 3 番目の箇条書きに対応する形式的要件がありません。
モデル spec_model_final
内の Cmd_Determination
を開き、更新された要件セットを表示します。追加要件のインデックスは 2.2.4
です。
spec_model = "spec_model_final"; load_system(spec_model); open_system(spec_model + "/Cmd_Determination");
上位レベルの要件と形式的要件のリンク
仕様モデルを読み込むと、"要件エディター" で形式的要件が読み込まれます。仕様モデルを閉じると、関連する要件セットも閉じられます。形式的要件の作成時に、形式的要件を対応する上位レベルの要件にリンクし、仕様モデル内の要件を追跡します。この例では、要件をリンクしてもテスト生成やテスト結果には影響しません。
最初の形式的要件を対応する上位レベルの要件にリンクするには、次の手順を実行します。
spec_model_final
で、Table1
という名前の要件セットを展開します。[インデックス] が
1
である形式的要件を右クリックし、[要件とのリンクを選択] を選択します。要件セット
AP_Controller_Reqs
を展開します。[ID] が
1
である要件を右クリックし、[1: Autopilot mode is OFF" から "1: High Level: Autopilot Con..." へのリンクを作成] をクリックします。
リンク タイプの既定の設定は Related to
です。リンク タイプの詳細については、リンク タイプを参照してください。
更新したモデルからテストを生成
Simulink® Design Verifier™ は、Requirements Table ブロックで定義された要件からテスト オブジェクティブを自動的に作成します。テストを生成するには、[コンフィギュレーション パラメーター] ウィンドウを使用するか、テストをプログラムによって指定します。テスト生成用のモデル カバレッジ オブジェクティブ (Simulink Design Verifier)を参照してください。異なるカバレッジ オブジェクティブを選択し、生成されるテスト数を最小限に抑える必要があるか、またはテストの精度とトレーサビリティを改善する必要があるかを決定します。
この例では、判定カバレッジを使用してテストが生成され、出力が MAT ファイルに保存されます。
opts = sldvoptions; opts.Mode = "TestGeneration"; opts.ModelCoverageObjectives = "Decision"; [~,files] = sldvrun(spec_model,opts,true);
Simulink Design Verifier は要件からテスト オブジェクティブとテストを生成します。このバージョンの仕様モデルでは、テスト オブジェクティブが達成されます。
設計モデルでのテストの実行
テスト オブジェクティブを達成するテストを作成したら、そのテストを設計モデルで実行できます。この例では、設計モデルは航空機の自動操縦コントローラーのモデル sldvexRollApController
です。
設計モデルでテストを実行する前に、仕様モデルと設計モデルとのインターフェイスをとる必要があります。通常、仕様モデルは設計モデルと同じ信号を生成することも、使用することもありません。こうした違いは、シンプルな場合もあれば、抽象的な場合もあります。たとえば、設計モデルが仕様モデルとは異なる入力および出力信号タイプを使用する場合や、設計モデルからのスカラー出力を仕様モデル内の範囲と比較する場合があります。そのため、設計モデルと仕様モデルの間でインターフェイスを構築しなければなりません。
設計モデルと仕様モデルとのインターフェイスをとる
この例では、仕様モデル spec_model_final
と設計モデル sldvexRollApController
の入力は直接インターフェイスをとることができますが、出力の 1 つが異なります。spec_model_final
は補助翼コマンドを値の範囲として表しますが、sldvexRollApController
によって生成される補助翼コマンドの値は double のスカラーです。インターフェイスは MATLAB Function ブロックを使用して、補助翼コマンドの値を比較します。その後、インターフェイスで Assertion ブロックを使用して両方の出力を検証します。モデル spec_model_test_interface
を開いて、インターフェイスを表示します。
test_interface = "spec_model_test_interface";
open_system(test_interface);
MATLAB Function ブロックは、次のコードを使用して 2 つの信号を比較します。
function y = fcn(design_val, spec_val) switch spec_val case Ail_Cmd.All y = true; case Ail_Cmd.Zero y = (design_val == 0); otherwise y = false; end
更新されたテストを設計モデルで実行
設計モデルをテストして検証するには、次を含むハーネス モデルを作成します。
仕様モデル
設計モデル
テスト インターフェイスと検証モデル
ハーネス モデルで、モデルを一緒に付加します。次に、設計モデルでテストを実行し、出力がハーネス モデル内の要件に対応することを検証します。
ハーネス モデルを表示するには、モデル sldvexDesignHarnessFinal
を開きます。
harness_model = "sldvexDesignHarnessFinal";
open_system(harness_model);
インターフェイス モデルと同様に、設計モデルのすべての入力が仕様モデルの入力に直接対応するとは限らない場合があります。この例では、仕様モデルによって指定された 5 つの入力を使用してテストするために、ハーネス モデルによって設計モデルが準備されます。
ハーネス モデル内から、設計モデルで更新済みテストを実行します。関数sldvruntest
(Simulink Design Verifier)を使用して、テストを実行し、結果を保存します。Simulink Coverage™ をお使いの場合は、sldvruntest
の出力からのテスト結果をカバレッジ レポートで確認できます。関数cvhtml
(Simulink Coverage)を使用して、カバレッジ レポートを表示します。
cvopts = sldvruntestopts; cvopts.coverageEnabled = true; [finalData, finalCov] = sldvruntest(... harness_model,files.DataFile,cvopts); cvhtml("finalCov",finalCov);
カバレッジ レポートで、sldvexRollApController
リンクをクリックします。概要には、設計モデル sldvexRollApController
でフル カバレッジが達成されたことが示されます。
bdclose("all");
slreq.clear;