使用 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的主要内容,如果未能解决你的问题,请参考以下文章