Обратные вызовы
Не путайте обратные вызовы, описанные в этой статье, с обратными вызовами библиотеки DiffEqCallbacks.jl. Подробнее о работе с ними читайте в Обработка событий и функции обратных вызовов. |
Обратные вызовы (Callback) — это функции, которые вызываются автоматически в ответ на определенные события в модели. Обратные вызовы Engee создаются на языке программирования Julia.
Для открытия обратных вызовов зайдите в окно настроек и нажмите Редактировать исходный код
:
В открывшемся меню доступны все обратные вызовы Engee. Они по умолчанию пустые и не содержат кода:
Все обратные вызовы Engee можно условно разделить на 4 группы:
|
|
|
|
Описание обратных вызовов
Открытие модели
Используются для настройки поведения модели до и после открытия.
Подробнее об обратных вызовах открытия модели
Используемые обратные вызовы: PreLoadFunc
(открытие) и PostLoadFunc
(закрытие).
Описание:
-
PreLoadFunc
— выполняется до загрузки модели.Методы программного управления нельзя использовать в обратном вызове этой модели, потому что модель еще не успела загрузиться. -
PostLoadFunc
— выполняется после загрузки модели. В ней можно использовать параметры модели, так как они уже загружены.
Обратные вызовы по условию открытия модели позволяют:
|
Выполнение модели
Используются в процессе симуляции.
Подробнее об обратных вызовах выполнения модели
Используемые обратные вызовы: InitFunc
(инициализация), StartFunc
(запуск), PauseFunc
(пауза), ContinueFunc
(выполнение), StopFunc
(остановка).
При запуске модели и хотя бы разовой остановки процесса симуляции сработают все эти функции.
Описание:
-
InitFunc
— выполняется после этапа компиляции модели; -
StartFunc
— выполняется до первого шага симуляции; -
PauseFunc
— вызывается в случае паузы во время симуляции; -
ContinueFunc
— выполняется на одном шаге при запуске модели после паузы; -
StopFunc
— выполняется во время остановки процесса симуляции.
Сохранение модели
Используются при сохранении модели.
Подробнее об обратных вызовах сохранения модели
Используемые обратные вызовы: PreSave
(перед сохранением), PostSave
(после сохранения)
Описание:
-
PreSave
— выполняется перед сохранением модели; -
PostSave
— выполняется после сохранения модели.
Закрытие модели
Используется при закрытии модели.
Подробнее об обратных вызовах закрытия модели
Используемые обратные вызовы: CloseFunc
(закрытие)
Описание:
-
CloseFunc
— выполняется после закрытия модели.
Обратные вызовы по условию закрытия модели позволяют:
|
Сообщения в окно диагностики
В коде обратных вызовов модели можно отправлять сообщения в окно диагностики модели с помощью функций:
-
engee.info(msg)
— информационное сообщение; -
engee.warning(msg)
— сообщение-предупреждение; -
engee.error(msg)
— сообщение об ошибке.
Эти функции работают только внутри обратных вызовов (масок и модели). Собирайте текст через интерполяцию ("Значение = $(x)" ) или string(…) .
|
Примеры по группам обратных вызовов
Открытие модели (PreLoadFunc
, PostLoadFunc
):
PreLoadFunc() = begin
engee.info("Открываю модель")
end
PostLoadFunc() = begin
engee.info("Модель загружена")
end
Выполнение модели (InitFunc
, StartFunc
, PauseFunc
, ContinueFunc
, StopFunc
):
InitFunc() = engee.info("Инициализация завершена")
StartFunc() = engee.info("Симуляция запущена")
PauseFunc() = engee.warning("Симуляция на паузе")
ContinueFunc() = engee.info("Продолжаю после паузы")
StopFunc() = engee.info("Симуляция остановлена")
Сохранение модели (PreSave
, PostSave
):
PreSave() = engee.info("Сохраняю модель…")
PostSave() = engee.info("Модель сохранена")
Закрытие модели (CloseFunc
):
CloseFunc() = begin
try
# освобождение временных ресурсов
engee.info("Ресурсы освобождены, модель закрыта")
catch e
engee.error("Не удалось корректно закрыть модель: $(e)")
end
end
Также смотрите раздел про сообщения в масках блоков: guide/masks-main.adoc#mask-callbacks-diagnostics. |
Пример работы
Для ознакомления с примером работы обратных вызовов перейдите по ссылке.
Для каждого обратного вызова в Engee можно присвоить переменную. Это удобно, чтобы отслеживать срабатывание в зависимости от условия симуляции, например, внутри вызова открытия модели PreLoadFunc
можно использовать код:
#переменные открытия модели
PreL = 1 #выполняется до загрузки модели
PostL = 0 #выполняется после загрузки модели
# переменные выполнения модели
Init = 0 #выполняется после компиляции модели
Start = 0 #выполняется до первого шага симуляции
Pause = 0 #вызывается в случае паузы симуляции
Continue = 0 #выполняется на одном шаге при запуске модели после паузы
Stop = 0 #выполняется во время остановки симуляции
#переменные сохранения модели
PreS = 0 #выполняется перед сохранением модели
PostS = 0 #выполняется после сохранения модели
#переменные закрытия модели
Close = 0 #выполняется после закрытия модели
Этот код инициализирует переменные с нулевыми значениями. Переменная PreL
, связанная с открытием модели, равна единице, так как ее параметры загружаются до и после загрузки модели (всегда выполняются). Например, в обратных вызовах выполнения модели StartFunc
можно установить переменную Start = 1
. При успешном выполнении этого обратного вызова значение переменной изменится с 0
(не выполнен) на 1
(выполнен). Следить за выполнением обратных вызовов можно с помощью окна переменных:
При каждом срабатывании обратного вызова переменные обновляются, а затем их значения выводятся для анализа и отладки процесса симуляции.