Этот пример показывает рабочий процесс и преимущества сохранения и восстановления рабочей точки симуляции с помощью объекта ModelOperatingPoint.
Объект ModelOperatingPoint содержит полный снимок состояния всех переменных, которые связаны с симуляцией модели. После сохранения объекта ModelOperatingPoint в конце симуляции Simulink® может перезагрузить рабочую точку и продолжить симуляцию со времени, в которое объект ModelOperatingPoint был сохранен. Это действие производит те же результаты симуляции, как будто симуляция никогда не прерывалась.
Этот пример иллюстрирует:
Как сохранение конечных состояний (регистрируемые состояния) не всегда достаточно для полного и точного восстановления состояния симуляции.
Как можно сохранить и восстановить полную рабочую точку симуляции, приведя к более быстрым рабочим процессам симуляции
Состояния, которые регистрируются во время симуляции, являются подмножеством всей информации, должен был полностью описать состояние симуляции. Определенные блоки полагаются на внутреннюю информацию, которая не регистрируется как часть журналирования состояния и экспорта конечного состояния. Один такой блок является блоком Transport Delay. Модели с Транспортными блоками Задержки обычно трудно полностью восстановить к конкретному состоянию, потому что состояние транспортной задержки не сохранено в формате структуры или формате массивов как часть регистрации данных "конечных состояний".
Чтобы проиллюстрировать эту проблему, сравните результаты симуляции для двух случаев:
1. Моделируйте модель, которая содержит блок Transport Delay, от 0 до 5 секунд, и сохраните значения "конечных состояний" в рабочей области. Затем загрузите этот первый набор конечных состояний и моделируйте с 5 до 10 секунд.
2. Моделируйте ту же модель от 0 до 10 секунд и обеспечьте модель, чтобы произвести вывод в 5 секунд. Мы вызываем результат этой симуляции базовый результат, потому что это - безостановочная симуляция.
Результаты первой симуляции совпадают с первой половиной базового результата. Если бы состояние симуляции первой симуляции было восстановлено полностью, вторые результаты симуляции совпадали бы со второй половиной базовой линии.
Чтобы начаться, загрузите эту модель:
mdl = 'slexVariableTransportDelay';
load_system(mdl);
Моделируйте до времени 5 и сохраните конечное состояние в формате структуры:
out = sim(mdl, 'StopTime', '5', 'SaveFinalState', 'on',... 'FinalStateName','xFinal', 'SaveFormat','Structure'); y1 = out.ScopeData;
Загрузите конечное состояние от последней симуляции и запуститесь к 10:
assignin('base', 'xFinal', out.get('xFinal')); out1 = sim(mdl, 'StartTime', '5', 'StopTime', '10', ... 'SaveFinalState', 'off', ... 'LoadInitialState', 'on', 'InitialState', 'xFinal'); y2 = out1.ScopeData;
Запустите безостановочную симуляцию, которая будет служить базовым результатом:
out2 = sim(mdl, 'OutputOption', 'AdditionalOutputTimes' ,... 'OutputTimes','[0 5 10]', 'LoadInitialState', 'off'); y = out2.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
Можно сохранить полную итоговую рабочую точку в Simulink.op. Объект ModelOperatingPoint. Объект ModelOperatingPoint содержит все переменные, которые необходимы, чтобы восстановить результаты симуляции. При помощи полного ModelOperatingPoint Simulink может восстановить состояние симуляции полностью и воспроизвести базовые результаты симуляции.
Установите параметр для Simulink, чтобы сохранить полную рабочую точку в конце симуляции.
out3 = sim(mdl, 'StopTime', '5', 'SaveFinalState', 'on', ... 'LoadInitialState', 'off', 'SaveOperatingPoint', 'on',... 'FinalStateName', 'xFinal'); y1 = out3.ScopeData;
Загрузите ModelOperatingPoint от последней симуляции и запуститесь в течение еще 5 секунд. Значение времени начала должно остаться 0.0 (что значение было временем начала исходной симуляции). Программное обеспечение хранит исходное время начала симуляции в xFinal. Это значение должно совпадать со временем начала текущей симуляции, чтобы включить восстановление состояния симуляции.
assignin('base', 'xFinal', out3.get('xFinal')); out4 = sim(mdl, 'StopTime', '10', 'SaveFinalState', 'off', ... 'LoadInitialState', 'on', 'InitialState', 'xFinal'); y2 = out4.ScopeData;
Постройте результаты и сравните их с базовой симуляцией. Обратите внимание на то, что на этот раз состояние симуляции было полностью восстановлено и результаты симуляции после соответствия восстановления рабочей точки базовая линия.
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