Estabelecendo comunicação via protocolo Modbus com ScadaBR

dados por e-mail com ScadaBR

Qual é o objetivo deste artigo?

 

Este artigo corresponde ao início de uma série de materiais que visam auxiliar no desenvolvimento de projetos de automação utilizando o Arduino UNO juntamente com o ScadaBR. Neste conteúdo serão apresentados alguns conceitos introdutórios para que o leitor entenda o que estamos propondo de maneira bastante didática fazendo desta publicação um ponto de partida para aplicações cada vez mais elaboradas.

 

Para aqueles que nunca ouviram falar. o ScadaBR consiste em um sistema supervisório completo que por sua vez é disponibilizado em licença Open Source. Além disso, possui suporte para uma vasta gama de protocolos de comunicação, sendo portanto, compatível com um grande número de hardwares dos mais diversos fabricantes, característica essencial para ser utilizado, por exemplo, no campo de controle e automação industrial. Para maiores informações, clique aqui.

 

 

Primeiro passo: Definição do hardware que será utilizado

 

O hardware que será utilizado para demonstrar os conceitos iniciais propostos no início deste artigo será composto por um Arduino UNO, um led (e o respectivo resistor para o acionamento do mesmo, com um valor de resistência de 280Ω) e um potenciômetro de 4.7kΩ. De maneira mais direta, o objetivo do projeto desenvolvido neste artigo consiste em produzir um sistema onde o usuário pode definir o valor do PWM a ser utilizado no acionamento do led existente através do potenciômetro, para por exemplo, controlar a intensidade luminosa do mesmo.

 

SITE14
Figura 1 - Hardware utilizado.

 

 

 

Segundo passo: Elaboração do código que será inserido no Arduino UNO

 

No decorrer desta seção serão explicados todos os passos utilizados para o desenvolvimento do projeto proposto, isto é, o código será comentado de modo que todo conhecimento aplicado seja facilmente compreendido.

 

Num primeiro momento deve-se incluir as bibliotecas necessárias para que o código a ser inserido no Arduino UNO funcione adequadamente. Neste artigo utilizaremos somente a biblioteca desejada para estabelecer a comunicação entre o Arduino UNO e o ScadaBR através do protocolo Modbus. Esta pode ser encontrada aqui (baixar o arquivo SimpleModbusSlaveV10.zip).

 

O código a ser utilizado foi derivado diretamente do exemplo disponível que vem junto com a biblioteca em questão. Portanto, caso o leitor queira, pode apenas modificar o exemplo citado.

 

 

Em seguida realizou-se o uso da diretiva #define para associarmos a palavra LED ao pino 9 do Arduino UNO.

 

 

Posteriormente pode-se observar um bloco chamado enum, neste estarão escritos os registradores que conterão as informações utilizadas na leitura ou no acionamento de dispositivos. São denominados no ScadaBR como Registradores Holding. Para declará-los basta escrever seus nomes seguidamente. Neste artigo, por exemplo, o Registrador Holding utilizado para conter o valor proveniente do potenciômetro chama-se VALOR_POT, enquanto o responsável por armazenar o valor que será utilizado no acionamento do led via PWM é denominado VALOR_PWM. É importante ressaltar que após as declarações dos respectivos Registradores Holding, deve-se escrever HOLDING_REGS_SIZE (informação utilizada pela biblioteca para identificar a quantidade de Registradores Holding que estão sendo utilizados) e em seguida cria-se a variável holdingRegs para a manipulação dos registradores em questão.

 

 

Na função setup() utiliza-se primeiramente a função modbus_configure() para determinar os parâmetros necessários para estabelecer a conexão via comunicação serial utilizando o protocolo Modbus. Os parâmetros mais importantes para este artigo são o segundo, o terceiro e o quarto que dizem respeito à taxa de transmissão de dados, o formato do pacote utilizado no protocolo Modbus e a identificação do escravo, respectivamente. Note que estes três argumentos citados devem estar em conformidade com as configurações do ScadaBR.

 

Em seguida temos a função modbus_update_comms() que também é responsável pela comunicação via Modbus, enquanto a função pinMode() determina o modo de operação (como saída) do pino onde está conectado o led.

 

 

O conteúdo da função loop() começa com a função modbus_update() utilizada para a atualização dos valores dos registradores citados anteriormente. Em seguida, realiza-se a leitura da tensão aplicada à porta de entrada analógica A0 e posteriormente o valor encontrado é convertido em um número inteiro contido no intervalo entre 0 e 1023 utilizando a função analogRead() de forma que este é armazenado no Registrador Holding identificado como VALOR_POT. Por último, temos a função analogWrite(), responsável por acionar o led utilizando PWM (observe que o valor utilizado na largura do pulso está contido no Registrador Holding VALOR_PWM, que por sua vez será preenchido dentro do ScadaBR).

 

 

 

Terceiro passo: Criação do Data Source e seu(s) respectivo(s) Data Point(s) para aquisição de dados

 

Neste momento iremos abordar os primeiros passos para realizar a interação do Arduino UNO com o SCADABR. Primeiramente é necessário fazer com que o SCADABR identifique o elemento com o qual irá interagir, chamado dentro do programa de Data source, de modo que para a criação deste é necessário clicar no ícone correspondente presente na barra de ferramentas conforme a figura a seguir.

 

scadabr: Barra de ferramentas
Figura 2 - Barra de ferramentas

 

Em seguida deve-se estabelecer 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 Serial.

 

scadabr: Criação de um Data source
Figura 3 - Criação de um Data source

 

Posteriormente algumas informações devem ser fornecidas para o SCADABR tanto para identificação do dispositivo escravo quanto para que a funcionalidade seja efetiva. Num primeiro momento o leitor deve nomear o dispositivo escravo, bem como definir o tempo em que os dados serão atualizados (esta informação é muito importante, sendo portanto, 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).

 

scadabr: Definição de características básicas
Figura 4 - Definição de características básicas

 

Além destas configurações básicas, deve-se especificar mais alguns parâmetros relativos à comunicação estabelecida, como por exemplo: a porta COM utilizada (neste artigo utilizamos a porta COM11), e a taxa de transmissão utilizada (9600 bps). Neste momento, o leitor deve recordar que ao escrever o código para o Arduino UNO, existiam duas funções dentro da função setup() em que um dos parâmetros era a sigla SERIAL_8N1. Esta significa que estão sendo utilizados 8 bits para dados e um bit de parada na transmissão da informação entre os elementos, portanto, estas informações devem estar identificadas nos campos data bits e stop bits. Observe que existe uma vasta gama de campos que podem ser modificados, no entanto, para este artigo foi necessário alterar somente os já citados.

 

scadabr: Definição de características pertinentes à comunicação
Figura 5 - Definição de características pertinentes à comunicação

 

Para conferir se o Arduino UNO foi encontrado, basta pesquisar a existência de um nó conforme a figura abaixo.

 

scadabr: Pesquisa de nós
Figura 6 - Pesquisa de nós

 

O próximo passo é inserir no SCADABR os registradores holding que foram declarados no código do Arduino UNO. Para realizar este procedimento deve-se criar os chamados data points, clicando no ícone encontrado na extremidade superior direita da figura abaixo.

 

scada9
Figura 7 - Criação de data points

 

Após o procedimento realizado anteriormente, uma nova janela é aberta para que seja possível determinar as propriedades do data point criado. Primeiramente é necessário nomeá-lo (aqui foi utilizado o nome POT) e em seguida definir 3 campos fundamentais: o primeiro é o Faixa do registro onde a opção a ser selecionada deve ser registrador holding, em seguida Tipo de dados modbus determinado como Inteiro de 2 bytes sem sinal e, por último, Offset (este campo, diz ao SCADABR qual dos registradores holding será escrito ou lido, de maneira que o número a ser utilizado vai de acordo com a sequência escrita no código do Arduino UNO, ou seja, como será lido o registrador VALOR_POT e este foi o primeiro a ser escrito na tabela, usa-se o valor 0 no Offset). Observe que ao efetuar a leitura, o SCADABR apresentará um valor que varia de 0 a 1023 conforme esperado, no entanto caso o leitor queira um valor entre 0 e 5V basta utilizar o valor adequado no campo Multiplicador.

 

scadabr: Definição das propriedades dos data points
Figura 8- Definição das propriedades dos data points

 

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 ícone conforme a figura citada.

 

scadabr: Data point criado
Figura 9 - Data point criado

 

O próximo passo é criar o data point responsável pelo acionamento do led via PWM. Este procedimento é idêntico ao anterior, exceto por uma diferença no campo Offset que desta vez é preenchido com o valor 1 (já que este refere-se ao segundo registrador da tabela escrita no código do Arduino UNO) e a opção configurável deve ser marcada.

 

scadabr: Data points operacionais
Figura 10 - Data points operacionais

 

Neste momento o leitor deve retornar a watch list (primeiro ícone da esquerda na barra de ferramentas) e clicar nas setas para visualizar o estado dos data points criados.

 

scadabr: Watch list
Figura 11 - Watch list

 

Repare que nos valores das medições, o data point referente ao PWM mostra o valor 0, enquanto o data point que diz respeito ao valor lido através do potenciômetro possui um conteúdo de fato condizente com a posição do mesmo. Isto acontece porque em nenhum momento o registrador holding responsável por conter o valor a ser utilizado no PWM é atualizado.

 

scadabr: Aquisição de dados
Figura 12 - Aquisição de dados

 

 

Quarto passo: Criação do(s) Point Link(s) 

 

Existem algumas maneiras de relacionar o valor a ser utilizado no PWM de acordo com a posição do potenciômetro, de forma que neste artigo esta correspondência será realizada dentro do SCADABR. Para isto é necessário clicar no item point links localizado na barra de ferramentas e adicionar um novo point link, onde o data point de origem é o POT e o de destino é o chamado PWM. O próximo passo é escrever o script que será responsável por proporcionar o valor desejado ao data point PWM, conforme a figura (o valor 51 é a constante de proporcionalidade para converter um valor de 0 a 5V em outro no intervalo entre 0 e 255) e posteriormente salvar (não esqueça de mudar o campo evento para atualização, pois caso este procedimento não seja feito, o valor só irá atualizar quando houver alguma modificação no data point de origem). Neste momento, o leitor pode retornar a watch list e conferir os valores adquiridos por meio do potenciômetro, bem como o responsável por acionar o led.

 

Retornando um valor criado no SCADABR para ser utilizado no PWM
Figura 13 - Retornando um valor criado no SCADABR para ser utilizado no PWM

 

A figura 17 exibe o resultado do projeto desenvolvido neste artigo, onde é possível ver a relação entre a posição do potenciômetro e o PWM gerado (gráfico) além da exibição dos valores referentes aos data points no SCADABR.

simulação com scadabr
Figura 14 - Resultado

 

Esperamos que você tenha gostado deste conteúdo, sinta-se à vontade para sugestões, críticas ou elogios. Deixe seu comentário abaixo.

Outros artigos da série

Criação de sistemas supervisórios simples com ScadaBR e Arduino >>
NEWSLETTER

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Obrigado! Sua inscrição foi um sucesso.

Ops, algo deu errado. Por favor tente novamente.

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Daniel Madeira
Sou 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. Me interesso por todas as vertentes existentes dentro da Engenharia Elétrica, no entanto, as áreas relacionadas à automação e instrumentação industrial possuem um significado especial para mim, assim como a Engenharia de Manutenção que na minha opinião é um setor fascinante.

28
Deixe um comentário

avatar
 
17 Comment threads
11 Thread replies
5 Followers
 
Most reacted comment
Hottest comment thread
21 Comment authors
Cássio Lucas de FariaDione LimaJACKSON ANDRADE DAEdilson PereiraLeonardo Recent comment authors
  Notificações  
recentes antigos mais votados
Notificar
Cássio Lucas de Faria
Visitante
Cássio Lucas de Faria

Boa tarde
Fiz tudo conforme descrito. Porém assim que fiz o Point Link apareceu mensagens Urgente e não atualizou o PWM junto com o POT.
Na mensagem aparece
Não foi possível converter resultado "[email protected]" para Numérico"

Fiz um teste. Deixei sem o script e funcionou perfeito.

JACKSON ANDRADE DA
Visitante
JACKSON ANDRADE DA

boa noite não conseguir instabelecer comunicação com meu scadabr esta apresentando que não existeporta de comunicação, como não esta se estou conseguindo comlocar skhect no ardoino? fiquei sem entender

Edilson Pereira
Visitante
Edilson Pereira

Alguém pode me ajudar?
Instalei o scadaBR e da esse erro :

HTTP Status 500 -
type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

org.apache.jasper.JasperException: Unable to compile class for JSP:

An error occurred at line: 1 in the generated java file
The type java.io.ObjectInputStream cannot be resolved. It is indirectly referenced from required .class files

Stacktrace:
org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:92)
org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:330)
org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:439)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:349)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:327)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:314)
org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:589)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:317)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
note The full stack trace of the root cause is available in the Apache Tomcat/6.0.26 logs.

Leonardo
Visitante
Leonardo

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.

Eduardo
Visitante
Eduardo

Olá, Já testei no Uno e funciona muito bem, mas no arduino mega não funciona, alguém já testou?!

Fabricio
Visitante
Fabricio

Olá. Eu consegui funcionar no Mega, no Uno não funcionou rs

Dione Lima
Visitante
Dione Lima

Opa Já usei sim, como o mega tem 4 portas RX TX vc tem que dizer no arduino (Vou setup) qual porta vai usar exemplo:
modbus_configure(&Serial3, 9600, SERIAL_8N1, 1, 2, HOLDING_REGS_SIZE, holdingRegs);
Neste caso devemos plugar no rx3 e tx3 do arduino mega

FILIPE
Visitante
FILIPE

Olá, gostei muito do artigo e do material fornecido, vc tem como fornecer também os materiais ou shields que eu preciso utilizar para fazer esta comunicação? preciso de uma placa shield para converter sinais do Arduino para o computador ? Ou utilizo o mesmo cabo USB e já estaria comunicando normalmente ? Essa por enquanto é minha maior dúvida, se alguem aqui ja fez esta experiência, me responda assim que possível...agradeço, ate breve meus caros !

Edu Silva
Visitante
Edu Silva

Alguém sabe me dizer como criar um botão virtual no ScadaBR para acionar uma lâmpada no através do arduino?

Jéssica
Visitante
Jéssica

Estou com um problema no Arduino Leonardo. Primeiramente fiz o passo a passo daqui, coloquei o código na IDE do arduino, e abri o ScadaBR. Quando fui configurar as portas do ScadaBR, apareceu esse erro "Comm configuration error. Check that rxtx DLL or libraries have been correctly installed.."
Alguém pode me ajudar?

Deocleciano Ruivo
Visitante
Deocleciano Ruivo

Ola!
Ótimo artigo, apenas um adendo. Na imagem Figura 8 mostra o checkbox como "configurável" desmarcado, porém se assim deixa no campo dropdown "Data Point de destino" fica vazio.
Obrigado

Gabriel Lopes
Visitante
Gabriel Lopes

Eu posso usar o ScadaBR para apenas monitorar o processo, e o processo em si ser controlado pelo arduino?