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');
[04-Aug-2023 00:44:51] Checking for availability of parallel pool...
Starting parallel pool (parpool) using the 'Processes' profile ...
Connected to parallel pool with 4 workers.
[04-Aug-2023 00:45:42] Starting Simulink on parallel workers...
[04-Aug-2023 00:46:41] Configuring simulation cache folder on parallel workers...
[04-Aug-2023 00:46:42] Loading model on parallel workers...
[04-Aug-2023 00:47:43] Running simulations...
[04-Aug-2023 00:48:29] Completed 1 of 2 simulation runs
[04-Aug-2023 00:48:29] Completed 2 of 2 simulation runs
[04-Aug-2023 00:48:29] Cleaning up parallel workers...

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

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

simOut(1).covdata
ans = ... cvdata
               file: /tmp/Bdoc23b_2347338_114237/tp930e6f4d/slcoverage-ex16619798/slcov_output/slvnvdemo_powerwindow_parsim/slvnvdemo_powerwindow_parsim_cvdata_1.cvt
               date: 04-Aug-2023 00:48:28

累積カバレッジの計算

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);