Barramentos Industriais
IFRS – Campus Farroupilha
Engenharia de Controle e Automação
Professor: Gustavo Künzel
Aluno: Pedro Henrique de Assumpção
Este projeto é uma continuação do Projeto 01. Utilizar conceitos de Modbus e comunicação TCP/IP para desenvolver um dispositivo compatível com o protocolo Modbus TCP. O objetivo é compreender como deve ser feita a programação do protocolo nos dispositivos. Nas I/Os do Arduino serão conectados potenciômetros e LEDs, de acordo com a aplicação.
- Microcontrolador com Wi-Fi (ESP32, NodeMCU) ou Arduino (Uno, Mega) com módulo Ethernet W5100;
- Componentes diversos para os I/Os;
- A porta serial (COM) do microcontrolador pode ser usada para debug;
- PC, DEV-C++, IDE, bibliotecas para envio e recebimento de comunicação TCP por sockets;
- Códigos desenvolvidos em outras disciplinas e atividades.
- Individual, seguindo o Projeto 1;
- Em dupla (neste caso, cada membro será responsável por uma parte):
- Um aluno foca no desenvolvimento no Dev-C++;
- Outro no Arduino/ESP.
-
Montagem física em protoboard ou placa e funcionalidade do protótipo conectado à uma rede.
-
Deve implementar um servidor TCP (usando Sockets TCP) e o ADU do Modbus TCP com a função do Projeto 1:
- a. Abrir uma comunicação TCP/IP na porta Modbus (502) e aguardar que um cliente se conecte e faça requisições;
- b. Interpretar adequadamente o cabeçalho MBAP (responder com o transaction ID da requisição, testar o length, o unit ID e o protocol ID, ignorando a requisição quando houver erros no MBAP);
- c. O unit ID do servidor é configurado pelas chaves de endereço e ele responde a requisições somente deste unit ID;
- d. Implementar as funções para acesso aos I/Os propostos, inclusive respondendo com as exceções (função inválida, registrador inválido, dado inválido) em casos de erro na requisição.
- O programa é um cliente TCP:
- a. O programa estabelece uma conexão TCP com o servidor, encerrando a conexão apenas ao término do programa;
- b. O programa deverá ter um menu de opções que permita interagir com o escravo (similar ao Projeto 1):
- Uma opção permitirá validar a função implementada, lendo o estado atual das entradas ou escrevendo nas saídas;
- Alguns comandos podem permitir acesso e leitura de mais de uma entrada ou saída por vez, logo, o programa deve permitir pleno teste da função Modbus escolhida (similar ao Projeto 1);
- c. Cada nova requisição enviada pelo cliente deve incrementar o transaction ID do cabeçalho MBAP;
- d. O programa deve identificar e exibir na tela do prompt os seguintes erros:
- Indicar erro se o transaction ID enviado na requisição for diferente ao recebido na resposta;
- Erros de conexão com o servidor, TCP e sockets (o próprio código de Sockets TCP já indica alguns testes de erros);
- Exibir ao usuário as exceções Modbus;
- Para fins de teste, o cliente deve ter a opção de enviar um quadro com erro (unit ID diferente) para o servidor;
- Para fins de teste de exceções, o cliente deve ter a opção de enviar um quadro com função inválida, registrador inválido e dado inválido;
- e. Um arquivo
config.txtdeve armazenar o endereço IP e a porta do servidor. Este arquivo é lido pelo programa na inicialização.
Pode-se utilizar uma ferramenta como o Modbus Poll ou Modbus Simulator para testar a compatibilidade do servidor com o protocolo Modbus TCP.
- Data limite da apresentação: 24/06/2025
- Nota total: 5 pontos de N2
- 15 minutos de apresentação + 5 minutos para comentários;
- Apresentação do projeto do circuito;
- Explicação da função implementada;
- Explicação sobre escolhas feitas no projeto;
- Apresentação das seções de código principais do cliente;
- Apresentação das seções de código principais no servidor;
- Demonstração funcional (pode fazer um vídeo também, para o caso de não funcionar na hora).
Enviar um ZIP com os códigos do mestre e escravo e PDF da apresentação no Moodle.
| Requisito | Pontos |
|---|---|
| Req1 | 0,5 |
| Req2 | 2,0 |
| Req3 | 1,5 |
| Apresentação | 1,0 |
| Total | 5,0 |
´´´ gcc -o run main.c teste.c writecoils.c mapa.c falhas.c serial.c ´´´ Executar: ´´´ ./run ´´´
Baixar arduino IDE https://www.arduino.cc/en/software/
Extraia o arquivo .zip: ´´´ unzip arduino-ide_2.3.6_Linux_64bit.zip -d arduino cd arduino ´´´
Corrija a permissão, torne o arquivo executável: ´´´ chmod +x arduino-ide ´´´
Se quiser criar um atalho de menu para a IDE:
Crie um arquivo chamado arduino-ide.desktop em ~/.local/share/applications/:
´´´ nano ~/.local/share/applications/arduino-ide.desktop ´´´
´´´ [Desktop Entry] Name=Arduino IDE Comment=Arduino IDE 2.x Exec=/caminho/para/arduino/arduino-ide Icon=/caminho/para/arduino/resources/app/static/arduino-logo.ico Terminal=false Type=Application Categories=Development;IDE; ´´´
Tools > Preferences > Baixar
Selecionar ESP32 DEV MODULE
Upload do código com USB conectado
-
Início do Programa no Cliente
O usuário executa o software em C pelo terminal Linux. -
Navegação no Menu
O usuário escolhe a opção 1 – Write Multiple Coils. -
Entrada da Jogada de Xadrez
O usuário informa a jogada no formato padrão (ex:D2D4). -
Conversão da Jogada para Padrão Binário
A jogada é convertida em um mapa de bits que define os LEDs a serem acesos. -
Geração dos Dados dos Coils
O padrão de 16 bits é dividido em dois bytes:resultadoAeresultadoB. -
Montagem do Quadro MODBUS TCP
O quadro inclui:- Cabeçalho MBAP
- Função 0x0F (Write Multiple Coils)
- Dados dos coils (
resultadoA,resultadoB)
-
Envio do Quadro via Wi-Fi
O cliente envia o quadro para o ESP32 pela porta 502. -
Início da Contagem de Timeout
-
Recebimento e Validação no Servidor (ESP32)
O ESP32 valida o cabeçalho e os dados recebidos. -
Interpretação e Log do Comando
O ESP32 interpreta os dados e imprime o comando recebido no Serial Monitor. -
Resposta do Servidor
O ESP32 envia um quadro de confirmação com os dados esperados. -
Validação da Resposta no Cliente
O cliente verifica a integridade da resposta. -
Exibição de Resultado
- Se válida, exibe “OK”;
- Caso contrário, executa tratamento de falha.
Curso: Engenharia de Controle e Automação
Instituição: IFRS – Campus Farroupilha
Disciplina: Barramentos Industriais
Professor: Gustavo Künzel
Aluno: Pedro Henrique de Assumpção
Data: 24/06/2025
- Introdução
- Objetivos
- Justificativa
- Fundamentação Teórica
- Proposta
- Testes
- Desafios
- Referências
Utilizar conceitos de Modbus TCP e comunicação pela rede Ethernet para desenvolver uma aplicação compatível com o protocolo. O objetivo é compreender como deve ser feita a programação do protocolo nos dispositivos.
- Módulo de saídas digitais (8 a 16 saídas);
- Representadas por mensagens no ESP32 (servidor);
- O programa do PC (cliente) deve enviar comandos ao ESP32;
- Utilizar a função Modbus 0x0F (Write Multiple Coils).
Desenvolver um sistema que permita o envio de comandos ao servidor a partir de uma conexão cliente, utilizando o ESP32 com rede integrada. Também busca-se compreender a implementação prática do protocolo e sua aplicabilidade em sistemas embarcados.
- Baseado em Ethernet, permite troca de dados via TCP/IP.
- Modelo cliente-servidor.
- Encapsula os dados do Modbus RTU em pacotes TCP/IP, preservando a estrutura lógica.
| Campo | Seção | Descrição | Tamanho (bytes) | Exemplo (Hex) |
|---|---|---|---|---|
| Transaction ID | MBAP Header | ID da transação definido pelo cliente | 2 | 00 01 |
| Protocol ID | MBAP Header | Sempre 0x0000 para Modbus | 2 | 00 00 |
| Length | MBAP Header | Nº de bytes restantes (Unit ID + PDU) | 2 | 00 08 |
| Unit ID | MBAP Header | Identificação do dispositivo | 1 | 01 |
| Function Code | PDU | 0x0F (Write Multiple Coils) | 1 | 0F |
| Starting Address | PDU | Endereço inicial dos coils | 2 | 00 13 |
| Quantity of Coils | PDU | Quantidade de coils (10) | 2 | 00 0A |
| Byte Count | PDU | Nº de bytes nos valores dos coils | 1 | 02 |
| Output Values | PDU | Bits para os coils | 2 ou + | 55 01 |
- ESP32-WROOM-32 configurado como servidor Modbus TCP;
- Comunicação via Wi-Fi, porta 502;
- IP dinâmico atribuído pela rede;
- Estrutura das mensagens segue o padrão Modbus TCP.
- Matriz 8x8 com 64 LEDs;
- Controlada por registros que determinam quais LEDs acender;
- Permite criar padrões visuais.
- Usuário executa o programa em C no terminal Linux.
- Usuário seleciona a opção 1 no menu (Write Multiple Coils).
- Usuário informa a jogada de xadrez (ex: D2D4).
- Programa converte a jogada em padrão binário.
- Divide os 16 bits em
resultadoAeresultadoB. - Monta quadro Modbus TCP (função 0x0F).
- Envia o quadro via Wi-Fi (porta 502).
- Inicia contagem de timeout.
- ESP32 recebe e valida o quadro.
- Interpreta os dados e imprime no Serial Monitor.
- Envia quadro de resposta ao cliente.
- Cliente valida a resposta.
- Se válida, exibe "OK".
- Se inválida ou sem resposta, trata o erro.
- Testes confirmaram a comunicação entre cliente e servidor;
- A saída em ambos os lados exibe o mesmo padrão binário.
- O menu do cliente trata erros como endereço inválido e ausência de resposta;
- Exibe mensagens de erro e permite nova tentativa sem travar o sistema.
- Melhorar a configuração com parametrização de:
- Endereço de rede;
- Senha;
- Porta serial.
- Tornar o sistema mais flexível e reutilizável com diferentes dispositivos.
-
MODBUS ORGANIZATION. MODBUS Messaging on TCP/IP Implementation Guide V1.0b. [S.l.], 2006. Disponível em: https://modbus.org/docs/Modbus_Messaging_Implementation_Guide_V1_0b.pdf. Acesso em: 22 jun. 2025.
-
EMODBUS. ModbusServer TCP – eModbus documentation. Disponível em: https://emodbus.github.io/modbusserver-tcp. Acesso em: 22 jun. 2025.
-
PEDRO HENRIQUE DE ASSUMPÇÃO. ModbusTCP. GitHub, 2025. Disponível em: https://github.com/pedrohdea/ModbusTCP. Acesso em: 22 jun. 2025.
-
ESPRESSIF SYSTEMS. ESP32 – TCP/IP Server Example. Documentation. [S.l.], [s.d.]. Disponível em: https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/lwip.html#tcp-server. Acesso em: 22 jun. 2025.
