После выставления всех настроек через вкладку 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 байт?
And, добрый вечер!
Что у вас там такое странное хранится? По стандарту Holding-регистр хранит 16 бит.
24-битового holding-регистра не бывает. Скорее всего, у вас там два регистра подряд. Попробуйте с помощью modbus_client почитать.
Насколько я понял, у меня здесь 3 регистра подряд, которые нужно считывать. По 16 бит каждый. Прикрепляю фрагмент из документации по используемому оборудованию (SEAK Lumibox).
Т.е. все считывается корректно. Проблема в том, что я никак не смог настроить считывание именно 3 значений с помощью драйвера wb-mqtt-serial. 1, 2 или 4 - запросто. А 3 - нет.
Здравствуйте.
Потому что не понимаю, как это реализовать : )
Я пробовал добавить несколько channels в настройках девайса с одинаковым значением adress, пробовал поковырять параметр consists_of, но без особых успехов.
Подскажете, как?
Ну, у вас есть три регистра на самом деле, 104, 105 и 106, в каждом — свое значение температуры, для L1, L2 и L3. Просто опишите в шаблоне устройства три отдельных контрола.
Нет, к сожалению это не сработало. Драйвер выдает значение null, а modbus-client выдает ошибку, если опрашивать только 1 регистр по отдельности, а не 3 сразу:
Нет, моя система более костыльная - я работаю с 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 указан уже другой запрос. При том что протестировать этот запрос я не могу.