使用 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.SimulationInputSimulationInput 对象对应一次仿真,并存储在数组 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 并行运行仿真
使用 函数并行执行仿真。将 parsimSimulationInput 对象数组 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 objectscovdata 的字段中,如先前由 CovSaveName 参数指定的那样。使用 parsim 运行多次仿真意味着捕获错误,以便后续仿真可以继续运行。任何错误都会记录在 ErrorMessage 对象的 SimulationOutput 属性中。
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);