Arquivo da tag: Modbus

Como Funciona o Modbus? Uma Visão Geral do Protocolo

E aí, galera! Tudo certo? Nesta postagem, vamos fazer uma introdução ao protocolo Modbus. A ideia é apresentar uma visão geral, destacando suas vantagens, explicando a arquitetura cliente-servidor utilizada, os principais tipos de Modbus, a estrutura dos dados e as funções mais comuns. Então fica ligado!

O que é o protocolo Modbus?

O protocolo Modbus foi criado em 1979 pela empresa Modicon, que hoje pertence à Schneider Electric. Na época, o objetivo era permitir que os equipamentos fabricados pela própria empresa pudessem trocar dados entre si.

Hoje, o padrão é mantido e padronizado pela Modbus Organization, que garante a certificação e evolução do protocolo.

Vantagens do Modbus

O protocolo Modbus foi desenvolvido desde o início com foco em aplicações industriais. Ele possui:

  • Formato de mensagem simples, facilitando a implementação;
  • Padrão aberto, ou seja, sem custos de licenciamento;
  • Grande disponibilidade de materiais de apoio, como tutoriais, bibliotecas e exemplos práticos;
  • Compatibilidade com diversos microcontroladores, como Arduino e outros;
  • Independência de meio físico, permitindo seu uso sobre diferentes interfaces (RS-232, RS-485, Ethernet, etc.);
  • Facilidade de configuração, após o entendimento das funções, tipos de dados e estrutura do protocolo.

Arquitetura Cliente-Servidor

Um dos principais conceitos do Modbus é a arquitetura cliente-servidor (anteriormente chamada de mestre-escravo). Qualquer equipamento que deseje trocar dados na rede atua como cliente, sendo o responsável por fazer requisições a um servidor, que é o dispositivo que responde a essas requisições.

Por exemplo, um CLP (Controlador Lógico Programável) pode atuar como cliente, fazendo requisições a um inversor de frequência (servidor). O servidor, então, responde às requisições, confirmando ou não os comandos enviados. Um exemplo de uma rede RS-485 com um cliente (CLP) e vários servidores (Inversores de Frequência) é apresentado na Figura 1.

Figura 1. Exemplo de uma rede RS-485 com um cliente (CLP) e vários servidores (Inversores de Frequência)

Exemplos de clientes e servidores

  • Clientes: computadores rodando sistemas supervisórios, CLPs enviando comandos, IHMs acessando dados de controladores.
  • Servidores: inversores, sensores, atuadores, módulos de entrada e saída, entre outros.

O Modbus no Modelo ISO/OSI

O Modbus é considerado um protocolo da camada de aplicação no modelo OSI. Isso significa que ele define as funções e comandos de alto nível usados para a comunicação entre dispositivos.

Abaixo dessa camada, o Modbus pode ser implementado em diferentes meios físicos. Quando utilizado com interfaces seriais como RS-232 ou RS-485, o protocolo opera com um modelo de mestre-escravo. Já em redes como Ethernet ou Wi-Fi, o acesso ao meio segue regras como CSMA/CD (acesso múltiplo com detecção de colisão). A Figura 2 apresenta as camadas, conforme especificado na norma.

Figura 2. Pilha de camadas do protocolo Modbus [1]

Tipos de Modbus

Existem três principais versões do protocolo Modbus, cada uma com características específicas:

Modbus TCP

É utilizado em redes Ethernet (IEEE 802.3) e Wi-Fi (IEEE 802.11). Nesta versão, o protocolo roda sobre TCP/IP, usando a porta 502 como padrão de comunicação.

Por exemplo, um CLP pode ser configurado com um endereço IP e conectado a um switch que distribui o tráfego para diversos dispositivos servidores, como módulos de entrada/saída. O cliente envia suas requisições na forma de pacotes TCP para a porta 502 dos servidores. A Figura 3 apresenta uma topologia com um CLP (cliente) e alguns módulos (servidores) ligados através de um switch.

Figura 3. Topologia de rede Modbus TCP [2]

Modbus RTU e ASCII via RS-485

As versões RTU (Remote Terminal Unit) e ASCII do Modbus são utilizadas em redes seriais, especialmente sobre o padrão RS-485 e RS-232. Neste caso, a comunicação segue o modelo mestre-escravo, onde apenas o mestre pode iniciar as requisições, e os escravos apenas respondem.

Cada escravo deve possuir um endereço configurado manualmente, muitas vezes por meio de chaves (DIP switches), IHM ou via software. As velocidades de comunicação típicas vão de 9.600 até 115.200 bps, sendo possível conectar até 32 dispositivos sem repetidores, com distâncias de até 1.200 metros e taxas de até 100 kbps. Na Figura 1 pode-se ver que cada inversor (servidor) tem o seu endereço de escravo.

Modbus RTU e ASCII via RS-232

O RS-232 é uma interface ponto-a-ponto, suportando apenas a comunicação entre um mestre e um único escravo. Ainda assim, o Modbus RTU e ASCII também podem ser utilizados nesse tipo de conexão, geralmente em painéis industriais entre CLPs e IHMs, onde a distância de comunicação é curta.

Como funciona a troca de dados entre cliente e servidor?

A comunicação sempre parte do cliente, que envia uma requisição ao servidor, solicitando a leitura ou escrita de alguma variável. As variáveis representam posições de memória, entradas (sensores, botões, etc.) e saídas (relés, bobinas, chaves).

O servidor pode responder de três formas:

  1. Resposta normal: aceita e executa o comando, retornando os dados esperados.
  2. Resposta de exceção: o comando não foi aceito devido a erro (endereço inválido, função não implementada, etc.).
  3. Sem resposta: pode ocorrer por erro de rede (ruído, CRC inválido, endereço inexistente ou mensagem broadcast — que não deve gerar resposta).

O servidor, ao receber a requisição, realiza uma verificação de integridade (checagem de erro) e, se válida, executa a função solicitada.

PDU x ADU no Modbus

A estrutura de mensagens do Modbus é apresentada na Figura 4 e é dividida em duas partes:

  • PDU (Protocol Data Unit): contém o código da função e os dados da requisição ou resposta.
  • ADU (Application Data Unit): adiciona elementos como endereçamento, identificador de transação e verificação de erro (CRC ou checksum), dependendo da versão do Modbus utilizada (RTU, ASCII ou TCP).
Figura 4. PDU e ADU do protocolo Modbus [1]

Tipos de Dados no Modbus

O Modbus trabalha com dois tipos principais de variáveis:

1. Acesso por bit

  • Entradas discretas (Discrete Inputs): representam entradas digitais, como sensores de presença ou botões. São apenas de leitura.
  • Coils (Bobinas): representam saídas digitais, como relés ou LEDs. Permitem leitura e escrita.

2. Acesso por palavra (Word de 16 bits)

  • Input Registers: são registradores de entradas analógica, geralmente lidos a partir de conversores AD.
  • Holding Registers: registradores de leitura e escrita, usados para configurar parâmetros, armazenar valores de temporizadores, contadores, variáveis de controle, entre outros.

Funções Modbus

O protocolo define códigos de função padronizados, usados para acessar os dados. Alguns exemplos:

Acesso por bit:

  • 01 (Read Coils) – Lê o estado das saídas digitais
  • 02 (Read Discrete Inputs) – Lê o estado das entradas digitais
  • 05 (Write Single Coil) – Escreve o estado de uma saída digital
  • 15 (Write Multiple Coils) – Escreve o estado de várias saídas digitais

Acesso por 16 bits:

  • 03 (Read Holding Registers) – Lê os registradores holding
  • 04 (Read Input Registers) – Lê os registradores de entrada
  • 06 (Write Single Register) – Escreve em um registrador holding
  • 16 (Write Multiple Registers) – Escreve em múltiplos registradores holding

Além disso, o Modbus define funções para diagnóstico, configuração e outras operações específicas. As funções e suas descrições detalhadas, com exemplos, são apresentadas em [1].

É importante lembrar que cada servidor pode implementar apenas parte dessas funções, conforme definido pelo fabricante. Por isso, é essencial consultar o manual do equipamento para saber quais códigos de função estão disponíveis. Caso você envie uma função não suportada, o servidor responderá com uma resposta de exceção.

Conclusão

Esses são os conceitos básicos que servem de base para o entendimento do protocolo Modbus e suas diferentes versões: RTU, ASCII e TCP. Com esse conhecimento, você poderá se aprofundar em aplicações práticas, desenvolver projetos de automação industrial e configurar dispositivos com segurança.

Acesse mais conteúdos aqui do blog relacionados ao Modbus

Nos próximos conteúdos, vamos explorar exemplos práticos com Arduino, CLPs, IHMs e softwares de testes, para você ver tudo isso funcionando na prática!

Curtiu o conteúdo? Compartilhe com colegas e fique ligado nos próximos posts!

Aula no YouTube

Esta postagem está disponível em vídeo no meu canal do YouTube.

Referências Bibliográficas

[1] Modbus-IDA. MODBUS APPLICATION PROTOCOL SPECIFICATION
V1.1b
. Disponível em: <https://www.modbus.org/docs/Modbus_Application_Protocol_V1_1b.pdf>. Acesso em: 25 mar. 2025.

[2] AMCI adds Modbus TCP to its stepper indexer/drives. Disponível em: <https://www.automation.com/en-us/products/product12/amci-adds-modbus-tcp-to-its-stepper-indexerdrives>. Acesso em: 25 mar. 2025.

Cliente Modbus RTU em Linguagem C – Windows e Porta COM

Um Cliente Modbus RTU desenvolvido em Linguagem C para Windows, utilizando Porta COM.

Download do código fonte

Cliente Modbus RTU em Linguagem C no Windows (.zip)

Download

Enviar link de download para: / Send download link to:

Para fazer o download deste arquivo, inscreva-se em nossa newsletter e fique por dentro de novidades e conteúdos exclusivos! Seu apoio é fundamental para que possamos continuar oferecendo material de qualidade. Muito obrigado por contribuir com a manutenção do nosso blog!

To download this file, sign up for our newsletter and stay up to date with news and exclusive content! Your support is essential for us to continue offering quality material. Thank you very much for contributing to the maintenance of our blog!

Link de Download do Dev-Cpp 5.11 TDM-GCC 4.9.2 Setup.exe

Aula no YouTube

Escravo Modbus RTU desenvolvido com Arduino Uno/Mega

No post de hoje eu vou mostrar como pode ser implementado um Escravo Modbus RTU desenvolvido com Arduino Uno/Mega. O projeto também pode ser implementado no Mega e em outras versões do Arduino.

Os objetivos desta aula prática são:

  • Utilizar um Arduino Uno/Mega como escravo/servidor Modbus RTU;
  • Montar um circuito de testes utilizando potenciômetros, botões, LEDs e resistores. Os potenciômetros e botões vão representar entradas que podem ser lidas, e os LEDs vão representar saídas digitais que podem ser escritas no escravo;
  • Mapear as entradas e saídas como endereços de registradores que serão utilizados para acesso aos dados do escravo;
  • Utilizar bibliotecas do próprio site oficial da Arduino: ArduinoModbus e ArduinoRS485;
  • Apresentar um código de exemplo (bem didático) para a configuração do escravo;
  • Testar a comunicação do escravo com o Elipse E3. O Elipse E3 é um software de supervisão, que vai agi como mestre/cliente. A partir do driver modbus.dll, vamos acessar os registradores configurados.

No nosso canal no YouTube eu já fiz uma aula sobre o Protocolo Modbus (visão geral) e também sobre o Protocolo Modbus RTU (que detalha mais protocolo). Neste artigo, não vamos entrar em detalhes sobre os quadros e bytes que estão sendo enviados. Estaremos simplesmente aplicando esse protocolo em um nível mais abstrato.

Aula em vídeo no YouTube

Arquitetura da aplicação

A Arquitetura é apresentada na Figura 1. Os dispositivos vão estar ligados pela USB/Serial. É possível também, a partir da porta Serial do Arduino Uno, utilizar módulos para montar uma rede RS-485 ou RS-232.

Figura 1. Arquitetura da Aplicação com Escravo Modbus RTU e Arduino UNO
Figura 1. Arquitetura da Aplicação com Escravo Modbus RTU e Arduino Uno

Um computador rodará o Elipse E3. Este programa vai agir como o mestre/cliente. No Modbus RTU, o mestre/cliente é o único dispositivo que pode fazer requisições para os escravos/servidores. Os escravos só podem responder às requisições do mestre. O mestre faz uma requisição solicitando o estado de uma entrada ou solicitando para alterar o valor de uma saída, e o escravo vai responder confirmando ou não a essa requisição (vou, a partir daqui, utilizar apenas os termos mestre e escravo no texto).

Definição de entradas, saídas e registradores

O circuito que foi montado é apresentado na Figura 2. Na lista abaixo, são apresentados os componentes, as entradas, as saídas e os registradores que serão configurados na aplicação.

  • 2 botões representam entradas digitais. O tipo de dados Modbus para entradas digitais é Discrete Inputs;
  • 2 potenciômetros representam entradas analógicas. O tipo de dados para entradas analógicas é Input Registers;
  • 2 LEDs são utilizados para representar saídas digitais. O tipo de dados Modbus para saídas digitais é Coils;
  • 2 LEDs são utilizados para representar saídas analógicas. O valor escrito nestas variáveis, entre 0 e 255, será utilizado para o valor do PWM do pino. O tipo de dados Modbus para saídas analógicas é Holding Registers;
  • O LED embutido (pino 13) é controlado por uma variável interna do tipo Holding Register. Toda vez que o valor do registrador estiver acima de 1000, o LED é ativado;
  • O tempo decorrido desde a inicialização do Arduino Uno é armazenado em uma variável do tipo Holding Register que pode ser lida pelo mestre;
  • Resistores de 330 ohms são utilizados para limitar a corrente dos LEDs.
Figura 2. Esquema Elétrico - Escravo Modbus RTU com Arduino UNO no TinkerCAD
Figura 2. Esquema Elétrico – Escravo Modbus RTU com Arduino Uno no TinkerCAD

A biblioteca ArduinoModbus

No Arduino Uno vai rodar um servidor (ModbusRTUServer). Esse é um objeto que vem da biblioteca ArduinoModbus e atende às requisições que vão chegar na porta Serial. Qualquer requisição que chegar será respondida automaticamente. Além disso, o servidor mantém o valor atual de cada registrador que foi configurado na inicialização do ModbusRTUServer.

Periodicamente, teremos que atualizar no servidor o estado das entradas, e utilizar as informações atuais no servidor para atualizar as saídas. Como usuários da biblioteca, nós precisamos chamar funções para fazer a leitura e escrita dos registradores que nós configuramos.  Em outras palavras, vamos sincronizar o estado das entradas e saídas com o ModbusRTUServer.

As bibliotecas ArduinoModbus e ArduinoRS485 são constantemente atualizadas, e as versões atuais não têm mais compatibilidade garantida com o Arduino Uno e ao Mega. Elas estão sendo desenvolvidas para outros modelos e as versões que eu utilizei (que não dão Warnings de compilação) são a versão 1.0.7 (ArduinoModbus) e 1.0.4 (ArduinoRS485).

Você pode instalar as bibliotecas através do Gerenciador de Bibliotecas da Arduino IDE.

Definição dos Endereços de Registradores

Será necessário definir os endereços de registradores para as entradas e saídas do Escravo Modbus RTU desenvolvido com Arduino Uno/Mega. A Figura 3 apresenta um resumo das configurações de pinos, tipos de dados e endereços de registradores. Os endereços estão apresentados no formato hexadecimal.

Figura 3. Endereços de registradores configurados
Figura 3. Endereços de registradores configurados

Códigos-Fonte e diagramas

Download dos arquivos de código-fonte, diagrama elétrico e configuração do driver Modbus.dll para o Elipse E3.

Escravo Modbus RTU com Arduino UNO (.zip)

Download

Enviar link de download para: / Send download link to:

Para fazer o download deste arquivo, inscreva-se em nossa newsletter e fique por dentro de novidades e conteúdos exclusivos! Seu apoio é fundamental para que possamos continuar oferecendo material de qualidade. Muito obrigado por contribuir com a manutenção do nosso blog!

To download this file, sign up for our newsletter and stay up to date with news and exclusive content! Your support is essential for us to continue offering quality material. Thank you very much for contributing to the maintenance of our blog!

Explicação do Código fonte

Inicialmente, são feitas diversas definições de bibliotecas, pinos, quantidades de entradas e saídas, endereços iniciais de registradores e outras relacionadas à comunicação Serial.

Em seguida, no setup(), configuramos os pinos como entradas e saídas. Além disso, o ModbusRTUServer precisa ser configurado com o endereço de escravo, taxa de comunicação e codificação da Serial. Por fim, configuramos os tipos de registradores que serão utilizados, bem como os endereços de cada tipo de dados e a quantidade de registradores.

Em seguida, no loop(), faremos a atualização do ModbusRTUServer, escrevendo o estado das entradas. Depois, atualizamos os pinos de saída com os valores armazenados no ModbusRTUServer. Também acessamos o valor atual do Holding Register do LED embutido e atualizamos no ModbusRTUServer o tempo decorrido.

Teste de comunicação com o Elipse E3

O driver de comunicação modbus.dll, obtido diretamente do site da Elipse, foi utilizado para os testes de comunicação. O driver foi configurado para acessar a porta COM onde está ligado o Arduino Uno. Em seguida, foram configuradas as tags que conseguem acessar os dados. A Figura 4 apresenta a configuração e os parâmetros utilizados.

Figura 4. Configuração de tags e endereços de registradores Modbus no Elipse E3
Figura 4. Configuração de tags e endereços de registradores Modbus no Elipse E3

Preste atenção em algumas configurações adicionais do driver modbus.dll nas Figuras 5 e 6. Na Figura 6, verifique se a taxa de comunicação (baud rate) configurada é igual à do código no Arduino. O recomendável é usar 9600 8-N-2.

Figura 5. Configuração do driver modbus.dll no Elipse E3
Figura 6. Configuração do driver modbus.dll no Elipse E3

Considerações finais

O protocolo Modbus é muito utilizado em aplicações de comunicação industrial, principalmente por ser um protocolo aberto. Sua facilidade de implementação em relação a outros protocolos, a compatibilidade com diversos equipamentos e a disponibilidade de bibliotecas e exemplos facilitam seu uso.

Porém, ele não é um protocolo determinístico, o que significa que em aplicações hard real-time e controle crítico não é adequada a sua utilização. Ele é mais indicado em aplicações soft real-time e para aplicações de supervisão de processos.

É importante também compreender o funcionamento das bibliotecas, suas limitações, e quais recursos do microcontrolador serão utilizados pela biblioteca, para que o uso não interfira em outras funcionalidades e bibliotecas utilizadas na aplicação.

Referências

Modbus (2023) Wikipedia. Available at: https://en.wikipedia.org/wiki/modbus (Acessado em 17 Jul 2023).

Modbus Application Protocol Specification V1. Available at: https://www.modbus.org/docs/Modbus_Application_Protocol_V1_1b.pdf (Acessado em 17 Jul 2023).

Modbus Tools (no date) Modbus Protocol. Available at: http://www.modbustools.com/modbus.html (Acessado em 17 Jul 2023).

Hard and soft real-time operating system – javatpoint (no date) www.javatpoint.com. Available at: https://www.javatpoint.com/hard-and-soft-real-time-operating-system (Acessado em 17 Jul 2023).

Comunicação de Dados