Программа для fbd программирования
Программирование микроконтроллеров AVR
на графическом языке функциональных блоков FBD
Язык FBD очень прост в освоении и удобен как для схемотехников, не имеющих специальной подготовки в области программирования, так и для начинающих осваивать мир электроники, автоматики и робототехники. Весь процесс программирования в FBD-системе заключается в соединении линиями связи готовых элементарных блоков. Практически каждый функциональный блок в Horizont-Configurator имеет графическое изображение, принятое при разработке функциональных схем электронных устройств. Блоки представлены в виде прямоугольников, внутри которых имеется обозначение функции, и являют собой операции над входными переменными.
Линии связи, которыми соединяют функциональные блоки, указывают распространение сигнала. Функциональная диаграмма системы управления, построенная в Horizont-Configurator, имеет сходство с электрическими схемами и может быть откомпилирована в файл прошивки для микроконтроллера AVR.
Система программирования, позволяющая строить программу из набора стандартных логических элементов, очень удобна, если Вы хотите сделать BEAM-робота, но предварительно решили проверить логику разработанной вами схемы. Нарисовать схему в программе Horizont-Configurator гораздо быстрее, чем собрать ее даже на макетной плате. Использование Horizont-Configurator также удобно при отладке или проверке различных вариантов схемы BEAM-робота на реальной платформе. Конечно, при исполнении BEAM-схемы на микроконтроллере потеряются ее аналоговые свойства, но основная логика работы будет вполне видна. Особенно удобно использовать Configurator при разработке многотактных конечных автоматов, являющихся центром управляющей системы BEAM-роботов со сложным поведением.
Для того, чтобы начать работу с Horizont-Configurator, необходимо скачать установочный файл по ссылке horizont-configurator_for_avr_setup.exe) и установить программу к себе на компьютер.
Установив Configurator, можно загрузить примеры проектов, посмотреть на работу программы, откомпилировать примеры (меню "Проект" -> "Конфигурация -> "Создать файл конфигураций", затем меню "Проект" -> "Конфигурация -> "Собрать проект"). Пока среда Horizont-Configurator еще находится в стадии разработки, но уже представляет собой удобный и гибкий инструмент, с помощью которого можно создавать самые разнообразные прошивки для микроконтроллеров AVR.
- Порты микроконтроллера (сразу конфигурируются как входы или выходы)
- Логические блоки (НЕ, И, ИЛИ, Исключающее ИЛИ)
- Логические константы
- Триггеры (RS, SR, D, DC, RTRIG, FTRIG)
- Логический генератор
- Генератор импульсов
- Блоки для работы с числами (Арифм. операции, Сравнение и т.д.)
- Таймеры
- Счетчики
- Индикаторы
- Элементы памяти
В меню Файл выберем "Новый проект", дадим ему название и зададим тип микроконтроллера, например, ATMega8. Нажмем несколько раз "применить" в появляющихся окнах.
Соединим элементы сигнальными линиями. В панели инструментов есть кнопки переключения между режимами выделения и рисования соединительных линий. Если объекты отказываются соединиться, то можно поступить следующим образом: нарисуйте соединительную линию, а затем придвиньте к ней элемент (они соединятся).
Зададим значения для логических констант последовательно выделив их и изменив значение "Value" в правой панели "Свойства" на "true".
Осталось откомпилировать получившуюся функциональную диаграмму. В меню Проект выберем "Конфигурация -> "Создать файл конфигураций", а затем "Конфигурация -> "Собрать проект". После проделанных действий у нас появится файл с прошивкой для микроконтроллера. Перейти в папку с получившимися файлами можно выбрав "Конфигурация -> "Открыть созданный проект". Среди списка файлов можно без труда найти файл "имя проекта.hex" - это и есть файл прошивки. Загрузить файл в микроконтроллер можно, например, с помощью программы-загрузчика PonyProg2000.
В качестве еще одного тестового примера попробуем сделать систему управления роботом для соревнований Кегельринг из статьи "Робот для соревнований".
Счетчик милисекунд необходим для нормальной работы таймеров (он использует внутренний Timer0 микроконтроллера). Установим его "Делитель" на 1 MHz в правой панели. Триггер FTRIG отслеживает падающий фронт логического сигнала.
При изменении состояния входа "FTRIG" с 1 на 0, происходит формирование короткого импульса на его выходе. Данный импульс поступает на входы блоков Таймеров с задержкой отключения, данные блоки формируют необходимые по длительности интервалы высокого уровня на своих выходах. Сигнал с вывода первого Таймера с задержкой отключения поступает на выходы PinC1 и PinC2, управляющие первым мотором. Блок "Логическое НЕ" необходим для реализации инверсии мотора. Аналогичным образом работает другая цепь Таймера с задержкой отключения, которая управляет вторым мотором. Интервалы для таймеров можно установить изменив свойство "T" в правой панели свойств. Зададим значение равное 1800 милисекунд для первого таймера и 2400 милисекунд для второго. Таким образом, при изменении состояния входа нашей схемы с 1 на 0, в тот момент, когда робот наткнется на черную ограничительную линию, триггер сформирует короткий импульс, запускающий таймеры. Направление вращения моторов инвертируется и робот начнет двигаться назад. Когда первый таймер перестанет работать, другой таймер еще 600 милисекунд будет обеспечивать вращение второго мотора в обратном направлении и робот повернется на небольшой угол. Когда и второй таймер закончит свою работу, робот снова поедет в прямом направлении.
В завершение краткого рассказа о новой среде разработки, следует добавить, что Horizont-Configurator имеет достаточно хорошую поддержку на youtube в виде целого ряда обучающих роликов. Ссылка на youtube-канал есть на официальном сайте программы.
В текущей версии (0.3.0.60) поддерживаются следующие микроконтроллеры AVR: ATmega128, ATmega1284, ATmega1284P, ATmega128A, ATmega16, ATmega161, ATmega162, ATmega163, ATmega164A, ATmega164P, ATmega164PA, ATmega165, ATmega165A, ATmega165P, ATmega165PA, ATmega168, ATmega168A, ATmega168P, ATmega168PA, ATmega169, ATmega169A, ATmega169P, ATmega169PA, ATmega16A, ATmega16HVA, ATmega16HVA2, ATmega16HVB, ATmega16M1, ATmega32, ATmega323, ATmega324A, ATmega324P, ATmega324PA, ATmega325, ATmega3250, ATmega3250P, ATmega3250PA, ATmega325A, ATmega325P, ATmega325PA, ATmega328, ATmega328P, ATmega329, ATmega3290, ATmega3290P, ATmega3290PA, ATmega329A, ATmega329P, ATmega329PA, ATmega32A, ATmega32C1, ATmega32HVB, ATmega32M1, ATmega406, ATmega48, ATmega48A, ATmega48P, ATmega48PA, ATmega64, ATmega644, ATmega644A, ATmega644P, ATmega644PA, ATmega645, ATmega6450, ATmega6450A, ATmega645A, ATmega649, ATmega6490, ATmega6490A, ATmega649A, ATmega649P, ATmega64A, ATmega64C1, ATmega64HVE, ATmega64M1, ATmega8, ATmega8515, ATmega8535, ATmega88, ATmega88A, ATmega88P, ATmega88PA, ATmega8A, ATmega8HVA, ATtiny13, ATtiny13A, ATtiny1634, ATtiny167, ATtiny2313, ATtiny2313A, ATtiny24, ATtiny24A, ATtiny25, ATtiny261, ATtiny261A, ATtiny4313, ATtiny43U, ATtiny44, ATtiny44A, ATtiny45, ATtiny461, ATtiny461A, ATtiny48, ATtiny84, ATtiny84A, ATtiny85, ATtiny861, ATtiny861A, ATtiny87, ATtiny88.
Редактор zetFBD предназначен для визуального построения сложных разветвлённых алгоритмов на языке функциональных блоков (Function Block Diagram, далее — FBD).
FBD — это графический язык программирования стандарта МЭК 61131-3, который предназначен для программирования микропроцессорных контроллеров (в частном случае — контроллеров Zentec). При программировании используются наборы библиотечных блоков и макросы (собственные блоки, также написанные на FBD). Любой FBD блок — это подпрограмма, функция или функциональный блок (И, ИЛИ, НЕ, триггеры, таймеры, математические операции и др.).
Программа, написанная на языке FBD представляет собой выражение, составленное графически из отдельных элементов. К выходу блока подключается следующий блок, образуя цепь. Внутри цепи блоки выполняются строго в порядке их соединения. Результат вычисления цепи записывается во внутреннюю переменную либо подается на выход ПЛК.
Пример программы в редакторе zetFBD:
- Значение переменной var1 умножить на значение переменной var2
- К произведению прибавить значение переменной var3
- Полученный результат записать в переменную result
2. Основные функции редактора
zetFBD предоставляет разработчику FBD программ обширный набор библиотек, инструментов и интерактивных систем, которые в совокупности обеспечивают выполнение следующих функций:
3. Порядок выполнения блоков
Программа, создаваемая пользователем, представляет собой набор схем. В самом простом случае это одна схема. Схема указывает, каким образом выходы устройства зависят от внешних и внутренних данных. Каждая схема состоит из блоков и связей между блоками, а также имеет набор переменных величин, читаемых и записываемых схемой. Блоки выполняют функции взаимодействия между своими входами и выходами: от элементарных логических И, ИЛИ, НЕ до очень сложных. Некоторые виды блоков, кроме вычисления значений выходов, выполняют специальные задачи, например, блок «Запись в переменную» изменяет значение переменной, присваивая ей значение, полученное на входе. Выполнение блоков происходит последовательно, в порядке следования связей от выходов к входам, т.е. любой блок получает на входы обновленные значения, предварительно рассчитанные соответствующими блоками.
От визуального расположения блоков на схеме их выполнение не зависит, т.е. пользователь может располагать блоки так, как ему удобнее их видеть.
Диаграмма 1 и Диаграмма 2 будут исполняться абсолютно одинаково:
- Сначала будет обработан счетчик;
- Затем детектор фронта;
- И последним будет обработан RS триггер.
4. Циклические связи
Связывание блоков требуется выполнять таким образом, чтобы было возможно расположить их в линейную последовательность выполнения.
Циклические связи не допускаются, т.к. они приводят к возможности неоднократного изменения значений входов-выходов блоков, т.е. гарантированное завершение выполнения схемы с обновлением значений входов-выходов невозможно.
На диаграмме 1 показана циклическая связь. Такие связи недопустимы.
Правило запрета циклических связей имеет исключение: есть блоки (например, счетчики), внутри которых выходы не имеют прямой связи с входами. Такие блоки, если они включены в циклическую связь, разрывают ее внутри себя, поэтому такая связь разрешена.
На Диаграмме 1 и 2 показаны блоки с псевдоциклическими связями.
5. Главный цикл, статическая и временная память
Шаги схемы выполняются в бесконечном цикле – главном цикле программы устройства.
Данные от последних (в последовательности выполнения) блоков могут быть прочитаны первыми блоками, если эти данные будут записаны в переменные схемы. Переменные, создаваемые пользователем, и специальные переменные устройства являются памятью, хранимой в течение всего времени работы устройства. Далее эту память будем называть «статической».
Для значений входов и выходов блоков, память устройства выделяется и освобождается по мере необходимости, - это «временная» память. Выполнение схемы в целом с точки зрения внешних систем является неделимым шагом, т.е. невозможно прочитать из устройства или увидеть на его выходах данные, обновленные частично. Если какие-либо блоки прерывают выполнение схемы, это прерывание гарантированно выполняется до записи в статическую память. Операции обновления значений физических входов-выходов устройства и обмена данными по каналам связи выполняются между шагами выполнения схемы.
На Диаграмме 1 показан полный цикл исполнения программы на примере кнопки-защелки: каждое нажатие кнопки DIN1 меняет состояние выхода DOUT1.
Блоки пронумерованы в порядке их исполнения.
Рассмотрим полный цикл работы примера по шагам:
- Опрос состояния DIN1. Передача результата с выхода DIN1 на вход D блока Raise;
- Операция в блоке Raise. Передача результата с выхода F на вход C блока D-trigger. Так же чтение блока D (переменная). Передача результата с выхода блока D на вход D блока D-trigger.;
- Операция в блоке D-trigger. Чтение выходов Q и ~Q;
- Запись результата в блок DOUT1 и переменную D.
Таким образом, переменная D "разрывает" циклическую связь.
Если рассмотреть пошаговую работу схемы в симуляторе, то при "включении питания" (начало симуляции) в первом шаге в переменной D записано значение 0.
Во втором шаге значение переменной меняется.
Другими словами, с момента команды записи до момента изменения переменной проходит один цикл программы, то есть происходит задержка на один цикл.
6. Цикл программы и Базовый таймер
Шаги схемы выполняются гарантированно, т.е. значения выходов гарантированно поступают на соответствующие входы; блоки гарантированно выполняют расчеты. В отличие от электронных схем, где каждый элемент имеет временные задержки в работе и может пропустить значения входов, схема FBD работает в общем дискретном времени, где каждый шаг полного расчета схемы соответствует одной единице дискретного времени. А каждая единица дискретного времени схемы соответствует какому-то интервалу физического времени.
Длительность этого интервала зависит только от скорости работы устройства, настройка такого соотношения в системе zetFBD отсутствует. Устройство выполняет шаги с максимально возможной скоростью.
При некоторых условиях устройство может быстрее или медленнее выполнять расчет, т.к. схемы при программировании устройства автоматически оптимизируются, чтобы устройство не выполняло расчеты, не нужные в данном шаге.
Гарантия срабатывания блоков в каждом шаге позволяет использовать следующую особенность: многие логические значения выходов, сигнализирующие о возникновении события, работают по принципу «одиночного срабатывания». Это значит, что такой выход выдает 0 в течение большинства шагов выполнения схемы. Только при возникновении события он выдает 1, в течение только одного шага выполнения схемы, а на следующих шагах снова выдается 0. Такая одиночная 1 только в течение одного шага (в течение одной единицы дискретного времени) обязательно будет обработана соответствующими блоками. Само собой разумеется, что если такой выход подключить к физическому дискретному выходу устройства – он будет включаться на время 1 шага схемы, который может длиться от 100 мксек до 1000 мсек, что неправильно, т.к. внешние системы не должны быть зависимы от времени выполнения шага устройства. Поведение таких выходов удобно тем, что для них передний фронт и уровень – одно и то же, при необходимости иметь передний фронт можно просто использовать этот выход, без анализа фронта.
Для синхронизации с реальным временем используется блок "таймер", работа которого определяется Базовым таймером системы.
Любое количество блоков "таймер" используют один аппаратный «базовый» таймер устройства, настраиваемый на определенный постоянный интервал срабатывания.
Базовый таймер - это интервал времени, за который гарантированно успевает выполниться вся программа контроллера без учета оптимизации.
Важно понимать:
- Цикл системы всегда динамический. Система внутренней оптимизации будет стремиться выполнить программу за минимальное время;
- Базовый таймер задает интервал времени, которому кратны все пользовательские таймеры;
- Если время динамического цикла выполнения программы будет больше времени базового таймера, то устройство выдаст ошибку (см. документ D080813 - Коды ошибок)
7. Работа системы внутренней оптимизации
Работа системы внутренней оптимизации основана на динамическом предоставлении ресурсов для выполнения задачи.
Следующий пример поясняет работу этой системы.
Например, необходимо однократно считать данные из подчиненного устройства.
На Диаграмме 1 представлена реализация этой задачи.
Блок чтения сетевой переменной 0h производит чтение, так как локальная переменная rdy имеет значение по умолчанию 1. После успешного чтения на выходе rdy блока чтения появляется уровень лог. 1, который записывает в локальную переменную rdy уровень лог. 0 (константу 0 на входе переменной). В следующем цикле переменная rdy запрещает работу блока чтения переменной 0h. Это состояние будет до следующего включения питания контроллера.
Очевидно, что данный пример работает несколько циклов после включения питания, а далее состояние блоков не меняется вплоть до сброса питания контроллера. Система внутренней оптимизации анализирует состояние входов и выходов этой программы и, после считывания переменной 0h исключает всю цепь из цикла программы. Остается только значение переменной SET, которое было получено при считывании переменной 0h.
8. Типы данных. Преобразование данных
Пользователю предоставляется возможность оперировать со следующими типами данных:
№ | Тип данных | Размер, бит | min значение | max значение | Цветовая маркировка по-умолчанию |
1 | Логический (bool) | 1 | 0 | 1 | красный |
2 | Без знака целый 1 байт (Uint8) | 8 | 0 | 255 | синий |
3 | Без знака целый 2 байт (Uint16) | 16 | 0 | 65535 | синий |
4 | Без знака целый 4 байт (Uint32) | 32 | 0 | 4294967295 | синий |
5 | Со знаком целый 1 байт (Sint8) | 8 | -128 | +127 | зеленый |
6 | Со знаком целый 2 байт (Sint16) | 16 | -32768 | +32767 | зеленый |
7 | Со знаком целый 4 байт (Sint32) | 32 | -2147483648 | +2147483647 | зеленый |
8 | Дробный 4 байт (float) | 32 | любое рациональное число | желтый |
Типы данных выбираются в свойствах блоков, входов/выходов макросов и переменных.
9. Макросы
Для удобства пользователя, разделения задач на подзадачи или многократного использования подпрограмм в проекте, имеется возможность создания макросных схем.
В таком случае в проекте имеется несколько схем, одна из которых является главной. Главная схема выполняется, выполняя другие (макросные) схемы при наличии в главной схеме соответствующих (макросных) блоков, ссылающихся на макросные схемы. Макросные схемы также могут содержать макросные блоки, т.е. макросы могут быть вложены. Однако вложение схемы в саму себя (рекурсия), прямая или косвенная, не допускается. Макросная схема также может содержать переменные, хранимые постоянно (постоянную память макроса). Если макросная схема использована в проекте неоднократно (имеется несколько блоков, использующих ее), каждый макросный блок имеет независимый от других блоков набор переменных. Логика работы устройства не изменится, если какие-либо блоки схемы перенести в макросную схему, и заменить их в главной схеме на макросный блок, или наоборот – заменить макросный блок на блоки, содержащиеся в макросной схеме. От такой замены может незначительно измениться только скорость работы схемы и количество использованной памяти устройства, из-за различно выполняемой оптимизации схемы.
10. Работа с постоянной памятью контроллера (ППЗУ)
Все переменные проекта располагаются в области оперативной памяти (ОЗУ) и имеют свойство «Сохранение в ПЗУ». Физически, при активном свойстве, данные из ОЗУ копируется (записывается) в ПЗУ.
Запись переменных в энергонезависимую память выполняется устройством между шагами расчета схемы. Е сли переменная в ОЗУ изменяется с высокой частотой, а устройство будет производить запись безусловно, то из-за ограниченного количества циклов перезаписи, ППЗУ будет испорчено через некоторое время работы.
Такая проблема решается следующим образом – пользователь должен установить на схему блок «Запись переменных» и подать на его вход признак необходимости записи. Его можно формировать либо по таймеру, либо по событию изменения переменной (если переменная изменяется не часто), или по другому событию.
На данной диаграмме показан способ записи значения из ОЗУ в ПЗУ. Когда в переменную Set_temp мастер сети произведет запись, на выходе rdy появится фронт, который будет подан на вход en блока EEPROM. Этот сигнал произведет инициализацию записи всей памяти устройства.
Пользователь должен рассчитать максимальную частоту записи переменных, исходя из количества циклов перезаписи ППЗУ. Событие записи изменившегося значения переменной не должно происходить с большей частотой.
Перед записью переменной ее значение считывается из ППЗУ, запись выполняется только при неравенстве значений в ОЗУ и ППЗУ.
Меня зовут Сергей Глушенко, и я являюсь автором проекта FLProg. Данный блог посвящён этому проекту, и здесь я буду рассказывать о новостях проекта, и достижениях участников сообщества пользователей программы. Проект посвящён созданию визуальной среды программирования плат Arduino, и поэтому прежде чем рассказывать о программе FLProg, я хочу сделать небольшой обзор существующих программ предназначенных для программирования этих плат.
- Прокачанные «Блокноты»
- Текстовые среды разработки
- Графические среды, визуализирующие структуру кода.
- Графические среды, отображающие код в виде графики.
- Визуальные среды программирования, не использующие кода.
Прокачанные «Блокноты»
К этому типу относятся оригинальная среда программирования Arduino-IDE, а так же множество её клонов.
Проектирование программы для контроллера в ней происходит на языке Processing/Wiring, который является диалектом языка Си (скорее Си++). Эта среда представляет собой, по сути, обычный текстовый редактор с возможностью загрузки написанного кода в контроллер
Текстовые среды разработки
Альтернативой Arduino IDE является среда разработки от производителя микроконтроллеров Atmel — AVRStudio.
Программирование в ней ведётся на чистом C, и она уже имеет намного больше возможностей и более похожа на серьёзные IDE для «настоящих» языков программирования.
Эти два типа программ рассчитаны на опытных программистов, которые хорошо знают язык и могут с помощью них создавать серьёзные проекты.
Графические среды, визуализирующие структуру кода.
Это программы, которые, по сути, являются расширением форматирования для обычного текстового редактора кода. В нем программа так же пишется на языке С, но в более удобном варианте. Сейчас таких сред очень много, самые яркие примеры: Scratch, S4A, Ardublock. Они очень хорошо подходят для начального обучения программированию на языке С, поскольку отлично показывают структуру и синтаксис языка. Но для больших серьёзных проектов программа получается громоздкой.
Графические среды, отображающие код в виде графики
Это программы, скрывающие код и заменяющие его графическими аналогами. В них так же повторяется структура языка, формируются циклы, переходы, условия. Так же очень хорошо подходят для обучения построению алгоритмов, с последующим переходом на программирование на классических языках. И так же не подходят для построения больших проектов ввиду громоздкости получаемого отображения. Пример такой программы: MiniBlog, Algorithm Builder, Flowcode
Описанные выше типы программ рассчитаны на программистов или на тех, кто решил изучать классическое программирование. Но для изготовления конечного устройства кроме непосредственно программирования контроллера обычно требуется разработка внешней обвязки платы, разработка и расчет силовой части, входных развязок и многого другого. С этим у программистов часто возникают проблемы. Зато с этим прекрасно справляются электрики и электронщики. Но среди них мало программистов, которые смогли бы составить программу для контроллера. Сочетание программиста и электронщика – достаточно редкий случай. В результате такой ситуации реальных, законченных проектов на основе плат Arduino (да и других контроллеров) единицы. Для решения этой проблемы и служат программы последнего типа.
Визуальные среды программирования, не использующие кода.
Данные программы реализуют принцип, который уже много лет применяется практически всеми производителями контроллеров промышленного применения. Он заключается в создании программ для контроллера на языках FBD или LAD. Собственно говоря, как таковыми языками они не являются. Это, скорее, графические среды для рисования принципиальных или логических схем. Вспомним, что процессоры далеко не всегда были микропроцессорами, а создавались на базе цифровых микросхем. Поэтому тем, кто привык работать с цифровой техникой, больше понравится работа на них, чем написание кода на классических языках программирования. Примером таких программ являются проекты Horizont и FLProg. Программы этого типа хорошо подходят как для изучения построения импульсной и релейной техники, так и для создания серьезных проектов.
Ну и наконец, герой этого блога, проект FLProg.
Поскольку я много лет работаю разработчиком систем АСУТП, я постарался собрать в программе FLProg все, что мне наиболее понравилось в средах от ведущих производителей промышленного оборудования (Tia-Portal, Zelio Soft, Logo Soft Comfort).
Программа позволяет составлять схемы в двух видах: функциональные схемы (FBD) и релейные схемы (LAD).
FBD (Function Block Diagram) – графический язык программирования стандарта МЭК 61131-3. Программа образуется из списка цепей, выполняемых последовательно сверху вниз. При программировании используются наборы библиотечных блоков. Блок (элемент) — это подпрограмма, функция или функциональный блок (И, ИЛИ, НЕ, триггеры, таймеры, счётчики, блоки обработки аналогового сигнала, математические операции и др.). Каждая отдельная цепь представляет собой выражение, составленное графически из отдельных элементов. К выходу блока подключается следующий блок, образуя цепь. Внутри цепи блоки выполняются строго в порядке их соединения. Результат вычисления цепи записывается во внутреннюю переменную либо подается на выход контроллера.
Ladder Diagram (LD, LAD, РКС) – язык релейной (лестничной) логики. Синтаксис языка удобен для замены логических схем, выполненных на релейной технике. Язык ориентирован на специалистов по автоматизации, работающих на промышленных предприятиях. Обеспечивает наглядный интерфейс логики работы контроллера, облегчающий не только задачи собственно программирования и ввода в эксплуатацию, но и быстрый поиск неполадок в подключаемом к контроллеру оборудовании. Программа на языке релейной логики имеет наглядный и интуитивно понятный инженерам-электрикам графический интерфейс, представляющий логические операции, как электрическую цепь с замкнутыми и разомкнутыми контактами. Протекание или отсутствие тока в этой цепи соответствует результату логической операции (истина — если ток течет; ложь — если ток не течет). Основными элементами языка являются контакты, которые можно образно уподобить паре контактов реле или кнопки. Пара контактов отождествляется с логической переменной, а состояние этой пары — со значением переменной. Различаются нормально замкнутые и нормально разомкнутые контактные элементы, которые можно сопоставить с нормально замкнутыми и нормально разомкнутыми кнопками в электрических цепях.
Такой способ программирования оказался очень удобным для легкого вхождения в разработку систем АСУ инженеров-электриков и электронщиков. Разрабатывая проекты устройств, они могут легко привязать работу этих установок к алгоритмам работы контроллера.
Построенная на этих представлениях программа FLProg работает с Arduino. Почему?
Плата очень удобна для быстрой разработки и отладки своих устройств, что важно не только радиолюбителям, но весьма полезно, например, и в школьных кружках, и в учебных лабораториях колледжей. Одно из преимуществ – вам не нужен программатор. Вы подключаете плату Arduino к компьютеру и готовую программу загружаете из среды разработки. В настоящее время существует богатый выбор модулей Arduino, дополнительных модулей, работающих с Arduino, датчиков и исполняющих устройств.
В настоящее время программой поддерживаются следующие версии Arduino: Arduino Diecimila, Arduino Duemilanove, Arduino Leonardo, Arduino Lilypad, Arduino Mega 2560, Arduino Micro, Arduino Mini, Arduino Nano (ATmega168), Arduino Nano (ATmega328), Arduino Pro Mini, Arduino Pro (ATmega168), Arduino Pro (ATmega328), Arduino UNO. Кроме того недавно в списке поддерживаемых контроллеров появилась плата Intel Galileo gen2. В дальнейшем предполагается пополнение и этого списка, и, возможно, добавление плат, основанных на контроллерах STM.
Проект в программе FLProg представляет собой набор своеобразных плат, на каждой из которых собран законченный модуль общей схемы. Для удобства работы каждая плата имеет наименование и комментарии. Также каждую плату можно свернуть (для экономии места в рабочей зоне, когда работа над ней закончена) и развернуть.
Более подробно о проекте я расскажу в последующих постах, а напоследок небольшое видео показывающее принципы работы в программе и возможность управления платой из приложения на смартфоне.
FBD (Function Block Diagram) — графический язык программирования стандарта МЭК 61131-3. Программа образуется из списка цепей, выполняемых последовательно сверху вниз. При программировании используются наборы библиотечных блоков. Блок (элемент) — это подпрограмма, функция или функциональный блок (И, ИЛИ, НЕ, триггеры, таймеры, счётчики, блоки обработки аналогового сигнала, математические операции и др.). Каждая отдельная цепь представляет собой выражение, составленное графически из отдельных элементов. К выходу блока подключается следующий блок, образуя цепь. Внутри цепи блоки выполняются строго в порядке их соединения. Результат вычисления цепи записывается во внутреннюю переменную либо подается на выход контроллера.
Ladder Diagram (LD, LAD, РКС) — язык релейной (лестничной) логики. Синтаксис языка удобен для замены логических схем, выполненных на релейной технике. Язык ориентирован на инженеров по автоматизации, работающих на промышленных предприятиях. Обеспечивает наглядный интерфейс логики работы контроллера, облегчающий не только задачи собственно программирования и ввода в эксплуатацию, но и быстрый поиск неполадок в подключаемом к контроллеру оборудовании. Программа на языке релейной логики имеет наглядный и интуитивно понятный инженерам-электрикам графический интерфейс, представляющий логические операции, как электрическую цепь с замкнутыми и разомкнутыми контактами. Протекание или отсутствие тока в этой цепи соответствует результату логической операции (истина — если ток течет; ложь — если ток не течет). Основными элементами языка являются контакты, которые можно образно уподобить паре контактов реле или кнопки. Пара контактов отождествляется с логической переменной, а состояние этой пары — со значением переменной. Различаются нормально замкнутые и нормально разомкнутые контактные элементы, которые можно сопоставить с нормально замкнутыми и нормально разомкнутыми кнопками в электрических цепях.
Я немного расширил классический функционал этих языков, добавив функциональные блоки, отвечающие за работу с внешними устройствами. Они являются обертками, над библиотеками, предназначенными для работы с ними.
Проект в FLProg представляет собой набор плат, на каждой, из которой собран законченный модуль общей схемы. Для удобства работы каждая плата имеет наименование и комментарии. Так же каждую плату можно свернуть (для экономии места на рабочей зоне, когда работа над ней закончена), и развернуть. Красный индикатор в наименовании платы указывает на то, что в схеме платы есть ошибки.
Вид окна программы в режиме языка FBD
Вид окна программы в режиме языка LAD
Схема каждой платы собирается из функциональных блоков в соответствии с логикой работы контроллера. Большинство функциональных блоков имеют возможность настройки, с помощью которой их работу можно настроить в соответствии с необходимыми в данном конкретном случае требованиями.
Так же для каждого функционального блока есть развернутое описание, которое доступно в любой момент и помогает разобраться в его работе и настройках.
При работе с программой пользователю нет необходимости заниматься написанием кода, контролем за использованием входов – выходов, проверкой уникальности имен и согласованностью типов данных. За всем этим следит программа. Так же она проверяет корректность проекта целиком и указывает на наличие ошибок.
Для работы с внешними устройствами создано несколько вспомогательных инструментов. Это инструмент инициализации и настройки часов реального времени, инструменты для чтения адресов устройств на шинах OneWire и I2C а так же инструмент для чтения и сохранения кодов кнопок на ИК пульте. Все определённые данные можно сохранить в виде файла и в последующем использовать в программе.
Язык функциональных блоковых диаграмм (FBD) и его применение
Одним из популярных языков программирования ПЛК - программируемых логических контроллеров, является графический язык функциональных блоковых диаграмм FBD - Function Block Diagram. Этот язык, наряду с другими языками стандарта МЭК 61131-3, такими как например язык лестничной логики (LD), использует в своей архитектуре подобие электронной схемы.
Написанная на данном языке программа для контроллера состоит из некого списка цепей, которые одна за другой выполняются сверху — вниз. Кроме того, здесь имеется возможность присвоения отдельным цепям меток, в этом случае станет доступно использование инструкций перехода на метку, дабы изменять последовательность исполнения цепей, и создавать условия и циклы.
Таким образом, программа, написанная на графическом языке FBD, представляет собой набор связанных друг с другом функциональных блоков, выходы и входы которых соединены линиями связи. Линии связи отражают определенные программные переменные, через которые происходит обмен данными от блока — к блоку.
Отдельный блок несет на себе конкретную функцию (логическое «и», «не», счетчик и т. д.), при этом один блок может иметь несколько выходов и входов. Изначально значения переменных задаются константами или со специальных входов, а выходы их связываются дальше с другими переменными программы или с выходами ПЛК.
На рисунке приведен пример программы, написанной на языке функциональных блоковых диаграмм FBD. Как видите, такое изображение программы очень наглядно отражает алгоритм, что и делает данный язык довольно простым и удобным для разработки ПО для ПЛК.
В процессе программирования на языке FBD применяются как стандартные блоки из библиотек, так и блоки, сами написанные на FBD или на иных языках стандарта МЭК 61131-3. Блок представляет собой элемент программы, своего рода подпрограмму, функциональный блок или функцию (логическое «НЕ», «ИЛИ», «И», таймер, счетчик, триггер, математическая операция, обработка аналогового сигнала и т. д.).
Из таких блоков графически составляются выражения, образующие цепи: к выходу одного блока присоединяется следующий блок, далее — еще блок, и так образуются цепи. По ходу цепи порядок выполнения блоков соответствует порядку их соединения, а результат выполнения цепи либо подается на выход ПЛК, либо записывается в какую-то внутреннюю переменную.
Рассмотрим кусочек программы, написанной на языке FBD: В умножить на 4, затем поделить на А, и записать результат в переменную result. В псевдокоде это будет выглядеть так: result := B*4/A. Возможно также добавление к блокам специальных управляющих входов EN и выходов ENO, для управления вызовами отдельных блоков: логический ноль, поданный на вход EN, запретит вызов данного блока, а выход ENO в случае ошибки сообщит о ней, и прервет тем самым выполнение цепи до конца.
Как видите, язык FBD до крайности нагляден, удобен, и потому прост в освоении даже специалистами — прикладниками, не имеющими специальной подготовки по информатике. Код выполняется последовательно, структура команд внутри кода проста, поэтому программа транслируется очень быстро и задача выполняется надежно. Используя FBD, можно решать очень сложные задачи на ПЛК.
Есть различные модификации языка программирования FBD, отличающиеся наличием тех или иных ограничений или расширений.
Например, существует разновидность FBC, допускающая применение только чистых функций с одним выходом без промежуточных переменных — модификация для функционального программирования.
Или модификация CFC (Continuous Function Chart), позволяющая установить порядок выполнения диаграмм не просто последовательной цепочкой, а по усмотрению разработчика ПО. С CFC разработчик получает больше свободы, хотя код получается более длинным.
Пример языка FBD в STEP 7:
Язык функциональных блок-схем FBD, использующий графический стиль потока данных, является наиболее широко используемым языком программирования ПЛК.
Ниже показан результат опроса в группе Программируемые контроллеры. Вопрос звучал следующим образом: " Какие языки программирования ПЛК вы используете чаще всего?". При ответе на вопрос допускалась возможность множественного выбора.
По результатам опроса язык FBD напбрал 52,14%, а его разновидность СFC - 10,71%, в сумме два языка набрали 62,85%, что значительно больше, чем другие языки программирования ПЛК. У ближайшего конкурента языка LD - 35%.
Преимущество языка FBD перед языком релейных диаграмм LD возрастает с увеличением сложности алгоритма управления. Алгоритм управления написанный в FBD, позволяет легче, чем в LD, отслеживать изменения в программе и искать возможные ошибки во время отладки.
В целом, принципы работы обоих языков очень похожи. Своей популярностью они обязаны прозрачности обозначений, благодаря которой код относительно небольших программ можно быстро понять, даже без особых знаний программирования.
Смотрите также по этой теме:
Курс по программированию контроллеров:
Structured Text
Представляем книгу по Structured Text (ST) МЭК 61131-3. Автор - Сергей Романов
Книга "Изучаем Structured Text МЭК 61131-3": Ссылка на книгу
Любите умные гаджеты и DIY? Станьте специалистом в сфере Internet of Things и создайте сеть умных гаджетов!
Записывайтесь в онлайн-университет от GeekBrains:
Изучить C, механизмы отладки и программирования микроконтроллеров;
Получить опыт работы с реальными проектами, в команде и самостоятельно;
Получить удостоверение и сертификат, подтверждающие полученные знания.
Starter box для первых экспериментов в подарок!
После прохождения курса в вашем портфолио будет: метостанция с функцией часов и встроенной игрой, распределенная сеть устройств, устройства регулирования температуры (ПИД-регулятор), устройство контроля влажности воздуха, система умного полива растений, устройство контроля протечки воды.
Вы получите диплом о профессиональной переподготовке и электронный сертификат, которые можно добавить в портфолио и показать работодателю.
Читайте также: