Покрытие записи в параллельных симуляциях при помощи Parsim

Этот пример показывает, как записать покрытие в нескольких параллельных симуляциях Simulink®, соответствующих различным тестам при помощи объектов SimulationInput и команды parsim. Если Parallel Computing Toolbox установлен в вашей системе, симуляции выполнений команды parsim параллельно. В противном случае симуляции запущены в сериале.

Образцовый обзор

Модель 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 Editor при помощи параметра NumberOfScenarios. Количество тестов определяет количество итераций, чтобы запуститься.

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), 'CovSaveSingleToWorkspaceVar', 'on');
    simIn(idx) = setModelParameter(simIn(idx), 'CovSaveName', 'covdata');
end

Запустите симуляции параллельно при помощи Parsim

Используйте функцию parsim, чтобы выполнить симуляции параллельно. Передайте массив объектов SimulationInput, simIn, в функцию parsim в качестве первого аргумента. Установите опцию ShowProgress на on отображать прогресс симуляций в Окне Команды MATLAB. Вывод от команды parsim является объектами simOut, |an array of |Simulink.SimulationOutput.

simOut = parsim(simIn, 'ShowProgress', 'on');
[24-Jan-2019 14:46:03] Checking for availability of parallel pool...
Starting parallel pool (parpool) using the 'local' profile ...
Connected to the parallel pool (number of workers: 12).
[24-Jan-2019 14:46:38] Starting Simulink on parallel workers...
[24-Jan-2019 14:47:25] Configuring simulation cache folder on parallel workers...
[24-Jan-2019 14:47:25] Loading model on parallel workers...
[24-Jan-2019 14:47:48] Running simulations...
[24-Jan-2019 14:48:23] Completed 1 of 2 simulation runs
[24-Jan-2019 14:48:23] Completed 2 of 2 simulation runs
[24-Jan-2019 14:48:23] Cleaning up parallel workers...

Каждый объект Simulink.SimulationOutput содержит регистрируемые результаты покрытия, сохраненные как cvdata objects. Эти результаты покрытия хранятся в поле под названием covdata, как ранее заданный параметром CovSaveName. Используя parsim, чтобы запустить несколько симуляций означает, что ошибки фиксируются так, чтобы последующие симуляции могли продолжить запускаться. Любые ошибки зарегистрированы в свойстве ErrorMessage объекта SimulationOutput.

covdata ссылается на файл, содержащий результаты покрытия. Данные о покрытии из файла, на который ссылаются, автоматически загружаются в память, когда covdata используется функцией покрытия.

simOut(1).covdata
ans = ... cvdata
                 file: /tmp/BR2019ad_1046204_242911/publish_examples0/tpa61e30ad/slcov_output/slvnvdemo_powerwindow_parsim/slvnvdemo_powerwindow_parsim_cvdata_1.cvt
                 date: 24-Jan-2019 14:48:22

Вычислите совокупное покрытие

Получите данные о покрытии из каждого элемента 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);

Закройте модель

Закройте модель, если модель была открыта скриптом в качестве примера.

if(~isModelOpen)
    close_system(mdl, 0);
end