WB и промавтоматика: quo vadis?

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

Я около полутора лет испытываю возможность промышленного (исключая реалтаймовые задачи, конечно) использования ВБ. Мне нравится гуманная цена линейки ваших продуктов. Мне нравится идеология софтовой начинки, которая с запасом вылетает за рамки стандартов МЭК прошлого тысячелетия: я за сутки могу построить на ВБ то, с чем бы иначе колупался долгими месяцами. В основном это простое и изящное сетевое взаимодействие. Мне нравится надежность железа: за все время скончались только три выноса WB-MGE, от атмосферной статики при грозе; более того, их материнки выглядят рабочими, выбило только китайские eth-to-serial субмодули. Вся остальная куча оборудования работает как часики. Это - прекрасно и достойно всяческих похвал.

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

Любой ПЛК для промки представляет собой набор стейт-машин, состояние коих детерминированно в любой момент времени - в противном случае контроллер подлежит немедленной замене на исправный. Я встречал мнения, что в домашнем IoT (для чего, как я понимаю, ВБ разрабатывался изначально) достаточно модели IFTTT, которая предполагает не более чем реакцию на событие - нажал кнопку, свет включился. Однако, как старый САУшник и старый разработчик контроллеров, я никак не могу согласиться с этим. Если пользователь не способен точно знать состояния управляемого ПЛК прибора, он автоматически навлекает на себя риск пожара (отопитель, котел), потопа (водоснабжение) или, в лучшем случае, перерасхода энергии (тот же отопитель, кондей, освещение итд).
Состояние контроллера и присоединенной к нему периферии обязано быть жестко определено в любой момент времени. Если это невозможно (сбой железа или связи), оператор (владелец квартиры или диспетчер сети) обязан получить немедленное оповещение об аварии и вмешаться по возможности прежде, чем что-то бабахнет.
Таким образом, разница между “домашним” и промышленным применением контроллеров практически равна нулю. Да, для промки нужна более производительная техника (впрочем, мозгов ВБ с запасом хватает для львиной доли приложений) и реалтайм в особых случаях (но помилуйте, ВБ стОит на порядок дешевле того же Симатика, а Сименс десятилетиями вылизывал реалтайм).

Так вот. К сожалению, построить работоспособную стейт-машину на ВБ пока нельзя.

Из коробки набор софта упичкан всевозможными вочдогами, которые передергивают любой демон при подозрении на его “зависание” - я долго ругался тут с авторами и в итоге, плюнув, написал скрипт для первичной настройки контроллера, оставляющий только вочдог по зависанию железа (пока он, к чести разработчиков, не выстрелил на моем оборудовании ни разу). И начал ковырять причины, почему эти вочдоги были прикостылены вообще.

mosquitto. При падении связи с соседним брокером (у меня это серверы телеметрии, скада, подчиненные и головные контроллеры в распределенных системах) демон в какой-то момент начинает раздувать файл базы на диске и затыкается. Разумеется, рестарт не дает какого-либо положительного эффекта: в попытке прожевать этот файл демон снова виснет.
Костыльное решение: при превышении таймаута на старт mosquitto не просто передергивать демон, а грохать базу и затем передергивать демон. Костыльное решение 2: persistence = false. В обоих случаях вся информация о состоянии контролов идет лесом. Нормальное решение: отсутствует.

wb-rules. В какой-то неопределенный момент времени (у меня - от недели до трех аптайма) демон просто молча падает. Я нашел еще один, совсем уж потайной, вочдог, который передергивает wb-rules, если давно не получает от него свежее значение аптайма! No comment. Естественно, любое состояние скрипта в любой момент времени может быть сброшено (на чем я и обнаружил сию фатальную багу), а это категорически предотвращает написание работоспособной стейт-машины: даже если постоянно писать состояние в persistent storage, нет никакой гарантии, что wb-rules не осыпался в промежутке между записями, успев что-то в(ы)ключить.
Решение: отсутствует.

systemd/init. Последовательность старта демонов не определена, поэтому, строго говоря, переменные в скриптах, а также исполнительные устройства (!) могут получать на старте отфонарные значения, либо из сохраненных в базе mosquitto, либо по факту опроса входов, ну либо как повезет.
Костыльное решение: силовым методом на старте инитить переменные константами. Не спасет от кратковременных непредсказуемых состояний выходов. Нормальное решение: упорядочить запуск демонов, разрисовать и документировать систему их взаимодействия. Пока не сделано.

Получается, использовать ВБ как контроллер нельзя, кроме как для приложений IFTTT, которые могут теоретически не заметить рестарта управляющих скриптов. (А могут и заметить, я набредал на ветки о спорадических глюках.)

Что же делать? Как пользователи опенсорса, т.е. фактически энтузиасты, мы не имеем морального права форсить авторов на срочное решение изложенных выше проблем. Как покупатели оборудования, мы таки хотим, чтобы оно работало.

Я для себя вижу несколько путей. Прошу делиться соображениями тех, кому это также актуально.

  1. Уйти от ВБ, закупать классические ПЛК. (Не хочу, ибо идея ВБ таки очень хороша. Плюс, на закуп и установку ВБ потрачены уже вполне весомые суммы.)
  2. Влиться в разработку в качестве программиста. (Лично для меня малореально по дикой нехватке времени.)
  3. Писать скрипты на сях и компилировать в бинарник, отключив wb-rules. (Но что делать с москитой? И, главное, что скажут инженеры, которые будут эти шедевры эксплуатировать после нас?!)
  4. Натянуть на ВБ вместо родного софта нечто вроде openPLC. (И низвести хороший контроллер до статуса малинки под шапкой с релюшками, которой на алике трёшник красная цена…)
  5. Натянуть openPLC, оснастив его драйвером MQTT, на имеющуюся систему: можно грохнуть несколько зайцев кряду - совместимость с МЭК языками для староверов и одновременно с сетевой архитектурой, которая мне так нравится. (Но время, время же… И москита.)

Мнения, коллеги?

2 лайка

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

Второй год занимаюсь с WB в свободное время, кое-какое впечатление уже сложилось.
WB как часть крупной системы АСУ, будь то котел или умный дом, мне видится вполне уместным, просто не стоит на него взваливать неподходящие задачи - риалтайм и конечные автоматы с небольшим числом состояний. Для последних есть логические реле и специализированный софт построения детерминистских систем.
Петли управления ответственных систем - котел там, например, - они должны быть автономными, на своих тупых ПЛК с сертифицированным софтом.

На собственном примере. Запихнул на WB Node-RED, zigbee2mqtt. Влезло, но на пределе по памяти и диску. Вроде даже работало как-то, но страшно тормозило. wb-rules, Node-RED - все одинаково плохо. Вынес на малину тяжелый софт - получше, но время реакции все равно болтается до полсекунды. Игры с приоритетами процессов как-то слабо помогли.

Чтобы для людей было незаметно торможение, требуется реакция в 20-50 мс, не более, истинно риалтаймовая задача. Нельзя, чтобы контроллер внезапно долго тупил.

Было бы идеально всю петлю управления светом поместить в таблицы соответствий реле WB-MR*. Но связей между реле нет, только свои входы. Не помещается у меня логика в таблицы реле.

Контроллер только для конфигурирования, мониторинга, интерфейса с другими не-риалтайм системами (HA, HomeKit, Sprut и прочие алисы). Отвалится алиса - да и черт с ней, пойду на выключатель ткну и свет включится.
Датчики климата (для людей, но не температура печи) вполне вешаются на MQTT и отображаются на плашнете. А терморегулятор я бы не доверил переполненному слоями абстракций софту, только хардвер, или выделенный микроконтроллер с навсегда зашитой программой.

Решительно нравится в WB то, что это прибор промышленного исполнения, в отличие от малины, которая чуть чего - в ребут, или внезапно дохнет. Но вот тормознутый, сабака, когда уже WB7 quad core подоспеет?

По вариантам:
0. добавить ПЛК где необходим риалтайм и детерминированность? пусть крутятся множество петель управления, а WB за всеми присмотрит и подкрутит переменные, если надо.
2. Интерфейс для инженеров важен. Должно быть функционально и документировано, с понятным lifecycle и развитым commutiny. Самопалу решительное нет.
3, 4 Про openPLC только узнал. Другая ось - это уже не WB будет.

А теперь злободневное.
Как перейти от колхоза на дебиане (пардон) к промышленному решению?
Например, конфигурация сетевого оборудования (и не только) у многих вендоров задается конфигурационным файлом. Редактировать можно в командной строке, из текстового меню, веб-интерфейса (фу трижды) или через API. Бекап сводится к сохранению конфиг файла. Замена сдохшего прибора - включить, залить конфиг и все. Единый конфиг, понимаете? Никакого бегания по /etc в поисках что же я менял.

По MQTT. Хорош как шина для телеметрии, много софта на нем уже существует. Простой как палка. Но пугает завязка архитектуры на единый центральный брокер. Конечно не так критично, если бекапим /etc/mosquitto и его БД, и в любой момент можем развернуть на новом железе.

Почему backup/restore важен? Может в 99% это не потребуется, но когда после, казалось, безобидного апдейта софта встанет производственный процесс в оставшемся 1% - мало не покажется. Даже если это свет в доме. На себе испытал.

Сам уже и забыл, как это ставить софт на голое железо. Только виртуализация, по-старинке - qemu kvm, с полными бекапами по расписанию. Не работает что-то? Откатили к вчерашней версии продакшен и разборки уже ведем на тестовом полигоне.
Может с новым контроллером с виртуализацией уже можно будет работать? Контроль ресурсов попроще получается, если течет память в одном месте - упрется в ограничитель и не повалит все остальное.

1 лайк

Первое - не стоит, верно, я уже сказал. Второе - это есть собственно контроллер, система управления. Если она не работает, прибором по назначению пользоваться нельзя, чему и был посвящен мой пространный и эмоциональный пост. Пока что - не работает.

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

И, да, mqtt как шина сообщений для независимых процессов, на мой взгляд, составляет как раз изюминку ВБ, если пользоваться ею с умом и расчетом.

можно пример “промышленного решения”, Овен - это оно?

согласен, что у контроллеров WB слабое место - аппаратная часть
вот если можно было запустить функционал на виртуалке, а к датчикам через шлюзы подключаться

Я не согласен. Не доводилось поставить туда то, что железка не тянет. Вчера побаловался с openPLC - тянет не напрягаясь.

А кто мешает собрать образ под виртуалкой?

1 лайк

т.е. можно без проблем запустить под виртуалкой?

4 шт WB-MAP12 и все - загружен под 2,5 ядра постоянно, приходится ставить шаблоны попроще или скорость увеличивать

  1. Берем, собираем, запускаем. Что-то не так?
  2. Вас ист 2.5 ядра? У меня 50 устройств на контроллере (включая четыре map3e) + правила, свободно 256М из 512, в топе наверху wb-rules c 13% цпу и мегом вмсайза, под ним wb-mqtt-serial c 10% цпу и семечками по памяти. Что я делаю не так?

Как часто wb-mqtt-serial успевает опрашивать в реальности? После некоторого количества устройств поллинг перестает успевать укладываться в заданное время опроса.
Выше скорость порта - выше загрузка CPU. Больше занятых портов - тоже выше загрузка, порты на разных прерываниях висят и параллельно обрабатываются. 115200 и устройства раскиданы по разным портам?

Вот статистика прерываний по моему контроллеру.
623 Hz /dev/ttyRS485-1 (21e8000.serial) - поллинг входов реле
177 Hz /dev/ttyRS485-2 (21ec000.serial) - map3e и map6s
79 Hz /dev/ttyMOD1 (21f0000.serial) - два msw-v3.
Шаблоны несколько изменены.
График количества прерываний в секунду:


И загрузка CPU:

Здесь Other – низкоприоритетные (nice 10) задачи типа node_exporter, rsyslogd, zabbix_agent и т.д. Обратите внимание на IRQ и особенно System.
Данные усредняются за 30 секунд, если посмотреть пиковую загрузку в htop - 100% длительностью по полсекунде.

P.S. Пока сочинял, понял как оптимизировать. Нужно дублировать сигнал выключателей, подавать не только на входы реле, но и на WBIO-DI-WD-14 для быстрой реакции, а входы реле опрашивать часто - дурная затея.

В моем раскладе 9600 бпс. Опрос раз в 2 с, чаще и быстрее смысла нет. Молотит на минималках. Если нужно миллисекунды ловить, я уже говорил: ставим классическую промку. Вайрен не про это. Да и датчики. В большинстве промышленных паспортный интервал опроса 2…30 секунд, чаще незачем.

Здравствуйте!

Это зависит от многих параметров: количества сконфигурированных устройств, количества и типа регистров в них, заданными интервалами опроса, заданными интервалами и таймаутами, настройкой скорости обмена.

Вот здесь (внизу страницы) есть диаграмма, отображающая алгоритм работы драйвера:

Кстати, из openPLC вырисовывается интересное. В свободное от отдыха время накрапываю драйвер mqtt для него и подумываю сделать к текущему вебальнику ВБ дополнение - маппинг матрицу контролов в топики и кнопку старт-стоп.

И тогда про wb-rules можно в сущности забыть навсегда. А можно (на свой страх и риск) юзать в параллель.

Ну-к что ж.

OpenPLC via MQTT чих-пых работает. Релейками щелкает, датчики чует, скрипт исполняет.
В качестве адаптации ВБ для староверов с МЭК языками - можно развивать в проект.
В качестве детерминированного ПЛК, способного надежно управлять периферией - увы, нет, ибо взаимодействие с железом идет через очередь телеграмм.

Обратная задача - ПЛК, надежный, как топор, и точный, как часики, - потребует обратной архитектуры, над которой я продолжаю думать. Пока (в ожидании ВБ7) взял за основу одноплатник на четырехъядерном Allwinner H3 и прибил рантайм openPLC к одному из ядер, освободив его от других задач. Симуляция влияния зависания остальных процессов на работоспособность треда ПЛК пока что обнадеживает, однако я еще не могу похвастаться полной его независимостью, как было бы, выдели я под него отдельный физический проц.

рекомендую ещё irq affinity тоже настроить, а то могут быть сюрпризы. Посмотреть, не прилетает ли чего на нужное ядро можно через cat /proc/interrupts

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

1 лайк

Ежли Вы не заметили, я уже полтора года как альфа-тестер практически всего вашего софта, так что смело записывайте, спасибо. :smiley:

Ковыряться-то хочу, времени нет ни черта. Но сделать работоспособную машинку - надо, факт.

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

Но - есть ли рынок…