Возникла проблема с подключением 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 пробовал менять, не помогает):
Если вы меряете напряжение на линиях 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 обратно
Странно, что инициируется соединение с битом четности(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
Если подключаться через 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
для наших периферийных устройств настройки 9600 8N2, а у вас 8N1. Возможно дело в этом. Другие приложения порт не занимают? Таких проблем никогда не видел.
Понятно. Хорошо бы конечно изолировать проблему: в NETMON/Linux это дело или в MR2. У вас есть просто переходник типа USB-RS-485, чтобы подключиться компьютером к Netmon ?
Это фича, а не баг. Modbus - устройства, в соответствии со стандартом, не отвечают на широковещательные (адрес 0x0) запросы. Так что проверьте, адрес должен был поставиться, если вы подключили правильно и порт правильный. Железки ещё мигают светодиодом при получении правильной команды, можно на это смотреть.