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

2024-04-29 15:07:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Modbus RTU,它连接到Modbus RTU/TCP网关,我正在尝试调用它。工作正常,但我必须读取多个值每个读取周期。你知道吗

我在用pymodbus库。你知道吗

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

地址,字长

1:0,2分

2:2,2

3:206,第4页

我现在正在做的是调用寄存器值1和2,从地址0开始读取,字数为4。 但接下来我必须再次请求注册值3。你知道吗

这意味着,当试图给值加时间戳时,我遇到了一个问题,即它们实际上不是在同一时间读取的。你知道吗

问题:有没有一种方法可以同时调用多个modbus寄存器,比如用python中的寄存器列表和它们各自的字数列表调用read\u holding\u寄存器?你知道吗

以这样的方式工作:

>> 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]]

Tags: 网关列表readresponse地址unit寄存器modbus
1条回答
网友
1楼 · 发布于 2024-04-29 15:07:17

简短回答:不,您不可能在单个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,您可以自由地对其中的任何内容进行编程),您可以同时对所有传感器(或需要保持同步的传感器)进行采样,并且在一定时间内不会再次更新,以便为主机提供读取所有数据的空间(大多数传感器没有那么快,因此对于大多数工业传感器来说,这通常不是问题设置)。你知道吗

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

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

我之前没有提到这一点,因为我认为您无法访问最终设备的Modbus映射,但如果您要做的是根据您的需要重新组织寄存器的顺序。一定要看一下你的设备手册,大多数高端和/或实时设备实际上都会允许你进行这种更改(我的意思是,更改固件总是可以解决你的问题)。你知道吗

相关问题 更多 >