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

1 人关注

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

我正在使用pymodbus库。

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

地址,字长

1: 0,2

2: 2,2

3: 206, 4

我现在所做的是通过从地址0开始读,字数为4,一起调用寄存器值1和2。 但随后我必须对寄存器值3提出另一个请求。

这意味着,当我试图对这些值进行时间标记时,我遇到的问题是,它们实际上不是在完全相同的时间被读取的。

这个问题。有没有一种方法可以同时调用多个modbus寄存器,比如用python调用read_holding_registers的寄存器列表和它们各自的字数列表?

在某种程度上,这将像这样工作。

>> 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]]
    
python
dataframe
modbus-tcp
pymodbus
JCB
JCB
发布于 2019-11-19
1 个回答
Marcos G.
Marcos G.
发布于 2019-11-19
已采纳
0 人赞同

简单回答。不,你不可能在一次Modbus查询中轮询非连续的寄存器。这是Modbus协议的一个限制。

如果你的设备(你没有提到你说的是什么设备,所以从这里开始我就猜测)坚持Modbus规范,那么你在一次查询中可以询问的最大寄存器数量是125。这是为了符合最大信息长度的要求,根据规范,信息长度为256字节。 spec :

要读取的寄存器的数量,加上预期响应中的所有其他字段 响应,不得超过Modbus信息的允许长度。256字节。

你提到的缺乏同步性的问题,经常使用以下两种策略之一来克服。

-在设备(从属)层面(例如,如果你的设备是一个PLC,你可以自由地在其中进行任何编程),你在同一时间对所有的传感器(或那些你需要保持同步的传感器)进行采样,并在一定时间内不再更新,以便给主站提供读取所有数据的空间(大多数传感器没有那么快,所以一般来说,这对大多数工业设置来说不是一个问题)。