You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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()

关键修改点说明

  1. 配置调整:替换INVERTER_IP为你的逆变器实际IP,确认SLAVE_ID与设备Modbus从站ID一致(SolarEdge默认是1)。
  2. FC21写请求构造:针对SolarEdge指定的0xF001地址,拆解为Modbus文件记录格式的file_number=0xF0和record_number=0x01,record_data传入0-100的整数(直接对应功率占比)。
  3. FC20读请求构造:使用FC21对应的读功能码FC20,读取相同的文件ID和记录号,通过BinaryPayloadDecoder解析返回的16位无符号整数得到当前功率占比。
  4. 错误处理:加入连接失败、请求错误的判断逻辑,便于快速排查问题。

注意事项

  • 确保逆变器已启用Modbus TCP功能,且设备IP在当前网络可访问。
  • 部分SolarEdge型号需要先解锁远程控制权限(如设置控制密码或启用允许远程控制),请参考设备官方文档操作。
  • 测试建议从低功率占比(如10%)开始,避免意外停机或功率突变影响设备运行。

内容的提问来源于stack exchange,提问作者stehof

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 16:53:17