我有一个Modbus-RTU连接到Modbus-RTU/TCP-网关,我正在尝试调用它。工作正常,但我必须在每个阅读周期读取多个值。
我在使用pymodbus库。
假设我有三个登记册可读:
地址,WordLength
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]]
发布于 2019-11-19 09:56:48
简单回答:不,您无法在单个Modbus查询上轮询非连续寄存器。这是Modbus协议的一个限制。
如果您的设备(您没有特别提到您正在讨论的设备,因此从现在开始,我将猜测)坚持Modbus规范,那么在一个查询中可以询问的寄存器的最大数量是125。这是遵从最大消息长度所必需的,根据等级库,最大消息长度为256个字节
要读取的寄存器数量,以及预期响应中的所有其他字段,不得超过Modbus消息的允许长度: 256字节。
您提到的缺乏同步的问题经常可以使用以下两种策略中的一种来克服:
-At设备(从设备)级别(例如,如果您的设备是一个可编程控制器,您可以在其中任意编程),您可以同时对所有传感器(或那些需要保持同步的传感器)进行采样,并在一定时间内不再进行更新,以便让主控制器读取所有数据(大多数传感器都没有那么快,因此对于大多数工业设置来说,这通常都不是问题)。
-At --主级别--您可以使用多线程方法启动两个(或更多)同时查询(您需要以某种方式同步这些查询)。这只适用于接受多个同时连接的Modbus TCP设备(大多数是这样)。由于您似乎正在处理网关的TCP端,此解决方案可能适用于您的时间戳问题,但请注意,本质上,它将仅仅是烟雾和镜子,以保持您的传感器被同步读取的幻想(更别提它将是花哨的烟雾和镜子,因为它将需要一些努力来编写代码)。
你应该后退一点,问问自己是什么原因让你的读数保持同步。如果您处于一个艰苦的实时环境中(例如,您必须同时测量两个传感器,因为您需要使用两个变量进行计算,并且它们变化非常快),那么您需要重新考虑您的数据采集系统,以便使用我前面提到的第一种方法(同步读取和冻结读取)。
我之前没有提到这一点,因为我认为您无法访问最终设备的Modbus映射,但是如果您做了一件琐碎而明智的事情,那就是根据您的需要重新组织寄存器的顺序。请务必看一看您的单元手册,大多数高端和/或实时设备实际上将允许您进行这种更改(我的意思是,更改固件总是可以解决您的问题)。
https://stackoverflow.com/questions/58930376
复制相似问题