Можно программно моделировать модель с функцией 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')
Simulink.SimulationMetadata
| Simulink.SimulationOutput
| Simulink.SimulationOutput.getSimulationMetadata
| Simulink.SimulationOutput.setUserData
| Simulink.SimulationOutput.setUserString