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]
的内容(这可能解释了为什么您的初始尝试失败) .
注意:发这种问题越详细越好设备制造商、型号等)。
我正在进行一个项目,在该项目中我使用 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]
的内容(这可能解释了为什么您的初始尝试失败) .
注意:发这种问题越详细越好设备制造商、型号等)。