使用 Parsim 实现并行仿真中的记录覆盖率
此示例展示如何使用 SimulationInput
对象和 parsim
命令记录对应于不同测试用例的多个并行 Simulink® 仿真中的覆盖率。如果您的系统上安装了 Parallel Computing Toolbox,则 parsim
命令将并行运行仿真。否则,仿真将串行运行。
模型概述
slvnvdemo_powerwindow_parsim
模型包含一个电动车窗控制器和一个低阶对象模型。组件 slvnvdemo_powerwindow_parsim/power_window_control_system/control
是一个引用模型 slvnvdemo_powerwindow_controller
的 Model 模块,它使用 Stateflow®图实现控制器。
mdl = 'slvnvdemo_powerwindow_parsim';
isModelOpen = bdIsLoaded(mdl);
open_system(mdl);
设置多个仿真的数据
使用 NumberOfScenarios
参数确定 Signal Editor 模块中的测试用例的数量。测试用例的数量决策了要运行的迭代次数。
sigEditBlk = [mdl '/Input']; numCases = str2double(get_param(sigEditBlk,'NumberOfScenarios'));
创建一个
对象数组来定义要运行的一组仿真。每个 Simulink.SimulationInput
SimulationInput
对象对应一次仿真,并存储在数组 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');
[20-Apr-2024 10:48:58] Checking for availability of parallel pool... Starting parallel pool (parpool) using the 'Processes' profile ... Connected to parallel pool with 4 workers. [20-Apr-2024 10:50:10] Starting Simulink on parallel workers... [20-Apr-2024 10:51:24] Configuring simulation cache folder on parallel workers... [20-Apr-2024 10:51:24] Loading model on parallel workers... [20-Apr-2024 10:52:51] Running simulations... [20-Apr-2024 10:53:30] Completed 1 of 2 simulation runs [20-Apr-2024 10:53:31] Completed 2 of 2 simulation runs [20-Apr-2024 10:53:31] Cleaning up parallel workers...
每个
对象包含以 Simulink.SimulationInput
形式存储的记录覆盖率结果。这些覆盖率结果存储在名为 cv.cvdatagroup
objectscovdata
的字段中,如先前由 CovSaveName
参数指定的那样。使用 parsim
运行多次仿真意味着捕获错误,以便后续仿真可以继续运行。任何错误都会记录在 SimulationOutput
对象的 ErrorMessage
属性中。
covdata
引用包含覆盖率结果的文件。当覆盖率函数使用 covdata
时,引用文件的覆盖率数据会自动加载到内存中。
simOut(1).covdata
ans = ... cvdata file: /tmp/Bdoc24a_2589924_2110844/tpa49fb889/slcoverage-ex16619798/slcov_output/slvnvdemo_powerwindow_parsim/slvnvdemo_powerwindow_parsim_cvdata_1.cvt date: 20-Apr-2024 10:53:29
计算累计覆盖率
获取 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('cummulative_cov_report.html', coverageData);