Этот пример показывает, как сохранить и восстановить состояние моделирования использование объектов SimState. Это также иллюстрирует преимущества использования объектов SimState.
Объект SimState содержит набор всех переменных, которые связаны с моделированием модели. После сохранения объекта SimState в конце моделирования Simulink® может перезагрузить SimState и продолжить моделирование со времени, в которое был сохранен SimState. Это действие производит те же результаты симуляции, как будто моделирование никогда не прерывалось.
Этот пример иллюстрирует:
Как сохранение конечных состояний (регистрируемые состояния) не всегда достаточно для полного и точного восстановления состояния моделирования.
Как можно использовать функцию SimState, чтобы сохранить и восстановить полное состояние моделирования.
Состояния, которые регистрируются во время моделирования, являются подмножеством всей информации, должен был полностью описать состояние моделирования. Определенные блоки полагаются на внутреннюю информацию, которая не регистрируется как часть экспорта конечного состояния non-SimState. Один такой блок является блоком Transport Delay. Модели с Транспортными блоками Задержки обычно трудно полностью восстановить к конкретному состоянию, потому что в состоянии транспортной задержки не сохраняют формат структуры или формат массивов как часть регистрации данных "конечных состояний".
Чтобы проиллюстрировать эту проблему, сравните результаты симуляции для двух случаев:
1. Моделируйте модель, которая содержит блок Transport Delay, от 0 до 5 секунд, и сохраните значения "конечных состояний" в рабочей области. Затем загрузите этот первый набор конечных состояний и моделируйте с 5 до 10 секунд.
2. Моделируйте ту же модель от 0 до 10 секунд и обеспечьте модель, чтобы произвести вывод в 5 секунд. Мы вызываем результат этого моделирования базовый результат, потому что это - безостановочное моделирование.
Результаты первого моделирования совпадают с первой половиной базового результата. Если бы состояние моделирования первого моделирования было восстановлено полностью, вторые результаты симуляции совпадали бы со второй половиной базовой линии.
Чтобы начаться, загрузите эту модель:
mdl = 'sldemo_VariableTransportDelay';
load_system(mdl);
Моделируйте до времени 5 и сохраните конечное состояние в формате структуры:
out = sim(mdl, 'StopTime', '5', 'SaveFinalState', 'on',... 'FinalStateName','xFinal', 'SaveFormat','Structure'); y1 = out.get('ScopeData');
Загрузите конечное состояние от последнего моделирования и запуститесь к 10:
assignin('base', 'xFinal', out.get('xFinal')); out1 = sim(mdl, 'StartTime', '5', 'StopTime', '10', ... 'SaveFinalState', 'off', ... 'LoadInitialState', 'on', 'InitialState', 'xFinal'); y2 = out1.get('ScopeData');
Запустите безостановочное моделирование, которое будет служить базовым результатом:
out2 = sim(mdl, 'OutputOption', 'AdditionalOutputTimes' ,... 'OutputTimes','[0 5 10]', 'LoadInitialState', 'off'); y = out2.get('ScopeData');
Постройте график результатов. Обратите внимание на то, что вторая половина базового результата не совпадает с моделированием с 5 до 10 секунд, начальное состояние которых было восстановлено от конечного состояния, сохраненного в 5 секунд:
figure; for idx=1:3 subplot(3, 1, idx); plot(y.time,y.signals(idx).values); hold on; plot([y1.time; y2.time],... [y1.signals(idx).values;y2.signals(idx).values],'r--'); hold off; grid on; end
Можно сохранить полный итоговый SimState в Simulink. Объект SimState. Объект SimState содержит все переменные, которые необходимы, чтобы восстановить результаты симуляции. При помощи полного SimState Simulink может восстановить состояние моделирования полностью и воспроизвести базовые результаты симуляции.
Установите параметр для Simulink, чтобы сохранить полный SimState в конце моделирования.
out3 = sim(mdl, 'StopTime', '5', 'SaveFinalState', 'on', ... 'LoadInitialState', 'off', 'SaveCompleteFinalSimState', 'on',... 'FinalStateName', 'xFinal'); y1 = out3.get('ScopeData');
Загрузите SimState от последнего моделирования и запуститесь в течение еще 5 секунд. Значение времени начала должно остаться 0.0 (что значение было временем начала исходного моделирования). Программное обеспечение хранит исходное время начала моделирования в xFinal. Это значение должно совпадать со временем начала текущего моделирования, чтобы включить восстановление состояния моделирования.
assignin('base', 'xFinal', out3.get('xFinal')); out4 = sim(mdl, 'StopTime', '10', 'SaveFinalState', 'off', ... 'LoadInitialState', 'on', 'InitialState', 'xFinal'); y2 = out4.get('ScopeData');
Постройте график результатов и сравните их с базовым моделированием. Обратите внимание на то, что на этот раз состояние моделирования было полностью восстановлено, и результаты SimState совпадают с базовой линией.
figure; for idx=1:3 subplot(3, 1, idx); plot(y.time,y.signals(idx).values); hold on plot([y1.time; y2.time],... [y1.signals(idx).values;y2.signals(idx).values],'r--'); hold off; grid on; end
Закройте модель и очистите переменные, которые использовались в этом примере
close_system(mdl, 0); clear mdl idx xFinal y y1 y2 y3 out out1 out2 out3 out4