我试图运行这段代码:
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()
但我只得到这个:
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)
另一方面,这个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)
我做错了什么?
答案 0 :(得分:2)
我假设您要阅读前七个持有寄存器。在这种情况下,要赋予read_holding_registers
函数的地址为 0 。该函数隐式地为保持寄存器添加了40000的偏移量。
因此,请尝试将您的读取代码更改为此
rr = client.read_holding_registers(0, 7, unit=0x01)
答案 1 :(得分:1)
异常响应(131,3,IllegalAddress)表示:
查询数据字段中包含的值不是从站的允许值。这表示复杂请求的剩余结构中的错误,例如隐含长度不正确。具体而言,并不意味着提交存储在寄存器中的数据项的值超出了应用程序的期望值,因为MODBUS协议不知道任何特定寄存器的任何特定值的重要性。
[UPDATE]:
您是否尝试使用0x40000
或0x400
(在许多情况下是默认设置)? 0x40000
(十六进制)与40000
(十进制)