【问题标题】:pymodbus Exception Response(131, 3, IllegalAddress)pymodbus 异常响应(131, 3, IllegalAddress)
【发布时间】:2019-01-01 19:56:26
【问题描述】:

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

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)

我做错了什么?

【问题讨论】:

  • 您确定您的 libmodbus 代码正常工作吗?您正在读取地址 0x40000 (262144),没有 Modbus 从站将接受此地址。
  • 是的,我确定 C 代码可以正常工作。
  • 您是否尝试过使用0x400000x400(在许多情况下是默认设置)? 0x40000(十六进制)与40000(十进制)不同

标签: python modbus pymodbus


【解决方案1】:

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

所以,试着把你的读取代码改成这个

rr = client.read_holding_registers(0, 7, unit=0x01)

【讨论】:

    【解决方案2】:

    Exception Response(131, 3, IllegalAddress) 表示:

    查询数据字段中包含的值不是从站的允许值。这表明复杂请求的剩余部分的结构存在错误,例如隐含长度不正确。这并不意味着提交存储在寄存器中的数据项具有超出应用程序预期的值,因为 MODBUS 协议不知道任何特定寄存器的任何特定值的重要性。

    http://www.simplymodbus.ca/exceptions.htm


    [更新]:

    您是否尝试过使用0x400000x400(在许多情况下作为默认设置)? 0x40000(十六进制)与40000(十进制)不同

    【讨论】:

      猜你喜欢
      • 2019-10-08
      • 2019-10-27
      • 2013-09-18
      • 1970-01-01
      • 1970-01-01
      • 2019-04-29
      • 2021-11-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多