Механика печатной машинки для графики Ladder-программ

При разработке IDE для программируемых логических контроллеров одной из самых сложных задач становится отображение Ladder-программ. Схема должна поддерживать бесконечное вложение веток, автоматически рассчитывать расположение элементов и корректно переводить двумерную структуру в последовательность линейных инструкций, понятных компилятору.
Автор проекта поставил перед собой задачу создать графический движок, который не заставляет пользователя вручную двигать каждый функциональный блок. В качестве ориентира рассматривались промышленные среды, в частности решения Allen-Bradley, где размещение элементов автоматизируется. Для сравнения, в OpenPLC и Beremiz многие операции приходится выполнять вручную.
Первоначально естественным решением казались графы и рекурсивные алгоритмы. Такой же путь предлагал и ИИ, генерируя большое количество псевдокода. Однако со временем автор пришёл к выводу, что подобная архитектура избыточна: задача может решаться существенно проще, если отказаться от сложной обработки графа и выбрать более прямолинейную модель.
Аналогия с печатной машинкой
Ключевой идеей стала механическая печатная машинка. Её каретка перемещается в основном вправо, а после окончания строки возвращается и опускается вниз. Если представить Ladder-схему как текст, то для размещения функциональных блоков может быть достаточно всего двух операций: добавить пробелы и перейти на новую строку.
На этой основе автор перешёл к стековой модели. При начале новой ветки её координаты помещаются в стек, а при завершении извлекаются обратно. Если одну ветку требуется вложить в другую, структуру можно пересобрать по тем же правилам: условно «снять лист» с печатной машинки и заново записать последовательность символов с нужными отступами и переносами строк.
У такого подхода есть важное свойство: текст, сформированный печатной машинкой, изначально линеен. Его последовательность можно напрямую сопоставить с машинными или ассемблерными инструкциями. В случае двумерных схем и произвольных графов сначала требуется выполнить отдельную линеаризацию, а ошибки на этом этапе могут привести к расхождению между тем, что видит разработчик, и тем, как программа исполняется контроллером.
Стековая модель позволяет сохранить соответствие между визуальной логикой Ladder-программы и порядком выполнения инструкций. В рамках проекта этот принцип используется для проверки корректности перевода вложенных двумерных веток в линейную последовательность команд.
Роль междисциплинарного мышления
Автор связывает найденное решение не только с инженерным опытом, но и с художественным образованием. Подход возник благодаря аналогии между программной схемой и давно знакомым физическим объектом, а не в результате перебора большого числа формальных вариантов. По мнению автора, это иллюстрирует ограничение ИИ: нейросеть способна быстро генерировать множество решений, но не всегда самостоятельно находит неожиданную связь между разными областями.
История проекта показывает, что при создании инструментов для промышленного программирования полезны не только сложные алгоритмы и готовые шаблоны. Иногда более надёжная архитектура появляется благодаря простой метафоре, которая точно отражает структуру задачи: движение по строкам, стек вложений и последовательная запись инструкций.


