2017-03-01 45 views
0

我在覆盆子pi上使用pymodbus作为客户端来保存传感器的值,并通过TCP将它们提供给modbus master。Pymodbus客户端setValues限制为100个寄存器

所有的作品都很棒。我正在使用以下设置数据存储。 values = context [slave_id] .getValues(register,address,count = 350) 问题是当我尝试设置值不能超过[98]列表值。

如果我设置了count = 5,我可以从[0]到[4]设置值,但是当我按照预期设置[5]时会引发错误。

随着计数= 350我得到和错误,当我尝试和设置值[99]。

这表明它们是100个寄存器的限制。这个限制可以延长吗?

看着store.py我看不到任何限制,所以我有点困惑,在极限设置。

您的帮助将不胜感激。

干杯

回答

1

有一个在该协议能够处理寄存器的金额的Modbus规范的限制。我在一次通话中亲自读/写的数据最多的是120个寄存器,但这里是对control.com的解释:

“要读取的寄存器的数量,与预期响应中的所有其他文件组合,不得超过Modbus消息的允许长度:256字节。“

到功能3请求的Modbus/RTU响应包括

节点地址:1个字节 功能代码:1个字节 字节数:1个字节

寄存器数据:N寄存器*每个

2个字节

CRC:2个字节

因此,可以在一个单一的Modbus/RTU查询中读取的寄存器的最大数量是125。

如果使用Modbus/TCP,则将6位标头和1字节单元标识符的设备地址和CRC(总共3个字节)进行交易;在单个响应寄存器的最大计数下降到123

Maximum amount of holding registers per request

+0

嗨。谢谢您的回答。这是pyModbus的一个非主从实现。当我从主人那里读取寄存器时,如同你所说的那样,我读了100个寄存器的数据块。 – Winetec

+0

问题是当你在pyModbus中创建寄存器的数据存储区时 – Winetec

+0

不会让你为从属寄存器添加超过前98个寄存器的值。 – Winetec

0

我已经回答了我的问题。如果您将PyModbus设置为从属设备,并且想要超过100个可用寄存器,则需要在Python脚本中编辑以下代码行以反映要更新的寄存器的数量。

这是您在python脚本中初始化数据存储的地方。

store = ModbusSlaveContext(
    di = ModbusSequentialDataBlock(0, [1]*100), 
    co = ModbusSequentialDataBlock(0, [2]*100), 
    hr = ModbusSequentialDataBlock(0, [3]*100), 
    ir = ModbusSequentialDataBlock(0, [4]*100)) 
context = ModbusServerContext(slaves=store, single=True) 

将值100更改为要更新的寄存器的数量。

谢谢StackOverflow和贡献者。你是我寻找问题答案的主要途径。伟大的网站。干杯