В этом примере показано, как можно запустить несколько симуляций Simulink ®, соответствующих различным тестам в блоке Редактор с помощью объектов SimulationInput и parsim
команда. Команда parsim использует Parallel Computing Toolbox™, если она доступна, чтобы запускать параллельные симуляции, в противном случае симуляции выполняются последовательно.
Показанная ниже модель sldemo_suspn_3dof моделирует динамику аппарата на основе взаимодействия дорога - подвеска для различных профилей дорог. Динамика аппарата охвачены тремя степенями свободы: вертикальным перемещением, креном и шагом. Данные профиля дороги для левой и правой шин импортируются в блок Редактор как различные тесты. Подсистема взаимодействия Дорога-Подвеска вычисляет силы подвески на транспортном средстве в четырех местах расположения шин на основе дорожных данных и текущего состояния транспортного средства. В подсистеме Body Dynamics эти силы и результирующие моменты тангажа и крена используются для определения движения транспортного средства в трех степенях свободы: вертикальное перемещение, крен и тангаж.
Модель подвески моделируется с помощью различных профилей дорог, чтобы определить, соответствует ли проект желаемым целям эффективности. Parallel Computing Toolbox используется для ускорения этих нескольких симуляций, как показано ниже.
mdl = 'sldemo_suspn_3dof';
isModelOpen = bdIsLoaded(mdl);
open_system(mdl);
Определите количество случаев в блоке Редактор с помощью параметра NumberOfScenarios блока Signal Editor. Количество случаев используется, чтобы определить количество итераций, которые будут выполняться на шаге 3.
sigEditBlk = [mdl '/Road Profiles']; numCases = str2double(get_param(sigEditBlk,'NumberOfScenarios'));
Создайте массив Simulink.SimulationInput
объекты, определяющие набор симуляций для выполнения. Каждый объект SimulationInput соответствует одной симуляции и будет сохранен как массив в переменной in
. Параметр маски, ActiveScenario
, задает значение сдвига для сценария блока редактора сигналов. Активный сценарий устанавливается для каждой симуляции.
for idx = numCases:-1:1 in(idx) = Simulink.SimulationInput(mdl); in(idx) = setBlockParameter(in(idx), sigEditBlk, 'ActiveScenario', idx); end
Обратите внимание, что установка параметра модели на объекте SimulationInput не применяет его к модели сразу. Заданное значение будет применено во время симуляции и возвращено к его исходному значению, по возможности, после завершения симуляции.
Используйте parsim
функция для выполнения параллельных симуляций. Массив объектов SimulationInput, in
, созданный на последнем шаге, передается в parsim
функция как первый аргумент. The выхода from the parsim
команда является массивом Simulink.SimulationOutput
объекты, которые хранятся в переменной out
. Установите опцию 'ShowProgress' в ' on ', чтобы напечатать прогресс симуляций в командном окне MATLAB.
out = parsim(in, 'ShowProgress', 'on');
[28-Feb-2018 12:26:20] Checking for availability of parallel pool... Starting parallel pool (parpool) using the 'local' profile ... connected to 6 workers. [28-Feb-2018 12:27:04] Loading Simulink on parallel workers... [28-Feb-2018 12:27:04] Configuring simulation cache folder on parallel workers... [28-Feb-2018 12:27:04] Loading model on parallel workers... [28-Feb-2018 12:27:08] Running simulations... [28-Feb-2018 12:27:18] Completed 1 of 20 simulation runs [28-Feb-2018 12:27:18] Completed 2 of 20 simulation runs [28-Feb-2018 12:27:18] Completed 3 of 20 simulation runs [28-Feb-2018 12:27:18] Completed 4 of 20 simulation runs [28-Feb-2018 12:27:18] Completed 5 of 20 simulation runs [28-Feb-2018 12:27:18] Completed 6 of 20 simulation runs [28-Feb-2018 12:27:22] Completed 7 of 20 simulation runs [28-Feb-2018 12:27:22] Completed 8 of 20 simulation runs [28-Feb-2018 12:27:22] Completed 9 of 20 simulation runs [28-Feb-2018 12:27:22] Completed 10 of 20 simulation runs [28-Feb-2018 12:27:22] Completed 11 of 20 simulation runs [28-Feb-2018 12:27:23] Completed 12 of 20 simulation runs [28-Feb-2018 12:27:26] Completed 13 of 20 simulation runs [28-Feb-2018 12:27:26] Completed 14 of 20 simulation runs [28-Feb-2018 12:27:26] Completed 15 of 20 simulation runs [28-Feb-2018 12:27:26] Completed 16 of 20 simulation runs [28-Feb-2018 12:27:26] Completed 17 of 20 simulation runs [28-Feb-2018 12:27:26] Completed 18 of 20 simulation runs [28-Feb-2018 12:27:29] Completed 19 of 20 simulation runs [28-Feb-2018 12:27:29] Completed 20 of 20 simulation runs [28-Feb-2018 12:27:29] Cleaning up parallel workers...
Каждый объект SimulationOutput содержит записанный сигнал вместе с SimulationMetadata
. При выполнении нескольких симуляций с помощью parsim
ошибки получаются так, что последующие симуляции могут продолжать выполняться. Любые ошибки могут появиться в ErrorMessage
свойство объекта SimulationOutput.
Постройте график вертикального перемещения транспортного средства из различных симуляций, чтобы увидеть, как транспортное средство выполняло различные дорожные профили. Сигнал регистрируется в объекте SimulationOutput в формате Dataset. Используйте get
метод получения объекта timeseries, содержащего данные времени и сигнала от каждого элемента out
.
legend_labels = cell(1,numCases); for i = 1:numCases simOut = out(i); ts = simOut.logsout.get('vertical_disp').Values; ts.plot; legend_labels{i} = ['Run ' num2str(i)]; hold all end title('Response of a 3-DoF Suspension Model') xlabel('Time (s)'); ylabel('Vehicle vertical displacement (m)'); legend(legend_labels,'Location','NorthEastOutside');
Наконец, закройте параллельный пул и модель, если они не были открыты ранее.
if(~isModelOpen) close_system(mdl, 0); end delete(gcp('nocreate'));
Parallel pool using the 'local' profile is shutting down.