pymodbus 异常响应(131, 3, IllegalAddress)

Dmi*_*rov 5 python modbus pymodbus

我正在尝试运行这段代码:

from pymodbus.client.sync import ModbusSerialClient as ModbusClient
import logging

logging.basicConfig()
log = logging.getLogger()
log.setLevel(logging.DEBUG)

client = ModbusClient(method='rtu', baudrate=9600, parity='E', port='/dev/ttyUSB0', timeout=1)
client.connect()

rr = client.read_holding_registers(40000, 7, unit=0x01)
print rr
client.close()
Run Code Online (Sandbox Code Playgroud)

但我只得到这个:

DEBUG:pymodbus.transaction:Running transaction 1
DEBUG:pymodbus.factory:Factory Response[131]
DEBUG:pymodbus.transaction:adding transaction 0
DEBUG:pymodbus.transaction:getting transaction 1
Exception Response(131, 3, IllegalAddress)
Run Code Online (Sandbox Code Playgroud)

另一方面,这个 C 代码(使用 libmodbus)正在工作:

modbus_t *mb;
int16_t hregs[9];
mb = modbus_new_rtu('/dev/ttyUSB0', 9600, 'E', 8, 1);
modbus_set_slave(mb, 1);
modbus_read_registers(mb, 0x40000, 7, hregs)
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

小智 1

我假设您想读取前七个保持寄存器。在这种情况下,赋予该read_holding_registers函数的地址是0。该函数隐式添加了保存寄存器的偏移量 40000。

所以,尝试将您的读取代码更改为此

rr = client.read_holding_registers(0, 7, unit=0x01)
Run Code Online (Sandbox Code Playgroud)