ВКПа. Введение, ч.1. Визуальное проектирование автоматов

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

1.     Введение

В моих статьях часто используется аббревиатура ВКПа. Это сокращение названия программной среды проектирования по канонам технологии автоматного программирования - среды автоматного Визуально-Компонентного Программирования (подробно основы ее теории описаны в статьях [1, 2]). Объяснение, что это за среда, конечно, дается, но, признаю, что делается это часто по ходу, достаточно поверхностно и разбросанно по многим статьям.

Отсюда вполне закономерный вопрос - что собой представляет ВКПа? В результате созрело решение, а, может, просто пришло время, дать достаточно концентрированное, пусть не столь подробное, описание среды. Будет это не техническая документация, т.к. речь все же не о ней, а о расстановке акцентов, точек, которые могли бы дать правильное представление о технологии и среде автоматного программирования, в которой, за очень редким исключением, создается мой программный код.   Но это одна сторона дела. Есть и другая...

Буквально за последние месяцы была проделана объемная целенаправленная работа по развитию среды и, что особенно важно, по повышению качества ее работы.  Раньше она была рассчитана на одного пользователя, который с ее проблемами легко мирился. Но, как говорится, до поры до времени... Теперь этот пользователь, а заодно и разработчик, решил сконцентрировать силы на доведении ее до нормального рабочего состояния.  Пришло, так сказать, время перейти на новый уровень качества среды. И, может, это прозвучит нескромно, но захотелось заодно поделиться также удовольствием от нынешней работы в ВКПа...

Но если серьезнее... Необходимым стало зафиксировать результаты проделанной работы. Их предполагается изложить  в нескольких статьях и даже приложить к ним видео. За качество которого прошу не судить - я все же простой программист, а не профессиональный блогер.

Итак, приступим...

2.   Заготовка для проекта

2.1. Создание проекта

Отрываем прототип будущего проекта. В нашем случае это будет ориентированная на ПЛК конфигурация BlankProjectForPLC из каталога проектов Examples. Для ее копирования используем диалог среды ВКПа ядро: автоматные пространства (рис. 1). Нажмем на кнопку копирование и, выбрав существующий каталог или создав новый, совершаем процесс копирования.

Перезапускаем среду ВКПа, перейдя в каталог только что созданного проект. Если диалог выбора каталога проекта не открылся, то в текущем открытом проекте в этом же диалоге устанавливаем флаг вывести диалог выбора конфигурации при запуске и перезапускаем среду. Чтобы в последующем при запуске среды автоматически выбирался каталог текущего проекта и диалог выбора проекта не открывался, нужно нажать кнопку запомнить путь к каталогу и снять флаг вывести диалог выбора конфигурации при запуске (см. рис. 1).

Рис. 1. Диалог управления автоматными пространствами среды ВКПа
Рис. 1. Диалог управления автоматными пространствами среды ВКПа

Заготовка проекта создана. Теперь можно ее наполнять автоматами.

2.2. Конфигурирование автоматных пространств

Перед созданием автоматов просматриваем автоматные пространства. Здесь есть типовые автоматные пространства, содержащие системные автоматные процессы. Можно использовать [только] их (некоторые на это и рассчитаны), но не запрещается создавать и прикладные. Например, для ПЛК будет удобно иметь пространства с именами Sensors и TimerModels (имена условные). В первом будут процессы для датчиков, во втором - таймеры. Так их будет потом проще найти.

На текущий момент пространства создаются вручную. Так, для упомянутых выше пространств в каталоге проекта _NetFsa создаются одноименные подкаталоги Sensors и TimerModels. В них помещается файл vTypesVar из любого подкаталога _NetFsa. На следующем шаге вносятся изменения в файл конфигурации vSetting.txt, добавив строки новых пространств по аналогии с описателями имеющихся. Чтобы не вникать в формат строки, можно просто продублировать любую из существующих строк и поменять в ней имена.

Проверить наличие автоматных пространств и изменить их свойства (установить режим работы, величину дискретного такта и т.д.) можно в списке пространств диалога среды ВКПа на рис. 1. Здесь можно также установить текущий режим работы с данными среды - теневой или обычный. Это делается в диалоге, открытом кнопкой Accsess right. Режим по умолчанию - теневой (установлен флаг shadow mode of variables).

Можно также установить пошаговый режим работы выбранного пространства в диалоге, открытом кнопкой  Step-by-step. Затем, через этот же диалог, управляем работой автоматов пространства в пошаговом режиме и т.д. и т.п.

2.3. Подключение автоматных библиотек и создание автоматных переменных

В ВКПа проектирование  автоматных процессов начинается с объектов, которые будем далее называть автоматными переменными. Они создаются из подключенных к проекту автоматных библиотек. Перечень их содержит файл конфигурации - vLibrary.txt. Добавление и отключение библиотек осуществляется изменением его записей также вручную, как описанное выше конфигурирование пространств. Но есть и хорошая новость: остальные изменения в конфигурации проекта вносятся уже в рамках диалогов среды.

Перечень подключенных библиотек можно посмотреть через список выбор библиотеки диалога создания автоматных переменных среды - ядро: автоматные переменные (см. рис.2).

Рис. 2. Диалог создания автоматных переменных в ВКПа
Рис. 2. Диалог создания автоматных переменных в ВКПа

В данном диалоге, ориентированном на создание автоматных переменных, поле Имя переменной объявляет автоматный процесс. Из списка Имя автомата выбирается компонента библиотеки, выбранной библиотеки из списка выбор библиотеки. Она (компонента) будет основой автоматного процесса. Если пользоваться терминологией ООП, то выбранная компонента - это класс, а автоматный процесс - объект, созданный на базе этого класса (на уровне С++ в ВКПа так оно фактически и происходит).  Существенное отличие автоматного объекта от обычного в том, что он по определению активный. Далее в списке диалог необходимо выбрать диалог настройки автоматного процесса. Таких диалогов может быть несколько. Если список диалогов пуст, но процесс настраивается только через инициализацию локальных переменных.

Из списка Автоматные пространства выбирается пространство, в которое будет загружен автоматный процесс. Это пространство будет определять режим работы процесса - синхронный или асинхронный, скорость его работы - дискретное время пространства и т.д. и т.п.

Необходимо также установить флаги условий создания и работы процесса. Если процесс нужно создать, то необходимо установить флаг создать, если после создания запустить в работу, то - загрузить, ну, а сразу же после этих шагов остановить (иногда это актуально), то установить флаг останов. автомата.

Созданный автоматный
процесс после запуска среды сразу же становится активным (с учетом состояния
его флагов, описанных выше). Но создать процесс можно также не перезапуская
среду. Для этого закрыть режим изменения (снять флаг режим создания переменной) и, выбрав в списке переменных процесс,
нажать кнопку  создать процесс.

3.     Визуальная форма автоматов в ВКПа

Среда ВКПа поддерживает два подхода к проектированию автоматов - визуальный и программный. Программный, как и положено его названию, сводится к созданию кода по определенному шаблону на языке С++. Здесь мы его рассматривать не будем. Визуальное проектирование, которое в основном и будет рассмотрено далее,  базируется на процессе, представленным блоком FAutomaton библиотеки FsaNet.

Программная реализация необходима, если нужен быстрый доступ к автоматному классу для создания процесса. Она также в два раза минимум быстрее визуальной формы. Такая реализация выгодна, когда автомат универсальный. Например, модель логического элемента. В таком случае программный код оформляется в форме блока, включенного в состав автоматной библиотеки. В последующем на уровне создания автоматной переменой он легко может стать автоматным процессом. И подобных процессов легко может быть создано любое число.

При визуальном проектировании автомат создается почти всегда заново в интерактивном режиме. Автомат фактически "лепится" и тут же, не выходя из среды, может быть проверен и/или отлажен по мере создания. Правда, есть процедура копирования автоматов (ею мы далее будем активно пользоваться), но нет библиотек "визуальных автоматов"

Процесс визуального проектирования покажем на примере автомата, отслеживающего состояние датчиков гильотины. Пусть гильотина имеет вернее и нижнее положение, которые отражают  датчики. Поставим им в соответствие состояния автомата. При движении гильотины она оказывается между датчиками. Введем и состояние, отражающее эту ситуацию. Для исключения влияния "дребезга" датчиков предусмотрим задержку на переходах в промежуточное состояние, т.к. предполагается, что за это время "дребезг" успокоится. Если нет, то возвращаемся в исходное состояние. На рис. 3 приведена подобная модель датчиков, а на рис. 4 - автоматная модель задержки для нее.

Рис. 3. Автомат индикации состояний гильотины
Рис. 3. Автомат индикации состояний гильотины
Рис. 4. Автоматная модель задержки
Рис. 4. Автоматная модель задержки

Автоматная модель датчиков гильотины - автомат Sensors2 находится в состоянии 0, если гильотина вверху, и в состоянии 1, если внизу. Она переходит в состоянии 2 при промежуточном положении гильотины. Есть у модели три локальных переменных. Это snsUp, snsDown, поставленные в соответствие датчикам, и переменная bStartDelay для управления задержкой.  

Задержка реагирует на установку переменной Sensor2.bStartDelay. Именно так  имя внешней локальной переменной выглядит для текущей модели. В данном случае локальная переменная bStartDelay процесса Sensor2. Как только время задержки истечет, переменная ее запуска сбрасывается самой задержкой.

На графе Sensor2 действие y5, запускающее задержку, приписано к состоянию 2. Это стиль автомата Мура. В случае автомата Мили его следовало бы записать на каждом переходе, ведущем в состояние 2. Выбранная форма записи более удобна и компактна и, что очень важно, более надежна с точки зрения проектирования автомата (меньше шансов пропустить действие в таблице переходов).   

Завершенный вариант визуального проектирования автомата Sensor2 на базе блока FAutomaton вместе с диалогом его локальных  переменных демонстрирует рис. 5. Здесь можно видеть также реализацию одного из предикатов - x3 (реализация остальных предикатов аналогична), реализацию единственного действия автомата - y5 и таблицу переходов (ТП) автомата.

Диалог FAutomaton содержит поле, отражающее текущее состояние автомата (поле тек.сост.). При установке флага view будет визуализирован текущий переход автомата. Установка флага рядом с кнопкой sbs переведет автомат в пошаговый режим работы. В этом режиме очередной шаг работы автомата будет запускаться данной кнопкой.

Кнопка Reset устанавливает автомат в начальное состояние, которое указано в поле начальное. При этом выполнятся действия, указанные в поле Действия при сбросе. В самом низу расположен список, с помощью которого выбирается процесс визуализации графа (далее - просто визуализатор), а кнопка OPEN View, которая появляется, если такой визуализатор выбран, открывает/закрывает его окно.

Диалог локальных переменных может быть вызван/закрыт нажатием кнопки Local Variable. В отдельном окне отображается множество локальных переменных процесса и их текущие значения. В режиме Изменить можно добавлять, удалять, изменять локальные переменные, их текущие значения,  значение инициализации и т.д. и т.п. 

Рис. 5. Визуальная форма реализации автомата Sensor2 в ВКПа
Рис. 5. Визуальная форма реализации автомата Sensor2 в ВКПа

Для полноты картины  на рис.6 приведена реализация задержки, которой управляет автомат Sensor2 (см. автомат Timer_Sensor2 на рис. 4).  

Рис. 6. Реализации задержки для автомата  Sensor2
Рис. 6. Реализации задержки для автомата  Sensor2

4.     Отладка автоматов в ВКПа

Работа над ошибками - непроходящее состояние программиста. Порой на нее тратится больше времени, чем на саму программу. А посему сокращению времени отладки, ее качеству в программировании уделяется без преувеличения огромное внимание. Можно даже сказать, без отладки оно было бы фактически невозможно.

Визуальное проектирование тем хорошо, что позволяет тут же увидеть результат работы.  При программном же подходе проект нужно остановить, изменить код, перекомпилировать, запустить опять среду и на все это необходимо время. И такая процедура, как правило, повторяется многократно. Но зато программные возможности много шире визуальных, т.к. ограничены лишь возможностями языка программирования и его IDE (в нашем случае это С++ и QT Creator). Программная реализация также в два раза быстрее визуальной, что тоже имеет значение.

Вне зависимости от подхода к проектированию автоматное программирование делает процесс отладки проще, нагляднее и качественнее. Среда ВКПа реализует несколько стратегий отладки процессов. Но характерным для них является контроль за состоянием процесса.

На рис. 7 приведены стандартные диалоги среды, используемые при отладке. Их можно вызвать, используя подпункты Входные каналы и Выходные каналы  основного меню Каналы среды ВКПа. Затем, если нужно, их можно закрепить для последующей загрузки, вызвав в пределах диалога контекстное меню (вид контекстного меню см. на рис. 7). Заметим, что наряду с ними при отладке используются также диалоги настройки и управления автоматными процессами.

 Рис. 7. Диалоги управления переменными среды
 Рис. 7. Диалоги управления переменными среды

В диалоге InputCanals, порожденном от блока FSetInputVar библиотеки fsavar10, можно присваивать значение глобальным переменным среды и локальным переменным процессов. В диалоге OutputCanals (блок FViewOutputVar, библиотека fsavar10) отображаются текущие значения переменных. Таким образом, изменяя входные переменные, и, отслеживая текущие состояния процессов и значения переменных, мы можем оценить работу того или иного автоматного процесса.

Обратим внимание на переменные Sensor2.. и Timer_Sensor2.. (см. на рис. 7 диалог OutputCanals). Это переменные типа state, характерного только для среды ВКПа. Они в строковом виде отражают текущее состояние автомата. Для этого каждый автомат имеет локальную переменную с именем "." (см. рис. 5 и рис.6) типа state. В дополнение к данному типу в ВКПа введен тип fsa(state). Переменные этого типа принимают единичное значение, когда автомат попадает в состояние state и нулевое в противоположной ситуации. На рис. 5 у автомата Sensors2 это локальные переменные с именами (0) и (1). Заметим, что для внешних процессов это будут соответственно имена Sensors2.(0) и Sensors2.(1), которые примут единичное значение, если автомат попадет соответственно в состояния 0 или 1.

Изменяя переменные входных каналов, в диалоге выходных каналов можно видеть изменение переменных и состояний и тем самым судить о поведении автоматного процесса/процессов на макро- и микро-уровне. Где макро-уровень - это значение текущего состояния процесса, а микро-уровень - значение локальных переменных процесса и глобальных переменных среды ВКПа.

По большому счету автоматное программирование формирует объемную технологию проектирования программ. Среда ВКПа это демонстрирует особенно наглядно. Здесь создание моделей (а по существу - алгоритмов) ведется не только на уровне отдельного процесса, но и на всем множестве параллельно исполняемых автоматных процессов. В "визуальном автомате" на лету можно менять все - вплоть до полного переписывания автомата. При этом таких автоматов может одновременно существовать и редактироваться любое число. Взаимодействовать между собой, синхронизировать свои действия  они могут любым образом, используя состояния, локальные и глобальные переменные. Можно буквально "лепить" свои "программистские образы", как вширь, т.е.. на уровне отдельного автомата, так и вглубь - на уровне автоматной сети. Образно говоря, программировать объемно.

Рис. 8. Тренды изменения переменных в ВКПа
Рис. 8. Тренды изменения переменных в ВКПа

5.     Визуализация графов автоматов в ВКПа

Но наиболее точное представление о работе автоматов дает визуализация переходов и текущего состояния. Визуализировать переходы может делать блок FAutomaton. Для визуализации состояний необходимо иметь, как минимум, нарисованный граф автомата и процесс, отмечающий на нем текущее состояние. Граф, созданный в приложении Microsoft Visio, у нас уже есть (см. рис.3). Его осталось сохранить в формате bmp или более экономном - png, например, с помощью редактора Paint.  

Отображение текущего состояния организует блок FViewFsaNet  библиотеки FsaNet. Создаем на его базе автоматную переменную и проводим ее настройку. Рассмотрим это на примере процесса с именем ViewSensors2 в автоматном пространстве SysDlg. Заботясь об оптимизации проекта мы в данном случае выбраем более медленное автоматное пространство, т.к. быстрые переходы визуально отследить сложно. Вызываем диалог настройки процесса (рис. 8) и выбираем графический файл для фона, который до этого сохранили в каталоге img проекта.

Рис. 8. Диалог настройки процесса визуализации автоматных графов
Рис. 8. Диалог настройки процесса визуализации автоматных графов

Рис.9. Настройка процесса отображения графа автомата. Далее создаем список отображаемых автоматов. Выбираем в списке автомат и, перейдя в режим setting mode, формируем список состояний кнопкой Create all. В списке выделяем состояние и левой кнопкой мышки щелкаем по одноименному состоянию  на графе, фиксируя координаты кнопкой Replace. "Перещелкав" подобным образом все состояния автомата, запоминаем их кнопкой save (см. рис. 9).

Рис.9. Настройка процесса отображения графа автомата.
Рис.9. Настройка процесса отображения графа автомата.

Установка флага display  не только вызывает окно отображения графа, но и инициирует процесс отображения текущего состояния автомата. Вызвать же это окно или закрыть его можно через автоматную переменную, выбрав для нее визуализатор. Основной диалог управления переменными вызывается через основное меню среды - FSA-инструменты/Переменные/Глобальные + локальные.  В нем выбираем автоматную переменную (переменная с двумя точками на конце), а из списка визуализаторов - нужный. После выбора его можно будет открыть/закрыть кнопкой OPEN_view. Аналогичные действия можно проделать также в рамках блока FAutomaton (см. рис. 5).

Более наглядный вариант отражения переменных - графический показан на рис. 8. Тренды (графики), безусловно,  не заменяют диалоговый вариант отображения переменных, а дополняют его, позволяя в динамике и с историей их отследить. Особенно это актуально для быстроизменяющихся значений. В нашем случае такой переменной является переменная Sensor2.bStartDelay,  изменения которой отражает красный график на рис. 8.

Вызвать окно отображения трендов (далее осциллограф) можно из любого стандартного диалога работы с переменными среды. Например, из диалога управления локальными переменными (рис. 5), который есть у каждого автомата.  Здесь в группе TickPlay этому служит кнопка с именем Show, когда осциллограф еще не открыт. Но при открытом осциллографе ее имя изменится на Hide.  Таким образом, одной той же кнопкой его можно открыть и закрыть.   

Создание трендов происходит через контекстное меню осциллографа, через которое можно вызвать диалоги создания графических переменных и трендов. В диалоге создания графических переменных выбирается переменная среды, которой определяются координаты полосы отображения и цвет графика. Чтобы график начал отображаться, переменную нужно включить в перечень трендов.  

6.     Задержки

В ВКПа уже есть задержки, но для совместимости со стандартами проектирования ПЛК создана задержка типа TON. Ее описание в документации на среду CoDeSys представлено на рис. 6.

Рис. 10. Описание задержки типа TON в CoDeSys
Рис. 10. Описание задержки типа TON в CoDeSys

Блок созданной программно задержки помещен в библиотеку FsaNet. Создание автоматной переменной задержки показано на рис. 11. Это задержка с именем TON_Sensors2. Ее локальная переменная bIN аналогична переменной IN, bQ - Q, nET - ET (см. рис. 10). Задержкой проще управлять через локальные переменные. Это можно сделать, например, заменив в предикатах и действиях автомата Sensors2 переменную bStartDelay на переменную TON_Sensors2.bIN в действии y5 и на переменную TON_SEnsors2.bQ в предикате x5 (см. рис. 2). Но можно использовать также имена внешних переменных, которые можно указать в параметрах strVarIN и strVarOut. Это может быть имя той же переменной - Sensors2.bStartDelay.

Рис. 11. Задержка типа TON в ВКПа
Рис. 11. Задержка типа TON в ВКПа

Устанавливая локальную переменную bIN, мы запускаем задержку, а затем, анализируя локальную переменную bQ, определяем ее текущее состояние.

Заметим, что поскольку действие y5 имеет тип операции Out, то при входе в состояние локальная переменная bIN устанавливается, а при выходе из состояния автоматически сбрасывается, прекращая работу задержки, если она еще не завершила работу. Но, заметим, как процесс задержка продолжает быть активной, чтобы не пропустить новую команду запуска.

7.     Заключение

Выше были рассмотрены первые шаги в ВКПа. Они позволяют 1) создать базу проекта, 2) спроектировать [параллельные] автоматы, 3) определить взаимодействие между ними, 4) организовать процесс отладки, 5) научились в реальном времени отслеживать текущее состояние автоматов. Важно, чтобы эти процессы проходили в комфортной среде. Основное предназначение ВКПа подобную среду создать.

В минимальном варианте для реализации идеи автоматного программирования достаточно ядра интерпретации автоматов. Речь об интерпретации идет постольку, поскольку ни один современный процессор не реализует автоматную модель вычислений. Не говоря уж о поддержке автоматного параллелизма, т.е. реализации сетей автоматов. Ядро ВКПа и есть автоматный процессор в его нынешнем варианте.

Среда ВКПа в меру своих возможностей позволяет реально ощутить практически неизбежное весьма вероятное будущее программирования. Не в переносном, а в буквальном смысле - "будущее [программирования] здесь".  Автор уверен, что когда-то оно наступит, т.к. неудовлетворенность современной моделью вычислений очевидна. Так, попытки создания тех же ассоциативных вычислителей [3] и уж совсем близко к автоматной модели - машин клеточных автоматов [5]  об этом говорят сами за себя. A те же нейронные сети [5] - не автоматы ли?

Привлекающая немалое число программистов SWITCH-технология меньше, чем некий минимум миниморум (minimum minimorum) автоматного программирования. Пусть она не реализует, а лишь имитирует автоматную модель вычислений, но она играет на этом же поле. Модель UML, автоматы в MATLAB - это тоже версии автоматных вычислений.    Список можно продолжить, попросив об этом YouTube. Так что на достигнутом грех останавливаться, а потому продолжение будет.

Если вам интересно, а если еще и полезно, то ставьте плюсы, чтобы его (пусть не будущее, но хотя бы продолжение) приблизить... Обратная связь, желательно положительная, в этом деле очень важна, т.к. стимулирует процесс.

Ссылка на видео: https://youtu.be/b0Qap9ulFJ0

Литература

1.     Автоматное программирование: определение, модель, реализация. [Электронный ресурс], Режим  доступа: https://habr.com/ru/articles/682422/ свободный. Яз. рус. (дата обращения 21.11.2023).

2.     Автоматная модель управления программ. [Электронный ресурс], Режим  доступа: https://habr.com/ru/articles/484588/ свободный. Яз. рус. (дата обращения 21.11.2023).

3.     Фостер К. Ассоциативные параллельные процессоры: Пер. с англ. – М.: Энергоиздат, 1981. – 240 с.

4.     Тоффоли Т.,  Марголус Н. Машины клеточных автоматов: Пер. с англ. – М.: Мир, 1991. – 280 с.

5.     Минский М. Вычисления и автоматы. М.: Мир, 1971. – 364 с.

Источник: https://habr.com/ru/articles/794498/


Интересные статьи

Интересные статьи

В этой статье я расскажу об основных трудностях, с которыми мы столкнулись при проектировании сценария, насколько важно проверять свои гипотезы на пользователях столько раз, сколько это будет необходи...
• Осторожно, присутствуют мелькающие гифки.• Трафик! (если в 2023 это ещё актуально)Самое простое представление двумерного клеточного автомата основано на двух характеристиках: клетки имеют всего 2 со...
Поговорим о том, как стоит спроектировать класс, чтобы его можно было использовать в компонентах на Vue 2 (так, чтобы данные были реактивными). Покажу как запретить изменение данных в компонентах, либ...
Создаем персонажа, который сам решает, что ему стоит сделать с игроком.В этой статье я познакомлю вас с методикой проектирования искусственного интеллекта под названием GOAP на примере игры Hitman.Под...
Оглавление 1. Введение 2. Backend 2.1. Инфраструктура. 2.2. Доменное имя. SSL. 2.3. Серверное приложение на Dart. … 3. Web 3.1....