Шаблон для Siemens RDF302

Здравствуйте! В своих проектах частенько используем Siemens RDF302. Решил облагородить конфиг и написать шаблон со всеми регистрами. Пока что не могу справиться с регистрами номер 1, 9, 24-27, 48 (По мануалу). Что я делаю не так, и как правильно их настроить?

Siemens modbus manual.pdf (852.9 КБ)

Скорректированная версия шаблона Siemens RDF302:
config-siemens-rdf302.json (14.8 KB)

Здравствуйте! А что именно не получается? Пришлите логи сервиса wb-mqtt-serial и скриншот со страницы Devices.

С виду все правильно

            {
              "address" : "0",
              "max" : "4",
              "name" : "P01",
              "reg_type" : "holding",
              "type" : "range"
            },
...
             {
              "address" : "599",
              "enabled" : true,
              "name" : "System Time",
              "reg_type" : "holding_multi",
              "type" : "value"
            },

Попробуйте считать данные регистры утилитой modbus_client.

Вчера спешил написать пост под вечер, не успел доп. инфу прикрепить, извиняюсь.

Ну, если с виду всё правильно, то вот:

image
image

root@wirenboard-A2T6NRMB:~# service wb-mqtt-serial stop

root@wirenboard-A2T6NRMB:~# modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -b9600 -a2 -t0x03 -r599
Opening /dev/ttyRS485-1 at 9600 bauds (N, 8, 2)
[02][03][02][57][00][01][34][51]
Waiting for a confirmation...
<02><83><02><30><F1>
ERROR Illegal data address
ERROR occured!

root@wirenboard-A2T6NRMB:~# modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -b9600 -a2 -t0x04 -r1099
Opening /dev/ttyRS485-1 at 9600 bauds (N, 8, 2)
[02][04][04][4B][00][01][40][DF]
Waiting for a confirmation...
<02><84><02><32><C1>
ERROR Illegal data address
ERROR occured!

На скриншоте адрес у термостата 6, а когда запрашиваете командами, то указываете адрес 2. Попробуйте тоже с адресом 6. Если утилитой modbus_client не получается считать регистр, то и драйвер wb-mqtt-serial эти регистры считать не сможет.

Приведите пример успешного считывания через modbus_client и неуспешного.

Там три одинаковых термостата, вот для уверенности:

root@wirenboard-A2T6NRMB:~# modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -b9600 -a6 -t0x03 -r599
Opening /dev/ttyRS485-1 at 9600 bauds (N, 8, 2)
[06][03][02][57][00][01][35][D5]
Waiting for a confirmation...
<06><83><02><71><30>
ERROR Illegal data address
ERROR occured!

Приведите пример успешного считывания через modbus_client и неуспешного.

root@wirenboard-A2T6NRMB:~# modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -b9600 -a6 -t0x03 -r100 
Opening /dev/ttyRS485-1 at 9600 bauds (N, 8, 2)
[06][03][00][64][00][01][C4][62]
Waiting for a confirmation...
<06><03><02><00><01><CC><44>
SUCCESS: read 1 of elements:
        Data: 0x0001

Кстати, если попробовать прочитать работающий регистр неправильной функцией (например, 0x03 вместо 0x04), то выдаётся такое же сообщение:

root@wirenboard-A2T6NRMB:~# modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -b9600 -a6 -t0x03 -r1002
Opening /dev/ttyRS485-1 at 9600 bauds (N, 8, 2)
[06][03][03][EA][00][01][A4][0D]
Waiting for a confirmation...
<06><83><02><71><30>
ERROR Illegal data address
ERROR occured!
root@wirenboard-A2T6NRMB:~# modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -b9600 -a6 -t0x04 -r1002
Opening /dev/ttyRS485-1 at 9600 bauds (N, 8, 2)
[06][04][03][EA][00][01][11][CD]
Waiting for a confirmation...
<06><04><02><04><74><0E><17>
SUCCESS: read 1 of elements:
        Data: 0x0474

По какой причине регистры могут не читаться даже modbus_client?

Пока не могу точно сказать. Попробуйте прочитать сразу 4 байта за раз (все данные даты и времени):

modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -b9600 -a6 -t0x03 -r599 -c4
root@wirenboard-A2U5UM2D:~# service wb-mqtt-serial stop
root@wirenboard-A2U5UM2D:~# modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -b9600 -a6 -t0x03 -r599 -c4
Opening /dev/ttyRS485-1 at 9600 bauds (N, 8, 2)
[06][03][02][57][00][04][F5][D6]
Waiting for a confirmation...
<06><03><08><00><00><00><00><00><00><00><00><8F><A3>
SUCCESS: read 4 of elements:
        Data: 0x0000 0x0000 0x0000 0x0000

То есть целиком 4 регистра читаются.
Тогда в шаблон можно добавить формат u64, чтобы читались все 4 регистра за раз:

             {
              "address" : "599",
              "enabled" : true,
              "name" : "System Time",
              "reg_type" : "holding_multi",
              "format": "u64",
              "type" : "value"
            },

Хорошо, с объектом №1 разобрались.

root@wirenboard-A2T6NRMB:~# modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -b9600 -a6 -t0x04 -r199 -c4
Opening /dev/ttyRS485-1 at 9600 bauds (N, 8, 2)
[06][04][00][C7][00][04][41][83]
Waiting for a confirmation...
<06><84><02><73><00>
ERROR Illegal data address
ERROR occured!

С 9 тоже разобрался, его читаю этой функцией:

root@wirenboard-A2T6NRMB:~# modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -b9600 -a6 -t0x04 -r1099 -c10
Opening /dev/ttyRS485-1 at 9600 bauds (N, 8, 2)
[06][04][04][4B][00][0A][00][9C]
Waiting for a confirmation...
<06><04><14><4E><6F><20><66><61><75><6C><74><20><20><20><20><20><20><20><20><20><20><20><00><18><3B>
SUCCESS: read 10 of elements:
        Data: 0x4e6f 0x2066 0x6175 0x6c74 0x2020 0x2020 0x2020 0x2020 0x2020 0x2000

24-27:

root@wirenboard-A2T6NRMB:~# modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -b9600 -a6 -t0x03 -r199 -c10
Opening /dev/ttyRS485-1 at 9600 bauds (N, 8, 2)
[06][03][00][C7][00][0A][75][87]
Waiting for a confirmation...
<06><03><14><43><6F><6E><64><65><6E><73><61><74><69><6F><6E><20><69><6E><20><72><6F><6F><6D><A6><91>
SUCCESS: read 10 of elements:
        Data: 0x436f 0x6e64 0x656e 0x7361 0x7469 0x6f6e 0x2069 0x6e20 0x726f 0x6f6d

Как добавить в шаблон такое?

И ещё что-то непонятное с регистром номер 48 (P38/P40):

root@wirenboard-A2T6NRMB:~# modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -b9600 -a6 -t0x03 -r37     
Opening /dev/ttyRS485-1 at 9600 bauds (N, 8, 2)
[06][03][00][25][00][01][94][76]
Waiting for a confirmation...
<06><03><02><03><01><CC><B4>
SUCCESS: read 1 of elements:
        Data: 0x0301

По мануалу там два байта, как я понял. Как разделить для правильного считывания и уставки?

Такие массивы данных драйвер читать пока не может. Довольно редкий случай, когда это необходимо. Попробуйте прочитать по частям за 4 раза:

modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -b9600 -a6 -t0x04 -r1099 -c4
modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -b9600 -a6 -t0x04 -r1103 -c4
modbus_client --debug -mrtu -pnone -s2 /dev/ttyRS485-1 -b9600 -a6 -t0x04 -r1107 -c2

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

Попробуйте указать в шаблоне таким образом:

            {
                "name": "P38",
                "reg_type": "holding",
                "address": "37:0:8",
                "type": "range",
                "format": "u16",
            },
            {
                "name": "P40",
                "reg_type": "holding",
                "address": "37:8:8",
                "type": "range",
                "format": "u16",
            },

В результате будут 2 канала, в одном будет младший байт регистра, в другом - старший.

Не надо останавливать. Любое преобразование байт можно сделать в правилах.

Я так понимаю, не могу редактировать свой первый пост, убрал очепятку в названии одного из регистров.

config-siemens-rdf302.json (14.8 КБ)

1 лайк

Заменил шаблон в первом посте на исправленный из последнего сообщения. Спасибо, что делитесь своими наработками!