0

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

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

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

当我尝试设置值 [99] 时,计数 = 350 时出现错误。

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

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

您的帮助将不胜感激。

干杯

4

2 回答 2

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 和贡献者。你是我寻找问题答案的主要途径。很棒的网站。干杯

于 2017-03-02T20:29:33.787 回答
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。

每个请求的最大保持寄存器数量

于 2017-03-02T16:57:38.387 回答