Странные проблемы с wb-mqtt-serial

Дано :
0) Отсутствие WirenBoard. Так что если никто не захочет помогать – я пойму. Но мне кажется, что проблема всё-таки в wb-mqtt-serial, а не в моём железе

  1. Usb to rs485 http://img.dxcdn.com/productimages/sku_221402_1.jpg
    Просто ft232+max485, ничего необычного
  2. Периферийное устройство – Arduino с библиотекой https://github.com/andresarmento/modbus-arduino . Вроде работает, тестировал с помощью разных программ, умеющих modbus, включая https://github.com/contactless/modbus-utils и qmodbus
  3. Собранная с гита последняя версия wb-mqtt-serial.
    Версия libmodbus: 3.0.6. Работает на PC под Ubuntu 15.10.

Конфиг

Итак, в чём проблема. Кнопка опрашивается раз в 100мс. И если в момент опрашивания кнопки послать mqtt сигнал для моргания светодиодом – будет ошибка. Если увеличить poll_interval до 10 секунд, то, соответственно, ошибка будет раз в 10 секунд (если будет совпадать время опрашивания кнопки и мигания светодиода). Менял скорость, стоповые биты и т.д. – ничего не помогает.
Сделал дамп данных, которые приходят не периферийное устройство, чтобы было понятно, что происходит :


Без выделения – опрос кнопки, синий прямоугольник – выключаем светодиод, зелёный – включаем, красный – пытались выключать, но что-то пошло не так

Предсказываю, что проблема с RTS (направлением передачи). Какой-то из концов линии не успевает сменить направление передачи. Проблема типичная для дешёвого и китайского железа и для поделок на ардуино.

Другой вариант - неправильно определение конца пакета в библиотечке на ардуино из-за слишком быстрого опроса. Можно поиграться с задержками, типа delay_ms.

1 Like

Что стоит на стороне Ардуины для RS485 ?

Рекомендую попробовать библиотеку: GitHub - yaacov/ArduinoModbusSlave: Modbus slave library for Arduino
У меня она работает в Mega 2560 в роли modbus расширителя портов через MAX485

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

mosquitto_pub -h host -t /devices/led/controls/led/on -m 1;  sleep 0.1; mosquitto_pub -h host -t /devices/led/controls/led/on -m 0

И иногда бывает хорошо (светодиод моргнул)

setting device register: <modbus:5:coil: 0> <- 1
modbus: write 1 coil(s) @ 0 of slave modbus:5
…убрал чтение других регистров
setting device register: <modbus:5:coil: 0> <- 0
modbus: write 1 coil(s) @ 0 of slave modbus:5

А иногда не очень

setting device register: <modbus:5:coil: 0> <- 1
modbus: write 1 coil(s) @ 0 of slave modbus:5
setting device register: <modbus:5:coil: 0> <- 0
…пошло чтение других регистров, нету write

Отсутствует write. В моём случае, вместо одного моргания светодиод остаётся гореть. Но я вот думаю, если глючит бажная библиотека под Ардуино, разве не должен wb-mqtt-serial писать ошибку? Почему просто отсутсвует write, как будто он даже не начал выполнять запись?
Кстати, задержка в 300 миллисекунд между посылками помогает.
Также помогает убрать из конфига все устройства, кроме одного. Если же в конфиге указано более одного устройства, то проблема есть.