Main Content

このページは前リリースの情報です。該当の英語のページはこのリリースで削除されています。

parsim を使用した並列シミュレーションのカバレッジの記録

この例では、SimulationInput オブジェクトおよび parsim コマンドを使用して、異なるテスト ケースに対応する Simulink® の複数の並列シミュレーションのカバレッジを記録する方法について説明します。システム上に Parallel Computing Toolbox がインストールされている場合、parsim コマンドはシミュレーションを並列実行します。そうでない場合、シミュレーションは逐次実行されます。

モデルの概要

slvnvdemo_powerwindow_parsim モデルには、パワー ウィンドウ コントローラーおよび低次のプラント モデルが含まれます。コンポーネント slvnvdemo_powerwindow_parsim/power_window_control_system/control は、Stateflow® チャートでコントローラーを実装するモデル slvnvdemo_powerwindow_controller を参照する Model ブロックです。

mdl               = 'slvnvdemo_powerwindow_parsim';
isModelOpen       = bdIsLoaded(mdl);
open_system(mdl);

複数のシミュレーションのデータ設定

Signal Editor ブロックで NumberOfScenarios パラメーターを使用して、テスト ケースの数を特定します。テスト ケースの数によって実行する反復回数が決まります。

sigEditBlk = [mdl '/Input'];
numCases   = str2double(get_param(sigEditBlk,'NumberOfScenarios'));

Simulink.SimulationInput オブジェクトの配列を作成し、実行するシミュレーションのセットを定義します。各 SimulationInput オブジェクトは 1 つのシミュレーションに対応し、配列 simIn に格納されます。各シミュレーションで、以下のパラメーターを設定します。

  • ActiveScenario。Signal Editor ブロックのどのシナリオを実行するかを示します。

  • CovEnable。カバレッジ解析をオンにします。

  • CovSaveSingleToWokspaceVar。カバレッジの結果をワークスペース変数に保存します。

  • CovSaveName。変数の名前を指定します。

for idx = numCases:-1:1
    simIn(idx) = Simulink.SimulationInput(mdl);
    simIn(idx) = setBlockParameter(simIn(idx), sigEditBlk, 'ActiveScenario', idx);
    simIn(idx) = setModelParameter(simIn(idx), 'CovEnable', 'on');
    simIn(idx) = setModelParameter(simIn(idx), 'CovSaveSingleToWorkspaceVar', 'on');
    simIn(idx) = setModelParameter(simIn(idx), 'CovSaveName', 'covdata');
end

parsim を使用したシミュレーションの並列実行

関数 parsim を使用して、シミュレーションを並列実行します。最初の引数として SimulationInput オブジェクトの配列 simIn を関数 parsim に渡します。ShowProgress オプションを on に設定し、MATLAB コマンド ウィンドウにシミュレーションの進行状況を表示します。parsim コマンドからの出力は simOut であり、Simulink.SimulationOutput オブジェクトの配列です。

simOut = parsim(simIn, 'ShowProgress', 'on');
[29-Jan-2020 15:07:58] Checking for availability of parallel pool...
Starting parallel pool (parpool) using the 'local' profile ...
Connected to the parallel pool (number of workers: 12).
[29-Jan-2020 15:08:53] Starting Simulink on parallel workers...
[29-Jan-2020 15:09:20] Configuring simulation cache folder on parallel workers...
[29-Jan-2020 15:09:21] Loading model on parallel workers...
[29-Jan-2020 15:10:00] Running simulations...
[29-Jan-2020 15:10:41] Completed 1 of 2 simulation runs
[29-Jan-2020 15:10:41] Completed 2 of 2 simulation runs
[29-Jan-2020 15:10:41] Cleaning up parallel workers...

Simulink.SimulationInput オブジェクトには、ログ記録されたカバレッジの結果が objects として格納されます。これらのカバレッジの結果は、事前に CovSaveName パラメーターによって指定されたとおり、covdata, という名前のフィールドに格納されます。parsim を使用して複数のシミュレーションを実行した場合、後続のシミュレーションを継続して実行できるようにエラーがキャプチャされます。エラーはすべて SimulationOutput オブジェクトの ErrorMessage プロパティに記録されます。

covdata はカバレッジの結果が記載されたファイルを参照します。カバレッジ関数によって covdata が使用されるときに、参照ファイルのカバレッジ データが自動的にメモリに読み込まれます。

simOut(1).covdata
ans = ... cvdata
                 file: /tmp/BR2020ad_1302590_239645/publish_examples0/tpbb10a12c/ex16619798/slcov_output/slvnvdemo_powerwindow_parsim/slvnvdemo_powerwindow_parsim_cvdata_1.cvt
                 date: 29-Jan-2020 15:10:41

累積カバレッジの計算

simOut の各要素からカバレッジ データを取得し、結果を累積します。

coverageData = simOut(1).covdata;
for i = 2 : numCases
    coverageData = coverageData + simOut(i).covdata;
end

カバレッジの強調表示を使用して、モデル上で累積されたカバレッジの結果を参照します。

cvmodelview(coverageData);
open_system('slvnvdemo_powerwindow_parsim/power_window_control_system');

累積カバレッジ レポートを生成します。

cvhtml('cummulative_cov_report.html', coverageData);