Warm tip: This article is reproduced from serverfault.com, please click

python-Pymodbus 在设备上找不到“分组”地址

(python - Pymodbus not finding 'grouped' addresses on device)

发布于 2021-01-20 07:15:47

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

分组 描述
00组 基本参数
01组 V/F 模式选择和设置
02组 电机参数
03组 多功能数字输入/输出
...
第 15 组 PLC监控功能

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

组地址 描述 范围
00-00 控制模式选择 0:V/F 模式,1:矢量模式
00-02 主运行命令。 0:键盘,1:通讯,2:PLC
...
00-20。 点动减速时间。 ~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]

但结果证明这不起作用(因为我再次收到“没有注册存在”错误)。

我究竟做错了什么?

我错过了什么?

有没有人知道如何访问以上述方式分组的地址?这是我第一次看到这种情况,我被难住了。

先感谢你!

Questioner
Hayden Eastwood
Viewed
0
Brits 2021-01-25 16:27:00

根据评论,第一个问题是你使用的手册已过时。通过搜索,"V/F pattern selections and setup"我找到了更新的手册这份更新后的手册包括一个将“分组”链接到寄存器的表格(页面“App3-13”到“App3-18”)。例如功能01-0(组 01 的一部分)“伏特/赫兹模式”在保持寄存器 0100H(100 十六进制)中。

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

注意:发布此类问题时,你可以提供的详细信息越多越好,例如设备制造商、型号等)。