主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

使用 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");
[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 形式存储的记录覆盖率结果。这些覆盖率结果存储在名为 covdata 的字段中,如先前由 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);