Автоматное программирование. Не задушишь, не убьешь!

«Для успеха необходимо знать секрет мира – его обычно никто не знает, считает неправильным или нецелесообразным» П. Тиль

23.02.2024 г. в качестве праздничного подарка я получил от неизвестного мне до этого времени Сергея Муравьева (smur@inbox.ru) письмо, в котором он сообщил, что еще в 2019 г. на форуме «Робот с логикой на основе автоматного программирования» (http://roboforum.ru/forum10/topic18271.html) описал процесс создания робота удаленного присутствия (https://vzikblog.wordpress.com/) с использованием наших работ по автоматному программированию (АП) применительно к очень распространенным микроконтроллерам ATmega 328 (обычно используются на платформе Arduino), которые можно купить на даже на «Озоне» и Aliexpress.

На указанном форуме в 2023 г. Александр Капульский, которой как мне стало известно из переписки с ним, также использует наши работы по автоматному программированию (https://www.youtube.com/watch?v=NxaWKFe5sP8), написал следующее: «Если на АП смотреть с точки зрения теории Тьюринга, то его машина, наглядно подтверждает уникальность АП. Недавно мне на глаза попалась лекция бакалавра сиднейского технологического университета, причем в такой лаконичной подаче, что мне захотелось перевести материал («Автоматное программирование, машина Тьюринга или как возникла информатика», https://www.youtube.com/watch?v=lQGw1b0ILGw) и представить его в тематических обществах».

После этого Муравьев написал Капульскому: «Вы говорите, что парадигма автоматного программирования не стала магистральным трендом, но это не так. Это доказывают многочисленные источники и диссертации, а также многочисленные проекты. Используйте приводимые ниже источники, когда пишете об автоматном программировании: Университет ИТМО. Кафедра «Технологии программирования» (https://is.ifmo.ru/); Шалыто Анатолий Абрамович, профессор факультета информационных технологий и программирования (https://itmo.ru/ru/viewperson/94/shalyto_anatoliy_abramovich.htm); Что такое автоматное программирование? (http://is.ifmo.ru/works/tech_aut_prog, http://is.ifmo.ru/works/diesel/,
http://is.ifmo.ru/projects_en/).

Капульский внял совету Муравьева и записал ролик и на русском языке (https://www.youtube.com/watch?v=hFoMia3s4NU), в котором рассказано о моей роли в обсуждаемом вопросе.

А тем временем обсуждение на форуме перекинулось к рассмотрению еще одного аспекта автоматного программирования: «Интересной является тема визуального программирования, и, в частности, один из инструментов преобразования графов переходов, представленных в формате MS Visio, в код.

20.08.2023 г. на «Форуме пользователей Visio» (https://visio.getbb.ru/viewtopic.php?f=18&t=792&st=0&sk=t&sd=a&start=40) участник под ником gtfox написал: «Visio довольно давно, минимум с 2002 г. (https://is.ifmo.ru/automata/visio2switch/), используется для решения задач «Автоматизации программирования задач логического управления» (приводится ссылка на нашу с Н. Туккелем статью в журнале «Программирование», размещенную по адресу https://is.ifmo.ru/download/switch.pdf). Соответствующая технология была названа «Switch-технология» (https://ru.wikipedia.org/wiki/Switch-технология). В 2005 г. (приводится ссылка на нашу с С. Канжелевым работу, размещенную по адресу https://is.ifmo.ru/projects/metaauto/) был создан конвертер MetaAuto, а в 2008 г. он был преобразован мной для программирования ПЛК на языке ST стандарта МЭК 61131-3. После этого я пиарил Switch-технологию и это средство на разных ресурсах: Owen.ru (https://owen.ru/forum/showthread.php?t=11839), Segnetics.com (https://forum.segnetics.com/showthread.php?t=223), Asutpforum.ru (https://asutpforum.ru/viewtopic.php?start=75&t=1450&sid=9014ba00448175949e46a01fc2217f46)».

Интересно, что на Owen.ru приведены также результаты голосования 64 участников, проведенного в 2008 г. опроса на тему «Автоматы в логическом управлении». Вот они: использую – 40,63%, буду использовать – 23,13%, не использую – 9,38%, о чем речь – 21,88%.

Суть подхода gtfox состоит в следующем: по графу переходов конечного автомата получить исходный текст программы на целевом языке программирования (ST или C++). Этот конвертер METAAUTO_VISIO_ST_CPP (https://disk.yandex.ru/d/QkHH8ReftIzVUw) хоть и с открытыми исходниками, но получился сложным и неудобным в использовании. Автор предполагает написать всё это на чистом Visual Basic for Application (VBA) в Visio.

Далее gtfox пишет, что ему недавно (17.08.2023 г.) на Хабре попалась статья «Графическое программирование конечных автоматов для Arduino. Часть 1» (https://habr.com/ru/articles/755292/), в которой автор с ником DonEgen выполнил реализацию соответствующего конвертора в VBA, правда не для ПЛК, а для микроконтроллеров.

Вот что пишет DonEgen во введении к этой статье: «Представление программного кода в виде конечного автомата подкупает надежностью и предсказуемостью результатов. Действительно, finite-state machine всегда находится только в одном состоянии, что значительно облегчает поиск ошибок. Однако ее код обычно весьма объемен, и поэтому его часто невозможно охватить взглядом. Поэтому фреймворки, помогающие создавать только код, не пользуются популярностью. Другое дело, графическое представление конечного автомата, например, Stateflow в Matlab, но Matlab – это очень дорого. Куда больше мне понравился продукт от Quantum Leaps (https://www.state-machine.com/). Это именно то, что хотелось бы видеть у себя в лаборатории! Однако конские цены полностью отбивают всё желание (https://www.state-machine.com/licensing#Commercial).

Выход нашелся – работы Анатолия Шалыто под общим названием «Автоматное программирование» (https://is.ifmo.ru/books/_umk.pdf). Там очень много полезной теории, но наибольший интерес для меня представляла его ранняя разработка: программа трансляции графов переходов автоматов, изображенных в Microsoft Visio, в код на языке C (https://is.ifmo.ru/works/_autogen.pdf). Это было именно то, что нужно. Увы, Анатолий Абрамович углубился в академическую деятельность (всецело одобряю), и полезная программа оказалась заброшена (не совсем: в НПО «Аврора» ее по сей день использует А. Калачинский (https://is.ifmo.ru/works/_volobuev.pdf), А.Ш.).

Пришлось повторять уже сделанное, используя его концепцию автоматного программирования в качестве стартовой точки. В результате получился программный комплекс V2S (https://github.com/donchenko-egen/StateMachines). За время эксплуатации этот комплекс позволил разработать эффективный код в ряде коммерческих проектов. Из самых крупных – система контроля высева пропашных культур «Топаз» на базе микроконтроллера STM32F412».

Вторая часть этой статьи посвящена описанию использования этого программного комплекса при создании проекта «Светофор» на аппаратной платформе Arduino (https://habr.com/ru/articles/756512/).

Из обсуждения этих статей:

«Программа на языке программирования с приличным функционалом вообще не воспринимается посторонними, а в графическом варианте ее можно обсуждать хоть с руководством, хоть с заказчиком»;

«Автоматное программирование оперирует состояниями конечного автомата (алгоритма поведения системы) и переходами между ними. При этом чем сложнее алгоритм, тем легче его понимание в графическом виде по сравнению с пониманием традиционно написанной программы»;

«С 2008 г. применяем Switch-технологию в программировании промышленных ПЛК для автоматизации задач логического управления. Для этого используем конвертер MetaAuto, переделанный для программирования ПЛК под язык ST стандарта МЭК 61131-3»;

«Программный комплекс V2S опирается на Switch-технологию, автор которой тоже А. Шалыто»;

«Эта технология у Вас применяется для управления с использованием ПЛК, а у меня – для создания программ для встраиваемых микроконтроллеров»;

«Приведенный пример «Светофор» демонстрирует преимущества автоматного программирования. Я, не глядя в код, смог понять алгоритм работы, смог легко его изменить и получить исходный текст программы, избежав синтаксических ошибок в ней»;

«Еще немаловажно, что все это можно легко повторить и через год, и через два, если вдруг понадобиться модернизировать алгоритм. А еще графическое представление в виде автоматов легко обсуждать с заказчиком/руководством, которые зачастую в программировании ничего не понимает, но в визуальном виде хотя бы воспринимают что там происходит. Это тоже очень важно, так как много раз сталкивался, что заказчик сам не знает чего хочет, откуда и вытекают многочисленные доработки. Дорабатывать программу в визуальном виде тоже весьма просто».

Этот текст начинался с письма С. Муравьева, этим письмом я хочу его и закончить. Вот что он еще написал: «Нашлась неточность в Ваших материалах на https://is.ifmo.ru/projects/metaauto/. Для тех, кто хочет использовать данный инструмент без глубокого погружения в тематику – это может быть важно. Данная неточность не позволяет синтезировать исходный код из шаблона для случаев задания выходных функций на переходе между состояниями.

Рассматриваемый программный модуль находится в архиве

https://is.ifmo.ru/projects/metaauto/MetaAuto_bin.zip

metaauto/MetaAuto_bin/CppProject/MetaAuto/Visio2Xml.exe.xml,

в котором содержится текст, в котором я потерял форматирование:

<xsl:template match="transition">

<xsl:choose>

<xsl:when test="not(condition)">

if (1)

</xsl:when>

<xsl:otherwise>

if ( <xsl:apply-templates select="condition"/> )

</xsl:otherwise>

</xsl:choose>

{

<xsl:apply-templates select="action/actionNode"/>

cm.y<xsl:value-of select="ancestor::stateMachine/@name"/> = <xsl:value-of select="@targetRef"/>;

}

<xsl:if test="not(position()=last())">

else

</xsl:if>

В нем строку

<xsl:apply-templates select="action/actionNode"/>

надо заменить на строку

<xsl:apply-templates select="outputAction/actionNode"/>

Там есть еще несколько неточностей, которые я увидел в процессе использования данного инструмента, но это один из неочевидных, и поэтому его не так быстро найти, не зная логику работы программы».

Я поблагодарил Сергея и написал этот текст.

23.02.2024.

121 views·4 shares