Конечные автоматы в среде динамического моделирования SimInTech. Часть 2
Во второй части мы покажем как создать вложенные и параллельно работающие конечные автоматы и осуществлять обмен данными между ними.
Вложенные структуры конечных автоматов. Реализация обмена данными с конечными автоматами
Конечные автоматы SimInTech сформированы на базе стандартных субмоделей, которые поддерживают неограниченную глубину вложенности, мы можем разместить на схеме внутри конечного автомата еще одну или несколько карт состояний и получить параллельно-работающий набор конечных автоматов. Поместите на схему внутри модели «Контроллер нагревателя» новый блок «Карта состояний конечного автомата» — это будет автомат, определяющий цвет и частоту мигания индикации нагревателя. Внутренняя структура блока будет состоять из двух состояний on и оff.
Соберите схему, как показано на рис. 30
Рисунок 30. Внутренняя структура автомата индикатора.
В качестве активного состояния выберете состояние on. Выделите блок и нажмите на него правой кнопкой мыши. В выпадающем меню выберите пункт «Свойства». Появится окно редактирования свойств, в котором нужно выбрать да в единственном свойстве «По умолчанию» Да (см. рис 31.)
Рисунок 31. Настройка начального активного состояния.
Внутренняя структура логики работы в состоянии включен представлена на рис. 32.
Рисунок 32. Логика работы в состоянии On
После включения состояния таймер вырабатывает сигнал 0 (false) в течение заданного времени. Это сигнал блоком «оператор НЕ» превращается в 1 (true) и передается на выход Оn. Пока не истечет время, заданное в блоке «Выдержка состояния», на выходе из блока состояния On будет 1. Как только время закончится, выход блока «Выдержка состояния» станет равен 1 (true), произойдет срабатывание перехода, одновременно сигнал на выходе станет On — 0 (false) и не будет меняться, пока состояние неактивно. Таким образом, можно использовать это выход в качестве индикации состояния включен.
Поднимитесь на один уровень схемы выше и поставьте на схему блок «Выходной порт» из закладки «Субструкутры». Этот порт будет передавать наружу сигнал работы индикатора. Соберите схему, как показано на рис. 33.
Рисунок 33 Схема автомата индикации.
Войдите в состояние off и наберите простую схему, как показано на рис. 34
Рисунок 34. Схема работы в состоянии off.
После включения состояния включается таймер и через указанный в настройках интервал времени происходит выход из состояния.
Поднимитесь на два уровня вверх и соедините появившийся выход из субмодели «Автомат индикатора» с выходом «Led» на схеме контроллера, как показано на рисунке 35.
Рисунок 35. Схема контроллера нагревателя с вложенным автоматом индикатора.
Если сейчас запустить общую схему на расчет, то индикатор будет переключаться между 0 и 1 с интервалом, заданным в таймере состояний автомата индикатора (см. рис. 32 и 34). По умолчанию это время равно 1 секунде и график «Индикация» на общей схеме (см. рис. 8) будет представлять из себя меандр с интервалом 1 сек, как на рисунке 36:
Рисунок 36. График работы автомата индикации.
Чтобы интервал автомата индикации зависел от состояния контроллера (1 секунда при нагреве и 5 секунд в выключенном состоянии), необходимо в него передать данные из параллельно работающего автомата состояния. Для этого существует несколько способов. Поскольку автоматы состояния реализованы с использованием обычных субмоделей могут быть использованы все методы передачи данных. В нашем примере мы используем один из них — сигналы модели.
Перейдите внутрь субмодели «Контроллер нагревателя». Схема на экране должна выглядеть как на рис. 35. В главном меню главного окна SimInTech выберите пункт «Сервис» подменю «Сигналы» (см рис. 37)
Рисунок 37. Вызов настройки сигналов проекта.
Будет вызвано окно задания списка сигналов. В данном окне можно задать сигналы проекта, доступ к которым имеют все используемые в проекте блоки.
Создайте новый сигнал (кнопка «добавить» внизу окна), задайте имя flash_time. Режим установите в «Ненаправленный» это позволит читать и записывать данный сигнал в любом месте проекта (см. рис. 38)
Рисунок 38. Добавление сигнала проекта.
Данный сигнал может быть использован для любых целей в проекте. Мы будем использовать его для задания интервала индикации в разных состояниях.
Перейдите в автомат индикации и в таймерах состояния для состояний on и off вместо значения по умолчанию 1 поставьте имя сигнала flash_time. (см. рис. 39)
Рисунок 39. Задание выдержки состояния индикации через имя сигнала.
Теперь, когда у нас время выдержки в состояниях индикатора задается сигналом, можно менять это значение в разных состояниях контроллера, тем самым, меняя интервал индикации.
Перейдите в карту состояний «Контроллер нагревателя» и состояние выключен. Поместите на схему блок «Константа» из закладки «Источники» и блок «Язык программирования» из закладки «Динамические». Соедините их, как показано на рис. 40.
Рисунок 40. Схема состояния выключен с заданием времени индикатора.
Задайте в свойствах константы значение 5 (5 секунд интервал в выключенном состоянии). В общем случае вместо константы может быть схема расчета интервала любой сложности и любой глубины вложенности.
Войдите в редактор блока «Язык программирования» двойным кликом и присвойте значение входа (u) переменной flash_time, как показано на рис. 41.
Рисунок 41. Задание интервала индикации в языке программирования.
Данный текст присваивает сигналу flash_time значение, полученное из входа в блок «Язык программирования». Для принятия изменений нажмите кнопку «Закрыть и применить» вверху окна. (см. рис. 41).
Можно не использовать блоки и задать интервал работы индикатора прямо в тексте программы. Давайте так сделаем для состояния включен.
Перейдите в состояние включен и поместите на схему блок «Язык программирования» из закладки «Динамические». Войдите в редактор блока двойными кликом и введите в окне редактирования текст, как показано на рис 42.
Закройте окно нажатием на кнопку «Закрыть и применить» в верхней части окна редактирования.
Рисунок 42. Задание интервала индикации для состояния включен в языке программирования.
Если сейчас запустить расчет, то график «Индикация» покажет нам, что автомат индикации меняет интервал переключения в зависимости от состояния контроллера нагревателя. В выключенном состоянии интервал равен 5 секундам, во включенном состоянии — 1 сек. (см рис. 43)
Рисунок 43. График работы индикатора с разным периодом.
Как уже было описано выше, в SimInTech логика конечных автоматов реализована на базе стандартных субмоделей, поэтому на схемах с этими блоками можно свободно использовать стандартную логику построения моделей.
Например, для изменения расчета цвета индикатора можно доработать схему контроллера так, чтобы, кроме включения и выключения индикатора (0,1) на выход, подавалось также значение цвета индикатора (0 — выключен, 1 — включен зеленый, 2 — выключен красный). Схема вычисления цвета приведена на рисунке 44.
Рисунок 44. Схема работы контроллера нагревателя с вычислением цвета индикатора
Если вы собрали все схемы, как описано в данном тексте, то графики работы модели будут похожи на приведенные ниже (см. рис. 45):
Рисунок 45. Результаты моделирования модели нагревателя с контроллером, построенным на базе конечных автоматов.
На графике индикации работы нагревателя (верхний график рисунка 45), видно, что в выключенном состоянии с периодом 5 секунд выход на индикатор меняет значение 0 — 1 (выключен-зеленый), а во включенном состоянии это выход с периодом 1 секунда меняет значение 0 — 2 (выключен красный). Обратите внимание что в приведенном примере на схемах комбинируются два подхода к созданию алгоритмов управления логика «конечных автоматов»
Выводы
Среда динамического моделирования технических систем SimInTech содержит средства для создания модели систем управления на основе конечных автоматов (state flow). Данная логика может быть использована вместе со стандартной логикой функционально-блочных схем (data flow), при этом средства разработки и создания схем полностью между собой совместимы.
В примере приведены основные приемы работы при использовании логики «конечных автоматов» в SimInTech. Скачать версию SimInTech c блоками конечных автоматов можно здесь.
В следующей части мы покажем как генерировать код Си из схемы в SimInTech.