Introdução
A Indústria 4.0 representa a integração entre sistemas ciberfísicos, IoT e automação inteligente, permitindo a comunicação contínua entre máquinas, sensores e sistemas supervisórios.
Este artigo apresenta um projeto didático que une supervisão e controle: uma HMI em Flutter troca mensagens via MQTT com um ESP32, que por sua vez se comunica via Modbus/TCP com o OpenPLC executando a lógica em Structured Text (IEC 61131-3). A solução acelera o ciclo editar-testar-ajustar e serve de base para provas de conceito (POCs), treinamentos e bancadas de ensino que utilizam o Factory I/O como simulador de planta, mantendo boas práticas de engenharia de software, como versionamento e automação.
Arquitetura do sistema
Componentes principais:
- HMI Flutter (mobile/web/desktop) – publica comandos e assina telemetria via MQTT.
- Broker MQTT (Mosquitto) – mensageria entre o APLICATIVO e ESP32.
- ESP32 – ponte MQTT↔Modbus, falando com o OpenPLC.
- OpenPLC Runtime – executa o programa ST simulando um CLP.
- Factory I/O – emula a planta conectando-se ao OpenPLC por Modbus/TCP.
Observação: Tudo está na mesma rede, e no caso o Mosquitto, OpenPLC e Factory IO no mesmo computador.
Problemas com REAL (float) no OpenPLC/Modbus
Durante o desenvolvimento, foi identificado um problema comum em integrações envolvendo o tipo REAL (float) no Modbus, especialmente ao comunicar com diferentes versões do OpenPLC e drivers Modbus.
Embora o OpenPLC suporte o tipo REAL internamente, enviar/receber floats por Modbus costuma gerar dor de cabeça: nem todas as versões expõem REAL em holding registers, existem variações de endianness (ordem dos words/bytes) e inconsistências entre drivers e CLPs. Para fugir disso, foi padronizado tudo em ponto fixo: números reais são codificados como inteiros com escala ×10000 (S32). No lado do PLC, combinamos dois registradores INT (LO/HI) em um DINT, convertemos para REAL e dividimos por 10000. O inverso é feito para publicar PV em LO/HI.
Trecho em ST(Structed Text) para reconstruir Kp/Ki/Kd e SP a partir de LO/HI ×10000:
_loDW := WORD_TO_DWORD(INT_TO_WORD(Kp_lo));
_hiDW := SHL(WORD_TO_DWORD(INT_TO_WORD(Kp_hi)), 16);
_raw_dw := _loDW OR _hiDW;
_raw_di := DWORD_TO_DINT(_raw_dw);
Kp := DINT_TO_REAL(_raw_di) / 10000.0;
(* Repete para Ki/Kd *)
Basicamente, o controle PID é feito da seguinte forma:
Para mais detalhes, conferir o link do GitHub que contém o projeto do OpenPLC e suas variáveis e tipos.
Configurações do Factory IO
Ao fazer o download do arquivo de projeto do Factory IO (.factoryio) no GitHub, irá vim tudo configurado, será somente necessário trocar o ‘Host’ para o IP do seu computador (ir em Drivers e depois Configuration).
Código Completo, Demonstrações e Contribuições
Todos os projetos estão no github (FactoryIO, ESP32, Flutter e OpenPLC). Caso tenha interesse em contribuir, sinta-se à vontade para enviar sugestões e melhorias!
Vídeo de demonstração
GitHub: https://github.com/Silvio347/industry4.0-factoryio-esp32-flutter-openplc
Considerações Finais
O projeto demonstrou que é possível integrar tecnologias abertas e acessíveis para compor um ecossistema completo de Indústria 4.0, unindo supervisão, controle e simulação.
A padronização em ponto fixo (S32 ×10000) simplificou a interoperabilidade entre os sistemas, evitando erros de endianness e garantindo robustez na comunicação.
O sistema fecha o ciclo HMI ↔ MQTT ↔ ESP32 ↔ OpenPLC ↔ Factory I/O, servindo como base sólida para futuras expansões, como registro histórico de dados, alarmes, digital twins e testes automatizados.
Referências
- IEC 61131-3 – Programmable Controllers
- Documentação do OpenPLC – https://autonomylogic.com/docs/openplc-overview
- Documentação do Factory I/O (drivers/Modbus) – https://docs.factoryio.com/manual
- Documentação do Mosquitto (MQTT) – https://mosquitto.org/documentation• Documentação do pacote mqtt_client para Dart – https://pub.dev/packages/mqtt_client




