如何通过Modbus读取连接至GoodWe EzLogger3000C的GoodWe逆变器数据?及Teltonika RUT 241路由器端口转发与Logger配置方案咨询
解答:通过Modbus TCP读取GoodWe逆变器数据及相关配置方案
我来一步步帮你拆解这两个问题,结合你的系统架构给出具体的实现步骤和配置细节:
1. 如何通过Modbus读取连接至GoodWe数据采集器的GoodWe逆变器数据?
GoodWe EzLogger3000C本质是一个Modbus RTU转TCP的网关——它负责和逆变器做RS485/RTU通信,同时对外提供Modbus TCP服务器接口,你的Python客户端只需要和EzLogger建立TCP连接,就能间接读取逆变器的数据。具体步骤如下:
核心准备工作
- 先获取GoodWe SMT GW25K-MT的Modbus寄存器映射表:这是关键,不同型号逆变器的寄存器地址、数据类型(16位/32位)、寄存器类型(输入寄存器/保持寄存器)都不一样。比如总交流功率、直流输入电压、当日发电量等参数,都需要对应到正确的寄存器地址,还要注意数据的字节序(大端/小端)。
- 选择Python的Modbus库:推荐使用
pymodbus,这是目前最常用的开源Modbus实现库。
示例Python代码(基于pymodbus)
from pymodbus.client import ModbusTcpClient from pymodbus.payload import BinaryPayloadDecoder from pymodbus.constants import Endian # 配置参数:这里的IP是通过WireGuard+端口转发后能访问到EzLogger的地址 EZLOGGER_IP = "10.0.0.1" # 假设RUT241的WireGuard地址,或者直接映射后的端口对应的地址 EZLOGGER_PORT = 502 INVERTER_SLAVE_ID = 1 # 逆变器的Modbus从站地址,默认一般是1 # 建立Modbus TCP连接 client = ModbusTcpClient(EZLOGGER_IP, port=EZLOGGER_PORT) connection = client.connect() if connection: # 读取逆变器的总交流功率(示例:假设对应输入寄存器地址0x0034,32位大端格式) response = client.read_input_registers(address=0x0034, count=2, slave=INVERTER_SLAVE_ID) if not response.isError(): # 解码32位浮点型数据(根据寄存器表的格式调整) decoder = BinaryPayloadDecoder.fromRegisters(response.registers, byteorder=Endian.Big, wordorder=Endian.Big) total_power = decoder.decode_32bit_float() print(f"逆变器总交流功率:{total_power} kW") else: print(f"读取失败:{response}") # 关闭连接 client.close() else: print("无法连接到EzLogger3000C")
注意事项
- 一定要根据GW25K-MT的官方寄存器表调整代码中的寄存器地址、数据类型和字节序,比如有些参数是16位整数,需要除以对应系数(比如电压寄存器值除以10才是实际V数)。
- 确保EzLogger已经正确和逆变器建立RS485通信(这依赖于下面的EzLogger配置)。
2. GoodWe EzLogger3000C的配置参数及Teltonika RUT 241端口转发方案
2.1 GoodWe EzLogger3000C核心配置
你需要通过EzLogger的Web管理界面(默认IP一般是192.168.1.10,具体看说明书)完成以下配置:
- LAN网络配置:
- 设置固定IP地址(比如
192.168.1.100),子网掩码255.255.255.0,网关设为Teltonika RUT241的LAN口IP(比如192.168.1.1)。固定IP是端口转发的前提,避免DHCP分配的IP变动导致转发失效。
- 设置固定IP地址(比如
- Modbus TCP服务器配置:
- 开启「Modbus TCP服务器」功能,设置监听端口(默认是
502,建议保持默认,也可以自定义,但要和路由器转发规则一致)。 - 设置允许访问的客户端IP范围:为了安全,建议只允许你的WireGuard子网(比如
10.0.0.0/24)访问,而不是0.0.0.0/0(允许所有)。
- 开启「Modbus TCP服务器」功能,设置监听端口(默认是
- RS485/Modbus RTU配置:
- 波特率:设置为
9600(GoodWe逆变器默认波特率,若逆变器有修改则同步调整)。 - 数据位:
8,停止位:1,奇偶校验:无。 - 逆变器从站地址:设置为和逆变器一致的数值(默认一般是
1,若有多个逆变器则每个地址唯一)。
- 波特率:设置为
2.2 Teltonika RUT 241端口转发设置
你的架构中,笔记本/服务器通过WireGuard连接到RUT241,所以需要配置从WireGuard子网到EzLogger LAN IP的端口转发规则:
- 登录RUT241的Web管理界面,找到「NAT」→「Port Forwarding」(或者类似命名的菜单,不同固件版本可能略有差异)。
- 添加一条新的端口转发规则:
- 外部接口:选择WireGuard隧道接口(比如命名为
wg0,或者「WireGuard」)。 - 外部端口:填写
502(和EzLogger的Modbus TCP端口一致)。 - 内部IP地址:填写EzLogger的固定LAN IP(比如
192.168.1.100)。 - 内部端口:填写
502。 - 协议:选择
TCP(Modbus TCP基于TCP协议)。 - 描述:可以填
Modbus to GoodWe EzLogger方便识别。
- 外部接口:选择WireGuard隧道接口(比如命名为
- 配置防火墙规则(若RUT241默认禁止跨子网访问):
- 找到「Firewall」→「Rules」,添加一条允许规则:
- 源地址:WireGuard子网(比如
10.0.0.0/24)。 - 目标地址:EzLogger的LAN IP(
192.168.1.100)。 - 目标端口:
502。 - 协议:
TCP。 - 动作:
Accept。
- 源地址:WireGuard子网(比如
- 找到「Firewall」→「Rules」,添加一条允许规则:
验证配置
配置完成后,可以在你的笔记本/服务器上执行telnet 10.0.0.1 502(假设RUT241的WireGuard地址是10.0.0.1),如果能连通,说明端口转发和EzLogger的Modbus服务正常。
内容的提问来源于stack exchange,提问作者Matthias Luh
相关产品推荐
相关产品推荐

