Термостат Keveno T302

Доброго дня. Подключаю вот такой термостат: http://www.keveno.com/?cat=109 по RS485.
Если верить мурзилке, должен по адресу 40002, например, отдавать Holding либо Input с состоянием вкл/выкл:
Пробую запросить:
root@wirenboard:/usr/share/wb-mqtt-serial/templates# modbus_client -mrtu --debug -s2 -pnone /dev/ttyAPP1 -t0x03 -r40000 -a2 19
0x0013 Opening /dev/ttyAPP1 at 9600 bauds (N, 8, 2)
[02][03][9C][40][00][01][AB][BD]
Waiting for a confirmation…
ERROR Connection timed out: select
ERROR occured!
root@wirenboard:/usr/share/wb-mqtt-serial/templates# modbus_client -mrtu --debug -s2 -pnone /dev/ttyAPP1 -t0x04 -r40000 -a2 19
0x0013 Opening /dev/ttyAPP1 at 9600 bauds (N, 8, 2)
[02][04][9C][40][00][01][1E][7D]
Waiting for a confirmation…
ERROR Connection timed out: select
ERROR occured!

ЧЯДНТ?

В мурзилке указаны не адреса, а номера регистров. К примеру, 40002 - это holding register с адресом 1. А вы вколачиваете целиком.

Вы говорите странное. 40000 + что-то - это просто схема нумерации, с точки зрения модбаса это всё ещё регистр с адресом 40002.

@Mikhail_Morev, адрес (который параметром -a) взяли откуда? На этом порту wb-mqtt-serial у вас не запущен?
Стоп-битов (-s) рекомендую поставить 1.

Адрес 19 задал с кнопок на термостате.
Утром попробую с 1 стоп-битом. Что значит “mqtt-serial не запущен на порту”? В настройках ttyAPP1 - enabled.

  1. выполните пожалуйста modbus_client без параметров и внимательно прочитайте справку. Вы даёте команде случайные числа в качестве аргументов случайных параметров и ожидаете, что оно будет работать.

  2. ну вот enabled, значит не только вы из консоли с портом общаетесь, но ещё и wb-mqtt-serial. А так нельзя. Опустите его перед работой

    service wb-mqtt-serial stop

М, да, перепутал параметры.
На свежую голову все получилось:

# modbus_client -mrtu -a19 -0 -r0x40002 -t3 -pnone /dev/ttyAPP1
SUCCESS: read 1 of elements:
Data: 0x0001

В мурзилке адреса регистров неверные оказались. Начальный адрес, действительно, 40001, но только это 40001hex, а все последующие адреса идут как десятичные (40010, 40011…40125), а на самом деле - 4000a, 4000b…4007d. Ну да ладно.

Вопрос. Какой параметр в веб-интерфейсе и/или в JSON-темплейте соответствует параметру -0 команды modbus_client? А то приходится еще и на единицу сдвигать адреса.

ничего не понимаю. В веб-интерфейсе вы задаёте абсолютный адрес регистра. В hex или в десятичном - это как хотите.

Я не знаю, как это объяснить по умному. У меня адрес первого регистра - 40001, но если я к нему обращаюсь по адресу 40001, в ответ получаю данные из регистра 40002. В хелпе команды modbux_client есть параметр “-0” (“NOTE: if first reference address starts at 0, set -0”), с которым я обращаюсь к регистру 40001 и получаю данные из 40001. В веб-интерфейсе, чтобы обратиться к регистру, например, 40020, мне нужно вписывать в конфиг 4001F - сбивает с толку.

-0 - это видимо опция для девайсов вроде того, с которым вы работаете, создатели которых странно поняли стандарт. Она из адреса, который вы ей даёте, просто вычитает единичку.

Поэтому если в вашем устройстве регистры сдвинуты на один, то вычитайте единичку сами, когда пишете конфиг и всё будет работать.

Да, я так и делаю уже. Так, на всякий случай спросил.

Может быть, все-таки, поэтому:
http://asutp-kaskad.narod.ru/documents/modbus/modbus.zip

Цитата:
Data Addresses in Modbus Messages
All data addresses in Modbus messages are referenced to zero. The first
occurrence of a data item is addressed as item number zero. For example:

  • The coil known as ‘coil 1’ in a programmable controller is addressed as coil
    0000 in the data address field of a Modbus message.
  • Coil 127 decimal is addressed as coil 007E hex (126 decimal).
  • Holding register 40001 is addressed as register 0000 in the data address field
    of the message. The function code field already specifies a ‘holding register’
    operation. Therefore the ‘4XXXX’ reference is implicit.
  • Holding register 40108 is addressed as register 006B hex (107 decimal).