Начало обзора


Итак, мои дорогие коллеги, начнём обзор с того, что же на самом деле мы хотим тут осветить. В статье я хочу рассмотреть элементы, характерные для построения программы промышленного контроллера, и показать, как их можно применить для систем домашней автоматики. И самое главное найти ответ на вопрос — что для этого необходимо.

Домашняя автоматика — области применения


Дом, милый дом… Так ли тебе нужен контроллер? Ответ прост — всё зависит от того, что в таком доме имеется. Конечно, если у вас просто квартира, и автоматика заключается в управлении домашним медиацентром и кондиционерами летом — всё, что написано далее, может быть совсем неинтересным. Но если ваше хобби заключается не только в продавливании дивана( что уж тут таить, я сам иногда в этом был замечен), то статья может оказаться весьма полезной.

Итак, давайте попробуем понять, как же подручными средствами можно упростить нашу нелёгкую жизнь. В качестве примера используем реальную ситуацию- один насос в скважине глубиной 70 метров, который поставили в складчину два соседа. Установили они его весной, когда воды в скважине было много и вообще, было просто тепло и хорошо. Но проходит время, и начинаются вопросы — для поднятия воды с такой глубины нужна электроэнергия, за которую надо платить. Несколько раз был затоплен подвал и технический этаж — просто забыли выключить насос… Да и не очень удобно вручную управлять — надо закрыть один кран, открыть другой, потом включить насос и смотреть за уровнем воды в баке.

А стоит ли тратить на это своё время, которого и так не хватает? Пытливый ум начинает искать решения и конечно же, находит его! Рождается список задач к реализации.

  1. Оплата за потреблённую электроэнергию не должна быть общей — значит, установим два пускателя, каждый из которых подключён к своему электрическому счётчику.
  2. Насос не должен выйти из строя из-за отсутствия воды — значит, установим датчик «сухого» хода насоса. Если нет воды — просто не запускаем насос, а если он работает — аварийно останавливаем.
  3. Насос не должен работать слишком долго — например, больше 25 минут. Превышение этого времени показывает, что система выходит из штатного режима работы.
  4. Заполнение емкостей должно происходить без участия человека, то есть автоматически.А это значит и запуск по нижнему уровню, и остановка по верхнему уровню.
  5. Заполняться должен только один бак, то есть устанавливаем два клапана — на подачу воды для набора в каждую ёмкость.
  6. Пауза между включениями насоса должна быть не менее 30 минут.
  7. Перерыв в электропитании не должен повлиять на алгоритм работы, если он был активен. Несмотря ни на что, алгоритм должен быть завершён.

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

Как работает промышленный контроллер?


Конечно же, сразу уточним — речь идёт о так называемых программируемых логических контроллерах, или сокращённо ПЛК. Что же скрывается под этой аббревиатурой? А скрывается вот что — невероятное разнообразие аппаратных решений, огромное количество программных продуктов и утилит. Сразу возникает резонный вопрос — а как же тогда использовать всё это добро? Неужели придётся с нуля изучать материальную часть и для каждого нового устройства находить время и деньги, чтобы пройти обучающие курсы и получить навыки, необходимые для работы с каждым устройством?

Ответ — нет, не надо. Всё уже сделано до нас. Осталось только изучить и научиться использовать. Именно этим я предлагаю заняться далее — немного погрузиться в стандарт IEC 61131. Давайте раскроем, какие части содержит этот стандарт.

  • IEC 61131-1: Общая информация.
  • IEC 61131-2: Требования к оборудованию и испытания.
  • IEC 61131-3: Языки программирования.
  • IEC 61131-4: Руководство пользователя.
  • IEC 61131-5: Коммуникации.
  • IEC 61131-6: Функциональная безопасность.
  • IEC 61131-7: Нечеткое программирование управления.
  • IEC 61131-8: Руководящие указания по применению и реализации языков программирования.
  • IEC 61131-9: Одноточечный интерфейс цифровой связи для небольших датчиков и исполнительных устройств.
  • IEC 61131-10: Формат обмена на основе PLC open XML.

Но углубляться в тему стандартов не будем, а говоря просто, контроллер в общем виде работает циклически — опрос состояния входов, выполнение интерпретатором программы управления, установление состояния выходов, выполнение задач внутреннего обслуживания и опять возврат к опросу состояния входов. Достаточно скучно, но зато действенно и эффективно. Программа управления представляет собой псевдокод, который создаётся при помощи среды программирования.Обычно такой псевдокод представляет собой двоично- кодированную последовательность, и ничего общего не имеющего с привычными нам языками программирования. Хотя для пользователя она представлена в виде, доступном для понимания — для контроллера же применяется совершенно другое представление. Хороший пример — небольшая программа, представленная в виде IL, LD и в виде двоичного кодирования для контроллера ( хм, даже термина специального нет). Ниже под спойлером показан небольшой пример.

Варианты отображения программы


Так что же делает эта программа полезного? Да ничего она не делает — если значение меркера М8010 равно 1, то в выход с адресом Y377 будет записана 1. Соответственно, то же самое для 0.
Одно из самых больших преимуществ такой реализации — это возможность выгрузить программу из памяти контроллера, открыть её для редактирования в редакторе в понятном для человека виде, скомпилировать( тут этот термин условен) и загрузить обратно в память контроллера. Причём некоторые контроллеры сохраняют даже комментарии и имена переменных.

Как запрограммировать контроллер?


Конечно же, необходимо специализированное программное обеспечение. После длительных поисков и экспериментов была выбрана программа Autoshop v3.02 от Inovance Control. Она замечательна тем, что бесплатна, доступна для свободного скачивания и она поддерживает контроллеры, совместимые с контроллерами Mitsubishi. А ещё она поддерживает работу не только через последовательные порты, но и через Ethernet. Ссылка на версию, использованную нами, под спойлером.

Ссылка на скачивание с Yandex Disk

Хорошо, мы установили программу и теперь другой вопрос — а как записать программу в наш контроллер? Так как мы будем работать с конкретным устройством, то и поставим конкретные драйвера виртуального COM порта. Для экономии выводов, да и для упрощения я решил использовать USB порт платы для подключения. Драйвера под спойлером.

Драйвера на Yandex Disk

После установки драйверов и подключения платы через mini-USB вы можете проверить, всё ли у вас успешно. Для этого правой кнопкой мыши откройте Мой компьютер- Управление-Диспетчер устройств-Порты( COM и LPT). У вас должно показаться вот такое окно, как под спойлером. Номер СОМ-порта в вашей системе может отличаться.

Диспетчер устройств


Теперь вы можете в меню программы AutoShop выбрать Tools-Communication Setting, в появившимся окне выбрать Serial, указать номер порта и нажать кнопку Test. У вас должно появиться вот такое окно, как под спойлером.

Успешное подключение к плате


Но если у вас что — то не получается, пишите либо в личку, либо в комментарии. Поможем обязательно.

Элементы программы, без которых будет грустно


Здесь и далее будем рассматривать язык лестничных диаграмм, или так называемый LD. Давайте рассмотрим только те элементы, которые мы будем использовать далее.

  • Входы и выходы дискретные. Обозначаются как X и Y. Предназначены для получения и выдачи дискретных сигналов.
  • Область памяти меркеров М. Может принимать два состояния — включен и выключен.
  • Таймеры имеют обозначение Т. Предназначены для отсчёта времени от 0.1 до 3276.7 секунд.
  • Область регистров D. Имеет размерность ячейки 16 бит, но может также адресоваться и как 32 битная ячейка.

Сферический конь в вакууме, или регистры косвенной адресации


Регистры косвенной адресации имеют обозначение V и Z и могут быть адресованы от V0 до V7 и от Z0 до Z7. Для чего же их можно применить? Давайте рассмотрим, как вообще они работают. Вот такая с виду безумная запись D1000V0 подразумевает, что будет использоваться адрес ячейки, вычисленный как адрес D1000 плюс значение, записанное в регистр косвенной адресации. Если там будет 15, то будем использовать адрес ячейки D1015. Весьма удобно при работе с массивами данных или при табличном управлении — нам достаточно изменять значение индексного регистра, и мы получаем значения из тех ячеек памяти, которые были адресованы. Но пока мы не будем их применять — этого уже коснёмся в следующей публикации.

Немного о визуализации работы программы, или онлайн — отладка


Если вы программист и только что завершили написание программы, следующим этапом будет отладка. И вот тут и возникает вопрос — как это делать. Опять же, очень много вариантов, но я расскажу про тот, который мы далее будем использовать. Редактор среды программирования позволяет путём нажатия одной кнопки визуально показать, какие значения битов и переменных сейчас в памяти контроллера. Весьма показательным будет пример — ниже под спойлерами оффлайн и онлайн отображение программы в редакторе.

Кнопка перехода в режим просмотра переменных


Вид программы в режиме просмотра значений переменных


Вид программы в режиме редактирования


Немного подробнее о процессах, происходящих при нажатии кнопки Online. Программа быстро составляет список видимых переменных, и по завершении записывает его в определённый буфер контроллера. После этого уже контроллер по этому списку готовит данные и помещает его в другой буфер. Программа считывает значения из этого буфера и показывает их в виде значений на мнемосхеме. Если вы прокрутите немного программу в окне отображения и измените видимые переменные, данный цикл снова повторится…

Кто Гамлета зовёт, или на сцене BluePill x405


А вы обратили внимание, что на рынке не попадаются простенькие платы типа синей таблетки, но оборудованные процессорами типа F405 и выше? Мне лично попадались только с камнями F401, но это немного другой уровень… На подъём я лёгкий, и для своих экспериментов, недолго думая, сделал плату в старом добром P-CAD 2006 и заказал у китайцев на одном из сайтов быстрого заказа. Конечно, по цвету это зеленая таблетка, но по смыслу решил оставить название BluePill, но с указанием, что она уже x405. Результат под спойлерами — фото платы BluePill x405.

Вид сверху


Вид снизу


Принципиальная схема и gerber на github

Немного о том, чем же так примечательна эта плата? Ведь попыток создания клонов bluepill были просто тысячи! А отличие вот в чём — к этой платке я прилагаю прошивку, которая позволит превратить её в ядро, выполняющее программу, совместимую по системе команд с промышленными контроллерами Mitsubishi. Рассчитано сие чудо на 16 входов, 16 выходов, 2 входа аналоговых, 3 UART с поддержкой DE для RS485, 1 мастер шины onewire. UART могут работать как мастер шины modbus RTU, так и как слейв. Причём могут работать совершенно независимо.
Но и это ещё не всё — если вы подключите 3В батарейку к выводу VBAT, то сохранять свои значения будут не только часы, но и таймера, счётчики, меркеры и первая 1000 регистров общего назначения D. И регистров тут 8000.

Предвосхищая вопросы, скажу сразу — да, программное обеспечение построено на основе операционной системы реального времени. Да, DMA используется везде, где только возможно. Эти особенности позволяют без значительного изменения времени цикла работать при больших коммуникационных нагрузках. Данная версия уже вторая ревизия, переработанная и дополненная.

Эту плату вполне можно программировать как GX FXDeveloper-ом, так и IEC Developer и GX Works.

Судьба насоса и двух баков


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

Net 1 - первое исполнение программы


В регистре D1000 хранится время, необходимое для подавления дребезга контактов. На самом деле, в программе это уже имеется — но мне хочется показать это более наглядно. Регистр D1001 отвечает за время защиты насоса. В него мы пишем 15000, или 1500 секунд. Далее у нас есть цепочка резервного сброса — если что-то пойдёт не так, можно подать на вход X14 сигнал 1 и перезапустить плату. В этом случае в регистры D0 и D1 запишется 0, и сбросятся меркера М98 и М99.

Net 2 - обработка сигналов входов


Здесь при помощи таймеров мы избавляемся от дребезга контактов. Для этого используем задержку в 200 миллисекунд. Для того, чтобы в дальнейшей программе при изменении адреса входа контакта не надо было переписывать много цепочек, я использую промежуточные меркеры( например, М102). Также примечательно, что тут используется системный меркер М8003 — он включается после того, как прошёл первый цикл исполнения программы. А вот меркер М8002 активен только в первый цикл программы, и это можно и нужно использовать для установки начальных значений.

Net 3 - наполнение бака 1.


Наполнение бака 1 совершенно идентично наполнению бака 2 за исключением адресов. Немного не поместился рисунок — но вы лучше его посмотрите, просто открыв проект. Что же примечательного в этом блоке управления? Наличие защит и взаимных блокировок, которые позволяют безударно запускать и останавливать механизмы. Например, после открытия клапана 1 только через 700 мсек будет подана команда на запуск пускателя, включающего насос.

Управление здесь не предусматривает ручного режима. Также реализована защита от сухого хода и защита от слишком длительной работы насоса.

Net 5-6 -Управление выходами


А вот тут мы управляем выходами с соблюдением блокировок.

Из задач осталось невыполненным только подключение 30 минутного интервала защиты перед повторным включением. Сразу скажу — в данной версии реализованы только входа X0-X3 и выхода Y0-Y3, чего вполне достаточно для тестирования материала данной статьи. Привязка такая PA4-X0,PA5-X1,PA6-X2,PA7-X3 и PB4-Y0,PB5-Y1,PB6-Y2,PB7-Y3.

Скорость выполнения цикла программы — дедовские методы измерения


Когда задаём себе этот вопрос, то сразу приходит на ум сделать так — записать в контроллер очень большую программу из определённого количества одинаковых элементов, получить время исполнения и получить время исполнения одной команды. Сказано — сделано, под спойлером программа и в имени спойлера время исполнения.

7995 шагов - 2.6 миллисекунды

Здесь каждый шаг — это одна команда, и получаем, что 2.6/7995=0.325 микросекунды. Не очень быстро, но неплохо.

FPU -быть или не быть?


А теперь определим, как быстро работают в нашей прошивке инструкции с плавающей запятой. Имеются две прошивки — одна с использованием встроенного FPU, а другая — с программной эмуляцией. Программа ниже:

Программа для вычисления времени выполнения инструкции

Прошивки ниже под спойлером, и они не имеет никаких ограничений

Две прошивки

При использовании аппаратного FPU время выполнения программы получается 1.8 мсек, или 1.8/600=0.003 мсек, или 3 микросекунды.

Теперь заменим прошивку — используем программную эмуляцию. Результат уже получается другой — 2.5 мсек, или 2.5/600=0.0041 мсек, или 4.1 микросекунды. Неплохо, но разница довольно ощутимая.

Заключение


Несмотря на большой объём статьи, осталось ещё немало материалов, которые было бы хорошо осветить. Так что если данная статья окажется вам интересной, то за этой статьёй последует ещё и ещё одна. Но мне бы хотелось найти единомышленников, кто желает приобщиться к скрещиванию промышленного и домашнего с только одной целью — чтобы эти инструменты оказались доступными простому обывателю.