我可以使用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”输出的参数。 “地址”是否等同于“持有注册#”?
答案 0 :(得分:0)
好的,这个是相当愚蠢的。对于记录(以及其他可能想使用rmodbus与他们的Helios交谈的人):
slave.debug = 1
打开调试,输出发送到modbus从站的字节流。第一个字节序列应该是:事务号(2字节),协议说明符(2字节,始终为零),后续消息的大小(2字节),单元标识符(1字节,始终为180,Helios KWL )。
需要使用单元标识符180而不是1:
初始化从站client.with_slave(180) do |slave|