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

Posted

技术标签:

【中文标题】使用 Ruby 的 ModBus TCP 通信:未能实现 HelloWorld【英文标题】:ModBus TCP communication using Ruby: failing to implement HelloWorld 【发布时间】:2018-10-19 08:03:25 【问题描述】:

我可以使用modpoll 实用程序 v3.4 与通风装置通信(Helios KWL EC 500 W 仅支持保持寄存器,英文描述从文件的 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】:

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

slave.debug = 1 

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

slave 需要用它的单元标识符 180 来初始化,而不是 1:

client.with_slave(180) do |slave|

【讨论】:

以上是关于使用 Ruby 的 ModBus TCP 通信:未能实现 HelloWorld的主要内容,如果未能解决你的问题,请参考以下文章

ModBus(RTU TCP UDP通信)及利用socket通信(DTU)实现Modbus-RTU通信协议

Modbus RTU/TCP协议解析

避免重新组装的TCP段“Modbus TCP通信”

modbus tcp 到 rtu的转换

Modbus TCP和Modbus Rtu的区别

优易通串口服务器Modbus TCP功能连接组态软件实例