Pymodbus 在设备上找不到 'grouped' 地址

Pymodbus not finding 'grouped' addresses on device

我正在进行一个项目,在该项目中我使用 Pymodbus 连接到工业风扇系统。我能够读取此风扇上的某些地址,但不能读取其他地址。我正在使用的风扇的说明书将地址放入“参数组”,如下所示:

Grouping Description
Group 00 Basic parameters
Group 01 V/F pattern selections and setup
Group 02 Motor parameters
Group 03 Multi function digital Inputs/Outputs
...
Group 15 PLC monitoring function

对于上面的每个分组 (1-15),手册后面的页面中会提供更具体的地址。例如,对于上面的组 00,有如下指定的地址条目:

Group-address Description Range
00-00 Control Mode Selection 0: V/F Mode, 1: Vector mode
00-02 Main run command. 0: Keypad, 1:Communication, 2: PLC
...
00-20. Jog deceleration time. ~0.1-3600.0

我可以使用以下 Python 脚本访问和打印上述地址(对于 '00' 分组的情况):

from pymodbus.client.sync import ModbusSerialClient as ModbusClient    
modbus_conn = ModbusClient(method='rtu', port="/dev/tty.usbserial-AQ00BYCR",baudrate=38400,parity = 'O')
modbus_conn.connect()
print(modbus_conn.read_holding_registers(0,20,unit=1).registers[0])

但是,问题是我无法访问更高的分组 ('01' -> '15')。例如,如果我尝试使用上述脚本访问大于 20 的任何地址,我会收到“那里没有寄存器”错误。我假设这是因为我被锁定在用我的脚本对第一个分组 ('00') 进行采样。

我探索了分组指定不同地址起点的想法,所以我测试了“01”是否表示从“100”位置开始的地址,如下所示:

modbus_conn.read_holding_registers(100,5,unit=1).registers[0]

但这并没有奏效(因为我又遇到了 'no register exists there' 错误)。

我做错了什么?

我错过了什么?

有谁知道如何访问按上述方式分组的地址吗?这是我第一次看到这个,我很困惑。

提前致谢!

设备文档中可能有如下方案:

地址GGnnH:GG表示参数组,nn表示参数编号,例如Pr 04-01的地址为0401H。 ('H' 表示数字,本例中的 401,是十六进制的。因此 0401H 是寄存器 1025)

将其归类为 分组 对我来说非常混乱。

要读取保持寄存器,您必须传递第一个寄存器的偏移量以及您要读取的数量,仅此而已。

可能设备的可读寄存器不超过 20 个,因此如果您传递 10 的偏移量和 20 的数量,那么您正在尝试读取最多可能不存在的第 30 个寄存器。

根据评论,第一个问题是您使用的手册已过时。通过搜索 "V/F pattern selections and setup",我找到了一个 updated manual。此更新后的手册包含一个 table,它将 'groupings' 链接到寄存器(第 'App3-13' 至 'App3-18' 页)。例如函数 01-0(组 01 的一部分)'Volts/Hz Patterns' 在保持寄存器 0100H(100 十六进制)中。

使用更新后的手册可以更轻松地确定如何从 grouping/function 映射到适当的寄存器。一个潜在的问题是手册以十六进制 (100H) 引用寄存器,因此在 Python 中查询时,您需要使用类似 modbus_conn.read_holding_registers(0x100,1,unit=1).registers[0] 的内容(这可能解释了为什么您的初始尝试失败) .

注意:发这种问题越详细越好设备制造商、型号等)。