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