Я могу связаться с вентиляционной установкой ( Helios KWL EC 500 Вт , которая поддерживает только регистры хранения, английское описание начинается с 50% файла) с помощью утилиты modpoll v3.4. Но я не смог передать самое первое сообщение Ruby и библиотеке rmodbus v1.3.3.
С помощью modpoll я могу запросить некоторое значение температуры с помощью команды
./modpoll -m tcp -a 180 <ipaddr> 0x7630 0x3031 0x3034 0x0000
и затем прочитайте данные, используя
./modpoll -m tcp -a 180 -t4:hex -c 8 -0 -1 <ipaddr>
Protocol configuration: MODBUS/TCP
Slave configuration...: address = 180, start reference = 1 (PDU), count = 8
Communication.........: x.x.x.x, port 502, t/o 2.00 s, poll rate 1000 ms
Data type.............: 16-bit register (hex), output (holding) register table
-- Polling slave...
[1]: 0x7630
, который выводит 8 16-битных регистров, как указано в качестве примера в документации по Helios Modbus. В качестве первого шага я попытался перенести часть чтения в Ruby. Тем не менее, мой код Ruby истекает:
require 'rmodbus'
ModBus::TCPClient.new(ipaddr, 502) do |client|
client.with_slave(1) do |slave|
slave.debug = true
puts slave.holding_registers[180..187]
end
end
и выдает исключение
/var/lib/gems/2.3.0/gems/rmodbus-1.3.3/lib/rmodbus/slave.rb:241:in `rescue in query':
Timed out during read attempt (ModBus::Errors::ModBusTimeout)
from /var/lib/gems/2.3.0/gems/rmodbus-1.3.3/lib/rmodbus/slave.rb:232:in `query'
from /var/lib/gems/2.3.0/gems/rmodbus-1.3.3/lib/rmodbus/slave.rb:164:in `read_holding_registers'
Что не так?
Я не уверен, если / как использовать параметры, выводимые с помощью modpoll "address = 180" и "start reference = 1". «Адрес» эквивалентен «регистру хранения #»?