Дано :
0) Отсутствие WirenBoard. Так что если никто не захочет помогать – я пойму. Но мне кажется, что проблема всё-таки в wb-mqtt-serial, а не в моём железе
- Usb to rs485 http://img.dxcdn.com/productimages/sku_221402_1.jpg
Просто ft232+max485, ничего необычного
- Периферийное устройство – Arduino с библиотекой https://github.com/andresarmento/modbus-arduino . Вроде работает, тестировал с помощью разных программ, умеющих modbus, включая https://github.com/contactless/modbus-utils и qmodbus
- Собранная с гита последняя версия wb-mqtt-serial.
Версия libmodbus: 3.0.6. Работает на PC под Ubuntu 15.10.
Конфиг
Итак, в чём проблема. Кнопка опрашивается раз в 100мс. И если в момент опрашивания кнопки послать mqtt сигнал для моргания светодиодом – будет ошибка. Если увеличить poll_interval до 10 секунд, то, соответственно, ошибка будет раз в 10 секунд (если будет совпадать время опрашивания кнопки и мигания светодиода). Менял скорость, стоповые биты и т.д. – ничего не помогает.
Сделал дамп данных, которые приходят не периферийное устройство, чтобы было понятно, что происходит :
Без выделения – опрос кнопки, синий прямоугольник – выключаем светодиод, зелёный – включаем, красный – пытались выключать, но что-то пошло не так
Предсказываю, что проблема с RTS (направлением передачи). Какой-то из концов линии не успевает сменить направление передачи. Проблема типичная для дешёвого и китайского железа и для поделок на ардуино.
Другой вариант - неправильно определение конца пакета в библиотечке на ардуино из-за слишком быстрого опроса. Можно поиграться с задержками, типа delay_ms.
1 лайк
Что стоит на стороне Ардуины для 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 миллисекунд между посылками помогает.
Также помогает убрать из конфига все устройства, кроме одного. Если же в конфиге указано более одного устройства, то проблема есть.