quinta-feira, 28 de novembro de 2013

Sistema de supervisão com Arduino e Elipse SCADA via rede MODBUS



Estou postando aqui um projeto que montei a mais de ano e agora resolvi posta-lo aqui para compartilhar. Se trata de um sistema de supervisão utilizando uma rede Modbus, onde o escravo é um Arduino e o mestre é um PC rodando o software Elipse SCADA.

Hardware

Para montagem do hardware utilizei um Arduino NANO, LEDs, resistores, 1 LDR, 1 sensor de temperatura LM75A, e um push button. Como utilizei apenas um escravo não precisei utilizar o meio físico RS485, assim utilizei a própria porta USB do Arduino, mas para mais de um escravo será necessário utilizar conversores RS232(PC) para RS485 e de RS485 para TTL(Arduino). A Figura 1 mostra como seria efetuada esta ligação.
http://api.ning.com/files/RkmlBfWrKPzFFM09GTWXdoeOmL5TjEc6xgwL0aGGlTmyWjQy7MUzo*xGBp99ZDj6EUI6hKrjjKfDycp5VTzqiECOAYXpQHNT/RedeArduinoMax485basico.jpg?width=721
Figura 1: Esquema de ligação rede RS485 utilizando Arduino e MAX485. Fonte: www.scadabr.com.b

A Figura 2 apresenta o circuito montado na protoboard para teste, desenhei no Fritizing (não me dei ao trabalho de criar novos resistores então coloquei o valor sobre eles)


Figura 2: Circuito montado para teste.

Software

Aqui darei mais ênfase no Elipse SCADA uma vez que o programa do Arduino esta comentado e não há muito o que falar sobre ele aqui, o mesmo pode ser baixado leste link.
O Elipse SCADA é um software pago e bastante utilizado na indústria, porém para até 20 tags (variáveis) e duas horas de execução seu uso é livre. O download pode ser efetuado no próprio site da Elipse www.elipse.com.br, porém ele vem sem o driver modbus e para baixá-lo e necessário efetuar um registro e aguardar aprovação, mas você também pode baixá-lo deste link.
Após instalado e Elipse para adicionar todo conteúdo da arquivo Modbus.zip a pasta C:\Program Files (x86)\Elipse SCADA\Drivers, feito isso é hora de começar a configuração do sistema.
Ao abrir o Elipse SCADA ele irá procurar pela Hard-Key, porém como você não comprou um licença ele irá perguntar se deseja rodar como Demo, marque sim.


A imagem abaixo mostra a tela inicial do Elipse SCADA, você poderá criar uma nova aplicação a partir do zero ou utilizar a que criei que pode ser baixada neste link.


Ao abrir o arquivo a tela da imagem abaixo será apresenta, estarei explicando cada item desta tela.


Para adicionar/configurar um driver, criar tags e outras configurações clique no ícone circulado de vermelho na imagem abaixo.

 


 Ao clicar a seguinte janela será apresentada.


Primeiramente vamos carregar o driver Modbus clique em "drivers" depois em "localizar" e navegue até a pasta onde colocamos o driver "C:\Program Files (x86)\Elipse SCADA\Drivers" e escolha o arquivo "Modbus.dll", após carregar o driver clique "Configurar" para abrir a janela de configuração do driver e depois em "Extras".


Na primeira aba "Modbus" provavelmente você não terá que alterar nada mas confira se esta igual a imagem abaixo.

 


Na segunda aba "Setup" você escolher o "Physical Layer" do modbus escolha serial.


Na terceira aba "Serial" é onde iremos configurar nossa porta serial. se estiver utilizando o código do Arduino que disponibilizei a configuração que terá que alterar será "Port" que é qual porta serial o Arduino esta plugado, se estiver utilizando outro Sketch configure a serial conforme foi configurada  no mesmo.

 

Agora vamos para a criação das Tags que utilizaremos:
Para criar uma nova Tag clique em Tags>Novo Tag>Tag PLC.


 Após criar todas as tags teremos que configurá-las o nome dela será a seu gosto, o Driver será que acabamos de configurar.
Os parâmetros N1, N2, N3 e N4 devem ser configurados conforme descrição abaixo retirado do arquivo de ajuda "Modbus_br" do Driver que se encontra na mesma pasta "C:\Program Files (x86)\Elipse SCADA\Drivers\"

N1: Endereço do equipamento escravo (CLP) na rede. Este endereço pode variar de 1 a 255. Pode-se ainda configurar este parâmetro com o valor 0. Com isto, este tag trabalhará em modo broadcast, enviando a mensagem para todos os equipamentos escravos (CLP) que estiverem na rede.
NOTA: no modo broadcast, com N1 = 0, não é possível realizar leituras, apenas escritas. Neste modo, todos os equipamentos na rede serão endereçados, recebendo o valor escrito, e não retornando qualquer resposta, de forma a evitar conflitos na rede.
· N2: Código da operação. Referencia uma operação de leitura ou escrita adicionada na janela de configurações do driver.
· N3: Parâmetro adicional. Para as funções de leitura e escrita de arquivos (funções 20 e 21), o parâmetro N3 especifica o arquivo a ser acessado. Para as demais funções de leitura e escrita de registradores, N3 especifica a máscara a ser usada na leitura. Esse parâmetro só será usado se a opção Use Bit Mask for habilitada para a operação em uso, e o número de um bit específico a ser retornado for selecionado. O valor zero indica o bit menos significativo. O valor do bit selecionado será sempre retornado no bit menos significativo do valor. Ou seja, se a opção Use Bit Mask estiver habilitada para a operação na janela de configuração, o valor retornado do tag será sempre 0 ou 1.
· N4: Endereço do registrador ou da variável no equipamento escravo (CLP) que se deseja ler ou escrever.
 Para ler o registrador MB_40003 deve-se colocar 4 no parâmetro N4 pois os registradores começam em 0 no Arduino mas em 1 no Elipse.

O "scam" e tempo em milissegundos que você deseja que a tag seja atualizada. 
Após configurar cada tag você testá-las clicando em "Ler" ou "Escrever", caso retorne uma mensagem de erro veja veja o pode estar errado.
Caso deseja configurar uma escala marca o tolbox "Escala" e configure as escalas.
Exemplo: um potenciômetro ligado a uma entrada analógica do Arduino com uma tensão que pode variar de 0 a 5 Volts. 
CLP Inferior: 0
CLP Superior: 1023 (conversor analógico de 10 bits do Arduino)
Sist. Inferior: 0
Sist. Superior: 5
Assim você mostrará o valor já em tensão no Elipse.


 

Agora vamos a configuração da tela do sistema.
Para adicionar botões, gráficos, displays, gauges, etc. escolha o que deseja conforme imagem abaixo.



Após selecionar o item desejado clique na tela com o botão esquerdo do mouse e arraste até o item ficar do tamanho que desejar.

Para alterar as propriedades do item basta um clique duplo sobre o mesmo.

Vamos configurar um item do tipo "botão" para ligar e desligar um LED ligado ao Arduino.

Propriedades do botão: basicamente temos que configurar três itens em um botão, a mensagem, a moldura e tag.
Mensagem: é mensagem que o botão irá exibir, cor e o valor que ele enviará para a tag;
Moldura: título do botão;
Tag: o mais importante, qual tag esta associada ao botão.

A imagens abaixo mostram as tela de configuração do botão.






Para associar a tag ao botão navegue na janela objetos até a tag deseja clique nela e em seguida clique em "adicionar".


Em seguida vamos configurar um item do tipo "texto" para do para mostras o estado de um botão ligado ao Arduino.

Zonas: é onde configuramos o texto a ser mostrado e a cor do fundo acordo com o valor da tag (os valores de máximo e mínimo e máximo são configurados de acordo como o desejado para variáveis digitais deve-se colocar o mesmo valor em ambos conforme as figuras abaixo);
Moldura: idem botão;
Tag: idem botão.

 

Em seguida vamos configurar um item do tipo "slider" para enviar um sinal PWM a um LED ligado ao Arduino.

Geral: aqui é configurado os valores mínimos, máximos e o passo do slider assim como a posição e o modo de atualizar.
Moldura: idem botão;
Tag: idem botão.


Em seguida vamos configurar um item do tipo "trand graph" para mostrar a temperatura do LM75A e o valor do sinal AD do LDR.

Geral: aqui é configurado basicamente a largura (intervalo de) do gráfico em segundos e a taxa de atualização do mesmo;
Gráfico: tipo de escala (normal, logarítmica e potência). limites superior e inferior do gráfico, números de linhas de grade cor de fundo, etc ;
Pena: que tag será apresentada no gráfico (clique no ícone da caneta depois em "Y axis" e navegue até a tag desejada clique nela e depois em "copiar script-->") .
Moldura: idem botão.




Em seguida vamos configurar um item do tipo "display" para enviar um sinal PWM a um LED ligado ao Arduino.

Formato: formato do numero a ser mostrado com prefixo, sufixo, número de algarismos e casas decimais.
Moldura: idem botão.
Tag:  idem botão.



O título do sistema com fundo azul claro e um item do tipo texto onde só foi configurado a moldura.

 Abaixo segue vídeo do sistema em funcionamento (Apenas a tela do PC).



 Espero que gostem, deixe ai seu comentário (mesmo que seja crítico).























32 comentários:

  1. Rob15son, Estou tendo problema no codigo do Arduino. Eu uso o uno. Da esse erro:
    ModbusSlave mbs; does not a type name.

    ResponderExcluir
  2. Este comentário foi removido pelo autor.

    ResponderExcluir
  3. Fernando boa noite!

    Experimente importar a biblioteca ModbusSlave para a IDE do arduino baixe ela neste link https://www.dropbox.com/sh/wjtbcmtkq858m17/AACn72LLrMvkRzXJgoNebaR3a importe e, sketch/Import Library/Add library/"caminho da blibloteca".

    ResponderExcluir
    Respostas
    1. Baixe os 3 aruivos e coloque em uma mesma pasta ou já baixe como zip https://www.dropbox.com/s/lj06ovzzn8u4vuj/ModbusSlave.zip

      Excluir
    2. Grande Robisson, eu estou no mesmo problema do cara logo acima, dá erro na hora da compilação mostrando a mensagem ''ModbusSlave does not name a type", ja baixei tudo que foi biblioteca nesse mundo (inclusive as que você disponibilizou) e coloco na pasta da libraries do arduino, adiciono na hora de rodar o programa, mas ainda sim aparece a mesma mensagem.
      Não sei mais o que fazer, teria como me ajudar ?

      Excluir
  4. Bom dia! Rob15son, estou com um problema, você pode me ajudar?
    Estou tentando enviar uma string do elipse para o arduino via modbus, como posso fazer isso?
    grato,

    ResponderExcluir
    Respostas
    1. Olá Tiago nunca enviei strings do elipse para o arduino via modbus, mas de uma olhada na documentação do driver para ver se tratam desta parte
      Segue link com driver e documentação
      https://www.dropbox.com/s/07xe5ukmj2rj9ua/Modbus.zip

      Excluir
  5. Este comentário foi removido pelo autor.

    ResponderExcluir
  6. Olá!!! Estou tendo problema ao rodar a aplicação no Scada pois diz que o drive modbus não está respondendo. Você pode me ajudar? Abraços

    ResponderExcluir
    Respostas
    1. Olá Diego, Você já tentou achar o escravo MODBUS utilizando algum software?
      Recomendaria a utilização do digiconfig http://www.novus.com.br/downloads/downloads.asp?FileID=636170

      Basta configurá-lo e pedir pesquisar se vai encontrar o arduino na rede MODBUS, se encontrar o problema deve estar na configuração do Elipse se não o problema é no arduino.

      Excluir
    2. Este comentário foi removido pelo autor.

      Excluir
  7. Olá Robson, estou implementando um processo parecido, porém no meu caso estou realizando a leitura do sensor de corrente acs712, porém estou tendo dificuldades ao passar a leitura para o Scada, seria possível dar uma orientada?

    ResponderExcluir
    Respostas
    1. Olá Matheus, considerando que você já tenha realizado a leitura do sinal analógico, você poderá transformar este sinal para o valor real da corrente porem sem a casa decimal (porexemplo se a corrente for 12,3 voce multiplicará por 10 antes de adicionar ela ao registrador MODBUS, é um pouco complicado trablahar com casas decimas nessa biblioteca MODBUS), feito isso lá no SCADA você faz a divisão necessária (se não me engano fiz com o sensor de temperatura LM75A).

      Excluir
    2. Segue links do meu programa

      ARDUINO
      https://www.dropbox.com/sh/axv6mxy9nw48jox/AAD9Xvc80-GfNdm0djBdoIWua?dl=0

      SCADA
      https://www.dropbox.com/sh/vzdwlcrpr8y6sd4/AACFKjIe5BcSvuLejT756Yt7a?dl=0

      Excluir
  8. Então Robisson, realmente o problema eram as casas decimais, a comunicação com o elipse scada deu certo, multipliquei o valor da variavel por 10 e transferi pro scada, porém como faço pra dividir por 10 no scada? É essa minha dificuldade agora.

    ResponderExcluir
    Respostas
    1. Matheus na TAG tem uma tolbox escala ai voce pode realizar a divisão por 10 da seguinte forma:
      Em CLP inferior e CLP superior voce coloca os valores que minimos e maximos que irá receber enviados pelo arquino, e em Sist. inferior e Sist. superior você coloca os valores colcados acima divido por 10 (exemplo se tiver colocado -300 e 300 você coloca -30 e 30, assim quando ele receber 112 irá exibir na tela 11,2).
      link com uma imagem para facilitar https://www.dropbox.com/s/7xnovr1l17ufbap/Screenshot_20160402_175550.png?dl=0

      Excluir
    2. Robisson, funcionou perfeitamente!
      Muito Obrigado pela atenção.

      Excluir
  9. Olá Robson se fosse colocado mais de um arduino na rede pelo RS485, como seria a forma de endereçamento? Acontece aleatoriamente quando eles são ligados na rede? Se não, onde configuro isso?

    ResponderExcluir
    Respostas
    1. Gabriela o endereço de cada escravo deve ser atribuido via código na configurção da biblioteca na seguinte linha:

      const unsigned char SLAVE = 10; /* slaveId *

      os endereços podem ser de 1 a 247;

      Excluir
  10. E por que eu necessito desse conversor RS485 para TTL?

    ResponderExcluir
    Respostas
    1. Porque os barramentos RS485 e RS232/TTL trabalham com tensões diferntes.

      Excluir
  11. Respostas
    1. No SCADA você apenas irá configurar o endereço do escravo que efetuará leitura/escrita nas TAGs.

      Excluir
  12. Robson você teria algum material que pudesse me ajudar a entender como montar essa rede com o RS485? Preciso fazer isso urgente para um trabalho de TCC, além do arduino pretendo colocar CLP e outros equipamentos na rede. Desde já agradeço a atenção!

    ResponderExcluir
    Respostas
    1. Gabriela tem muito material na internet a respeito do assunto, não tenho nenhum em específico para indicar, mas creio que o idela seria ter os equipamentos em mãos para montar a rede assim conseguirá identificar onde terá maiores dificuldades.

      O consversor RS485 para RS232/TTL um exemplo é este http://produto.mercadolivre.com.br/MLB-701050260-modulo-conversor-rs232-ttl-p-rs485-max485-arduino-pic-_JM

      Já o conversor USB para RS485 (também pode ser de RS232-DB9 para RS485 mas como as portas RS232 DB9 hoje em dia são raridade) é possível encontrar diferentes modelos e preços na internet.

      Excluir
    2. Ok, muito obrigada Robson, seu trabalho esclareceu bastante algumas dúvidas.

      Excluir
  13. Olá Robison
    Estou com problemas para configurar as saídas digitais do elipse E3, já tentamos todas as operações porém não obtivemos exito em nenhuma delas. Gostaria de saber se você pode nos ajudar por favor
    Grato

    ResponderExcluir
    Respostas
    1. Olá Mateus,
      mas e quanto a leitura está conseguindo realizar? Sabe me dizer se a comunicação Elipse E3 e o escravo Modbus esta funcionando normalmente?

      Excluir
  14. ola robson boa noite porque desses 2 resistores a mais na ligaçao(fora os de 120 ohms)?

    ResponderExcluir
    Respostas
    1. Breno boa noite!
      Se entendi direito você deve estar falando dos resistores de pull-down e pull-up, servem para evitar que o sinal fique flutuando quando não houver comunicação.

      Excluir
  15. Boa tarde Robson. estou tentando fazer essa comunicação do elipse com um clp, mas quando mando rodar a aplicação no elipse dá a seguinte mensagem: problema de comunicação do driver modbus. Estou utilizando um conversor rs232 e rs485, você sabe o que pode ser?

    ResponderExcluir
  16. Olá, parabéns pela publicação.
    Como faço para ler um valor em float no elipse scada?

    ResponderExcluir