使用 python 在 ModbusRTU 中同时调用多个寄存器?

Calling multiple registers simultaneously in a ModbusRTU using python?

我有一个连接到 Modbus-RTU/TCP-Gateway 的 Modbus-RTU,我正在尝试调用它。工作正常,但我必须在每个读取周期读取多个值。

我正在使用 pymodbus 库。

假设我有 3 个寄存器要读取:

地址,字长

1:0,2

2: 2,2

3: 206, 4

我现在正在做的是同时调用寄存器值 1 和 2,从地址 0 开始读取,字数为 4。 但是然后我必须再次请求注册值 3.

这意味着,当我尝试为这些值添加时间戳时,我遇到了一个问题,即它们实际上并不是在同一时间读取的。

问题:有没有办法同时调用多个 modbus 寄存器,比如调用 read_holding_registers 并在 python 中使用寄存器列表和它们各自的字数列表?

以这样的方式工作:

>> response = gateway.read_holding_registers(address=[0,2,206], count=[2,2,4], unit=unit).registers
>> response
<< [[0,26],[0,27],[0,0,0,3008]]

简短回答:不,您无法在单个 Modbus 查询中轮询不连续的寄存器。这是 Modbus 协议的限制。

如果你的设备(你没有特别提到你在谈论什么设备,所以从这里开始我会猜测)坚持 Modbus 规范那么你可以查询的最大寄存器数量单个查询为 125。这需要符合最大消息长度,根据 spec:

为 256 字节

The quantity of registers to be read, combined with all other fields in the expected response, must not exceed the allowable length of Modbus messages: 256 bytes.

您提到的缺乏同步通常可以使用以下两种策略之一来克服:

-在设备(从属)级别(例如,如果您的设备是 PLC,您可以在其中自由编程任何您想要的)您对所有传感器(或需要保持同步的传感器)进行采样同时并且在一段时间内不要再次更新,以便为 Master 读取所有数据留出空间(大多数传感器没有那么快,因此对于大多数工业设置来说这通常不是问题)。

-在大师级别,您可以使用多线程方法来启动两个(或更多)同时查询(您需要以某种方式同步这些查询)。这仅适用于接受多个同时连接的 Modbus TCP 设备(大多数情况下是这样)。由于您似乎正在使用网关的 TCP 端,因此此解决方案可能适用于您的时间戳问题,但请注意,从本质上讲,它只是虚幻以保持您的传感器被同步读取的幻想(更不用说它会是花哨的烟雾和镜子,因为想出代码需要一些努力)。

你应该后退一点,问问自己同步读数的原因是什么。如果您处于硬实时环境中(例如,您必须同时测量两个传感器,因为您需要使用两个变量进行计算并且它们变化非常快),您需要重新考虑您的数据采集​​系统使用我上面提到的第一种方法(同步读取和冻结)。

我之前没有提到它是因为我想你无法访问最终设备的 Modbus 映射,但是如果你做一些简单而聪明的事情就是根据以下内容重新组织寄存器的顺序您的需求。请务必查看您的设备手册,大多数高端 and/or 实时设备实际上允许您进行这种更改(我的意思是,以一种简单的方式,更改固件总能解决您的问题).