ПЛК на микроконтроллере: визуализация цепей в реальном времени

В основе разрабатываемой среды программируемого логического контроллера лежит модель, полностью описанная в XML-файле. Такой подход позволяет отделить структуру функциональных блоков от кода графического интерфейса и гибко настраивать внешний вид элементов, которые исполняются на стороне микроконтроллера.
От XML-описания к блоку на экране
XML-файл содержит список функциональных блоков, или юнитов. Для каждого из них задаются имя, группа, ширина и высота. По значению группы приложение на ПК распределяет блоки по вкладкам. Внутри описания также находятся графические примитивы — прямоугольники, линии, окружности и текстовые элементы, из которых собирается визуальный образ блока.
Каждый примитив хранит параметры положения, размеров, цвета, толщины контура и заливки. При загрузке модели программа получает этот набор данных, формирует список элементов и затем отрисовывает их в заданных координатах. Благодаря этому внешний вид функционального блока можно менять через XML, не переписывая основную логику интерфейса.
Динамическая отрисовка по данным ПЛК
В описание функциональных блоков добавлен параметр Style="box". Он используется для элементов, которым требуется автоматически подстраивать размеры. Если имя или связанный параметр оказывается слишком длинным, блок расширяется по ширине строки во время отрисовки.
От обрезки текста разработчик отказался: в промышленных схемах это может скрыть существенную часть обозначения. Например, ссылка на поле сложной структуры или элемент массива нередко располагается в конце длинной строки. Потеря этого фрагмента усложняет проверку схемы и повышает риск ошибки при настройке.
Перед выводом каждого примитива программа сопоставляет его стиль со значением, полученным из памяти микроконтроллера. В Java-приложении за это отвечает класс AnimFabric, содержащий типы анимации, а объект sm хранит тег и данные, связанные с конкретным графическим элементом. Для линий, например, может изменяться цвет в зависимости от состояния сигнала, после чего элемент отрисовывается с заданной толщиной и координатами.
Лёгкая среда для недорогого оборудования
При разработке приоритет был отдан не современной визуальной оболочке, а компактности и невысоким требованиям к ресурсам. Для графики и интерфейса используются стандартные классы OpenJDK. В результате приложение способно работать даже на ранних версиях Raspberry Pi и потребляет около 120–200 МБ оперативной памяти.
Аппаратная часть, исполняющая программу в роли ПЛК, требует примерно 5 КБ оперативной памяти и 32 КБ флеш-памяти. Интерпретатор байт-кода работает на микроконтроллерах начиная со STM32G030. После его установки под пользовательскую программу остаётся ещё 2–3 КБ памяти — этого достаточно, чтобы превратить такой микроконтроллер в простое программируемое реле.


