使用Ruby的ModBus TCP通信:未能实现HelloWorld

时间:2018-05-09 09:00:16

标签: ruby modbus-tcp

我可以使用Helios KWL EC 500 W实用程序v3.4与通风装置(modpoll进行通信,该装置仅支持保存寄存器,英文说明从文件的50%开始)。但是我没能将第一次通信转移到Ruby和rmodbus library 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 :(得分:0)

好的,这个是相当愚蠢的。对于记录(以及其他可能想使用rmodbus与他们的Helios交谈的人):

slave.debug = 1 

打开调试,输出发送到modbus从站的字节流。第一个字节序列应该是:事务号(2字节),协议说明符(2字节,始终为零),后续消息的大小(2字节),单元标识符(1字节,始终为180,Helios KWL )。

需要使用单元标识符180而不是1:

初始化从站
client.with_slave(180) do |slave|