python 尝试使用PyModBus通过USB读取没有任何可用文档的Omnik变频器

ie3xauqp  于 2023-01-16  发布在  Python
关注(0)|答案(1)|浏览(65)

我的太阳能电池板连接到一个Omnik逆变器(5000 TL 2)。那家公司已经破产了,现有的文档没有指定USB端口的使用或逆变器本身上的寄存器。
我试图在不使用WiFi模块的情况下读取逆变器上的数据。我将Pi 2B+连接到USB端口,安装了Pymodbus,并尝试了以下代码(由Fasthook提供),这原本是为另一个品牌(Growatt)准备的:

import subprocess
from time import strftime
import time

from pymodbus.client.sync import ModbusSerialClient as ModbusClient

client = ModbusClient(method='rtu', port='/dev/ttyUSB0', baudrate=9600, stopbits=1, parity='N', bytesize=8, timeout=1)
client.connect()
rr = client.read_input_registers(1,44)

rr = client.read_input_registers(2,1) #Watts delivered by panels (DC side)
value=rr.registers
pv_watts=float(value[0])/10
rr = client.read_input_registers(3,1) # Volts on DC side
value=rr.registers
pv_volts=float(value[0])/10
rr = client.read_input_registers(4,1) # Amps on DC side??? Not sure.
value=rr.registers
pv_amps=float(value[0])/10
rr = client.read_input_registers(12,1) #watts delivered by inverter to net
value=rr.registers
out_watts=float(value[0])/10
rr = client.read_input_registers(13,1) # frequency of AC
value=rr.registers
ac_hz=float(value[0])/100
rr = client.read_input_registers(14,1) # volts on AC side delivered by inverter
value=rr.registers
ac_volts=float(value[0])/10
rr = client.read_input_registers(27,1) # Total energy production today
value=rr.registers
Wh_today=float(value[0])*100
rr = client.read_input_registers(29,1) # Total energy production in inervter storage
value=rr.registers
Wh_total=float(value[0])*100
rr = client.read_input_registers(32,1) # Inverter temperature
value=rr.registers
current_temp=float(value[0])/10

client.close()

我还启动了PyModBus调试,它给我:

  • 调试:pymodbus.事务:当前事务状态- IDLE
  • 调试:pymodbus.事务:运行事务1
  • 调试:pymodbus。事务:发送:0x0 0x4 0x0 0x10x0 0x2c 0xa1 0xc6
  • 调试:pymodbus.client.sync:新事务状态正在发送
  • 调试:pymodbus.transaction:将事务状态从SENDING更改为WAITING FOR REPLY
  • 调试:pymodbus。事务:事务失败。(Modbus错误:[无效消息]收到的消息不完整,至少应为2个字节(收到0个))
  • 调试:pymodbus.framer.rtu_framer:帧- [b]未就绪
  • 调试:pymodbus.事务:获取事务0
  • 调试:pymodbus.transaction:将事务状态从处理回复更改为TRANSACTION_COMPLETE

此错误来自:rr = client.read_input_registers(1,44)
我猜GROWATT的寄存器与Omnik不同,这并不奇怪:)由于我找不到任何有关Omnik的文档,我如何确定适用于Omnik逆变器的正确代码?
非常感谢您在这方面的任何帮助!
巴特

xu3bshqb

xu3bshqb1#

有兴趣找出答案
我的2美分,但还没有足够的做这些东西
https://ginlongsolis.freshdesk.com/support/solutions/articles/36000340158-modbus-communication-for-solis-inverters
V4协议https://github.com/XtheOne/Inverter-Data-Logger/blob/master/InverterMsg.py的Map
这些设置可能不同(omnik?为19200波特)----波特率:9600 bps----奇偶校验:无----数据:8 ----停止:1
因此,发送:0x 0 0x 4 0x 0 0x 1 0x 0 0x 2c 0xa 1 0xc 6
0x 0是从机(不应该是0x 01)0x 4是从逆变器读取详细信息的函数0x 0 0x 1是地址1(如果从0开始,则为2)0x 0 0x 2c是要返回的44个字节0xA 1 0xC 6是CRC校验(如何计算)

相关问题