Статья

Wiren Board - оптимизация опросов

Купил wirenboard, собрал тестовый стенд, и все хорошо работало на нем, с тремя устройствами... Проблемы начали появляться по мере эксплуатации и добавления новых устройств. Основная претензия была в том, что имея по 10 устройств на линии, я получал немалые задержки 3-4 секунды !!! на срабатывание датчика движения, по которому должен был включаться свет. Это приводило к тому, что я мог пройти весь коридор, выйти с него, и только тогда в коридоре включалась ночная подсветка. Polling - серьезный недостаток протокола Modbus RTU. Я провел достаточно много экспериментов по улучшению скорости срабатывания датчиков, добился опроса в 300мс на 18 устройствах, и теперь могу поделиться своими наработками.

1. Физическое подключение

Сначала теория.

RS-485:Физическое подключение - как подключать витую пару по цветам. Также есть момент, касаемо терминатора на конце линии - терминатор можно не ставить, при длине линии менее 100 метров. Я у себя нигде не ставил, т.к. нет такой длины. Витая пара должна быть экранированной, для исключения наводок. 

RS-485:Основы функционирования интерфейса RS-485 - тут написано о том, почему надо подключать все последовательно, шиной, а не ветвями - звездой.  "Ветвление сети RS-485 не допускается – это делает практически невозможным ее согласование." Но у себя я допустил ветвление, в некоторых местах, и это никак не повлияло на сигнал.  Ветвление линии допустимо, но нежелательно. 

Wiren Board. Подключение Modbus (RS-485) модулей - а это хорошая и понятная статья от Александр Жабунин (OXOTH1K).

У контроллера в распоряжении 2 порта rs-485, для лучшего распределения устройств. Имеет смысл докупить еще 2 расширяющих модуля WBE2-I-RS485-ISO, таким образом будет 4 порта. Чем меньше устройств  на линии rs-485, тем выше скорость опроса.

У себя я сделал так:

  • порт 1: это самые быстрые модули: реле, диммеры - все, что должно работать максимально быстро (у меня тут 14 устройств);
  • порт 2: все датчики, счетчик электроэнергии, модули штор (у меня тут 18 устройств);
  • порт 3: пока тут только особый девайс, работающий на скорости 38600, скорость сменить нельзя;
  • порт 4: датчик на скорости 9600, резервная линия для опытов.

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

2. Настройка порта и устройств в UI

Baud rate на максимум, 115200 (может быть проблемой на длинных линиях свыше 100 метров, в таком случае - 57600).

Response timeout - этот параметр 500мс по умолчанию. Но я подобрал 50мс, меньше не советую ставить, т.к. у меня раз в несколько часов самопроизвольно перезагружался контроллер. Работает это так: контроллер опрашивает устройство и ждет ответа Х мс, иногда устройство не отвечает, по какой-то причине. Если на линии есть ошибки, то каждый раз ждать 500мс слишком долго. 

Для всех устройств надо установить скорость 115200, как это сделать: Настройка параметров обмена данными по RS-485 для modbus-устройств Wiren Board. 

Почему 115200?

1 / 9600 * 11 [бит в байте] * (8 [байт в запросе] 4 [байт задержка перед ответом]) * 10 [запросов] = 137.5мс
1 / 115200 * 11 [бит в байте] * (8 [байт в запросе] 4 [байт задержка перед ответом]) * 10 [запросов] = 11.5мс
Это скорость ответа на бумаге, один ответ от устройства. На 1 устройство приходится несколько опросов, например, на датчик msw3 - 10 опросов. То есть на линии с 10 msw3 будет 100 опросов и если посчитать 137.5*10-11.5*10=1260мс - теоретический выигрыш в скорости.

В настройках устройства обязательно надо переопределить параметр Delay before accessing device - поставить 10мс для каждого устройства. Это, пожалуй, самое действенное средство увеличения скорости. По умолчанию 300мс задержка перед чтением данных с девайса. Если у вас 10 устройств на линии, только задержка будет 300*10 = 3 секунды! Ставим 10мс (меньше нельзя) и общая задержка будет в 30 раз меньше.

3. Оптимизация шаблонов устройств

Немного теории, для общего понимания. Оставляем один датчик msw3 на линии, смотрим логи порта:

WB опрашивает несколько регистров одним опросом (bulk reading), но регистры должны идти подряд, и время опроса должно быть одинаковое, в настройках. Группой опрос занимает почти столько же времени, как и одиночный. 

Синие рамки - это инициализация. Создаются диапазоны для каждого опроса. Для msw3 создалось 5 диапазонов, в зеленой рамке идут 5 опросов подряд. Далее еще одна синяя рамка, судя по всему - это какая-то надстройка, первый диапазон разбился на 3 отдельных, получилось 7 опросов всего. Вот этот момент должны оптимизировать на стороне производителя. 

Красные рамки - это уже рабочие цикличные опросы, 7 опросов подряд. Тут не все хорошо, я считаю, должно быть 4 опроса, вместо 7: 0-11 input, 97-98,  280-284 и 0-11 coils. Так как у всех регистров устройства задано одинаковое время опроса, то все они выполняются подряд, всегда в одинаковом порядке и на максимально возможной скорости порта. 

На самом деле, в базовом шаблоне еще больше опросов, это я уже убрал некоторые, об это дальше.

Самое важное: чем меньше опросов, тем быстрее.

Перейдем к оптимизации шаблонов. Информация, где хранятся шаблоны и описание параметров: Драйвер wb-mqtt-serial:Примеры написания шаблонов. Все стандартные шаблоны можно взять с github.

Принципы оптимизации такие:

  1. убрать регистры, которые не нужны и не используются;
  2. важным регистрам поставить poll_interval меньше, остальным - больше;
  3. не разбивать bulk опросы, должен быть одинаковый poll_interval в пределах одного опроса.

До оптимизации: 9 опросов, которые циклично выполнялись для каждого датчика, на максимальной скорости.
После оптимизации: 3 опроса: 1 опрос раз в секунду, 1 опрос на максимальной скорости, 1 опрос раз в 30 секунд.

Таким образом, удалось "разгрузить" линию, опросов стало значительно меньше, следовательно, возросла общая скорость.

У себя я отметил достаточную скорость срабатывания датчиков движения. Срабатывают практически моментально, не раздражают, как раньше.

Пример моих шаблонов:

config-wb-msw_v3-simple.json - шаблон для msw3.
config-wb-map12h-simple.json - шаблон для трез фазного счетчика  электроэнергии.

Установка шаблонов:

Шаблоны записывать в папку  /usr/share/wb-mqtt-serial/templates
Удалить устройство (через UI) из /etc/wb-mqtt-serial.conf
Удалить все топики устройства через команду mqtt-delete-retained "/devices/wb-mrm2_114/#"
Добавить устройство, выбрать новый шаблон

4. Софт, нагрузка CPU, правила

Это очевидно, но важно, как и все остальное, так как любой следующий пункт может повлиять на скорость работы.

  • Не следует ставить лишний софт, устанавливать только самое необходимое.
  • Правила WB могут сильно тормозить, если написаны плохо и/или их много, поэтому стоит задуматься о переносе всех сценариев на отдельный сервер (например, raspberry pi4). Вместо правил использовать Node-Red.
  • Следить за загрузкой CPU и памятью, например, контроллер WB может тормозить, если много разных девайсов подпишется на него по mqtt.
  • Иногда логи занимают все свободное место и начинаются тормоза, необходимо проверять доступное место на диске.

5. Работа modbus на Sprut.Hub

Бонусом о том, как работает modbus на Sprut.Hub (beta).  

Все, что надо сделать - это отключить порт в настройках Wirenboard. Теперь порт будет открывать SH и опрашивать устройства сам.

Настраивать вообще ничего не надо!

1) Устройства добавляются автоматически.
2) Подобраны минимальные задержки для опросов.
3) Опросы оптимизированы по приоритетам.


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

Спасибо! Будем пробовать!

В новой квартире планирую все сделать на wirenboard и данная статья очень полезна! Спасибо Андрей!

Спасибо за подробную инструкцию! Тем не менее возник вопрос (специально зарегистрировался, чтобы задать), у вас выделено, что витая пара должна быть экранированной, хотя в документации Wiren Board, на которую вы ссылаетесь, явно этого не написано, более того, там сказано: "можно использовать обычную витую пару CAT5 для Ethernet". Чем обусловлено ваше утверждение: вашим опытом, экспериментами или перестраховкой? Ведь один из смыслов витой пары как раз в какой-то помехозащищенности (если я ничего не путаю). Вопрос без подвоха - прямо сейчас выбираю кабель для прокладки трасс, и экранированный раза в три дороже. Заранее спасибо!

Это опыт множества людей, я прислушивался к советам бывалых интеграторов. Ну и здравый смысл, если передаются данные, то нужна защита от наводок. Для кнопок можно обычную cat5 использовать, но я тоже взял экранированную, мало ли я захочу КНХ кнопки подключить... Переплата за FTP небольшая, и потом уже не перетянуть на другой кабель, внутри штукатурки. 

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

Delay before accessing device - поставить 10мс для каждого устройства.


в последней версии этого параметра нет, его и не надо прописывать, все оптимизировано

В последней версии т.е. все хорошо и уже не чего делать не надо??

И еще один вопрос, с помощью какой команды смотрели логи порта. (3 пикча, на черном фоне)


Вернуться назад

Устройства


WirenBoard

Wiren Board 6

(4 отзыва)

Вернуться назад