Есть WIren Board 6. Подскажите, как можно сделать так, например по Ethernet на порт 503 пришло A3 03 00 03 00 02 AB C5 и это необходимо перебросить во 2й порт RS-485 и потом ответ перебросить обратно по Ethernet
Что для этого потребуется?
Есть WIren Board 6. Подскажите, как можно сделать так, например по Ethernet на порт 503 пришло A3 03 00 03 00 02 AB C5 и это необходимо перебросить во 2й порт RS-485 и потом ответ перебросить обратно по Ethernet
Что для этого потребуется?
Добрый день, Asu!
А откуда пришло, по какому протоколу доставлялись эти байты?
Возможно, вы сможете решить задачу с использованием socat, тут пример у нас есть:
https://wirenboard.com/wiki/index.php/Доступ_к_порту_RS-485_контроллера_Wiren_Board_с_компьютера
Данные пришли и Modbus-подобного протокола. В варианте, который Вы предложили написано - service wb-mqtt-serial stop, а wb-mqtt-serial тоже необходимо.
Да и PC под управлением Windows. Нужно какое-то другое решение
Если wb-mqtt-serial не использует второй порт, то останавливать wb-mqtt-serial не потребуется. И PC в вашем варианте не задействуется, только контроллер. Вопрос в том, поддерживает ли устройство, которое шлет данные по TCP, работу с последовательным портом по TCP. Кто в вашей схеме будет выступать Modbus-мастером?
А зачем ему поддерживать работу с последовательным портом?
ОРС-сервер отправляет данные по TCP, к примеру 0A 03 30 30 30 30 A1 B1. Эта посылка перебрасывается в RS-485 и ожидает ответа. Когда устройство подключённое по RS-485 отвечает, его ответ отправляется обратно по TCP.
В данном варианте контроллер используется как преобразователь интерфейсов TCP в RS485
Modbus-мастер - PC
Если вам нужно читать не слишком большое количество устройств и их регистров, то проще добавить их все в настройках wb-mqtt-serial. Тогда контроллер сам будет автоматически их опрашивать.
В таком случае не нужно будет посылать modbus-команды на контроллер вовсе, достаточно будет опрашивать указанные значения. Я этого добился собственной программкой на C#, использующей библиотеку MQTTnet:
Если этот вариант не подходит, то можно формировать команду с помощью modbus-client. Например, эта команда соответствует запросу из первого поста:
modbus_client -mrtu /dev/ttyRS485-2 -a0xa3 -t0x03 -r0x03 -c0x02
Ответ сразу транслируется в консоль, удобно его обрабатывать.
С компьютера я опрашивал контроллер, опять же, с помощью сторонней библиотеки:
Наконец, можно формировать команду через wb-rules непосредственно на контроллере:
runShellCommand("/usr/bin/printf ‘\xa3\x03\x00\x03\x00\x02\xab\xc5’ >/dev/ttyRS485-2");
Сформированные мной команды корректно обрабатывались портом, но у меня не получилось научить его считывать ответы с порта (нужно использовать runshellcommand и cat / socat?). Если это возможно сделать, то вашу задачу можно решить используя только wb-rules, без дополнительных надстроек в виде программ. Достаточно написать правило, которое будет: