我正在从事一个项目,在该项目中我使用 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]
但结果证明这不起作用(因为我再次收到“没有注册存在”错误)。
我究竟做错了什么?
我错过了什么?
有没有人知道如何访问以上述方式分组的地址?这是我第一次看到这种情况,我被难住了。
先感谢你!
根据评论,第一个问题是你使用的手册已过时。通过搜索,"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]
(这可能解释了你最初尝试失败的原因)。
注意:发布此类问题时,你可以提供的详细信息越多越好,例如设备制造商、型号等)。