Работа с увлажнителем Nordmann AT4

Здравствуйте! Есть увлажнитель Nordmann AT4 с поддержкой Modbus. Вот к нему мануал:

300120_TED_AT4_communication_interface_DE_EN_FR.pdf (648,5 КБ)

Пытаюсь прочитать setpoint контроллера. Согласно мануалу, это регистр номер 4, функция 0x03. На что мне приходит ответ:

root@wirenboard-AKQCRFMO:~# modbus_client --debug -mrtu -peven -s2 /dev/ttyRS485-2 -b9600 -a2 -t0x03 r4
0x88e4 Opening /dev/ttyRS485-2 at 9600 bauds (E, 8, 2)
[02][03][00][64][00][01][C5][E6]
Waiting for a confirmation...
<02><83><02><30><F1>
ERROR Illegal data address
ERROR occured!

На самом деле, чтение любого регистра командой 0x03 выдаёт ошибку:

root@wirenboard-AKQCRFMO:~# modbus_client --debug -mrtu -peven -s2 /dev/ttyRS485-2 -b9600 -a2 -t0x03 r5
0x58e4 Opening /dev/ttyRS485-2 at 9600 bauds (E, 8, 2)
[02][03][00][64][00][01][C5][E6]
Waiting for a confirmation...
<02><83><02><30><F1>
ERROR Illegal data address
ERROR occured!

Чтение же input выдаёт во всех регистрах 0x0002:

root@wirenboard-AKQCRFMO:~# modbus_client --debug -mrtu -peven -s2 /dev/ttyRS485-2 -b9600 -a2 -t0x04 r17
0x3000 Opening /dev/ttyRS485-2 at 9600 bauds (E, 8, 2)
[02][04][00][64][00][01][70][26]
Waiting for a confirmation...
<02><04><02><00><02><7C><F1>
SUCCESS: read 1 of elements:
        Data: 0x0002

root@wirenboard-AKQCRFMO:~# modbus_client --debug -mrtu -peven -s2 /dev/ttyRS485-2 -b9600 -a2 -t0x04 r32
0x3000 Opening /dev/ttyRS485-2 at 9600 bauds (E, 8, 2)
[02][04][00][64][00][01][70][26]
Waiting for a confirmation...
<02><04><02><00><02><7C><F1>
SUCCESS: read 1 of elements:
        Data: 0x0002

В чём может быть проблема? На шине никаких других устройств нет. Заранее спасибо!

Но зачем вы читаете го командой1 03? 3 - чтение holding регистра.

Допустил ошибку в изначальном сообщении, поправил, это holding

Дефолтные настройки modbus меняли? Какая сейчас настройка?

Нужно, что следует из документации 1 стопбит.
Но, собственно - почему четность Even стоит?

Раз отвечает, в принципе то и нормально. Но в таблицах я не вижу регистров holding 4 и 5.

Да, пробовали другие настройки выставить, поэтому они не дефолтные

Register: 3xxxx read only with Modbus function 04
Register: 4xxxx read with Modbus function 03 and write with Modbus function 06

root@wirenboard-AKQCRFMO:~# modbus_client --debug -mrtu -peven -s1 /dev/ttyRS485-2 -b9600 -a2 -t0x03 r4    
0x28e4 Opening /dev/ttyRS485-2 at 9600 bauds (E, 8, 1)
[02][03][00][64][00][01][C5][E6]
Waiting for a confirmation...
<02><83><02><30><F1>
ERROR Illegal data address
ERROR occured!
root@wirenboard-AKQCRFMO:~# modbus_client --debug -mrtu -peven -s1 /dev/ttyRS485-2 -b9600 -a2 -t0x03 r40005
0x3000 Opening /dev/ttyRS485-2 at 9600 bauds (E, 8, 1)
[02][03][00][64][00][01][C5][E6]
Waiting for a confirmation...
<02><83><02><30><F1>
ERROR Illegal data address
ERROR occured!
root@wirenboard-AKQCRFMO:~# modbus_client --debug -mrtu -peven -s1 /dev/ttyRS485-2 -b9600 -a2 -t0x03 r40004
0x3000 Opening /dev/ttyRS485-2 at 9600 bauds (E, 8, 1)
[02][03][00][64][00][01][C5][E6]
Waiting for a confirmation...
<02><83><02><30><F1>
ERROR Illegal data address
ERROR occured!

Ошибка, тут читается с какого попало адрса (в данном случае с 0x64)

Нет. Записывать надо именно **-**r

modbus_client --debug -mrtu -peven -s1 /dev/ttyRS485-2 -b9600 -a2 -t0x03 -r4    

Пример, верная запись:

modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -a38 -t0x03 -r 0x80 -c 1
Opening /dev/ttyRS485-1 at 9600 bauds (N, 8, 2)
[26][03][00][80][00][01][83][35]
Waiting for a confirmation...
<26><03><02><00><26><0D><99>
SUCCESS: read 1 of elements:
	Data: 0x0026 

Неверная:

modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -a38 -t0x03 r0x80 -c 1
0xf9b4 Opening /dev/ttyRS485-1 at 9600 bauds (N, 8, 2)
[26][03][00][64][00][01][C3][02]
Waiting for a confirmation...
<26><03><02><00><00><8C><43>
SUCCESS: read 1 of elements:
	Data: 0x0000 

Это небольшая деформация, когда начинаешь читать байты запроса-ответа наприямую. :slight_smile:

1 лайк

Хм, почему-то я умудрился потерять тире. Спасибо, вроде заработало, буду писать шаблон

1 лайк

Почему-то каждые 10-15 секунд вылезают восклицательные знаки у топиков и почти сразу пропадают. На шине ничего, кроме этого увлажнителя нет, на обеих концах терминирующие резисторы. Какой параметр подкрутить?

Параметры:


Read period у регистров по 1000мс у каждого

Логи

Это указывает на то, что не удается выдержать период опроса.
Установленные параметры опроса соответствуют ли расчетным для вашего количества регистров и параметров скорости шины?

Не понял, как мне рассчитать параметры для моего количества регистров и параметров скорости шины? Мои параметры опроса были выставлены методом научного тыка, буду рад, если вы меня научите их рассчитывать

Пришлите файл настройки wb-mqtt-serial. Будет понятнее, что конкретно вы настроили.

Как вы установили 1000 мс в read period для каждого регистра?

Я бы не устанавливал период опроса каждого регистра. А поставил бы период опроса для устройства и подбирал его. Начал бы с 1000 мс.

Это какой параметр? Read rate limit deprecated, я следую гайдлайнам и использую вместо него read period у каждого регистра.

wb-mqtt-serial.conf (10,2 КБ)

Response timeout (ms)

Если вы из интерфейса ставите период опроса каждому регистру, то там возможно выбрать только 200 мс или 100 мс (поэтому спрашиваю, как установили 1000 мс?). И в вашем случае это слишком часто на такой скорости шины.

Response timeout (ms) уже стоит 1000 мс, это и в шапке на скрине видно, и в конфиге.

Лайфхак: если нажать не на стрелочку, а на поле ввода, можно ввести любое число, чем я воспользовался и ввёл 1000 мс.

Так где и какие параметры мне поменять для теста?

Все-таки не понимаю целесообразности установки таймаута для регистров. Если стоит задача подобрать параметры обмена, чтобы они удовлетворяли возможностям устройства (увлажнителя) и обмен проходил без сбоев, то я бы подобрал вначале таймаут опроса устройства.

Проблема была решена убиранием из конфига и Read Period (ms) у регистров, и Response timeout (ms).

Правильно ли я понимаю, что Guard interval у порта и Additional delay before each writing to port у регистра это одно и то же?

Guard interval - для порта. Additional delay before each writing to port (us) — для устройства. Если на шине одно устройство, то тогда да.

Очень странное решение назвать одну функцию разными названиями

Эта тема была автоматически закрыта через 7 дней после последнего ответа. В ней больше нельзя отвечать.