TCP-связь ModBus с использованием Ruby: не удалось реализовать HelloWorld - PullRequest
0 голосов
/ 09 мая 2018

Я могу связаться с вентиляционной установкой ( 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". «Адрес» эквивалентен «регистру хранения #»?

1 Ответ

0 голосов
/ 09 мая 2018

Хорошо, этот был довольно глупым. Для записей (и других, которые могут захотеть поговорить со своим Helios, используя rmodbus):

slave.debug = 1 

включает отладку, которая выводит поток байтов, отправленный ведомому Modbus. Предполагается, что первая последовательность байтов: номер транзакции (2 байта), спецификатор протокола (2 байта, всегда ноль), размер следующего сообщения (2 байта), идентификатор блока (1 байт, всегда 180 для Helios KWL ).

Подчиненное устройство должно быть инициализировано с идентификатором устройства 180 вместо 1:

client.with_slave(180) do |slave|
...