メインコンテンツ

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

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),...
        "CovIncludeTopModel","off");
    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");
[01-Feb-2025 15:46:46] Checking for availability of parallel pool...
[01-Feb-2025 15:46:47] Running simulations...
[01-Feb-2025 15:47:00] Completed 1 of 2 simulation runs
[01-Feb-2025 15:47:03] Completed 2 of 2 simulation runs

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

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

simOut(1).covdata
ans = ... cvdata
               file: /tmp/Bdoc25a_2864802_2301199/tp1ce04949/slcoverage-ex16619798/slcov_output/slvnvdemo_powerwindow_parsim/slvnvdemo_powerwindow_parsim_cvdata_1.cvt
               date: 01-Feb-2025 15:47:00

累積カバレッジの計算

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

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

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

open(Simulink.BlockPath(...
    "slvnvdemo_powerwindow_parsim/power_window_control_system/control"));
cvmodelview(coverageData);

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

cvhtml("cumulativeCovReport",coverageData);