Подключение WB-MRM2 по modbus к Wiren Board 4

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

Возникла проблема с подключением WB-MRM2 по modbus к Wiren Board 4. Получил следующие сообщения по всем регистрам(coil, holding) в логах /var/log/messages:

Jan 15 12:55:39 wirenboard user.notice modbus: TRegisterHandler::Poll(): warning: Modbus error: failed to read 1 coil(s) @ 0 slave_id is 2(0x2)

В конце линии поставил терминальный резистор 100 Ом. Напряжение разомкнутой линии A-B - 500 мВ. Напряжение на клеммах A-B WB-MRM2 - 200 мВ - постоянное, хотя запросы идут с контроллера с заданным интервалом. По идее, если сигнал идет, но напряжение должно подскакивать до 1.5В минимум (судя по описанию RS-485). Пробовал подключать как к изолированному порту(ISO), так и к стандартному - итог прежний. Создается впечатление, что сигнал не формируется физически, хотя в логах сообщения идут.

Сам релейный модуль работает - переключаю реле с помощью кнопки. На самом Wiren board реле тоже работают, контроллер виден по Wi-Fi и управляется

Конфиг modbus взял с вики (slave_id пробовал менять, не помогает):

{
     "ports": [
        {
            "path" : "/dev/ttyNSC0",
            "baud_rate": 9600,
            "parity": "N",
            "data_bits": 8,
            "stop_bits": 2,
            "poll_interval": 10,
            "devices" : [
                {
                    "device_type" : "WB-MRM2",
                    "slave_id": 25
                }
            ]
        }
    ]
}

Подскажите, пожалуйста, способ отладки линий RS-485.

Если вы меряете напряжение на линиях A и B не осциллографом, то вы ничего не увидите.

Как вы выбрали slave_id? В конфиге у вас 25, а в логах 2. Правильный slave_id должен быть написан на наклейке на устройстве. Можно поменять slave_id для большей уверенности принудительно. Для этого нужно подключить устройство к порту и выполнить в консоли:

service wb-homa-modbus stop # отключаем демон modbus, чтобы не занимал порт
modbus_client -mrtu /dev/ttyNSC0 --debug -a0x0 -t0x06 -r0x80 25 # поменять slave_id на 25 (в десятичной системе)
service wb-homa-modbus start # запускаем демон modbus  обратно

Ввел команду. Результат:
Data to write: 0x16
Opening /dev/tty[ 2711.910000] sc16is7x2 spi1.3:
[ 2711.910000] sc16is7x2_startup (1)
NSC0 at 9600 bauds (E, 8, 1)
[ 2711.920000] sc16is7x2 spi1.3: sc16is7x2_read_status ier=0x00 iir=0x10 msr=0x00 lsr=0x00
[ 2711.940000] sc16is7x2 spi1.3: sc16is7x2_set_termios (baud 9600)
[ 2711.940000] sc16is7x2 spi1.3: sc16is7x2_set_termios (baud 9600)
[00][06][00][80][00][16][08][3D]
Waiting for a confirmation…
[ 2711.960000] sc16is7x2 spi1.3: sc16is7x2_read_status ier=0x05 iir=0xc1 msr=0x00 lsr=0x00
ERROR Connection timed o[ 2712.460000] sc16is7x2 spi1.3: sc16is7x2_set_termios (baud 9600)
ut: select
ERROR occured!
[ 2712.470000] sc16is7x2 spi1.3: sc16is7x2_read_status ier=0x05 iir=0xc1 msr=0x00 lsr=0x60
[ 2712.480000] sc16is7x2 spi1.3: sc16is7x2_shutdown ch1

Странно, что инициируется соединение с битом четности(9600 bauds (E, 8, 1)), хотя в конфиге его нет.
“path” : “/dev/ttyNSC0”,
“baud_rate”: 9600,
“parity”: “N”,
“data_bits”: 8,
“stop_bits”: 1,

добавьте -pnone к команде - будет. Из-за того, что вы сидите через UART, у вас в кучу валятся сообщения от ядра и от программы. От modbus_client вы должны получить всё равно connection timeout, потому что смена адреса - это широковещательный запрос. На шине соответственно кстати должно быть только одно устройство.

Проверить, что адрес поставился, можно обратившись по этому адресу к устройству, только так. Ну и ещё лампочка на устройстве мигает, когда он получает команду.

Добрый день.

Похожая проблема на NetMon:
ошибки при чтении с WB-MRM2. После включения debug сообщений в конфиге выяснилось, что в начале ответа от устройства появляется лишний нулевой байт.
Например:

Aug 4 09:34:38 wirenboard user.notice modbus: [01][01][00][01][00][01][AC][0A]
Aug 4 09:34:38 wirenboard user.notice modbus: Waiting for a confirmation…
Aug 4 09:34:38 wirenboard user.notice modbus: <00><01><01><01><00><51>
Aug 4 09:34:38 wirenboard user.notice modbus: TRegisterHandler::Poll(): warning: Modbus error: failed to read 1 coil(s) @ 1 slave_id is 1(0x1)
Aug 4 09:34:38 wirenboard user.notice modbus: ERROR CRC received B844 != CRC calculated 9C5F
Aug 4 09:34:38 wirenboard user.notice modbus: [01][03][00][08][00][01][05][C8]
Aug 4 09:34:38 wirenboard user.notice modbus: Waiting for a confirmation…
Aug 4 09:34:38 wirenboard user.notice modbus: <00><01><03><02><00><00><44>

Естественно, контрольная сумма из-за этого не верна.

В этом случае - “Aug 4 09:34:38 wirenboard user.notice modbus: <00><01><01><01><00><51>” - вдобавок отсутствует последний байт.

Если подавать команды через seial_tool, то картина похожая:

root@wirenboard:/var/log# serial_tool /dev/ttyNSC0
serial_tool on /dev/ttyNSC0: 9600 8N1
Enter your commands below in HEX form.
All characters but 0-9,a-f including spaces are ignored.
Press Control-D or Control-C to leave the application.
Press [Enter] to print received data

010100010001ac0a
<< 00 01 01 01 00 51 88

010100010001ac0a
<< 00 01 01 01 00 51 88

01030008000105c8
<< 00 01 03 02 00 00 B8 44

Но при этом не пропадает последний байт.

Если подключаться через RS232 порт с конвертором, то всё нормально:

root@wirenboard:/var/log# serial_tool /dev/ttyNSC3
serial_tool on /dev/ttyNSC3: 9600 8N1
Enter your commands below in HEX form.
All characters but 0-9,a-f including spaces are ignored.
Press Control-D or Control-C to leave the application.
Press [Enter] to print received data

01030008000105c8
<< 01 03 02 00 00 B8 44

010100010001ac0a
<< 01 01 01 00 51 88

для наших периферийных устройств настройки 9600 8N2, а у вас 8N1. Возможно дело в этом. Другие приложения порт не занимают? Таких проблем никогда не видел.

В конфиге 2 стоп-бита:

{
    "debug": true,
    "ports": [
        {
            "path" : "/dev/ttyNSC3",
            "baud_rate": 9600,
            "parity": "N",
            "data_bits": 8,
            "stop_bits": 2,
            "poll_interval": 500,
            "enabled": true,
            "devices" : [
                {
                    "device_type" : "WB-MRM2",
                    "slave_id": 1,
                    "enabled": true
                }
            ]
        }
    ]
}

Пробовал на обоих портах rs485. Других приложений нет.

А на шине физически одно устройство?

Устройство одно.
Эффект стабильный, то есть воспроизводится однозначно.

Понятно. Хорошо бы конечно изолировать проблему: в NETMON/Linux это дело или в MR2. У вас есть просто переходник типа USB-RS-485, чтобы подключиться компьютером к Netmon ?

Переходник есть. С его помощью подключал WB-MRM2 к компьютеру с Windows - работает без проблем (через тестовую программу для modbus).

Провёл эксперимент:
подавал команды на реле в serial_tool и “подслушивал” через переходник rs232-rs485 в терминале

в serial_tool

01030008000105c8
<< 00 01 03 02 00 00 B8 44

010100010001ac0a
<< 00 01 01 01 00 51 88

не дописал ))

в serial_tool

01030008000105c8
<< 00 01 03 02 00 00 B8 44

010100010001ac0a
<< 00 01 01 01 00 51 88

в терминале:

01030008000105C80103020000B844010100010001AC0A010101005188

то есть в терминале ничего лишнего нет и ничего не пропадает.

Интересно, пытаемся воспроизвести. Скажите ещё пожалуйста, это у вас на обоих портах (и6 и и8) происходит или только на одном?

На обоих портах. Разницы не заметил.

Проблему нашли, но программного исправления пока нет, и не очень понятно будет ли.

Отправьте нам пожалуйста на support@ номер заказа - напишем про варианты ремонта/замены.

Коллеги, возникла проблема с установкой slave-адреса wb-mrm2:

root@wirenboard:/run# service wb-homa-modbus stop
root@wirenboard:/run# modbus_client -mrtu /dev/ttyNSC0 --debug -a0x0 -t0x06 -r0x80 -s2 -pnone 25
Data to write: 0x19
Opening /dev/ttyNSC0 at 9600 bauds (N, 8, 2)
[00][06][00][80][00][19][48][39]
Waiting for a confirmation...
ERROR Connection timed out: select
ERROR occured!

В чем может быть проблема?

Это фича, а не баг. Modbus - устройства, в соответствии со стандартом, не отвечают на широковещательные (адрес 0x0) запросы. Так что проверьте, адрес должен был поставиться, если вы подключили правильно и порт правильный. Железки ещё мигают светодиодом при получении правильной команды, можно на это смотреть.

Спасибо, Евгений! Действительо, фича. Адрес установился, все подцепилось и работает.