Main Content

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

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