У меня есть два китайских реле с управлением по Modbus: одно одноканальное, второе- двухканальное.
Они успешно управляются через modbus_client
, согласно инструкции.
Например, включение реле 2 двухканального реле с адресом 0x12:
$ modbus_client --debug -mrtu -pnone -s1 /dev/ttyRS485-2 -a0x12 -t0x05 -r0x01 1
Data to write: 0x1
Opening /dev/ttyRS485-2 at 9600 bauds (N, 8, 1)
[12][05][00][01][FF][00][DF][59]
Waiting for a confirmation...
<12><05><00><01><FF><00><DF><59>
SUCCESS: written 1 elements!
выключение:
$ modbus_client --debug -mrtu -pnone -s1 /dev/ttyRS485-2 -a0x12 -t0x05 -r0x01 0
Data to write: 0x0
Opening /dev/ttyRS485-2 at 9600 bauds (N, 8, 1)
[12][05][00][01][00][00][9E][A9]
Waiting for a confirmation...
<12><05><00><01><00><00><9E><A9>
SUCCESS: written 1 elements!
Завёл шаблон устройства:
{
"device_type": "China Modbus 2-ch Relay",
"device": {
"name": "China Modbus 2-ch Relay",
"id": "china-mb-2-ch-relay",
"max_read_registers": 8,
"response_timeout_ms": 1,
"frame_timeout_ms": 8,
"poll_interval": 100,
"channels": [
{
"name": "Relay 1",
"reg_type": "coil",
"address": 0,
"type": "switch"
},
{
"name": "Relay 2",
"reg_type": "coil",
"address": 1,
"type": "switch"
}
]
}
}
Добавил в интерфейс, появляется устройство, кнопки включают-выключают реле, но надписи отображаются красным
и состояние реле не считывается (если остановить службу wb-mqtt-serial, изменить состояние реле, и запустить службу опять).
в логах видно, что считывается два coil-а:
DEBUG: [port] Sleep 0 us
DEBUG: [port] Write: 12 01 00 00 00 02 bf 68
DEBUG: [port] Sleep 9000 us
WARNING: [modbus] failed to read 2 coil(s) @ 0 of device modbus:0x12: Serial protocol error: request timed out
это то же самое, что
modbus_client --debug -mrtu -pnone -s1 /dev/ttyRS485-2 -a0x12 -t0x01 -r0x00 -c 2
Opening /dev/ttyRS485-2 at 9600 bauds (N, 8, 1)
[12][01][00][00][00][02][BF][68]
Waiting for a confirmation...
ERROR Connection timed out: select
ERROR occured!
однако, чтение статуса (п.10 в документации выше):
10,read device address (тут правда, ошибка копи-пасты: должно быть read device status, полагаю)
send:FF 01 00 00 00 08 28 12
return :FF 01 01 01 A1 A0
remarks:The 4th byte of the Return frame,the Bit0–Bit7 of 0x01 representing relay 1-relay 8, 0 is turn off .1 is turn on.
т.е.
modbus_client --debug -mrtu -pnone -s1 /dev/ttyRS485-2 -a0x12 -t0x01 -r0x00 -c 8
Opening /dev/ttyRS485-2 at 9600 bauds (N, 8, 1)
[12][01][00][00][00][08][3F][6F]
Waiting for a confirmation...
<12><01><01><03><15><0D>
SUCCESS: read 8 of elements:
Data: 0x01 0x01 0x00 0x00 0x00 0x00 0x00 0x00
даёт нам правильный ответ: включены оба реле, например
т.е. применяя дедукцию ))), догоняем в конфиге количество реле до 8 штук, и получаем
т.е. всё как бы корректно запрашивается
DEBUG: [port] Sleep 0 us
DEBUG: [port] Write: 12 01 00 00 00 08 3f 6f
DEBUG: [port] Sleep 9000 us
DEBUG: [port] ReadFrame: 12 01 01 03 15 0d
DEBUG: [serial port driver] channel 'Relay 1' of device 'china-mb-2-ch-relay_0x12' <-- 1
DEBUG: [serial port driver] channel 'Relay 2' of device 'china-mb-2-ch-relay_0x12' <-- 1
DEBUG: [serial port driver] channel 'Relay 3' of device 'china-mb-2-ch-relay_0x12' <-- 0
DEBUG: [serial port driver] channel 'Relay 4' of device 'china-mb-2-ch-relay_0x12' <-- 0
DEBUG: [serial port driver] channel 'Relay 5' of device 'china-mb-2-ch-relay_0x12' <-- 0
DEBUG: [serial port driver] channel 'Relay 6' of device 'china-mb-2-ch-relay_0x12' <-- 0
DEBUG: [serial port driver] channel 'Relay 7' of device 'china-mb-2-ch-relay_0x12' <-- 0
DEBUG: [serial port driver] channel 'Relay 8' of device 'china-mb-2-ch-relay_0x12' <-- 0
однако, реле на самом деле два )) ну педали 3-8 ничего не делают…
отсюда вопрос: как сделать так, чтобы можно было видеть реальное количество реле, но получать их статус при запросе всех восьми?