Wiren Board 6 - Modbus RTU

Добрый день!

Можно ли наладить опрос регистров Wiren Board 6 посредством modbus RTU, подключив через RS-485 имеющийся на плате?

Спасибо.

Добрый день.
Можно, но писать реализацию придется самому. А какая цель? Если требуется опросить именно по Modbus - то целесообразней выбрать Modbus TCP, настроив по инструкции:

Инструкцию видел, спасибо.

Цель - использовать всё же modbus RTU. Мы работаем с ним, у нас очень много оборудования подключено. И использование modbus TCP крайне не желательно.

Собственно - в самом контроллере регистров как таковых - нет, все хранитсяся в MQTT
Поэтому - для доступа к контроллре в режиме “slave” надо создавать “виртуальные регистры”, делать таблицу сопоставления параметр-номер_регистра. Так в wb-mqtt-mbgate и сделано.

Добрый день!

Присоединяюсь к тому, что написал коллега.
Хочу только дополнить, что хотя готового решения из коробки действительно пока нет, есть вот такой вариант: Siemens<-ModBus->WB - на ваш страх и риск.

Когда это появится в основном ПО, зависит от того, как часто это требуется клиентам. Может быть, вы подскажете какие-нибудь частые сценарии использования?

Коллеги, н осам по себе WB6 умеет работать, как modbus RTU slave? Или только modbus TCP и никак иначе, а дальше уже конвертация в RTU?

Умеет. Реализуется эта возможность - веткой “rtu_support” проекта


Как раз wb-mqtt-mbgate - отвечает за работу контроллера как modbus-slave. В основной ветке - как modbus rtu TCP.
Эта функциональность разработана давно, но не очень востребована (была, по райней мере).
Если она вам нужна - включим ее в master.

Спасибо, коллеги.

Ветка включена в master.

А скиньте пример пожалуйста пример конфига mbgate modbus rtu с привязкой к порту RS485-2 и к примеру опросом одного холдинг регистра. А также интересует для холдинг регистров режим - только чтение.

Сейчас для установки пакета wb-mqtt-mbgate нужно выполнить:

  1. Подключаем experimental
echo "deb http://releases.contactless.ru/experimental/stretch stretch main" > /etc/apt/sources.list.d/experim.list
  1. Обновляем индекс и ставим
apt update
apt install wb-mqtt-mbgate=0.3.0

Через некоторое время мы включим пакет в основной репозиторий, поэтому правильная версия wb-mqtt-mbgate будет либо уже предустановлена на контроллера, либо устанавливаться через

apt update
apt install wb-mqtt-mbgate

Инструкция по настройке здесь: Шлюз Modbus RTU/TCP — Wiren Board.
Мы следуем спецификации Modbus, поэтому значения в Holding Register можно менять. Для значений, которое нельзя менять, можно создать Input Register.
А какая у вас задача?

root@wirenboard-AK476JRE:~# echo "deb http://releases.contactless.ru/experimental stretch main" > /etc/apt/sources.list.d/experim.list
root@wirenboard-AK476JRE:~# apt update
Ign:1 http://deb.debian.org/debian stretch InRelease
Get:3 http://deb.debian.org/debian stretch-updates InRelease [93.6 kB]
Get:4 http://security.debian.org stretch/updates InRelease [53.0 kB]
Get:2 http://cdn-fastly.deb.debian.org/debian stretch-backports InRelease [91.8 kB]
Hit:5 http://releases.contactless.ru/stable/stretch stretch InRelease
Get:6 http://releases.contactless.ru/experimental stretch InRelease [18.5 kB]
Get:7 http://security.debian.org stretch/updates/main armhf Packages [627 kB]
Hit:8 http://deb.debian.org/debian stretch Release
Get:10 http://security.debian.org stretch/updates/main Translation-en [293 kB]
Get:6 http://releases.contactless.ru/experimental stretch InRelease [18.5 kB]
Fetched 1160 kB in 5min 4s (3805 B/s)
Reading package lists... Done
Building dependency tree
Reading state information... Done
19 packages can be upgraded. Run 'apt list --upgradable' to see them.
root@wirenboard-AK476JRE:~# apt install wb-mqtt-mbgate=0.3.0
Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Version '0.3.0' for 'wb-mqtt-mbgate' was not found
root@wirenboard-AK476JRE:~# apt install wb-mqtt-mbgate
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages will be upgraded:
  wb-mqtt-mbgate
1 upgraded, 0 newly installed, 0 to remove and 18 not upgraded.
Need to get 41.1 kB of archives.
After this operation, 15.4 kB disk space will be freed.
Get:1 http://releases.contactless.ru/stable/stretch stretch/main armhf wb-mqtt-mbgate armhf 0.2.2 [41.1 kB]
Fetched 41.1 kB in 8s (4684 B/s)
(Reading database ... 28366 files and directories currently installed.)
Preparing to unpack .../wb-mqtt-mbgate_0.2.2_armhf.deb ...
Unpacking wb-mqtt-mbgate (0.2.2) over (0.1.4) ...
Setting up wb-mqtt-mbgate (0.2.2) ...
Created symlink /etc/systemd/system/multi-user.target.wants/wb-mqtt-mbgate.service → /lib/systemd/system/wb-mqtt-mbgate.service.
root@wirenboard-AK476JRE:~#

Отсутствует пакет E: Version ‘0.3.0’ for ‘wb-mqtt-mbgate’ was not found для данного репозитоия

Только что проверил.
Что у вас возвращает

apt policy wb-mqtt-mbgate
root@wirenboard-AK476JRE:~# apt policy wb-mqtt-mbgate
wb-mqtt-mbgate:
  Installed: 0.2.2
  Candidate: 0.2.2
  Version table:
 *** 0.2.2 990
        990 http://releases.contactless.ru/stable/stretch stretch/main armhf Packages
        100 /var/lib/dpkg/status
     0.1.4 990
        990 http://releases.contactless.ru/stable/stretch stretch/main armhf Packages
     0.1.3 990
        990 http://releases.contactless.ru/stable/stretch stretch/main armhf Packages
     0.1.2 990
        990 http://releases.contactless.ru/stable/stretch stretch/main armhf Packages
     0.1.1 990
        990 http://releases.contactless.ru/stable/stretch stretch/main armhf Packages
root@wirenboard-AK476JRE:~#

Указан источник, но список не читается?

cat /var/lib/apt/lists/releases.contactless.ru_experimental_*_Packages |grep wb-mqtt-mbgate |awk '{print $2}'

Добавьте пожалуйста так:

echo "deb http://releases.contactless.ru/experimental/stretch stretch main" > /etc/apt/sources.list.d/experim.list

Ошибочно опубликовали неверный репозиторий.

Спасибо! Теперь всё работает!

1 лайк

Хотел уточнить еще почему значения переданные через модбас не меняют значения фактически в MQTT топиках. Возможно я где то ошибся в правке конфига.

{
 "debug": true, 
 "modbus": {
  "parity": "N", 
  "stop_bits": 1, 
  "baud_rate": 9600, 
  "path": "/dev/ttyRS485-2", 
  "data_bits": 8, 
  "type": "rtu"
 }, 
 "mqtt": {
  "host": "localhost", 
  "port": 1883
 }, 
 "registers": {
  "remap_values": false, 
  "holdings": [
   {
    "scale": 1, 
    "byteswap": false, 
    "format": "signed", 
    "max": 0, 
    "address": 0, 
    "enabled": true, 
    "topic": "wb-modbus-1-0/pressure", 
    "meta_type": "value", 
    "unitId": 1, 
    "wordswap": false, 
    "size": 2
   }, 
   {
    "scale": 1, 
    "byteswap": false, 
    "format": "signed", 
    "max": 0, 
    "address": 1, 
    "enabled": true, 
    "topic": "dev_temp/t1", 
    "meta_type": "value", 
    "unitId": 1, 
    "wordswap": false, 
    "size": 2
   }, 
   {
    "scale": 1, 
    "byteswap": false, 
    "format": "signed", 
    "max": 0, 
    "address": 2, 
    "enabled": true, 
    "topic": "wb-gpio/A2_OUT", 
    "meta_type": "value", 
    "unitId": 1, 
    "wordswap": false, 
    "size": 2
   }, 
   {
    "scale": 1, 
    "byteswap": false, 
    "format": "signed", 
    "max": 0, 
    "address": 3, 
    "enabled": true, 
    "topic": "wb-gpio/A3_OUT", 
    "meta_type": "value", 
    "unitId": 1, 
    "wordswap": false, 
    "size": 2
   }, 
   {
    "scale": 1, 
    "byteswap": false, 
    "format": "signed", 
    "max": 0, 
    "address": 4, 
    "enabled": true, 
    "topic": "vdev/maxP", 
    "meta_type": "range", 
    "unitId": 1, 
    "wordswap": false, 
    "size": 2
   }, 
   {
    "scale": 1, 
    "byteswap": false, 
    "format": "signed", 
    "max": 0, 
    "address": 5, 
    "enabled": true, 
    "topic": "vdev/minP", 
    "meta_type": "range", 
    "unitId": 1, 
    "wordswap": false, 
    "size": 2
   }, 
   {
    "scale": 1, 
    "byteswap": false, 
    "format": "signed", 
    "max": 0, 
    "address": 6, 
    "enabled": true, 
    "topic": "vdev/maxT", 
    "meta_type": "range", 
    "unitId": 1, 
    "wordswap": false, 
    "size": 2
   }, 
   {
    "scale": 1, 
    "byteswap": false, 
    "format": "signed", 
    "max": 0, 
    "address": 7, 
    "enabled": true, 
    "topic": "vdev/minT", 
    "meta_type": "range", 
    "unitId": 1, 
    "wordswap": false, 
    "size": 2
     }
  ]
 }
}

К примеру меняю значение в 7ом регистре modbus holding для топика vdev/minT. По modbus я меняю и считываю что значение поменялось. А вот значение самого топика не меняется в веб консоли не меняется, через протокол MQTT значения меняются. тип данных в структуре топика value(ro) там же в веб консоли. RO это только для чтения?

Так, воспроизведу.

Да.
В этом, скорее всего, и причина проблемы: wb-mqtt-mbgate успешно получает значение, пытается его писать в топик .../on, но так как топик readonly, значения из него никто не слушает.