使用 pymodbus 从 Epever uPower 充电器/逆变器读取 modbus 寄存器时出现问题

问题描述 投票:0回答:3

我在从 Epever uPower 太阳能充电器/逆变器读取 modbus 寄存器时遇到问题。我正在使用在 Raspberry Pi 上运行的 pymodbus 库,通过 USB 转 RS485 电缆进行通信。我知道硬件和电缆正常工作,因为我可以在 Windows 笔记本电脑上获取数据。它似乎也适用于 PI,因为当我在下面的代码中选择不同的单元 ID 时,出现连接错误。

有许多有据可查的从 Epever 设备读取寄存器的示例,以下代码似乎适用于大多数设备,但我无法让它与较新的 uPower 设备一起使用:

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

client = ModbusClient(method = 'rtu', port = '/dev/ttyUSB0', baudrate = 115200, stopbits=1, timeout=1, parity='N' )
client.connect()
 
result = client.read_input_registers(0x3100,6,unit=10)
print(result.registers)
solarVoltage = float(result.registers[0] / 100.0)
solarCurrent = float(result.registers[1] / 100.0)
batteryVoltage = float(result.registers[4] / 100.0)
chargeCurrent = float(result.registers[5] / 100.0)
 
# Do something with the data
 
client.close()

调试日志显示以下内容:

DEBUG:pymodbus.transaction:Running transaction 1
DEBUG:pymodbus.transaction:SEND: 0xa 0x4 0x31 0x0 0x0 0x6 0x7f 0x8f
DEBUG:pymodbus.client.sync:New Transaction state 'SENDING'
DEBUG:pymodbus.transaction:Changing transaction state from 'SENDING' to 'WAITING FOR REPLY'
DEBUG:pymodbus.transaction:Changing transaction state from 'WAITING FOR REPLY' to 'PROCESSING REPLY'
DEBUG:pymodbus.transaction:RECV: 0xa 0x84 0x2 0xb3 0x3
DEBUG:pymodbus.framer.rtu_framer:Getting Frame - 0x84 0x2
DEBUG:pymodbus.factory:Factory Response[132]
DEBUG:pymodbus.framer.rtu_framer:Frame advanced, resetting header!!
DEBUG:pymodbus.transaction:Adding transaction 10
DEBUG:pymodbus.transaction:Getting transaction 10
DEBUG:pymodbus.transaction:Changing transaction state from 'PROCESSING REPLY' to 'TRANSACTION_COMPLETE'
Traceback (most recent call last):
  File "main.py", line 11, in <module>
    print(result.registers)
AttributeError: 'ExceptionResponse' object has no attribute 'registers'

非常感谢收到的任何帮助或指点。如果我能理解代码收到 RECV 的响应,也许会有所帮助:0xa 0x84 0x2 0xb3 0x3

不管怎样,它似乎没有任何寄存器......

modbus rs485 pymodbus solar
3个回答
1
投票

您需要将地址从 0x3100 更改为 0x3500。

我反编译了SolarStation软件,发现他们将实时地址更改为13568。


0
投票

Modbus规范来看,您的响应中列出的异常功能代码(0x0A)似乎是网关路径不可用。这意味着问题可能出在您的 RS485 总线上。您可以通过添加 isError() 检查来获取更多信息:

result = client.read_input_registers(0x3100,6,unit=10)
assert(not result.isError())
print(result.registers)

0
投票

问题解决了吗? 我也有同样的问题。 你使用哪个用于 modbus 的 python 库?

© www.soinside.com 2019 - 2024. All rights reserved.