Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

要件に基づくテストに対する仕様モデルの使用

R2022b 以降

この例では、仕様モデルを使用して、航空機の自動操縦コントローラーのモデルで形式的要件をモデル化およびテストする方法を説明します。この仕様モデルでは、2 つの Requirements Table ブロックを使用して、航空機の自動操縦コントローラー モデルの必要な入力と出力をモデル化します。仕様モデルからテストを生成し、そのテストを航空機の自動操縦コントローラー モデルで実行します。テスト対象のモデルは "設計モデル" です。

Requirements Table ブロックを定義および設定する方法の詳細については、Requirements Table ブロックを使用した形式的要件の作成 (Requirements Toolbox)および形式的要件のプロパティの構成 (Requirements Toolbox)を参照してください。

上位レベルの要件の表示

"要件エディター" で要件セット AP_Controller_Reqs を開きます。

slreq.open("AP_Controller_Reqs");

上位レベルの要件によって、モデルの出力と自動操縦コントローラー モードが指定されます。各要件の説明では、形式的要件で必要なロジックを明示的に定義するために使うことができる高水準言語が使用されます。

This image shows the requirements set, AP_Controller_Reqs, in the Requirements Editor.

仕様モデルの最初の反復の表示

仕様モデル spec_model_partial を開きます。

spec_model = "spec_model_partial";
open_system(spec_model); 

このモデルには 2 つの Requirements Table ブロックが含まれていて、上位レベルの要件をテスト可能な論理式に変換する形式的要件を定義します。AP_Mode_Determination ブロックは自動操縦コントローラー モードの形式的要件を指定し、Cmd_Determination ブロックはコントローラーの出力を指定します。

This image shows the specification model, spec_model_partial. The model has two Requirements Table blocks that are connected together.

形式的要件を表示するには、各 Requirements Table ブロックを検証します。

コントローラー モードの Requirements Table ブロック

AP_Mode_Determination を開きます。ブロックは、自動操縦コントローラー モードの形式的要件を指定します。出力データ Mode を決定するために、AP_Mode_Determination は次の 2 つの入力データを使用して 3 つの要件を指定します。

  • AP_Engage_Switch — 自動操縦の係合スイッチ

  • HDG_Engage_Switch — 機首の係合スイッチ

各要件は入力の組み合わせを使用して、Mode の一意の出力値を指定します。

Ths image shows the table for AP_Mode_Determination. The block specifies the formal requirements for the autopilot controller mode.

コントローラー コマンドの Requirements Table ブロック

Cmd_Determination を開きます。Cmd_Determination は補助翼コマンドとロール参照コマンドの要件を指定します。Cmd_Determination は次の 4 つの入力データを使用します。

  • ModeAP_Mode_Determination の出力 Mode

  • Roll_Ref_TK — ロール参照ターゲット ノブの設定

  • Roll_Angle_Phi — 実際の航空機ロール角

  • HDG_Ref_TK — 機首参照ターゲット ノブの設定

このブロックでは、これらの入力データを使用して、コントローラーの出力データを決定します。

  • Roll_Ref_Cmd — ロール参照コマンド

  • Ail_Cmd — 補助翼コマンド

This image shows the table for Cmd_Determination. Cmd_Determination specifies the requirements for the aileron command and roll reference command.

この例では、式に定数データが使用され、Roll_Ref_TK および Roll_Angle_Phi の値の範囲を定義します。値をパラメーター化するか、リテラル値を使用することもできます。Requirements Table ブロックのデータの定義 (Requirements Toolbox)を参照してください。これらの値を表示するには、[シンボル] ペインを開きます。[モデル化] タブの [データの設計] セクションで [シンボル] ペインをクリックします。

要件だけでなく、Cmd_Determination は設計の仮定も定義します。要件への仮定の追加 (Requirements Toolbox)を参照してください。この例では、仮定により、物理的な制限に基づいてロール角とロール参照ターゲット ノブの値が制約されます。ロール角は 180 度を超えたり、-180 度を下回ることはできず、ロール参照ターゲット ノブは 30 を超えたり、-30 を下回ることはできません。テーブルで、[仮定] タブをクリックします。

This image shows the assumptions used in Cmd_Determination.

また、データの [最小値][最大値] プロパティでデータ範囲の制限を指定するか、ブロックを使用して信号から範囲を明示的に指定することもできます。

テストの生成

Simulink® Design Verifier™ は、Requirements Table ブロックで定義された要件からテスト オブジェクティブを自動的に作成します。テストを生成するには、[コンフィギュレーション パラメーター] ウィンドウを使用するか、テストをプログラムによって指定します。テスト生成用のモデル カバレッジ オブジェクティブを参照してください。異なるカバレッジ オブジェクティブを選択し、生成されるテスト数を最小限に抑える必要があるか、またはテストの精度とトレーサビリティを改善する必要があるかを決定します。

この例では、判定カバレッジを使用してテストが生成され、出力が MAT ファイルに保存されます。

opts = sldvoptions; 
opts.Mode = "TestGeneration"; 
opts.ModelCoverageObjectives = "Decision";
[~,files] = sldvrun(spec_model,opts,true);

Simulink Design Verifier は要件からテスト オブジェクティブとテストを生成しますが、要件が達成するのは 7 つのテスト オブジェクティブだけです。

This image shows the results of generating the tests on the specification model. The requirements satisfy only seven of the test objectives.

テスト オブジェクティブを達成するには、仕様モデルを改訂しなければなりません。一般的に、形式的要件が完全で、一貫性があり、上位レベルの要件に対応していることを確認せずに仕様モデルからテストが生成されることを回避します。そうしないと、生成するテストがテスト オブジェクティブを達成する可能性が低くなってしまいます。

clear("files")

仕様モデルの調査と更新

仕様モデルを調査し、形式的要件を更新します。この例では、Cmd_Determination の要件セットには要件 3 の 3 番目の箇条書きに対応する形式的要件がありません。

This image shows the description for the 3rd high-level requirement. The missing requirement from Cmd_Determination is in the red box.

モデル spec_model_final 内の Cmd_Determination を開き、更新された要件セットを表示します。追加要件のインデックスは 2.2.4 です。

spec_model = "spec_model_final";
load_system(spec_model);
open_system(spec_model + "/Cmd_Determination");

This image shows the updated formal requirements of Cmd_Determination. The new requirement is in a red box.

要件セットに含まれる問題を手作業で見つけることは困難です。Simulink Design Verifier を使用すると、要件セットを解析し、矛盾と不完全性を特定できます。詳細については、ブロックの解析 (Requirements Toolbox)を参照してください。

上位レベルの要件と形式的要件のリンク

仕様モデルを読み込むと、"要件エディター" で形式的要件が読み込まれます。仕様モデルを閉じると、関連する要件セットも閉じられます。形式的要件の作成時に、形式的要件を対応する上位レベルの要件にリンクし、仕様モデル内の要件を追跡します。この例では、要件をリンクしてもテスト生成やテスト結果には影響しません。

最初の形式的要件を対応する上位レベルの要件にリンクするには、次の手順を実行します。

  1. spec_model_final で、Table1 という名前の要件セットを展開します。

  2. [インデックス]1 である形式的要件を右クリックし、[要件とのリンクを選択] を選択します。

  3. 要件セット AP_Controller_Reqs を展開します。

  4. [ID]1 である要件を右クリックし、[1: Autopilot mode is OFF" から "1: High Level: Autopilot Con..." へのリンクを作成] をクリックします。

リンク タイプの既定の設定は Related to です。リンク タイプの詳細については、リンク タイプ (Requirements Toolbox)を参照してください。

更新したモデルからテストを生成

以前に定義したオプションを使用して、更新された仕様モデルからテストを生成します。

opts = sldvoptions; 
opts.Mode = "TestGeneration"; 
opts.ModelCoverageObjectives = "Decision"; 
[~,files] = sldvrun(spec_model,opts,true);

このバージョンの仕様モデルでは、テスト オブジェクティブが達成されます。

This image shows the results of generating the tests on the updated specification model. The test objectives are satisfied.

設計モデルでのテストの実行

テスト オブジェクティブを達成するテストを作成したら、そのテストを設計モデルで実行できます。この例では、設計モデルは航空機の自動操縦コントローラーのモデル 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);

This image shows the model, spec_model_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    

更新されたテストを設計モデルで実行

設計モデルをテストして検証するには、次を含むハーネス モデルを作成します。

  1. 仕様モデル

  2. 設計モデル

  3. テスト インターフェイスと検証モデル

ハーネス モデルで、モデルを一緒に付加します。次に、設計モデルでテストを実行し、出力がハーネス モデル内の要件に対応することを検証します。

ハーネス モデルを表示するには、モデル sldvexDesignHarnessFinal を開きます。

harness_model = "sldvexDesignHarnessFinal";
open_system(harness_model);

インターフェイス モデルと同様に、設計モデルのすべての入力が仕様モデルの入力に直接対応するとは限らない場合があります。この例では、仕様モデルによって指定された 5 つの入力を使用してテストするために、ハーネス モデルによって設計モデルが準備されます。

This image shows the harness model, sldvexDesignHarnessFinal.

ハーネス モデル内から、設計モデルで更新済みテストを実行します。関数sldvruntestを使用して、テストを実行し、結果を保存します。Simulink Coverage™ をお使いの場合は、sldvruntest の出力からのテスト結果をカバレッジ レポートで確認できます。関数cvhtml (Simulink Coverage)を使用して、カバレッジ レポートを表示します。

cvopts = sldvruntestopts;
cvopts.coverageEnabled = true;
[finalData, finalCov] = sldvruntest(...
    harness_model,files.DataFile,cvopts);
cvhtml("finalCov",finalCov);

カバレッジ レポートには、設計モデル sldvexRollApController でフル カバレッジが達成されたことが示されます。

This image shows the coverage report after running the tests from within the harness model. The report shows that full coverage is achieved on the design model.

bdclose("all");
slreq.clear;

参考

(Requirements Toolbox)

関連するトピック