Проблема со связью по Modbus-RTU (HW?)

Добрейший день!

Выявили следующую проблему.
При связи с панелями управления генератором DeepSea через встроенные порты RS485 периодически (несколько раз в минуту при непрерывном чтении) вылезают ошибки связи (CRC и неверный размер), причем даже на столе при объединении массы и соединении витым кабелем.
Что с терминаторами, что без.

Проверили через modbus_read - тоже случается.

Подключили через два разных USBшных адаптера на FT232 - с ними за сутки ни одной ошибки.

Посмотрели на физику осциллографом - всё вполне прилично, с FT даже похуже будет.

Так что…wb-mqtt-serial не при делах, внешние соединения тоже - я так понимаю, проблема где-то между линуксовым драйвером UART’а и клеммами.

Собственно, куда копать?

Добрый день!

Это очень интересно.

  1. Наблюдается ли эта проблема на одном контроллере, или уже проверили на нескольких?
  2. Наблюдается ли проблема с другим оборудованием?
  3. Какие серийники или партии контроллеров, на которых проверяли?
  4. Какие параметры связи?
  5. Какие регистры и какими пачками читает драйвер?
  6. покажите пожалуйста вывод cat /proc/tty/driver/IMX-uart, желательно два раза: до пояления ошибок связи и после.
  7. Нет ли у вас под рукой логического анализатора?
  1. Проблема есть на 52 контроллерах в поле (6.7) и воспроизводится на одном у меня на столе (6.6).
  2. Не-а. В поле вместе с дипсишными железками на одном порту висят WB-MAP’ы - с ними всё отлично. Ну и вообще больше ни с чем такого не наблюдали.
  3. Наверное смогу в понедельник раздобыть счет на оплату тех, что 6.7 - этого хватит? Но воспроизводится и на старом, могу еще на 6.5 попробовать.
  4. В поле 9600@8N1, на столе 19200@8N1 (дипси, который сейчас живет у нас в конторе - он с дохлым экраном, так что менять на нем что-то весьма некузяво).
  5. Карта в аттаче - config-deepsea7-adapted.json (5.7 КБ)
    Еще из-за того, что wb-mqtt-serial не умеет (ну либо я не понял как) в write-only-регистры, раз в десять минут оно ругается несколько раз подряд на несуществующий регистр 4104, но если это выпилить из конфига, лучше не становится (да и с чего бы).
  6. Сделать дважды смогу в понедельник - сейчас оставили на выходные железяку работать с USBшным хвостиком. Так что пока вот - так понимаю, что с момента, когда я поменял ttyRS485-1 в конфиге на ttyUSB0, через последовательные порты ничего не передавалось:
    root@wirenboard-AY2BBI36:~# cat /proc/tty/driver/IMX-uart
    serinfo:1.0 driver revision:
    0: uart:IMX mmio:0x02020000 irq:18 tx:8452 rx:0 RTS|DTR|DSR|CD
    1: uart:IMX mmio:0x021E8000 irq:55 tx:1565265 rx:1451441 fe:607 RTS|DTR|DSR|CD
    3: uart:IMX mmio:0x021F0000 irq:217 tx:0 rx:0 DSR|CD
    
  7. Есть встроенный в Hantek 6022BL, но пользоваться им мы не пробовали. Но можем попробовать.

не, не нужно. Если на 6.6, и 6.7, и на 52 контроллерах - то точно не в партии дело.

В общем нужно посмотреть на то, растёт ли вот это: fe:607 и совпадает ли рост с числом ошибок.

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

Что ещё нужно:

  1. fe, выше написано
  2. логи wb-mqtt-serial с ошибками
  3. очень желательно полные логи wb-mqtt-serial с включенным debug, чтобы прямо видеть какие именно неправильные байтики получаются
  4. лог c лог. анализатора. Я горячо рекомендую купить копеечный восьмиканальный анализатор, гуглится по словам “saleae”. Есть в Москве, стоит ~700 рублей. По-хорошему его нужно подключать к логическим уровням, но 5В он выдерживает, поэтому можно просто подключить GND и A, например.

Добрейший день!
Логический анализатор сейчас купим, да.

То, что можем сейчас:

  1. fe растёт, рост совпадает с появлением ошибок
    Например:

root@wirenboard-AY2BBI36:~# cat /proc/tty/driver/IMX-uart
serinfo:1.0 driver revision:
0: uart:IMX mmio:0x02020000 irq:18 tx:8452 rx:0 RTS|DTR|DSR|CD
1: uart:IMX mmio:0x021E8000 irq:55 tx:1649809 rx:1530837 fe:648 RTS|DTR|DSR|CD
3: uart:IMX mmio:0x021F0000 irq:217 tx:0 rx:0 DSR|CD

root@wirenboard-AY2BBI36:~# cat /proc/tty/driver/IMX-uart
serinfo:1.0 driver revision:
0: uart:IMX mmio:0x02020000 irq:18 tx:8452 rx:0 RTS|DTR|DSR|CD
1: uart:IMX mmio:0x021E8000 irq:55 tx:1654689 rx:1535428 fe:650 RTS|DTR|DSR|CD
3: uart:IMX mmio:0x021F0000 irq:217 tx:0 rx:0 DSR|CD

И между ними

ModbusRTU::ReadRegisterRange(): failed to read 1 holding(s) @ 1027 of device modbus:1: Serial protocol error: invalid crc

2/3) Лог вот тут, битые биты в наличии → serial_log.txt (872.0 КБ)

А USB адаптеры (в первом сообщении темы) втыкали в компьютер или в контроллер?

И в компьютер, и в контроллер. С разным софтом - в первую очередь с wb-mqtt-serial.

WBE2-I-RS485-ISO - ткого модуля нету, проверить?

Нет, такого нету.

Из лога, видимо, самое интересное выглядит примерно так:

modbus: read 2 holding(s) @ 1536 of device modbus:1
Write: 01 03 06 00 00 02 c4 83
ReadFrame: 08 FF FF FF 67
read noise: fa 0d
ModbusRTU::ReadRegisterRange(): failed to read 2 holding(s) @ 1536 of device modbus:1: Serial protocol error: invalid crc

Судя по принятому куску “FF FF FF” - постоянно высокий уровень. Вот такое крайне часто бывает если плохая земля или разные БП (для контроллера и для устройства) со связью с фазой через емкости входного фильтра. Тут вариант диагностики прост - отключить питание контроллера, запитать его от АКБ, например. Так чтобы масса была связана только с “панелью”. Если пропадет помеха - то действительно так. А на “панели” точно нету отдельной “земли” для RS-485?

Это известно.
Оба девайса на столе запитаны от одного источника (крутой промышленный питальник ABB), на объектах - вообще от аккумулятора генераторной установки.
Сигнальная масса у панели есть - на стенде пробовали и с ней (на GND контроллера), и без неё - разницы никакой ни в логах, ни на осциллографе.
Заземление в офисе так себе, но в полях идеальное.

Вот только что соединил последовательно два свинцовых аккума и от них всё запитал - фиг, ничего не изменилось.

Порядком удивляет то, что сигнал при использовании USB/Serial выглядит ощутимо хуже (три разных низких уровня, кривые фронты, всё вот это), но стабильно работает.

А этот свисток - самый обычный-типовой без всякой развязки?

Хм, может у устройства не хватает мощности выхода?
При работе от
А пара резисторов (надо попробовать ом 75-150) от линий А и от Б на землю ситуацию ухудшают или наоборот?

Свистки обычные, неизолированные. Один отечественный “типа промышленный” - со встроенными терминатором и подтяжками, другой - DFRobot, совсем примитивный.

Подтяжки пробовали, никаких изменений.

Тут именно в уровнях скорее дело. Недотягивает, и “А” все равно больше “Б”


failsafe отключать пробовали?

Попробовал. Как ругался, так и ругается.

Как выше коллега посоветовал - надо лог анаизатор.
Текущая гипотеза - некорректные частоты, точнее сдвиг частоты из-за чего значения битов получаются не в тех местах.
У меня вот такой, например:
https://aliexpress.ru/item/4000144266133.html
Их много.

fe - это framing error, т.е. процессор принял неправильный пакет. Например там стопбит короче, чем надо, или его вообще нет.

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

Исключительно в целях поделиться опытом про “ошибка СRС”.
Периодически возникала с некоторыми контроллерами.
Полечилась изменением времянки опроса: строго выдерживать 2мс перед чтением и 1мс между байтами - фактически к стандарту.

1 лайк

Дело кончилось вот чем.

  1. С помощью логического анализатора и какой-то матери выяснили, что таки между фреймами слишком короткая пауза, а виновата в этом панель DeepSea.
  2. Докричались до DeepSea, те кинули в нас скриншот конфигурационной утилитки, в которой есть настройка паузы. Мы проверили у себя - её нет.
  3. Дипси срочно выпускает версию, в которой есть настройка. Но есть один момент - она не подключается к нашей древней панели…
  4. злые звуки переписки с западным производятлом оборудования
  5. Дипси присылает правильный конфигуратор и инструкцию, как подружить его со старой панелью.
  6. Подбираем длину паузы у панели.
  7. PROFIT

Евгений, огромное спасибо!

3 лайка

Александр, вам спасибо за то, что не поленились описать, чем закончилось дело.

Мы кстати по результатам запланировали в следующий Wiren Board добавить некоторый аппаратный блок, который позволит мгновенно переключать драйвер на приём и работать с такими устройствами, нарушающими стандарт.