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


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

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


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

Итак, давайте попробуем понять, как же подручными средствами можно упростить нашу нелёгкую жизнь. В качестве примера используем реальную ситуацию- один насос в скважине глубиной 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 микросекунды. Неплохо, но разница довольно ощутимая.

Заключение


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

Комментарии (16)


  1. xFFFF
    29.11.2019 10:53

    На али встречаются платы с STM32F405 и 407, так и с более мощными.

    ru.aliexpress.com/item/4000094075769.html
    ru.aliexpress.com/item/33022702116.html


    1. Greeds74 Автор
      29.11.2019 11:03

      Большое спасибо за ссылки. Обратите внимание на форм-фактор и на то, что уже на них и держатель для батареи, и память всякую и разных форматов, плюс SD коннектор, и отладочный порт для стандартного коннектора. А в этой плате смысл такой, чтобы подхватить падающий флаг BluePill и поддержать именно такой, минималистичный, форм-фактор. И хочу заметить, если на плате у вас будет процессор F405RGT6, и кварцы будут 8 МГц и 32.768кГц, то прошивка легко запустится. Другие камни я не пробовал — нет в наличии. Хотя, признаюсь, просто чешется попробовать F765 — как на нём себя поведёт интерпретатор.


  1. slog2
    29.11.2019 11:20

    Хорошее решение, но к вашей плате ещё нужен целый колхоз из входов-выходов. А не это ли самое, только всё в одном, уже сделали китайцы ru.aliexpress.com/item/33021250022.html
    И таких плат там сотни разных разновидностей.


    1. Greeds74 Автор
      29.11.2019 11:27

      Никто и не говорил, что будет легко. Зато какой размах для творчества — можно сделать то, что тебе хочется. А если нет желания ничего делать — тут можно и у китайцев прикупить платку вот такую. Она и недорого выйдет.
          Я лично таких плат не имею, но мои коллеги утверждают, что довольно надёжное решение. Насчёт программирования — по умолчанию для них применяют GX Developer- FX. Конечно, провести бы тесты с интенсивной коммуникацией…


  1. lingvo
    29.11.2019 13:00

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


    Я в своих домашних проектах, где это требуется, использую Raspberry PI с установленным Codesys Runtime и ихней же средой проектирования IEC 61131-3. Получается куча возможностей, начиная от удобной современной среды разработки и отладки и заканчивая доступными коммуникационными протоколами и визуализацией. И все это за стоимость RPi + лицензии за 50 евро.


    Так как среда поддерживает кучу контроллеров начиная от Овна и заканчивая Wago — можно спокойно выбрать себе нужный контроллер под свои нужды.


    ПС Что-то не нашел у вас в статье собственно I/O интерфейсов для контакторов и датчиков. Это и есть основная стоимость и сложность ПЛК, а не той платы, что вы показали.


    1. Greeds74 Автор
      29.11.2019 13:32

         Интересно будет посмотреть на задачу, которая требует быстродействия больше, чем 3 миллисекунды на 8000 шагов программы, вот честно. Этой средой программирования поддерживается ещё и SFC — тоже классная штука. Я и о ней расскажу.
         Я знаком с рантаймом Codesys для малины. Вопросы, которые у меня возникали, были тривиальны — нагрев, сохраняемые переменные при отключении питания.
          А вот эта мелкая платка — не греется, потому что не кушает много, имеет 4 килобайта аппаратно сохраняемой памяти, причём быстрой. И часы есть аппаратные кстати) А ценник у неё для меня получился 270 рублей полностью, вместе с платой. Да, детали из Китая.
          А разработка для этой платки тоже не менее удобна, среда программирования достаточно продумана. Я бы конечно, немного поднастроил горячие клавиши — но это уже сила привычки.


      1. Greeds74 Автор
        29.11.2019 13:47

            Когда платы заказывал, а их заказывать надо не менее 5 штук, решил сделать их побольше. Ниже под спойлером результат —

        Печатки, как они есть


    1. Greeds74 Автор
      29.11.2019 13:54

      ПС Что-то не нашел у вас в статье собственно I/O интерфейсов для контакторов и датчиков. Это и есть основная стоимость и сложность ПЛК, а не той платы, что вы показали.

          Разумеется, статья этого не описывает, потому что предметно рассматривается вот такая плата и среда для её программирования. Я могу показать IO, но это уже тема для обсуждения не здесь.


      1. lingvo
        29.11.2019 14:34

        Интересно будет посмотреть на задачу, которая требует быстродействия больше, чем 3 миллисекунды на 8000 шагов программы, вот честно.

        Ну у вас чисто логика, нету аналога. А добавите какой-нибудь простенький ПИД регулятор и плавающую точку и быстродействие вам сразу же понадобится.


        сохраняемые переменные при отключении питания.

        Не помню, чтобы там были проблемы с этим.


        Разумеется, статья этого не описывает, потому что предметно рассматривается вот такая плата и среда для её программирования. Я могу показать IO, но это уже тема для обсуждения не здесь.

        Я бы сказал, что не стоит это отрывать. Потому что на фоне I/O все эти вопросы по потреблению, сохраняемой памяти или стоимости в 270 рублей очень быстро померкнут.


    1. poznawatel
      30.11.2019 06:46

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


  1. Greeds74 Автор
    29.11.2019 14:47

    Ну у вас чисто логика, нету аналога.
    Это собственно как так? А кому я распинался про работу с плавающей запятой? А два аналоговых входа на борту для кого? Да пожалуйста — пид реализован, пользуйтесь. Даже визард в среде программирования к вашим услугам. Три порта UART, причём аппаратные, с выходом DE, имеются. Я их качал до скорости 1 500 000 mbps — тянут как миленькие.
    Для работы ПИД регулятора надо 25 регистров плюс ещё 10 для вспомогательных целей. В эту плату можно запихать 8000/35 =228 регуляторов, и быстродействие будет на уровне 3.2 миллисекунды. Я делал только 170 регуляторов, больше было лень. Сейчас сделаю проект и чуть позднее скажу реальные цифры.
    Я бы сказал, что не стоит это отрывать. Потому что на фоне I/O все эти вопросы по потреблению, сохраняемой памяти или стоимости в 270 рублей очень быстро померкнут.

    А я бы сказал, что стоит. Потому что малина для такого решения будет стоить сколько? Считаем — малина(2358)+лицуха( 3500)+норм.карточка(1000) = 6858 рублей. И точно так же нужна добротная обвязка!!! То есть по цене одного вашего решения можно взять 25 плат, таких, как я показал.


  1. Greeds74 Автор
    29.11.2019 15:13

       Я не стал мудрить и сразу сделал тестовый проект со 100 пид регуляторами и выложил его на github. Ниже результаты —

    Результаты замера наглядно


  1. Greeds74 Автор
    29.11.2019 15:23

     А вообще, дома у меня Raspberry Pi второй модели применяется как домашний медиацентр KODI, и её работой я весьма доволен. Было совсем недавно одно омрачение — начал мигать красный диод и на экране появилась характерная жёлтая молния. Замена блока питания и кабеля ничего не дала. Помог только прогрев паяльным феном… Сложная это плата всё-таки.


  1. Greeds74 Автор
    29.11.2019 16:21

    Я их качал до скорости 1 500 000 mbps — тянут как миленькие.

    Упс… ошибочка вышла. Конечно же 1 500 000 bps, или 1,5 мегабита в секунду. Протокол — Modbus RTU.


  1. tonyk_av
    30.11.2019 19:27

    Предлагаю дать этой плате другое название. «Blue Pill» для зелёной платы… Может, «по аналогии, „Green Pill“? Ведь известно, что „как вы яхту назовёте, так она и поплывёт“.

    По-моему, STM32F405 — не очень удачный выбор для такой платы. Нет массовости как у Blue Pill. У меня есть Nucleo 103, 091, 401, 411, 446, 746. И ни на одной я не могу опробовать работу Greeds74. Жаль…

    Философский вопрос: а что думает юридический отдел Мицубиси об этой разработке?


    1. Greeds74 Автор
      30.11.2019 19:42

      По-моему, STM32F405 — не очень удачный выбор для такой платы. Нет массовости как у Blue Pill. У меня есть Nucleo 103, 091, 401, 411, 446, 746. И ни на одной я не могу опробовать работу Greeds74. Жаль…

        Спасибо за интерес к проекту. Дело в том, что три года назад я поддался всеобщему энтузиазму и сделал свою плату, но под STM32F103RET6. Конечно же, после проведения всех работ она теперь просто лежит на полке. Но вот буквально месяц назад мне потребовался максимально недорогой подопытный с процем из F4 серии, который будет не жалко использовать в тестах на живучесть. Полчаса работы — и уже плата готова. Вообще целевая аудитория интерпретатора обширна — F427, F765 и Н743. Вообще, Крайний камень из этого списка жду с нетерпением — интересны результаты…
        А насчёт юридического отдела… Вопрос хороший, но можно спросить и так — что скажет BMW, если кто-то сделает машину, которая и управляется также, и ездит также, но выглядит по другому?
        Мне кажется, что через пару месяцев на али можно будет искать эту плату. Китайцы работают на удивление слаженно и быстро.