繁体   English   中英

使用 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。这需要符合最大消息长度,根据规范,它是 256 字节:

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

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

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

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

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

我之前没有提到它,因为我想您无法访问最终设备的 Modbus 映射,但是如果您做一件简单而聪明的事情,那就是根据您的需要重新组织寄存器的顺序。 请务必查看您设备的手册,大多数高端和/或实时设备实际上都允许您进行这种更改(我的意思是简单地说,更改固件将始终解决您的问题)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM