如何用PyModbus实现FC21读写SolarEdge逆变器0xF001寄存器?
PyModbus实现SolarEdge逆变器Active Power Control读写(FC21/FC20)
前置依赖
先安装PyModbus:
pip install pymodbus
完整实现脚本
from pymodbus.client import ModbusTcpClient from pymodbus.payload import BinaryPayloadDecoder from pymodbus.pdu import ReadFileRecordRequest, WriteFileRecordRequest from pymodbus.constants import Endian # 逆变器Modbus配置 INVERTER_IP = "192.168.1.100" # 替换为你的逆变器实际IP INVERTER_PORT = 502 # Modbus TCP默认端口,若有修改请同步 SLAVE_ID = 1 # SolarEdge逆变器默认从站ID,按实际配置调整 def set_active_power_control(percent): """设置Active Power Control功率占比(范围0-100,0=停机)""" if not 0 <= percent <= 100: raise ValueError("功率占比必须在0-100之间") with ModbusTcpClient(INVERTER_IP, port=INVERTER_PORT) as client: if not client.connect(): print("连接逆变器失败") return False # 构造FC21写请求:对应地址0xF001(拆解为文件ID 0xF0,记录号0x01) write_records = [ { "file_number": 0xF0, "record_number": 0x01, "record_data": [percent] # 写入1个16位寄存器,值为目标功率占比 } ] request = WriteFileRecordRequest(write_records, unit=SLAVE_ID) response = client.execute(request) if response.isError(): print(f"写入失败: {response}") return False print(f"成功设置功率占比为{percent}%") return True def get_active_power_control(): """读取当前Active Power Control功率占比""" with ModbusTcpClient(INVERTER_IP, port=INVERTER_PORT) as client: if not client.connect(): print("连接逆变器失败") return None # 构造FC20读请求:读取对应文件ID和记录号的寄存器值 read_records = [ { "file_number": 0xF0, "record_number": 0x01, "record_count": 1 } ] request = ReadFileRecordRequest(read_records, unit=SLAVE_ID) response = client.execute(request) if response.isError(): print(f"读取失败: {response}") return None # 解析响应的16位无符号整数 decoder = BinaryPayloadDecoder.fromRegisters( response.records[0]["record_data"], byteorder=Endian.Big, wordorder=Endian.Big ) current_percent = decoder.decode_16bit_uint() print(f"当前功率占比: {current_percent}%") return current_percent # 测试示例 if __name__ == "__main__": # 设置功率占比为50% set_active_power_control(50) # 验证设置结果 get_active_power_control()
关键修改点说明
- 配置调整:替换
INVERTER_IP为你的逆变器实际IP,确认SLAVE_ID与设备Modbus从站ID一致(SolarEdge默认是1)。 - FC21写请求构造:针对SolarEdge指定的0xF001地址,拆解为Modbus文件记录格式的
file_number=0xF0和record_number=0x01,record_data传入0-100的整数(直接对应功率占比)。 - FC20读请求构造:使用FC21对应的读功能码FC20,读取相同的文件ID和记录号,通过
BinaryPayloadDecoder解析返回的16位无符号整数得到当前功率占比。 - 错误处理:加入连接失败、请求错误的判断逻辑,便于快速排查问题。
注意事项
- 确保逆变器已启用Modbus TCP功能,且设备IP在当前网络可访问。
- 部分SolarEdge型号需要先解锁远程控制权限(如设置控制密码或启用允许远程控制),请参考设备官方文档操作。
- 测试建议从低功率占比(如10%)开始,避免意外停机或功率突变影响设备运行。
内容的提问来源于stack exchange,提问作者stehof
相关产品推荐
相关产品推荐

