Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

Simulink® Coverage™ を使用したコード カバレッジ メトリクスの収集

この例では、Simulink® Coverage™ を使用したソフトウェアインザループ (SIL) またはプロセッサインザループ (PIL) のシミュレーション中にコード カバレッジ メトリクスを収集する方法について説明します。

コード カバレッジ ツールとコード カバレッジ レポートを使用し、SIL シミュレーションに対して記録されたコード カバレッジを表示します。

この例では、ノーマル モードのシミュレーション中にモデル カバレッジを測定し、同じシミュレーションを SIL モードで繰り返して、両方のシミュレーションから記録されたメトリクスを比較します。

モデル カバレッジおよびコード カバレッジ レポート内のハイパーリンクを使用することで、モデル カバレッジおよびコード カバレッジの結果を比較できます。

SIL および PIL のシミュレーションを測定するその他の例については、SIL シミュレーションと PIL シミュレーションを使用した生成コードのテスト (Embedded Coder)を参照してください。

初期設定

モデルを開きます。

model = 'rtwdemo_sil_topmodel';
close_system(model,0)
open_system(model)

既存のビルド フォルダーを削除します。

buildFolder = RTW.getBuildDir(model);
if isfolder(buildFolder.BuildDirectory)
    rmdir(buildFolder.BuildDirectory,'s');
end

カバレッジ収集のモデルを設定します。

set_param(model, 'CovEnable', 'on')
clear covCumulativeData

入力データを設定します。

T = 0.1; % sample time
[ticks_to_count, reset, counter_mode, count_enable, ...
    counter_mode_values_run1, counter_mode_values_run2, ...
    count_enable_values_run1, count_enable_values_run2] = ...
    rtwdemo_sil_topmodel_data(T);

ノーマル モードで最初のシミュレーションを実行する

シミュレーション完了後、モデル カバレッジ レポートが開きます。モデル内のブロックからカバレッジ レポートの対応するセクションに移動するには、カバレッジ表示ウィンドウを使用します。

counter_mode.signals.values = counter_mode_values_run1;
count_enable.signals.values = count_enable_values_run1;
set_param(model, 'SimulationMode', 'normal');

シミュレーション データ インスペクターを使用してシミュレーション結果を表示し、比較します。

Simulink.sdi.view;
Simulink.sdi.clear;

シミュレーションを実行します。

simout_normal_run1 = sim(model, 'ReturnWorkspaceOutputs', 'on');

結果を取得します。

Simulink.sdi.createRun('Run 1 (normal mode)', 'namevalue',...
                       {'simout_normal_run1'}, {simout_normal_run1});

ノーマル モードで 2 番目のシミュレーションを実行する

最初のシミュレーションについて、レポートにはモデルが 100% 未満の MCDC カバレッジを達成したことが示されます。異なる入力信号で 2 番目のシミュレーションを実行し、MCDC カバレッジを 100% のレベルに拡大します。モデル カバレッジ レポートは、両方のシミュレーション実行の累積カバレッジを示すよう設定されています。

counter_mode.signals.values = counter_mode_values_run2;
count_enable.signals.values = count_enable_values_run2;
set_param(model, 'SimulationMode', 'normal');

simout_normal_run2 = sim(model, 'ReturnWorkspaceOutputs', 'on');

Simulink.sdi.createRun('Run 2 (normal mode)', 'namevalue',...
                       {'simout_normal_run2'}, {simout_normal_run2});            

コード カバレッジを測定する対象のモデルの設定

SIL シミュレーションを実行する前に、コード カバレッジ メトリクスを収集するようにモデルを設定します。

coverageSettings = get_param(model, 'CodeCoverageSettings');
coverageSettings.CoverageTool = 'Simulink Coverage';
set_param(model, 'CodeCoverageSettings', coverageSettings);

最初のシミュレーションを SIL モードで実行する

ノーマル モードで最初のシミュレーションの実行時に使用した同じ入力信号を SIL シミュレーションで使用できます。

最初のシミュレーションを SIL モードで実行します。

counter_mode.signals.values = counter_mode_values_run1;
count_enable.signals.values = count_enable_values_run1;
set_param(model, 'SimulationMode', 'software-in-the-loop');
set_param(model, 'CodeExecutionProfiling', 'off');
set_param(model, 'CodeProfilingInstrumentation', 'off');
simout_sil_run1 = sim(model, 'ReturnWorkspaceOutputs', 'on');
### Starting build procedure for: rtwdemo_sil_topmodel
### Successful completion of build procedure for: rtwdemo_sil_topmodel

Build Summary

Top model targets built:

Model                 Action                       Rebuild Reason                                    
=====================================================================================================
rtwdemo_sil_topmodel  Code generated and compiled  Code generation information file does not exist.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 28.458s
### Preparing to start SIL simulation ...
Building with 'gcc'.
MEX completed successfully.
### Updating code generation report with SIL files ...
### Starting SIL simulation for component: rtwdemo_sil_topmodel
### Stopping SIL simulation for component: rtwdemo_sil_topmodel
Simulink.sdi.createRun('Run 1 (SIL mode)', 'namevalue',...
                       {'simout_sil_run1'}, {simout_sil_run1});

シミュレーションが完了したら、カバレッジの強調表示を使用してモデルでコード カバレッジ結果を表示します。モデル要素の SIL コード カバレッジの概要を確認するには、カーソルをモデル要素に合わせます。

HTML のコード カバレッジ レポートでコード カバレッジ結果を表示することもできます。概要セクションには、すべての関数が呼び出されたものの、SIL シミュレーション実行で判定、条件、または MCDC カバレッジのフル カバレッジが達成されなかったことが示されます。

ブロック線図で対応するモデル要素に移動するには、コード カバレッジ レポートのハイパーリンクを使用します。

2 番目のシミュレーションを SIL モードで実行する

ノーマル モードで 2 番目のシミュレーションの実行時に使用した同じ入力信号を SIL シミュレーションで使用します。

counter_mode.signals.values = counter_mode_values_run2;
count_enable.signals.values = count_enable_values_run2;
set_param(model, 'SimulationMode', 'software-in-the-loop');
set_param(model, 'CodeExecutionProfiling', 'off');
set_param(model, 'CodeProfilingInstrumentation', 'off');
simout_sil_run2 = sim(model, 'ReturnWorkspaceOutputs', 'on');
### Starting build procedure for: rtwdemo_sil_topmodel
### Generated code for 'rtwdemo_sil_topmodel' is up to date because no structural, parameter or code replacement library changes were found.
### Successful completion of build procedure for: rtwdemo_sil_topmodel

Build Summary

Top model targets built:

Model                 Action         Rebuild Reason                           
==============================================================================
rtwdemo_sil_topmodel  Code compiled  Compilation artifacts were out of date.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 4.1183s
### Preparing to start SIL simulation ...
### Starting SIL simulation for component: rtwdemo_sil_topmodel
### Stopping SIL simulation for component: rtwdemo_sil_topmodel
Simulink.sdi.createRun('Run 2 (SIL mode)', 'namevalue',...
                       {'simout_sil_run2'}, {simout_sil_run2});

コード カバレッジの強調表示には、モデルから生成されたコードがフル カバレッジを達成したことが示されます。

ノーマル シミュレーションと SIL シミュレーションからのメトリクスを比較する

シミュレーション データ インスペクターは実行するたびに自動的に開くため、結果を表示して解析できます。SIL およびノーマル モードの実行に対してログ記録された信号が同等であることを確認するには、[比較] ペインと [検査] ペインの情報を確認します。