Создание приборной панели (Engee-приложение)
Изучаем процесс разработки панели индикаторов, получающей данные от модели в реальном времени и реализованной как отдельное приложение.
Описание примера
На платформе Engee представлено много инструментов, позволяющих создавать самые разные средства автоматизации для управления моделями: индикаторов, пультов… Среди них:
-
Маски кодовых ячеек для управления моделью
-
Виртуальные приборы (блоки для графического холста)
-
Возможности размещать пользовательские приложения (есть курс на эту тему)
В этом примере мы рассмотрим процесс создания графических индикаторов для виртуальных приборных панелей. Другой пример на эту тему иллюстрирует, как управлять ходом исполнения модели, используя команды программного управления (как реализовать кнопку, запускающую модель на выполнение).
Виртуальная приборная панель будет работать на платформе Engee как отдельный сервер, которому потребуется время на запуск (несколько десятков секунд).
Описание модели
В этом примере индикаторы принимают данные в диапазоне от 0 до 100. Значения, выходящие за этот диапазон, ограничиваются. Поскольку в Engee численным форматом по умолчанию является Float64, код в блоках отправки значений ориентируется на передачу 8-байтовых пакетов (64 бита). В модели включен режим "Мгновенной индикации" (панель Отладка в настройках модели) чтобы проверять правильность работы индикаторов, а также режим "Управления скоростью симуляции", позволяющей замедлить модельное время до выполнения "в реальном времени".
Общение между моделью и приборами происходит через блоки Engee Function
, которые принимают входные данные и выдают сигнал об успехе отправки. По запросу от приборной панели (сигнал Clear To Send), блоки расположенные на модели отправляют свежие данные для отображения.

Настройка соединения по UDP
Передача данных между моделью и приборной панелью осуществляется по протоколу UDP.
Для избежания конфликтов каждый прибор требует создания двух UDP-соединений. По первому соединению (на порт из параметра port
) отправляется 8 байт данных. Второе соединение работает в обратную сторону: блок Engee Function
открывает соединение на порту cts_port
(от Clear To Send) и ожидает получения сообщения сообщения Clear To Send (CTS), означающего готовность индикаторной панели принимать данные.
Со стороны модели эти настройки указаны в Параметрах каждого блока и иконкой индикатора. Их можно увидеть, если заглянуть под маску блоков.

Создание панели индикаторов
На приборной панели расположено два независимых индикатора.
Логика обновления информации, модель графической части приложения и порты для приема данных заданы в коде приложения app.jl
.
-
левый индикатор ожидает данные на порту 5050 и отправляет CTS сигнал на порт 5051,
-
правый индикатор принимает данные на порту 5052 после отправки им CTS-сообщения на порт 5053.
Что касается графической модели индикаторов - в описании компонентов каждого индикатора есть атрибуты, привязанные к реактивным переменным. Как только реактивная переменная-строка получает обновленное значение, связанный с ней компонент обновляется автоматически. Например, вот строка, задающая атрибуты стрелки на левом индикаторе:
path(d="m21.287 24.405-6.1832 13.013 4.5464-13.716z", style="fill:#f00;stop-color:#000000;transition: transform .2s linear", transform! = "circular_gauge_string")
Обратите внимание на свойство
transform! = …
. Синтаксис с применением!
позволяет создавать в Julia реактивные атрибуты, привязывая их обновление к обновлению какой-нибудь переменной из модели данных.
Поскольку приборы представлены элементами векторной графики SVG, их размер можно менять, подстраивая значения
width
иheight
контейнеров, в которых они располагаются.

Запуск приложения
Приложение запускается на отдельном сервере на платформе Engee и становится доступным по некоторому адресу app.url
. Страницу с этим адресом можно открыть прямо в выводе текущей ячейки или в отдельном окне.
app = engee.genie.start("$(@__DIR__)/app.jl", log_file="$(@__DIR__)/log.txt");
# display("text/html", """<iframe src="$(string(app.url))" width="600" height="450" style="border: none;"></iframe>""";)
Команда display
из предыдущей ячейки, если ее раскомментировать, позволяет открыть приборную панель внутри скрипта.
После окончания работы сервера с приложением, на этом месте будет лишь табличка "сервер надоступен", поэтому для помещения интерфейса в отчеты лучше использовать статичные снимки экрана.
Чтобы получить ссылку app.url
и открыть ее в отдельной странице, выполните следующую ячейку. Эта ссылка тоже будет работать лишь до тех пор, пока запущен сервер с приложением.
display("text/html", """<a href="$(string(app.url))" target="_blank" rel="noopener noreferrer">Открыть в отдельном окне</a>""")
Чтобы остановить этот сервер в отладочных целях или для перезапуска, раскомментируйте и выполните следующий код:
# engee.genie.stop("$(@__DIR__)/app.jl");
Иллюстрация работы приборной панели
Прикладываем небольшую иллюстрацию работы этой приборной панели:

Заключение
Мы рассмотрели проект, который хорошо иллюстрирует процесс разработки пользовательской приборной панели, получающей данные из модели Engee в реальном времени.