В этом примере показано, как записать покрытие в нескольких параллельных симуляциях Simulink ®, соответствующих различным тестам, с помощью объектов SimulationInput и parsim
команда. Если в вашей системе установлен Parallel Computing Toolbox, parsim
команда выполняет параллельные симуляции. В противном случае симуляции выполняются последовательно.
The slvnvdemo_powerwindow_parsim
модель содержит контроллер окна со степенью и модель объекта управления порядка. Область компонента slvnvdemo_powerwindow_parsim/power_window_control_system/control
является блоком Model, который ссылается на модель slvnvdemo_powerwindow_controller
, который реализует контроллер с графиком Stateflow ®.
mdl = 'slvnvdemo_powerwindow_parsim';
isModelOpen = bdIsLoaded(mdl);
open_system(mdl);
Определите количество тестов в блоке Signal Редактора при помощи NumberOfScenarios
параметр. Количество тестов определяет количество итераций, которые должны выполняться.
sigEditBlk = [mdl '/Input']; numCases = str2double(get_param(sigEditBlk,'NumberOfScenarios'));
Создайте массив
объекты, определяющие набор симуляций для выполнения. Каждый объект SimulationInput соответствует одной симуляции и хранится в массиве Simulink.SimulationInput
simIn
. Для каждой симуляции установите следующие параметры:
ActiveScenario
чтобы указать, какой сценарий блока Редактор выполнять
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), 'CovSaveSingleToWorkspaceVar', 'on'); simIn(idx) = setModelParameter(simIn(idx), 'CovSaveName', 'covdata'); end
Используйте
функция для выполнения параллельных симуляций. Передайте массив объектов SimulationInput, parsim
simIn
, в parsim
функция как первый аргумент. Установите ShowProgress
опция для on
для отображения прогресса симуляций в Командном Окне MATLAB. The выхода from the parsim
команда simOut
, массив Simulink.SimulationOutput
объекты.
simOut = parsim(simIn, 'ShowProgress', 'on');
[27-Jan-2021 07:37:36] Checking for availability of parallel pool... Starting parallel pool (parpool) using the 'local' profile ... Connected to the parallel pool (number of workers: 12). [27-Jan-2021 07:38:13] Starting Simulink on parallel workers... [27-Jan-2021 07:39:02] Configuring simulation cache folder on parallel workers... [27-Jan-2021 07:39:03] Loading model on parallel workers... [27-Jan-2021 07:39:42] Running simulations... [27-Jan-2021 07:40:17] Completed 1 of 2 simulation runs [27-Jan-2021 07:40:17] Completed 2 of 2 simulation runs [27-Jan-2021 07:40:17] Cleaning up parallel workers...
Каждый
объект содержит записанные в журнал результаты покрытия, сохраненные как Simulink.SimulationInput
. Эти результаты покрытия хранятся в поле с именем cv.cvdatagroup
объектыcovdata
, как ранее указано в CovSaveName
параметр. Использование parsim
выполнение нескольких симуляций означает, что ошибки получаются таким образом, что последующие симуляции могут продолжать выполняться. Любые ошибки регистрируются в ErrorMessage
свойство объекта SimulationOutput.
covdata
ссылается на файл, содержащий результаты покрытия. Данные о покрытии из ссылочного файла автоматически загружаются в память при covdata
используется функцией переадресации.
simOut(1).covdata
ans = ... cvdata file: /tmp/BR2021ad_1584584_202060/publish_examples3/tp76447b8e/ex16619798/slcov_output/slvnvdemo_powerwindow_parsim/slvnvdemo_powerwindow_parsim_cvdata_1.cvt date: 27-Jan-2021 07:40:16
Получите данные о покрытии от каждого элемента simOut
и суммируйте результаты.
coverageData = simOut(1).covdata; for i = 2 : numCases coverageData = coverageData + simOut(i).covdata; end
Просмотрите совокупные результаты покрытия на модели с помощью подсветки покрытия.
cvmodelview(coverageData);
open_system('slvnvdemo_powerwindow_parsim/power_window_control_system');
Сгенерируйте совокупный отчет о покрытии.
cvhtml('cummulative_cov_report.html', coverageData);