PROJETO / 007 / MODBUS RTU

INVERTER
MODBUS
LIB

Uma biblioteca Arduino/C++ criada para organizar mapas Modbus, padronizar leituras e preparar aplicações de controle de geração com múltiplos inversores.

STATUS
● ALPHA / EM DESENVOLVIMENTO
PLATAFORMA ATUAL
ESP8266
BRANCH ATIVA
refactor/nonblocking-modbus
Arquitetura da InverterModbusLib reunindo mapas, descriptors, monitoramento, controle, export limit e geração programada sobre Modbus RTU
Visão da arquitetura modular: uma camada comum organiza leitura, monitoramento e controle de múltiplos inversores no barramento RS485.

Fazer o mesmo trabalho uma vez só.

A InverterModbusLib nasceu de necessidades práticas observadas no setor fotovoltaico. Controlar geração, limitar potência, preparar geração programada ou estudar um export limit exigia voltar aos mapas de cada equipamento.

Mesmo quando todos falavam Modbus, o trabalho se repetia: localizar registradores, confirmar tipos, unidades, escalas, ordem de palavras e regras de escrita. A biblioteca começou como uma forma de organizar esse conhecimento e reutilizá-lo.

Modbus é comum. Os mapas não.

O protocolo define como pedir e transportar dados. Ele não obriga fabricantes diferentes a colocar a mesma grandeza no mesmo endereço ou representá-la da mesma forma.

FABRICANTE Apotência → endereço X
escala → × 0,1
tipo → int32
FABRICANTE Bpotência → endereço Y
escala → × 1
tipo → uint32
FABRICANTE Coutro endereço
outra ordem de words
regra especial

Também podem mudar quantidade de registradores, sinal, código de função, permissões, offsets e comportamento conforme modelo ou firmware. A página não reproduz mapas proprietários: documenta a abstração criada para lidar com essas diferenças.

Separar o que o inversor é de onde seus dados estão.

APLICAÇÃOpede potência, frequência, identificação ou controle
INVERTER APIinterface comum usada pelo sketch
DESCRIPTOR / MAP / FEATURESmodelo, capacidades, campos e regras
INVERTER MODBUS BUSarbitragem e transação Modbus RTU
RS485 / INVERSOR REALequipamento e mapa específicos

A aplicação trabalha com funções como getActivePower() e getGridFrequency(). Endereço, escala e interpretação ficam abaixo dessa interface.

Onde o conhecimento fica.

DESCRIPTOR

Descreve topologia, conexão, fases, potência nominal, configuração padrão, strings, MPPTs e capacidades.

MAP

Organiza endereço, tipo, comprimento, stride, escala, acesso e modo de tratamento.

FEATURE

Agrupa identificação, controle, potência, export limit, rede, energia, strings, bateria, EPS, diagnóstico e status.

O Handler fica reservado a exceções reais. Um campo pode indicar tratamento simples ou especial e selecionar um handler específico.

API real da branch ativa

InverterRequestStatus status = inverter.getActivePower(activePower);

A chamada retorna estados intermediários e finais. A operação pode estar ocupada, concluída, em erro ou rejeitada; a aplicação continua executando e consulta novamente no loop.

Do bloqueante ao não bloqueante.

As primeiras versões usavam uma abordagem direta: enviar, esperar e só então continuar. Isso atende testes pequenos, mas disputa tempo com Wi‑Fi, servidor web, LEDs, diagnóstico e lógica de controle.

MODELO BLOQUEANTEenvia request
↓
espera resposta
↓
continua
MODELO NÃO BLOQUEANTEenvia request
↓
continua Wi‑Fi / web / LEDs
↓
bus.task()
↓
atualiza o estado

Um barramento, vários inversores.

Um InverterModbusBus representa o barramento compartilhado. Vários objetos Inverter podem usá-lo, mas apenas uma transação ocupa o RS485 por vez. Pedidos concorrentes são arbitrados e podem ser rejeitados para nova tentativa.

O barramento físico continua serial. O ganho é não congelar a aplicação inteira durante a espera.

ESP8266 · INVERTER MODBUS BUS · RS485
INVERTER #1ID 1
INVERTER #2ID 2
INVERTER #3ID 3
COMPATIBILIDADE DE PLATAFORMA

O estado confirmado atualmente é ESP8266. Tornar a biblioteca compatível e validada no ESP32 é um dos objetivos; referências antecipadas a ESP32 no repositório não são tratadas aqui como validação concluída.

Três inversores no mesmo RS485.

O sketch de validação usa ESP8266, ponto de acesso Wi‑Fi, página local em 192.168.4.1, três objetos no mesmo barramento e leituras sequenciais. Um heartbeat alterna o LED aproximadamente a cada 250 ms para evidenciar que o loop permanece ativo.

SIW500H_ST030_M3Modbus ID 1
SIW400G_T100_W0Modbus ID 2
SIW400G_T100_W0Modbus ID 3
FREQUÊNCIAVALIDADA
POTÊNCIA ATIVAVALIDADA
POTÊNCIA NOMINALVALIDADA
SERIAL NUMBERVALIDADO, NÃO EXPOSTO

O painel mantém contadores de sucessos, falhas, timeouts e rejeições por operação. Assim, “não funcionou” deixa de ser um único estado e passa a carregar contexto para o diagnóstico.

Quando controlar um inversor não é suficiente.

O objetivo futuro central é usar a biblioteca como base de um controlador de exportação para dois ou mais inversores. Um medidor informa a potência no ponto de conexão; o controlador calcula a redução, distribui limites, envia comandos, confirma respostas e repete o ciclo.

REDE / MEDIDOR
CONTROLADOR
DIAGNÓSTICO / WEB
INVERSOR A
INVERSOR B
INVERSOR C

A distribuição ainda precisa definir proporção pela potência nominal, prioridades, limites, equipamentos offline, comandos rejeitados e estabilidade. Por isso getRatedPower() importa: inversores de 30 kW e 100 kW não necessariamente devem receber o mesmo limite absoluto.

A mesma abstração pode apoiar geração programada — por exemplo, 30% às 08:00, 60% às 10:00 e 100% ao meio-dia — mas esse módulo ainda não está concluído.

O que já funciona.

BIBLIOTECA BASEFUNCIONAL
MAPS / DESCRIPTORSEM EXPANSÃO
getGridFrequency()VALIDADO EM HARDWARE
getActivePower()VALIDADO EM HARDWARE
getRatedPower()VALIDADO EM HARDWARE
getSerialNumber()VALIDADO EM HARDWARE
setPowerLimit()EM DESENVOLVIMENTO / VALIDAÇÃO
setPowerLimitPercent()EM DESENVOLVIMENTO / VALIDAÇÃO
BARRAMENTO NÃO BLOQUEANTEIMPLEMENTADO / EM TESTES
3 INVERSORES NO MESMO BUSVALIDADO EM BANCADA
ESP32OBJETIVO DE COMPATIBILIDADE
EXPORT LIMIT MULTI-INVERSORPLANEJADO

Transformar abstração em controle.

  1. Finalizar a validação de setPowerLimit() e setPowerLimitPercent().
  2. Ampliar maps e descriptors e validar mais modelos em hardware.
  3. Aprimorar diagnóstico e recuperação após timeout ou falha.
  4. Portar, compilar e validar a arquitetura no ESP32.
  5. Desenvolver o controlador de export limit multi-inversor.
  6. Estudar distribuição proporcional, prioridades e estabilidade.
  7. Manter exemplos e documentação por modelo.
ORIGEM

Mapas específicos

Leituras e comandos eram adaptados novamente a cada fabricante, modelo e mapa Modbus.

BIBLIOTECA

API comum

Maps, descriptors e features passaram a concentrar as diferenças dos equipamentos.

AGORA

Barramento não bloqueante

A branch ativa reorganiza as transações para vários inversores compartilharem um barramento sem paralisar o loop principal.

OBJETIVO

Controle coordenado

A abstração deve servir como base para geração programada e export limit multi-inversor.

Projeto aberto.

  • A biblioteca está em fase alpha e não é um produto certificado.
  • Mapas podem variar por fabricante, modelo, firmware, região e permissões.
  • Funções de escrita devem ser validadas cuidadosamente em bancada.
  • Controle de potência interfere na operação real do sistema.
  • Teste de bancada não equivale a validação completa em campo.
  • Não existe garantia universal de compatibilidade.
ESCRITAS MODBUS

setPowerLimit() e setPowerLimitPercent() permanecem em desenvolvimento e validação. Não são apresentadas como prontas para uso irrestrito em campo.

[ PROJETO ABERTO ]

O objetivo não é esconder as diferenças entre os inversores. É organizá-las para que não precisem ser resolvidas novamente em cada projeto.

VER BRANCH NO GITHUB ↗
[ LINHAGEM / RAMIFICAÇÕES ]

CAMINHOS RELACIONADOS