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.
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.
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.
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)
Enviar link de download para: / Send download link to:
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.
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.
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).