Main Content

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

コード生成コンポーネントの検証

モデル例について

この例では slvnvdemo_powerwindow モデルを使用して、あるコンポーネントを、モデルがそのコンポーネントを含むという状況下で検証する方法を示します。この例の作業に沿って、Simulink® Design Verifier™ コンポーネント検証関数を使用してテスト ケースを作成し、参照モデルのカバレッジを測定していきます。また、コード生成検証 (CGV) API を使用して、シミュレーション モードおよびソフトウェアインザループ (SIL) モードの両方で参照モデルを実行することもできます。

メモ

この例の実行には次の製品ライセンスが必要です。

  • Stateflow®

  • Embedded Coder®

  • Simulink Coder™

検証するコンポーネントは control という名前の Model ブロックです。このコンポーネントは、slvnvdemo_powerwindow モデルの最上位の power_window_control_system サブシステムの中にあります。以下に power_window_control_system サブシステムを示します。

Model ブロック control はモデル slvnvdemo_powerwindow_controller を参照します。

参照モデルには、control という Stateflow チャートがあり、パワー ウィンドウ コントローラーのロジックを実装します。

検証するコンポーネントの準備

参照モデル slvnvdemo_powerwindow_controller を検証するには、プラント モデルのコントローラーをシミュレートする入力信号を含むハーネス モデルを作成します。

  1. モデル例 slvnvdemo_powerwindow および参照モデルを開きます。

    openExample('sldv/CreatingAndExecutingTestCasesExample',...
    'supportingFile','slvnvdemo_powerwindow');
    open_system('slvnvdemo_powerwindow_controller');
    
  2. モデル例で power_window_control_system サブシステムを開きます。

    power_window_control_system サブシステムにある control という名前の Model ブロックが、この例で検証するコンポーネント slvnvdemo_powerwindow_controller を参照しています。

  3. slvnvdemo_powerwindow_controller モデルを参照する Model ブロックのシミュレーションを行い、Model ブロックへの入力信号のログを作成します。

    loggedSignalsPlant = sldvlogsignals( ...
    	'slvnvdemo_powerwindow/power_window_control_system/control');

    sldvlogsignals は、loggedSignalsPlant にログ信号を保存します。

  4. ログ信号を含むハーネス モデルを生成します。

    harnessModelFilePath = sldvmakeharness( ...
    	'slvnvdemo_powerwindow_controller', loggedSignalsPlant);
    

    sldvmakeharness は、slvnvdemo_powerwindow_controller_harness という名前のハーネス モデルを作成して開きます。Signal Builder ブロックには、ログ信号が含まれるテスト ケースが 1 つ含まれています。

    ハーネス モデルの詳細は、Simulink Design Verifier ハーネス モデルの管理を参照してください。

  5. この例で後で使用するために、ハーネス モデルの名前を保存します。

    [~, harnessModel] = fileparts(harnessModelFilePath);
  6. この例の次の部分で使用するために、すべてのウィンドウは開いたままにしておきます。

次に、slvnvdemo_powerwindow_controller モデルのカバレッジを記録します。

コンポーネント カバレッジの記録

モデル カバレッジは、テスト ケースによりモデルがテストされる範囲を示す基準で、テスト ケースで確認される経路をパーセンテージで表します。slvnvdemo_powerwindow_controller モデルのカバレッジを記録するには、以下を行います。

  1. 関数 sldvruntest に必要な既定のオプション オブジェクトを作成します。

    runOpts = sldvruntestopts;
  2. モデルのシミュレーション実行、およびカバレッジの記録を指定します。

    runOpts.coverageEnabled = true;
  3. 参照モデルのシミュレーションを実行し、カバレッジを記録します。

    [~, covDataFromLoggedSignals] = sldvruntest( ...
    	'slvnvdemo_powerwindow_controller', loggedSignalsPlant, runOpts);
  4. HTML カバレッジ レポートを表示します。

    cvhtml('Coverage with Test Cases', covDataFromLoggedSignals);

    slvnvdemo_powerwindow_controller モデルは以下を達成しました。

    • 判定カバレッジ: 40%

    • 条件カバレッジ: 35%

    • MCDC カバレッジ: 10%

    判定カバレッジ、条件カバレッジ、MCDC カバレッジの詳細については、モデル カバレッジの種類 (Simulink Coverage)を参照してください。

slvnvdemo_powerwindow_controller モデルで 100% のカバレッジが達成されていないため、次は、モデルを解析して追加のカバレッジを記録し、追加のテスト ケースを作成します。

Simulink Design Verifier ソフトウェアを使用した追加のカバレッジの記録

Simulink Design Verifier を使用して、slvnvdemo_powerwindow_controller モデルを解析し、カバレッジを収集することができます。以前に達成されたオブジェクティブを無視し、追加のカバレッジを記録するように解析を指定できます。

モデルの追加のカバレッジを記録するには、以下を行います。

  1. ログ信号について記録したカバレッジ データをファイルに保存します。

    cvsave('existingCovFromLoggedSignal', covDataFromLoggedSignals);
  2. 解析用の既定のオプション オブジェクトを作成します。

    opts = sldvoptions;
  3. 判定、条件および改良条件判定カバレッジを記録するテスト ケースを解析時に生成するよう指定します。

    opts.ModelCoverageObjectives = 'MCDC';
  4. Model ブロックへの信号のログを作成したときに達成されたオブジェクティブを解析時に無視するように指定します。

    opts.IgnoreCovSatisfied = 'on';
  5. 達成されたオブジェクティブ データを含むファイルの名前を指定します。

    opts.CoverageDataFile = 'existingCovFromLoggedSignal.cvt';
  6. 解析で複数のオブジェクティブを達成させる長いテスト ケースを作成することを指定します。

    opts.TestSuiteOptimization = 'LongTestcases';

    それぞれのテスト ケースが複数のテスト オブジェクティブを達成させるようにして、作成するテスト ケースの数を少なくすると、次の節で生成コードを実行する際に時間が節約されます。

  7. Model ブロックを使用してコンポーネントを参照するハーネス モデルを作成するように指定します。

    opts.saveHarnessModel = 'on';
    opts.ModelReferenceHarness = 'on';

    検証するコンポーネントの準備でログ信号から作成したハーネス モデルは、モデル slvnvdemo_powerwindow_controller を参照する Model ブロックを使用します。解析で作成されるハーネス モデルも、slvnvdemo_powerwindow_controller を参照する Model ブロックを使用しなければなりません。テスト ケース データを最初のハーネス モデルに追加して、1 つのテスト スイートを作成することができます。

  8. Simulink Design Verifier を使用してモデルを解析します。

    [status, fileNames] = sldvrun('slvnvdemo_powerwindow_controller', ...
    	opts, true);

    解析でハーネス モデル slvnvdemo_powerwindow_controller_harness が作成されて開きます。Signal Builder ブロックには、74 のテスト オブジェクティブを達成する 1 つの長いテスト ケースが含まれています。

    このテスト ケースと検証するコンポーネントの準備で作成したテスト ケースを組み合わせて slvnvdemo_powerwindow_controller モデルの追加カバレッジを記録できます。

  9. 新しいハーネス モデルの名前を保存してそれを開きます。

    [~, newHarnessModel] = fileparts(fileNames.HarnessModel);
    open_system(newHarnessModel); 

次に、2 つのハーネス モデルを組み合わせて 1 つのテスト スイートを作成します。

ハーネス モデルの結合

2 つのハーネス モデルが次の時点で作成されています。

  • slvnvdemo_powerwindow_controller モデルを参照する Model ブロック control への信号のログ作成時。

  • slvnvdemo_powerwindow_controller モデルの解析時。

両方のハーネス モデルのテスト ケースを組み合わせることにより、より 100% カバレッジに近いカバレッジを記録できます。

  1. 最新のテスト ケースをログ信号のテスト ケースに追加してハーネス モデルを組み合わせます。

    sldvmergeharness(harnessModel, newHarnessModel);

    これで、slvnvdemo_powerwindow_controller_harness モデル内の Signal Builder ブロックには両方のテスト ケースが含まれることになります。

  2. ハーネス モデルへの信号のログを記録します。

    loggedSignalsMergedHarness = sldvlogsignals(harnessModel);
  3. 組み合わせたテスト ケースを使用して slvnvdemo_powerwindow_controller_harness モデルのカバレッジを記録します。まず、sldvruntest のオプション オブジェクトを構成します。

    runOpts = sldvruntestopts;
    runOpts.coverageEnabled = true;
  4. モデルのシミュレーションを実行し、カバレッジ データを記録して表示します。

    [~, covDataFromMergedSignals] = sldvruntest( ...
    	'slvnvdemo_powerwindow_controller', loggedSignalsMergedHarness, ...
    	runOpts);
    cvhtml('Coverage with Merged Test Cases', covDataFromMergedSignals);

    ここで、slvnvdemo_powerwindow_controller モデルは以下を達成します。

    • 判定カバレッジ: 100%

    • 条件カバレッジ: 80%

    • MCDC カバレッジ: 60%

シミュレーション モードでのコンポーネントの実行

モデルの生成コードがモデルのシミュレーションと同じ結果を生成することを検証するには、コード生成検証 (CGV) API メソッドを使用します。

メモ

異なる実行モードでモデルを実行するには、CGV API を使用して結果の数値的等価性を検証します。CGV API の詳細については、プログラムによるコード生成の検証 (Embedded Coder)を参照してください。

この手順を行うと、シミュレーションで両方のテスト ケースを使用してモデル コードがコンパイルされ実行されます。

  1. sldvruncgvtest の既定のオプション オブジェクトを作成します。

    runcgvopts = sldvruntestopts('cgv');
  2. モデルをシミュレーション モードで実行することを指定します。

    runcgvopts.cgvConn = 'sim';
  3. 2 つのテスト ケースと runcgvopts オブジェクトを使用して slvnv_powerwindow_controller モデルを実行します。

    cgvSim = sldvruncgvtest('slvnvdemo_powerwindow_controller', ...
    	loggedSignalsMergedHarness, runcgvopts);

    これらの手順により、ワークスペース変数 cgvSim に結果が保存されます。

次に、同じモデルを同じテスト ケースでソフトウェアインザループ (SIL) モードによって実行し、両方のシミュレーションの結果を比較します。

ノーマル シミュレーション モードの詳細については、SIL シミュレーションおよび PIL シミュレーションとは (Embedded Coder)を参照してください。

ソフトウェアインザループ (SIL) モードでのコンポーネントの実行

モデルをソフトウェアインザループ (SIL) モードで実行すると、シミュレーションでホスト コンピューター上に生成コードがコンパイルされて実行されます。

この節では、slvnvdemo_powerwindow_controller モデルを SIL モードで実行し、前の節の結果の、シミュレーション モードで実行した場合と比較します。

  1. モデルを SIL モードで実行することを指定します。

    runcgvopts.cgvConn = 'sil';
  2. 2 つのテスト ケースと runcgvopts オブジェクトを使用して slvnv_powerwindow_controller モデルを実行します。

    cgvSil = sldvruncgvtest('slvnvdemo_powerwindow_controller', ...
    	loggedSignalsMergedHarness, runcgvopts);

    ワークスペース変数 cgvSil には SIL モードでの実行結果が含まれます。

  3. cgvSil の結果と、シミュレーション モードの実行により作成された cgvSim の結果とを比較します。compare (Embedded Coder) メソッドを使用して、2 つのシミュレーションの結果を比較します。

    for i=1:length(loggedSignalsMergedHarness.TestCases)
        simout = cgvSim.getOutputData(i);
        silout = cgvSil.getOutputData(i);
        [matchNames, ~, mismatchNames, ~ ] = ...
    			cgv.CGV.compare(simout, silout);
    end
  4. 比較の結果を MATLAB® コマンド ウィンドウに表示します。

    fprintf(['\nTest Case(%d):%d Signals match, %d Signals mismatch\r'],...
    	i, length(matchNames), length(mismatchNames));
    

    想定されたとおり、2 つのシミュレーションの結果は一致します。

ソフトウェアインザループ (SIL) シミュレーションの詳細については、SIL シミュレーションおよび PIL シミュレーションとは (Embedded Coder)を参照してください。