Выполняйте симуляции программно

Можно программно симулировать модель двумя способами:

  • По sim команда.

  • С помощью кнопки run

При выполнении симуляций с sim команда используется в командной строке для выполнения операций над симуляцией. Выполнение симуляций с помощью кнопки Run подразумевает, что вы можете взаимодействовать с симуляцией с помощью Simulink® UI для выполнения любых других дополнительных операций. В следующей таблице подробно изложены различия между этими двумя подходами.

Действияsim Симуляции командКнопка Run Симуляций
Допустимый уровень взаимодействияНизкоВысоко
Запустите симуляциюsim команда set_param(mdl,'SimulationCommand','Start') / Run
Остановка симуляцииCtrl-C в командной строке

set_param(mdl,'SimulationCommand','Stop')/ Stop

Пауза симуляцииНетДа. set_param(mdl,'SimulationCommand','Pause') / Pause
Подсказка MATLAB доступна во время выполнения симуляцииНетДа
Возможности обновляются во время выполнения симуляцииДа, кроме Rapid Режима AcceleratorДа
Симуляционный шаговыйНетДа, кроме модели быстрого ускорителя)
Условные паузыНетДа, кроме модели быстрого ускорителя)
Значение порта отображается доступным во время выполнения симуляции?НетДа
Поддерживает темп симуляцииДаДа
Поддерживает TimeOut опцияДа Нет
Обработка ошибокИсключение MATLAB, если только CaptureErrors включенОтправлено в Средство Просмотра

sim Симуляции команд

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

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

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

Симулируйте 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 mode, задающий абсолютную погрешность для ошибки решателя. 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')

Plot of the vdp simulation

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

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

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

Ошибки симуляции захвата

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

Кнопки Run

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

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

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

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

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

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

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

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

Когда вы используете set_param чтобы приостановить или остановить симуляцию, симуляция не выполняет команды сразу. Вы можете использовать set_param чтобы запустить симуляцию после stop и продолжить симуляцию после команды паузы. 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, который находит Scope блоки в вашей модели и открывает их на переднем плане, когда вы симулируете модель. Сохраните скрипт в текущей папке.

% 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')

См. также

| | | |

Похожие темы