Драйвер wb-mqtt-serial: настройка команд на регистры

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

Добавляю оборудование по RS-485.

После выставления всех настроек через вкладку settings у меня начинают работать команды чтения регистров. Все отлично.

Некоторые команды должны читать 2 байта информации. Для них я выставляю format “unsigned 16 bit integer”. Сообщение выглядит так (адрес устройства - х01, регистра - х70):

Write: 01 | 03 | 00 70 | 00 01 | 85 d1

Как видно, тут registry count равен 1.

Команды, читающие 4 байта информации тоже работают хорошо, если выставить format: “unsigned 32 bit integer”.

Write: 23 | 03 | 01 0E | 00 02 | A2 B6

Тут registry count равен 2.

Проблемы начинаются, когда команда требует registry count 3 (считывание 6 байт информации). Если я выставляю unsigned 64 bit integer, то формируется следующая команда:

Write: 01 | 03 | 00 68 | 00 04 | C5 D5

А мне не нужна х00 х04, мне нужна х00 х03!
Никаких очевидных решений своей проблемы я не нашел.
Драйвер wb-mqtt-serial не поддерживает нестандартные команды считывания n байт?

Команды просмотрены через log/messages.

And, добрый вечер!
Что у вас там такое странное хранится? По стандарту Holding-регистр хранит 16 бит.
24-битового holding-регистра не бывает. Скорее всего, у вас там два регистра подряд. Попробуйте с помощью modbus_client почитать.

Насколько я понял, у меня здесь 3 регистра подряд, которые нужно считывать. По 16 бит каждый. Прикрепляю фрагмент из документации по используемому оборудованию (SEAK Lumibox).

В консоли контроллера использую следующую команду:

modbus_client --debug -mrtu -pnone /dev/ttyRS485-1 -a1 -t0x03 -r104 -c3

(адрес устройства 1, команда х03, регистр х68 (переведен в 104), считываю 3 значения из него)

Получаю такой ответ:

Opening /dev/ttyRS485-1 at 9600 bauds (N, 8, 1)
[01][03][00][68][00][03][84][17]
Waiting for a confirmation…
<01><03><06><00><1B><00><00><00><00><45><77>
SUCCESS: read 3 of elements:
Data: 0x001b 0x0000 0x0000

Т.е. все считывается корректно. Проблема в том, что я никак не смог настроить считывание именно 3 значений с помощью драйвера wb-mqtt-serial. 1, 2 или 4 - запросто. А 3 - нет.

Добрый день!
А почему вы не хотите считать по отдельности 2+1 holding register?

Здравствуйте.
Потому что не понимаю, как это реализовать : )
Я пробовал добавить несколько channels в настройках девайса с одинаковым значением adress, пробовал поковырять параметр consists_of, но без особых успехов.
Подскажете, как?

Ну, у вас есть три регистра на самом деле, 104, 105 и 106, в каждом — свое значение температуры, для L1, L2 и L3. Просто опишите в шаблоне устройства три отдельных контрола.

Нет, к сожалению это не сработало. Драйвер выдает значение null, а modbus-client выдает ошибку, если опрашивать только 1 регистр по отдельности, а не 3 сразу:

Не исключено, что это специфика оборудования, с которым я работаю. Пока что настроил чтение 3 значений через modbus-client, получилось вполне удобно.

Да, похоже на специфику устройства. А вы сейчас modbus_client вызываете из движка правил?

Нет, моя система более костыльная - я работаю с modbus-client с собственного windows-приложения, присоединяющегося к wiren board по SSH.

Команды выше я проверял через WinSCP.

Но через, например,
runShellCommand(“service wb-mqtt-serial stop”);
runShellCommand(“modbus_client -mrtu -pnone /dev/ttyRS485-1 -a1 -t0x10 -r0 -c1 100”);
написанный в движке правил, команды записи на устройство тоже идут.

включите пожалуйста отладку в настройках, посмотрите какие реально запросы отправляет наш модуль wb-mqtt-serial.

Вообще wb-mqtt-serial должен обьединять подряд идущие регистры и читать их одним запросом. Возможно дело как раз в том, что он обьединяет слишком много, и читает, например, ещё следующий или предыдущий регистр. В конфиге есть настройка, определяющая максимальное количество регистров для обьединения. Возможно если с ней поиграть, то получится сделать как нужно.

В самом деле, мне помогла опция “Max read registers”.
Из своих тестов я установил, что драйвер читает 1, 2 или 4 значения, в зависимости от установок регистра. Max read registers объединяет эти значения в одно, если может.
Причем интересно, что он объединяет (1+2) и (1+1+1) значения, но отказывается объединять (2+1). Возможно, поэтому у меня не получилось сходу решить вопрос, т.к. я помню, что уже игрался с максимальным количеством регистров ранее.

Я создал 2 регистра:
104, с настройкой “Unsigned 16 int” (1 значение)
105, с настройкой “Unsigned 32 int” (2 значения)

И установил max read registers в 3.

Теперь он, наконец, посылает следующую команду:
modbus: read 3 holding(s) @ 104 of device modbus:1
Write: 01 03 00 68 00 03 84 17
ReadFrame: 01 03 06 00 1E 00 00 00 00 89 77

Т.е. получает значения х001E, х0000 и х0000. Это соответствует результатам через modbus_client с консоли, которые я публиковал выше.

Меня смущает только тот факт, что в моей документации к устройству в регистре 105 указан уже другой запрос. При том что протестировать этот запрос я не могу.

Всем спасибо за помощь!

1 Like