Этот пример показывает рабочий процесс и преимущества сохранения и восстановления рабочей точки симуляции с помощью объекта ModelOperatingPoint.
Объект ModelOperatingPoint содержит полный снимок всех переменных, которые связаны с симуляцией модели. После сохранения объекта ModelOperatingPoint в конце симуляции Simulink ® может перезагрузить рабочую точку и продолжить симуляцию с момента сохранения объекта ModelOperatingPoint. Это действие приводит к тем же результатам симуляции, как если бы симуляция никогда не была прервана.
Этот пример иллюстрирует:
Как сохранение состояний Final (регистрируемых состояний) не всегда достаточно для полного и точного восстановления состояния симуляции.
Как можно сохранить и восстановить полную рабочую точку симуляции, получая более быстрые рабочие процессы симуляции
Состояния, которые регистрируются во время моделирования, являются подмножеством всей информации, необходимой для полного описания состояния симуляции. Некоторые блоки полагаются на внутреннюю информацию, которая не регистрируется как часть логгирования состояний и конечного экспорта состояний. Одним из таких блоков является блок Transport Delay. Модели с блоками Transport Delay обычно трудно полностью восстановить в конкретном состоянии, потому что состояние задержки транспорта не сохранено в формате структуры или формате массива как часть логгирования данных «Final states».
Чтобы проиллюстрировать эту проблему, сравните результаты симуляции для двух случаев:
1. Симулируйте модель, которая содержит блок Transport Delay, от 0 до 5 секунд и сохраните значения «Final states» в рабочей области. Затем загрузите этот первый набор конечных состояний и симулируйте от 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