De acordo com os artigos anteriores foi demonstrado para o leitor que, para realizar a interação entre o Arduino UNO e o ScadaBR foi necessário utilizar um protocolo de comunicação chamado Modbus, no entanto, este protocolo possui basicamente duas versões que podem cumprir este papel, estas são: Modbus Serial e Modbus TCP/IP. Vamos então para mais um posto ScadaBR Arduino.
O objetivo deste conteúdo é abordar novamente a questão da comunicação entre o Arduino UNO e o ScadaBR, porém, desta vez, por meio da versão Modbus TCP/IP. Como pode-se perceber, esta abordagem possibilita que as informações provenientes das leituras das variáveis e as utilizadas nos acionamentos, possam ser transmitidas via rede.
Produtos Utilizados no Projeto:
- 1 Arduino UNO + Cabo USB AB
- 1 Shield Ethernet
- 1 Resistor 10k Ω 1/4 W
- 1 Protoboard
- Sensor de umidade e temperatura DHT 11
Montagem Física (Hardware):
Desenvolvimento do Código para ScadaBR Arduino:
Neste ponto, serão demonstrados todos os passos para o desenvolvimento do código que deve ser inserido no Arduino UNO para que seja possível realizar as leituras provenientes do sensor DHT11 através do ScadaBR.
O primeiro passo para o estabelecimento da comunicação entre os dois elementos consiste na inclusão das bibliotecas adequadas para a utilização do protocolo Modbus TCP/IP no código do Arduino UNO. As bibliotecas utilizadas neste artigo foram desenvolvidas pelo André Sarmento e estão disponíveis aqui.
O desenvolvimento do código começa com a inclusão da bibliotecas Modbus.h e ModbusIP.h por meio da diretiva #include.
1 2 3 4 5 6 7 8 9 |
#include <SPI.h>; #include <Ethernet.h>; #include <Modbus.h>; #include <ModbusIP.h>; #include <DHT.h>; |
Em seguida, deve-se criar o objeto do tipo DHT para representar o sensor DHT11 no código do Arduino UNO.
1 |
DHT dht(A0, DHT11); |
Como o objetivo desta aplicação é simplesmente realizar a leitura de dados, utiliza-se a instância denominada Input Register. Lembre-se que, neste caso, deseja-se obter tanto os valores de temperatura quanto os de umidade, portanto, duas instâncias do tipo citado devem ser utilizadas para armazenar as informações em questão. Sendo assim, determina-se os offsets das instâncias citadas anteriormente.
1 2 |
const int TEMP_IREG = 0; const int UMI_IREG= 1; |
Antes de prosseguir para a função setup(), deve-se criar o objeto do tipo ModbusIP.
1 |
ModbusIP mb; |
Além disso, declara-se uma variável do tipo long para auxiliar na contagem de tempo para a realização da leitura do sensor (recomenda-se que seja utilizado um valor de aproximadamente 2 segundos na realização das leituras).
1 |
long ts; |
Na função Setup(), pode-se perceber que existem três blocos de código, de modo que, o primeiro diz respeito à configuração dos parâmetros de comunicação do protocolo (deve-se ficar atento apenas à escolha de um endereço de ip compatível com a rede local que está sendo utilizada) e à inicialização da comunicação propriamente dita.
O segundo bloco de código é responsável pela criação das instancias utilizados do tipo Input register, citadas anteriormente.
Por último, deve-se inicializar o sensor DHT11 e preencher a variável ts com o valor proporcionado pela função millis(), para então, realizar a leitura do sensor em intervalos de tempo predeterminados.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
void setup() { //Bloco 1 byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; byte ip[] = { 192, 168, 26, 50 }; mb.config(mac, ip); //Bloco 2 mb.addIreg(TEMP_IREG); mb.addIreg(UMI_IREG); // Bloco 3 dht.begin(); ts = millis(); } |
Já dentro da função loop(), encontra-se a função task(), utilizada para gerenciar a comunicação e a troca de dados entre os dispositivos que estão conectados através do protocolo Modbus.
Além da função citada, pode-se perceber a existência de uma estrutura condicional IF cujo conteúdo consiste em determinar que seja feita a leitura do sensor a cada 2 segundos. Observe que as funções utilizadas para inserir os dados nas instâncias criadas são: readTemperature() e readHumidity().
1 2 3 4 5 6 7 8 9 10 11 |
void loop() { mb.task(); if (millis() > ts + 2000) { ts = millis(); mb.Ireg(TEMP_IREG, dht.readTemperature()); mb.Ireg(UMI_IREG, dht.readHumidity()); } } |
Desenvolvimento da Estrutura de Controle no Scadabr Arduino
Assim como nos artigos anteriores, o primeiro passo para prosseguir com o desenvolvimento de uma aplicação no ScadaBR consiste na criação de um Data source, ou seja, na definição do elemento responsável por fornecer os dados do processo para o ScadaBR.
Posteriormente, deve-se fornecer algumas informações para o ScadaBR visando a identificação do dispositivo e a definição do tempo em que os dados serão atualizados no ScadaBR Arduino (esta informação é muito importante, sendo assim, torna-se fundamental que o leitor tenha conhecimento da aplicação que está desenvolvendo para que a escolha deste parâmetro resulte em um funcionamento eficaz do projeto).
Além destas configurações, deve-se especificar também os parâmetros relativos à comunicação, como por exemplo: o Tipo de transporte utilizado e também o Endereço IP do Arduino UNO.
Após a determinação do Data source deve-se criar os Data points correspondentes aos elementos de hardware que serão utilizados. Inicialmente, cria-se um novo Data point para interagir com a instância do tipo Input register denominada TEMP_IREG e em seguida deve-se definir seus campos da seguinte forma:
- No campo Faixa do registro deve-se selecionar a opção Input register.
- O campo Tipo de dados modbus estará automaticamente definido como Inteiro de 2 bytes sem sinal.
- Deve-se atribuir o valor 0 ao campo Offset, devido ao fato de o Input register TEMP_IREG ter sido a primeira instância deste tipo a ser adicionada no código (lembre-se que a ordem começa a ser contada a partir do 0 e não do 1).
- Lembre-se de deixar a caixa de seleção desmarcada para que o Data point não possa ser alterado manualmente.
O segundo Data point a ser criado servirá para interagir com a instância do tipo Input
register denominada UMI_IREG. Seus campos devem ser definidos da seguinte forma:
- No campo Faixa do registro deve-se selecionar a opção Input register.
- O campo Tipo de dados modbus estará automaticamente definido como Inteiro de 2 bytes sem sinal.
- Deve-se atribuir o valor 1 ao campo Offset, devido ao fato de o Input register UMI_IREG ter sido a primeira instância deste tipo a ser adicionada no código (lembre-se que a ordem começa a ser contada a partir do 0 e não do 1).
- Lembre-se de deixar a caixa de seleção desmarcada para que o Data point não possa ser alterado manualmente.
A figura a seguir mostra como os Data points estão organizados os após a criação realizada anteriormente. Neste momento, deve-se habilitar o Data point clicando no ícone adequado, conforme apresentado na figura abaixo.
Neste momento o leitor deve acessar a Watch list para conferir se o Data Point em questão foi criado e clicar na seta para visualizar o conteúdo dos Data points criados.
Este foi mais um conteúdo que preparamos com bastante cuidado para você. Esperamos que tenha gostado do artigo “ScadaBR Arduino Comunicando através do protocolo TCP/IP”. Lembre-se de deixar suas dúvidas, críticas e sugestões nos comentários abaixo.
Conheça toda Linha de Produtos Arduino no Site UsinaInfo.
Nossa muito bom este artigo!
Parabéns”
Voltarei sempre aqui!
Funciona bem de mais!!!
Muito obrigado!
Daniel
Muito bom seu projeto funcionou muito bem.
Como usamos DHT22 que tem precisão de uma casa decimal.Quando Lemos no SCADAbr ele perde essa precisão.
Tem como ter essa casa decimal de precisão?