Можно программно симулировать модель двумя способами:
По sim
команда.
С помощью кнопки run
При выполнении симуляций с sim
команда используется в командной строке для выполнения операций над симуляцией. Выполнение симуляций с помощью кнопки Run подразумевает, что вы можете взаимодействовать с симуляцией с помощью Simulink® UI для выполнения любых других дополнительных операций. В следующей таблице подробно изложены различия между этими двумя подходами.
Действия | sim Симуляции команд | Кнопка Run Симуляций |
Допустимый уровень взаимодействия | Низко | Высоко |
Запустите симуляцию | sim команда | set_param(mdl,'SimulationCommand','Start') / Run |
Остановка симуляции | Ctrl-C в командной строке |
|
Пауза симуляции | Нет | Да. 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')
Если вы запускаете несколько симуляций в цикле и используете решатель с переменным шагом, рассмотрите использование 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
свойство.
Для интерактивной симуляции можно использовать 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')
getSimulationMetadata
| setUserData
| setUserString
| Simulink.SimulationMetadata
| Simulink.SimulationOutput