Запустите симуляции программно

Можно программно моделировать модель с функцией sim, с помощью различных методов, чтобы задать значения параметров. В дополнение к симуляции модели можно использовать sim, чтобы включить тайм-ауты симуляции, зафиксировать ошибки симуляции и метаданные симуляции доступа, когда симуляция завершена

Для интерактивной симуляции можно использовать set_param и get_param. С set_param и get_param, можно проверять состояние рабочей симуляции, управлять как моделирование при помощи коллбэков блока.

Задайте пары "имя-значение" параметра

Этот пример показывает, как программно моделировать модель, задав параметры как пары "имя-значение".

Моделируйте модель vdp со значениями параметров, заданными как последовательные пары "имя-значение".

simOut = sim('vdp','SimulationMode','normal','AbsTol','1e-5',...
            'SaveState','on','StateSaveName','xout',...
            'SaveOutput','on','OutputSaveName','yout',...
 'SaveFormat', 'Dataset');
outputs = simOut.get('yout')
outputs = 

  Simulink.SimulationData.Dataset
  Package: Simulink.SimulationData

  Characteristics:
              Name: 'yout'
    Total Elements: 2

  Elements:
    1 : 'x1'
    2 : 'x2'

  -Use get or getElement to access elements by index or name.
  -Use addElement or setElement to add or modify elements.

Вы моделируете модель в режиме Normal, задавая абсолютный допуск к ошибке решателя. Функция sim возвращает SimOut, один объект Simulink.SimulationOutput, который содержит всю симуляцию выходные параметры (регистрируемое время, состояния и сигналы). Функция sim не возвращает значения симуляции к рабочей области.

Постройте значения выходного сигнала против времени.

x1=(outputs.get('x1').Values);
x2=(outputs.get('x2').Values);
plot(x1); hold on;
plot(x2);
title('VDP States')
xlabel('Time'); legend('x1','x2')

Включите тайм-ауты симуляции

Если при запуске несколько симуляций в цикле и используете решатель переменного шага, рассматриваете использование sim с параметром timeout. Если по некоторым причинам симуляция зависнет или начнет брать неожиданно маленькие временные шаги, она испытает таймаут. Затем следующая симуляция может запуститься. Синтаксис в качестве примера показывают ниже.

N = 100;
simOut = repmat(Simulink.SimulationOutput, N, 1);
for i = 1:N
		simOut(i) = sim('vdp', 'timeout', 1000);
end

Зафиксируйте ошибки симуляции

Если ошибка заставляет вашу симуляцию останавливаться, вы видите ошибку в метаданных симуляции. В этом случае sim получает данные моделирования в симуляции выходной объект до времени, это сталкивается с ошибкой, позволяя вам сделать некоторую отладку симуляции, не повторно выполняя его. Чтобы активировать эту опцию, используйте параметр CaptureErrors с функцией sim.

Синтаксис в качестве примера и получившийся вывод для фиксации ошибок с sim:

simOut = sim('my_model', 'CaptureErrors', 'on');
simOut.getSimulationMetadata.ExecutionInfo
ans = 

  struct with fields:

               StopEvent: 'DiagnosticError'
         StopEventSource: []
    StopEventDescription: 'Division by zero in 'my_model/Divide''
         ErrorDiagnostic: [1×1 struct]
      WarningDiagnostics: [0×1 struct]

Другое преимущество этого подхода состоит в том, что ошибка симуляции также не заставляет sim останавливаться. Поэтому, если вы будете использовать sim в цикле for, например, последующие итерации цикла все еще запустятся.

Доступ к метаданным симуляции

Этот пример показывает вам, как получить доступ к метаданным симуляции, если ваша симуляция завершена. Можно запустить любой вид симуляции и доступа, это - метаданные.

Этот пример моделирует модель со значениями параметров, задает как пары "имя-значение". Запустите симуляцию.

simOut = sim('vdp','SimulationMode','normal','AbsTol','1e-5',...
            'SaveState','on','StateSaveName','xoutNew',...
            'SaveOutput','on','OutputSaveName','youtNew',...
 'SaveFormat', 'StructureWithTime');

Доступ к свойству ModelInfo, которое имеет некоторую основную информацию о модели и решателе.

simOut.getSimulationMetadata.ModelInfo
ans = 

  struct with fields:

                  ModelName: 'vdp'
               ModelVersion: '1.6'
              ModelFilePath: 'C:\MyWork'
                     UserID: 'User'
                MachineName: 'MyMachine'
                   Platform: 'PCWIN64'
    ModelStructuralChecksum: [4×1 uint32]
             SimulationMode: 'normal'
                  StartTime: 0
                   StopTime: 20
                 SolverInfo: [1×1 struct]
            SimulinkVersion: [1×1 struct]
                LoggingInfo: [1×1 struct]

Осмотрите информацию о решателе.

simOut.getSimulationMetadata.ModelInfo.SolverInfo
ans = 

  struct with fields:

           Type: 'Variable-Step'
         Solver: 'ode45'
    MaxStepSize: 0.4000

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

simOut.getSimulationMetadata.TimingInfo
ans = 

  struct with fields:

          WallClockTimestampStart: '2016-06-17 10:26:58.433686'
           WallClockTimestampStop: '2016-06-17 10:26:58.620687'
    InitializationElapsedWallTime: 0.1830
         ExecutionElapsedWallTime: 1.0000e-03
       TerminationElapsedWallTime: 0.0030
             TotalElapsedWallTime: 0.1870

Добавьте примечания в свою симуляцию.

simOut=simOut.setUserString('Results from simulation 1 of 10');
simOut.getSimulationMetadata
ans = 

  SimulationMetadata with properties:

        ModelInfo: [1×1 struct]
       TimingInfo: [1×1 struct]
    ExecutionInfo: [1×1 struct]
       UserString: 'Results from simulation 1 of 10'
         UserData: []

Можно также добавить собственные данные с помощью свойства UserData.

Управляйте и проверяйте состояние симуляции

Этот пример показывает, как использовать set_param, чтобы управлять и проверять состояние вашей симуляции. set_param позволяет вам обновлять переменные динамически, а также писать переменные регистрации данных в рабочую область.

Запустите симуляцию.

set_param('vdp','SimulationCommand','start')

Когда вы запускаете симуляцию с помощью set_param и аргумента 'start', необходимо использовать аргумент 'stop', чтобы остановить его.

Приостановите, продолжите и остановите симуляцию.

set_param('vdp','SimulationCommand','pause')
set_param('vdp','SimulationCommand','continue')
set_param('vdp','SimulationCommand','stop')

Когда вы используете set_param, чтобы приостановить или остановить симуляцию, команды являются запросами о таких действиях, и симуляция сразу не выполняет их. Можно использовать set_param, чтобы запустить симуляцию после команды остановки и продолжить симуляцию после команды "пауза". Simulink® сначала завершает непрерываемую работу, такую как шаги решателя и другие команды, которые предшествовали команде set_param. Затем симуляция запускается, делает паузу, продолжается или останавливается, как задано командой set_param.

Проверяйте состояние симуляции.

get_param('vdp','SimulationStatus')

Программное обеспечение возвращает 'stopped', 'initializing', 'running', 'paused', 'compiled', 'updating', 'terminating' или 'external' (используемый с продуктом Simulink Coder™).

Чтобы обновить замененные переменные рабочей области динамически, в то время как симуляция запускается, используйте команду update.

set_param('vdp','SimulationCommand','update')

Запишите все переменные регистрации данных в базовое рабочее пространство.

set_param('vdp','SimulationCommand','WriteDataLogs')

Автоматизируйте задачи симуляции Используя коллбэки

Коллбэк выполняется, когда вы выполняете различные действия со своей моделью, такие как запуск, приостановка или остановка симуляции. Можно использовать коллбэки, чтобы выполнить скрипт MATLAB® или другие команды MATLAB. Для получения дополнительной информации смотрите Коллбэки для Индивидуально настраиваемых Образцовых Параметров Коллбэка Поведения и Блока.

Этот пример показывает, как использовать коллбэк модели StartFcn, чтобы автоматически выполнить код MATLAB, прежде чем симуляция запустится.

Запишите скрипт MATLAB, который находит блоки Осциллографа в вашей модели и открывает их на переднем плане, когда вы моделируете модель. Сохраните скрипт в текущей папке.

% openscopes.m 
% Brings scopes to forefront at beginning of simulation.

blocks = find_system(bdroot,'BlockType','Scope');

% Finds all of the scope blocks in the top level of your
	% model. To find scopes in subsystems, provide the subsystem
	% names. Type help find_system for more on this command.

for i = 1:length(blocks)
  set_param(blocks{i},'Open','on')
end

% Loops through all of the scope blocks and brings them
	% to the forefront.

Установите параметр StartFcn для модели, чтобы вызвать скрипт openscopes.

set_param('my_model','StartFcn','openscopes')

Смотрите также

| | | |

Похожие темы