Приборная панель (приложение Engee)
Создание приборной панели (Engee-приложение)
Изучаем низкоуровневый пример разработки панели индикаторов, реализованной как отдельное приложение.
Описание примера
На платформе Engee, в распоряжении инженера есть много возможностей для интерактивного запуска моделей:
-
Маски кодовых ячеек для управления моделью
-
Виртуальные приборы (блоки для графического холста)
-
Создание пользовательских приложений (есть курс на эту тему)
В этом примере мы рассмотрим процесс создания индикаторов для виртуальных приборных панелей. Индикаторная панель будет работать на платформе Engee как отдельный сервер, которому потребуется время на запуск. Общение с моделью происходит через блоки Engee Function
, которые принимают данные и порт для коммуникации, дальше данные отправляются в приборную панель по UDP на указанный порт, а приложение их принимает в отдельном процессе и отображает на соответствующих индикаторах.
Модель, используемая в примере
Входные данные для нашей приборной панели генерируются следующей моделью:
Можно видеть, что здесь включена мгновенная индикация для генераторов синусоид, что позволяет нам отлаживать индикацию.
В настройках модели включен режим "Управление скоростью симуляции", в котором модель замедляется чтобы модельное время текло синхронно с воспринимаемым нами временем.
В этом примере индикаторы принимают данные в диапазоне от 0 до 100. Значения, выходящие за этот диапазон, ограничиваются. Поскольку в Engee численным форматом по умолчанию является Float64, код в блоках отправки значений ориентируется на передачу 8-байтовых пакетов (64 бита).
Данные отправляются на индикатор с заданной частотой обновления 0.3 с.
Создание панели индикаторов
Панель индикаторов в этом примере разрабатывалась как два отдельных SVG-индикатора с продуманным расположением анимированных элементов.
Мы ограничимся отображающими элементами, получающими данные от запущенной модели.
Чтобы управлять ходом выполнения модели, используйте команды программного управления. В примере на эту тему показано, как реализовать кнопку, запускающую модель на выполнение.
На приборной панели расположено два индикатора, в обоих случаях мы изменяем значение некоторого параметра каждого из них, и в настройках стиля каждого индикатора установлена сглаживающая анимация, которая реализует перемещение элементов за фиксированное время 0.2 с.
Приведем фрагмент кода, показывающий, как осуществляется поворот стрелки прибора:
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")
Итак, среди компонентов векторной модели прибора есть компонент path
, свойство transform
которого будет обновляться при помощи некоторой строки из модели данных нашего приложения. Когда строка получает новое значение, компонент обновляется автоматически.
Поскольку приборы векторные, их размер легко изменить, поменяв соответствующие значения
width
иheight
контейнеров, в которых они располагаются.
Запуск приложения
Поскольку приложение запускается как еще один сервер на платформе Engee, оно становится доступным по некоторому адресу app.url
. Страницу с этим адресом можно открыть прямо в выводе текущей ячейки или в отдельном окне.
app = engee.genie.start("$(@__DIR__)/app.jl", log_file="log.txt");
#display("text/html", """<iframe src="$(string(app.url))" width="600" height="450" style="border: none;"></iframe>""";)
При желании, вы можете открыть приборную панель внутри скрипта. С той лишь поправкой, что после окончания работы сервера с приложением, на этом месте будет лишь табличка "сервер надоступен", поэтому для помещения интерфейса в отчеты лучше всё же воспользоваться снимками экрана.
Чтобы получить ссылку app.url
и открыть ее в отдельной странице, выполните следующую ячейку:
display("text/html", """<a href="$(string(app.url))" target="_blank" rel="noopener noreferrer">Открыть в отдельном окне</a>""")
Разумеется, эта ссылка тоже будет работать лишь пока работает сервер с приложением.
Чтобы остановить этот сервер в отладочных целях или для перезапуска, раскомментируйте и выполните следующий код:
# engee.genie.stop("$(@__DIR__)/app.jl");
Как это работает
Прикладываем небольшую анимацию работы этой приборной панели:
Из-за того, что элементы имеют фиксированное время обновления, в работу программы могут вмешиваться задержки, связанные с меняющейся нагрузкой на вычислительное ядро Engee. Выделение большего количества процессоров или организация CTS/RTS логики отправки данных снизит количество задержек.
Заключение
Мы рассмотрели цепочку низкоуровневых действий, которые сопутствуют разработке приборных панелей и пользовательских индикаторов. В этом повествовании много пробелов и есть более сложные технические решения, которые сделают программу более быстрой и надежной, как то:
-
реализация логики CTS/RTS вместо жестко заданного интервала обновления,
-
более автоматизированная интеграция SVG элементов и растровых изображений текст приложения.
Но, конечно, уже сейчас в Engee можно создавать очень реалистичные и удобные панели.