我在树莓派上使用pymodbus作为客户端来保存传感器的值,并通过TCP将它们提供给modbus主站。
一切都很棒。我正在使用以下设置数据存储区。 values = context [slave_id] .getValues(register,address,count = 350) 问题是当我尝试设置值时,我不能超过[98]列表值。
如果我设置count = 5,我可以设置从[0]到[4]的值,但是当我按照您的预期设置[5]时会抛出错误。
当我尝试设置值[99]时,计数= 350,我得到并出错。
这表明它们是100个寄存器的限制。这个限制可以延长吗?
查看store.py我看不出任何限制,所以我对设置限制的位置感到困惑。
非常感谢您的帮助。
干杯
答案 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.
答案 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和贡献者。你是寻找问题答案的主要人选。很棒的网站。干杯