Здравствуйте! В своих проектах частенько используем 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.
Explorerol:
С виду все правильно
Вчера спешил написать пост под вечер, не успел доп. инфу прикрепить, извиняюсь.
Ну, если с виду всё правильно, то вот:
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 канала, в одном будет младший байт регистра, в другом - старший.
Explorerol:
Такие массивы данных драйвер читать пока не может. Довольно редкий случай, когда это необходимо. Попробуйте прочитать по частям за 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-ти регистров.
Не надо останавливать. Любое преобразование байт можно сделать в правилах.
Я так понимаю, не могу редактировать свой первый пост, убрал очепятку в названии одного из регистров.
config-siemens-rdf302.json (14.8 КБ)
1 лайк
Заменил шаблон в первом посте на исправленный из последнего сообщения. Спасибо, что делитесь своими наработками!