Comunicando o Arduino com o ScadaBR através do protocolo TCP/IP

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.

Sendo assim, 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:

 

 

MONTAGEM FÍSICA (HARDWARE):

Figura 1 – Hardware utilizado

 

DESENVOLVIMENTO DO CÓDIGO PARA O 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.

 

#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.

 

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.

 

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.

 

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).

 

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.

 

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().

 

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:

 

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.

 

Figura 2 – Data source criado

 

 

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 (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.

 

Figura 3 – Propriedades do Data source

 

 

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.

 

Figura 4 – Data point TEMPERATURA

 

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.

 

Figura 5 – Data point UMIDADE

 

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.

 

Figura 6 – Data points criados

 

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.

 

Figura 7 – Data points em funcionamento

 

 

Este foi mais um conteúdo que preparamos com bastante cuidado para você. Esperamos que tenha gostado deste artigo e lembre-se de deixar suas dúvidas, críticas e sugestões nos comentários abaixo.

Categorias
ScadaBR

Engenheiro eletricista graduado com ênfase em Controle e Automação pela Universidade Federal do Espírito Santo - UFES e Técnico em Eletrotécnica pelo Instituto Federal do Espírito Santo - IFES. Parceiro do site UsinaInfo.
Um Comentário
  • maria luiza
    14 julho 2017 at 19:16
    Enviar Resposta

    Nossa muito bom este artigo!
    Parabéns”
    Voltarei sempre aqui!

  • Enviar Resposta

    *

    *

    Sobre nós

    Hoje a Usinainfo é um dos maiores ecommerces de Ferramentas, Peças para Eletrônica, Componentes Eletrônicos, Sensores e Arduino do Brasil, contando com uma grande diversidade de produtos na linha de eletrônica.

    Sugestões

    Artigos Relacionados