Pymodbus客户端setValues限制为100个寄存器

时间:2017-03-01 22:32:48

标签: client raspberry-pi3 modbus pymodbus3

我在树莓派上使用pymodbus作为客户端来保存传感器的值,并通过TCP将它们提供给modbus主站。

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

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

当我尝试设置值[99]时,计数= 350,我得到并出错。

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

查看store.py我看不出任何限制,所以我对设置限制的位置感到困惑。

非常感谢您的帮助。

干杯

2 个答案:

答案 0 :(得分:1)

Modbus规范中协议可以处理的寄存器数量有限制。我在一次通话中亲自读/写的最多是120个注册,但这是对control.com的解释:

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

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

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

寄存器数据:N寄存器*每个2字节

CRC:2个字节

因此,单个Modbus / RTU查询中可读取的最大寄存器数为125.

如果您使用Modbus / TCP,则将设备地址和CRC(总共3个字节)换成6字节标头和1字节单元标识符;单个响应中寄存器的最大计数降至123.

Maximum amount of holding registers per request

答案 1 :(得分:1)

我已经回答了我自己的问题。如果您要将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和贡献者。你是寻找问题答案的主要人选。很棒的网站。干杯