Из Ethernet в порт RS-485


#1

Есть WIren Board 6. Подскажите, как можно сделать так, например по Ethernet на порт 503 пришло A3 03 00 03 00 02 AB C5 и это необходимо перебросить во 2й порт RS-485 и потом ответ перебросить обратно по Ethernet

Что для этого потребуется?


#2

Добрый день, Asu!
А откуда пришло, по какому протоколу доставлялись эти байты?
Возможно, вы сможете решить задачу с использованием socat, тут пример у нас есть:
https://wirenboard.com/wiki/index.php/Доступ_к_порту_RS-485_контроллера_Wiren_Board_с_компьютера


#3

Данные пришли и Modbus-подобного протокола. В варианте, который Вы предложили написано - service wb-mqtt-serial stop, а wb-mqtt-serial тоже необходимо.

Да и PC под управлением Windows. Нужно какое-то другое решение


#4

Если wb-mqtt-serial не использует второй порт, то останавливать wb-mqtt-serial не потребуется. И PC в вашем варианте не задействуется, только контроллер. Вопрос в том, поддерживает ли устройство, которое шлет данные по TCP, работу с последовательным портом по TCP. Кто в вашей схеме будет выступать Modbus-мастером?


#5

А зачем ему поддерживать работу с последовательным портом?
ОРС-сервер отправляет данные по TCP, к примеру 0A 03 30 30 30 30 A1 B1. Эта посылка перебрасывается в RS-485 и ожидает ответа. Когда устройство подключённое по RS-485 отвечает, его ответ отправляется обратно по TCP.
В данном варианте контроллер используется как преобразователь интерфейсов TCP в RS485
Modbus-мастер - PC


#6

Если вам нужно читать не слишком большое количество устройств и их регистров, то проще добавить их все в настройках 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, без дополнительных надстроек в виде программ. Достаточно написать правило, которое будет:

  • читать ethernet-порт,
  • получать значения, вставлять их в вышеуказанную команду,
  • запускать команду,
  • получать ответ RS-485-2 порта,
  • аналогичной командой посылать ответ в ethernet-порт.