ScadaBR com Arduino via Modbus TCP/IP
No tutorial anterior aprendemos a dar o primeiros passos com SCADABR. Dando sequencia, neste tutorial demonstraremos os procedimentos necessários para a comunicação do Arduino com o ScadaBR utilizando uma outra categoria do protocolo modbus: o modbus TCP/IP.
[toc]
Mãos à obra – Estabelecendo a comunicação entre uma placa Arduino e o ScadaBR
Componentes necessários
- 1 x Arduino UNO
- 1 x Shield Ethernet Wiznet W5100
- 1 x Protoboard
- 1 x Resistor 330 Ω
- 1 x Led verde difuso
Montando o projeto
Programando
#include <SPI.h> #include <Ethernet.h> #include <Modbus.h> #include <ModbusIP.h> const int LED_COIL = 0; ModbusIP mb; void setup() { byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED } byte ip[] = { 192, 168, 25, 16 }; mb.config(mac,ip); pinMode(9, OUTPUT); mb.addCoil(LED_COIL); } void loop() { mb.task(); digitalWrite(9, mb.Coil(LED_COIL)); }
Configurando o Scadabr
Neste momento, vamos apresentar os procedimentos iniciais que devem ser feitos no ScadaBR para que seja possível realizar a interação entre mesmo e a nossa placa Arduino. Primeiramente, para cumprirmos o objetivo apresentado, devemos fazer com que o ScadaBR identifique o elemento com o qual irá se comunicar. Isto deve ser feito através da criação de um elemento chamado Data source, que por sua vez, será a ponte entre a placa Arduino que estamos utilizando e o ScadaBR.
Data source é a estrutura que permite a comunicação entre o Arduino e o ScadaBR
Em seguida, na criação do Data point, devemos dizer qual tipo de comunicação existirá entre os 2 elementos. Como dito anteriormente utilizaremos o protocolo Modbus através da comunicação serial, portanto basta na lista de seleção encontrar a opção Modbus IP e clicar no ícone à direita da lista em questão.
Em seguida, o ScadaBR irá nos direcionará para uma página, na qual, devemos definir os parâmetros do Data source em questão (lembre-se de que ele é a ponte entre o Arduino UNO e o ScadaBR). Em um primeiro momento, devemos apenas nomear o nosso Data source e também definir o tempo em que os dados serão atualizados (esta informação é muito importante, ou seja, 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, devemos também especificar mais alguns parâmetros relativos à comunicação que será estabelecida estabelecida, como por exemplo: o endeceço IP previamente configurado no código do Arduino UNO e o tipo de transporte (sugerimos a opção “TCP com manter-vivo” em um primeiro momento. Não há necessidade de alterarmos o campo Porta.
Após a criação e configuração do Data source, devemos criar uma pequena estrutura denominada Data point. Os Data points são os elementos que irão conter os valores relacionados com as entradas e saídas da nossa placa Arduino. Para realizar este procedimento, vamos até a parte inferior da tela e em seguida clicamos no ícone localizado à direita da tabela referente aos Data points.
Após clicarmos no ícone citado, o ScadaBR nos dará uma janela com algumas opções para serem definidas. Primeiramente, devemos nomear o Data point (neste tutorial, chamamos o mesmo de LED). Em seguida, devemos garantir que campo Faixa do registro esteja com a opção Status do Coil selecionada. Para salvar as configurações feitas, basta clicar no ícone existente na extremidade superior direita da janela.
Como este é um tutorial introdutório, nós não iremos abordar o funcionamento dos outros campos.
A figura a seguir mostra como a tabela onde estão organizados os Data points ficará após a criação realizada anteriormente. Para habilitar o data point desejado basta clicar no círculo vermelho presente no campo Status do Data point criado.
Por fim, devemos ir ao topo da página, salvar as configurações realizadas (procedimento idêntico ao realizado no passo anterior) e habilitar o Data source, clicando novamente no círculo vermelho existente ao lado do ícone de utilizado para salvar.
Neste momento o leitor deve retornar a watch list (primeiro ícone da esquerda na barra de ferramentas) e no lado esquerdo da interface apresentada, clicar na seta para visualizar o estado do data point criado.
Após realizarmos o procedimento citado anteriormente, o nosso Data point aparecerá criado no lado direito da interface apresentada em nossa watchlist.
.
Para acionarmos o led basta posicionarmos o mouse sobre o ícone localizado à esquerda do nome do Data point e alterar o valor do mesmo (repare que quando o valor do mesmo for 0 (zero), o led estará apagado, ao passo que, quando alterarmos para 1(um) o led será acionado).
Veja o resultado do acionamento do led no ScadaBR.
Entendendo a fundo
Software
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 a realização da comunicação entre o mesmo e o ScadaBR.
– Incluindo as bibliotecas que serão utilizadas
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 (desenvolvidas pelo André Sarmento e estão disponíveis aqui). Além disso, devemos declarar também as bibliotecas responsáveis pelo funcionamento do protocolo de comunicação SPI e pela conectividade da nossa placa Arduino com a rede local.
#include <SPI.h> #include <Ethernet.h> #include <Modbus.h> #include <ModbusIP.h>
– Definindo as estruturas do protocolo Modbus
Posteriormente, devemos determinar a estrutura que será responsável pelo acionamento do led. Neste tutorial, iremos abordar apenas uma entre as demais estruturas existente no protocolo MODBUS: os Coils. Estes elementos atuam no armazenamento de valores que podem ser utilizados no acionamento on/off de dispositivos.
Para definirmos o Coil que será utilizado no acionamento do led basta declararmos uma variável do tipo const int e em seguida atribuir um número à mesma de acordo com a quantidade de Coils em uso no projeto (como nesta aplicação estamos utilizando somente um Coil, atribuímos o numero 0 (zero) à variável declarada).
const int LED_COIL = 0;
– Criando o objeto mb
Antes de prosseguir para a função setup(), deve-se criar um objeto chamado mb para que possamos fazer o controla das estruturas existentes no protocolo Modbus.
ModbusIP mb;
– Definindo as configurações iniciais
Na função Setup() existem algumas linhas de código referentes às definições iniciais do programa. Primeiramente, devemos definir alguns parâmetros relacionados ao protocolo de comunicação utilizado, de modo que, este procedimento é realizado através da definição dos endereços MAC e IP da nossa placa Arduino UNO (na prática, o endereço MAC pode ser qualquer um, desde que seja único na rede, enquanto o endereço IP deve ser um endereço válido em sua rede local). Em seguida, para configurarmos o nosso protocolo Modbus, utilizamos a função config() em conjunto com os valores determinados anteriormente.
Em seguida, utilizamos a função pinMode() para definir o modo de operação do pino digital 9 como uma saída digital e por fim, adicionamos o Coil que será responsável por conter os valores utilizados no acionamento do led.
void setup() { byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED } byte ip[] = { 192, 168, 25, 16 }; mb.config(mac,ip); pinMode(9, OUTPUT); mb.addCoil(LED_COIL); }
– Realizando o acionamento do led
Dentro da função loop(), utilizamos a função task() 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, temos também a função necessária para realizar a escrita do dado referente ao acionamento do led na instância Coil.
void loop() { mb.task(); digitalWrite(9, mb.Coil(LED_COIL)); }
Considerações finais
Neste tutorial, demonstramos como você fazer para estabelecer uma comunicação entre a sua placa Arduino e o ScadaBR através de uma rede local, esperamos que você continue nos acompanhando e sinta-se à vontade para nos dar sugestões, críticas ou elogios. Lembre-se de deixar suas dúvidas nos comentários abaixo.
Como faz pra baixar essa biblioteca? Não da certo da erro de diretorio…manda por email??
Ola, estou com o mesmo problema de “‘Arduino TCP/IP’: com.serotonin.modbus4j.exception.ModbusTransportException: java.net.SocketTimeoutException: connect timed out” e no watchlist aparece abaixo do Data Point “Valor do ponto pode não ser confiável “. Como posso corrigir?
Boa noite,
Obrigada pelo tutorial.
Uma dúvida, quando tento fazer a conexão dá um erro de “‘Arduino TCP/IP’: com.serotonin.modbus4j.exception.ModbusTransportException: java.net.SocketTimeoutException: connect timed out” e no watchlist aparece abaixo do Data Point “Valor do ponto pode não ser confiável “. Como posso corrigir?
PODERÁ ENCONTRAR AS BIBLIOTECAS EM:
https://github.com/andresarmento/modbus-arduino
Prezado Daniel;
Estou enfrentando o mesmo problema que os colegas relataram, ou seja, não consigo baixas as bibliotecas.
Seria possível você enviá-la no meu e-mail.
Desde já, um grande abraço.
Daniel, muito bom seu trabalho, mas eu gostaria de saber como “instalar” as bibliotecas na IDE do arduino.
Desde já, agradeço.
Bom dia Daniel, essa biblioteca ModbusIP onde encontrar baixei inumeras bibliotecas nenhuma foi possivel instalar na plataforma IDE, to com meu projeto parado nao acho algo que funcione
Bom dia, é possível colocar também um botão físico para fazer o acionamento ? Fiz aqui para fazer o acionamento via TCP IP e funciono, mas preciso colocar um botão em paralelo para o acionamento também.