Automação da Leitura de um Medidor de Energia – Utilizando Arduino, ScadaBR, Modbus RTU RS485


#1

Estou precisando de ajuda em algumas coisinhas bem bobas (eu nunca fiz nada parecido, não tenho conhecimento nessa área, sou nova com tudo e estou sozinha no projeto) a respeito de uma automação que estou fazendo no meu estágio.
Eu preciso fazer a automação da leitura de dados de um MMG (Multimedidor de Grandezas, modelo Power Meter 710 da Schneider - como o a figura, com manual do fabricante em: https://www.schneider-electric.com.br/pt/download/document/63230-501-209/). As ferramentas foram definidas pelo meu chefe, e eu usarei um Arduino (tentei o Leonardo, mas tive problemas com a identificação das portas dele, então agora estou com o UNO), ScadaBR, Modbus RTU com camada física RS485 (o medidor suporta isso). Assim, eu pegarei os dados do Medidor (com fios para RS485) com um Arduino uno usado um módulo RS485, e o ScadaBR vai me mostrar o dados do Arduino, para que eu gere relatórios e veja os gráficos no ScadaBR.
Eu fiz alguns testes inicialmente para ver como funcionava uma leitura de dados do Arduino pelo ScadaBR, como esse: https://www.embarcados.com.br/supervisorio-com-scadabr/ (este então é o úico conhecimento que eu tenho sobre o assunto, fiz esse exemplo para começar).
Minhas dúvidas:

  • Qual biblioteca para o Arduino utilizar? Eu preciso das funções 0x03, 0x04, 0x06, 0x10, 0x11 e 0x2B (pois são as funções suportadas pelo medidor POWER METER 710). Até agora estou com idéia de usar a biblioteca ModbusMaster (e suas versões – disponíveis aqui: http://4-20ma.io/ModbusMaster/modules.html ) . Ela tem o que eu preciso. Mas será que tem outra mais simples? Até pq eu não encontrei nenhuma que suporte as funções 0x11 e 0x2B ( essas funções são especiais, ou preciso que atenda elas também?)
  • Eu preciso acessar pelo menos 32 registros do medidor, o que significaria 64bytes. Mas e o ring buffer do Arduino? Como faço pra ele aceitar um numero grande no ring buffer? Quem define isso é a biblioteca? Além da limitação de algumas funções sobre isso, pois pelo que eu li a função 4 por exemplo, consegue ler múltiplos registros de no máximo 54bytes = 29 registros. Essa função também consegue ler registros entre 30001 e 3999 (isso é definido pela biblioteca?) É isso mesmo? Pois segundo meu manual, meus registros estão a partir de 4000 até 4200, olhem a figura aí pra vcs entenderem o que eu estou falando.
  • Sobre o offset do ScadaBR, quando eu for fazer a leitura de dados pelo Arduino, devo considerar que meu registro precisa ser ajustado no offset, ou essa lista de registro do manual do meu medidor já está supondo isso? Por exemplo, o registro do manual é 4076. Como fica ele no ScadaBR? (pq o Modbus RTU tem esse offset né?)

#2

Vamos aos poucos.
Primeiro, o registrador no equipamento não muda. E o ScadaBR não intende. Você vai fazer o ajuste no ofset manualmente.
Cada tipo de dado usa uma faixa. Tipo, registrador de holding é de 30.000 a 39.999, ou seja, o primeiro endereço registrador holding é o 30.000. Se seu equipamento for base 0, o ofset desse endereço é 0. Se for de base 1, coloque 1.
Veja o endereço 30.301. Se tor base zero vc vai colocar 300. Se for base 1 será 301.

Depois que descobrir o primeiro é só seguir a regra.


#3

Obrigada! :wink:
Vou tentar e qualquer dúvida mando por aqui


#4

Olá @jessica.sa13!

Você fez ótimas perguntas! Vou tentar responder algumas por experiencia de já ter feito algo semelhante. Tenho um projeto rodando com um multimedidor da Schneider bem parecido.

Primeiramente me ocorre a duvida de porque utilizar o Arduino, visto que tu poderias conectar o multimedidor diretamente ao ScadaBR, bastando um adaptador Serial USB<>RS485. Ficaria bem mais simples. Mas isto é só uma curiosidade, e sei que teu projeto pode estar integrando outras coisas diferentes.

O Protocolo Modbus tem várias funções para diferentes tipos de registros, mas como o registro mais utilizado largamente é o Registrador tipo Holding, as funções principais são a 0x03, 0x06 e 0x10. Sendo assim, uma biblioteca do Arduino que sempre utilizo em conjunto com o ScadaBR é https://github.com/angeloc/simplemodbusng SimpleModbusSlave. Bem simples de usar e nunca me deixou na mao. Já testei ela também com SoftwareSerial, que acredito que tu vais precisar usar pois o UNO só tem uma serial e tu vais precisar de duas.

Não entendi muito bem a pergunta sobre o ring buffer, mas acredito que estejas se referindo ao buffer de comunicação serial. Realmente se for isso é uma preocupação importante, pois quando ler e escrever muitos registradores realmente pode estourar o buffer e ocasionar erro, até porque além dos bytes dos registradores ainda tem os bytes do protocolo. Salvo engano, sem alterar o buffer do Arduino o máximo de registradores que podem ser lidos e escritos no mesmo comando são 29. Dá pra aumentar o buffer do Arduino, mas tem que alterar a biblioteca serial nativa do programa do Arduino.
A solução mais simples é na hora de configurar o Datasource no ScadaBR, existe a opção de dizer qual o numero máximo de registradores de leitura e escrita simultâneos. Eu sempre configuro pra 10 e nunca tenho problema. Mais seguro que alterar o Buffer serial do Arduino.

A questão das funções que serão utilizadas vão depender do tipo de dado que tu quer acessar. Por exemplo, não é possível ler um registrador tipo Holding com a função 0x04. Aparentemente todas as funções que tu vais acessar no medidor são em registradores tipo Holding (4xxxx), sendo assim só vais precisar das funções 0x03, 0x06 e 0x10.

Quanto ao acesso ao registro, o ScaraBR utiliza o offset baseado em 0, e salvo engano o manual da Schenider informa o valor do registrador baseado em 1 (pelo menos no modelo que eu utilizo), logo se tu queres acessar o registro 4076, tens que configurar o offset para 4075, bem como o @farmsid explicou.

Espero ter ajudado!
Abs


#5

Oi @Gulart muito obrigada. Você esclareceu algumas dúvidas.
Então, nesse projeto em si eu não precisarei integrar mais nada além dos medidores ao ScadaBR, dessa forma, eu posso dispensar o uso do Arduino nessa aplicação. Mas foi bom saber essa função do ScadaBR de ler um número máximo de registradores simultâneos. Acredito ser uma boa solução para futuros erros.
Então, minha dúvida agora é na escolha do conversor USB-RS485. O que acontece, eu estudei um pouco sobre a camada RS485. Pelo que eu entendi desta, a sua maior funcionalidade é a dispensa de um GND para a conexão com o computador. Você tem cabos em longa distância, e um GND de longa distância poderia não ser uma boa ideia. Assim, o RS485 utiliza como referência a diferença de tensão entre os dois cabos (que são os de envio de bits) se não me engano né?
Só que ao procurar esses conversores USB-RS485 pela internet, vi algumas críticas com o uso desses sem o GND. No outro fórum que participo, alguém me disse que nunca funcionam esses sem o GND. Então, o conversor USB-GND deveria ter os três pinos de entrada né (Os dois de envio/recebimento, mais o GND). Ao procurar esses com três pinos de entrada, só encontrei os da NOVUS e WEG, que são muito caros para um versão protótipo. Você teria algum para me indicar? Algum que você use.
Eu também pensei em eu mesma fazer, caso não encontrasse. Na PCB mesmo, com algum CI importante e talvez um layout já encontrado pela internet. O que você me indicaria?
Eu tenho vários medidores para ler (cerca de 10 medidores). Dessa forma, não sei também a viabilidade do USB pela limitação de portas no computador. Mas por exemplo, um HUB, ou uma placa construída por mim poderia mitigar esse problema, o que acha?

Desde já obrigada :slight_smile:


#6

Olá bom dia!

Estou também com um projeto de ler um equipamento (inversor CC/CA) que possui suporte ao protocolo RS485 e comprei o seguinte equipamento =

https://produto.mercadolivre.com.br/MLB-839074795-conversor-usb-20-para-serial-rs485-ftdi-ft232rl-arduino-_JM

Não sei se será o ideal, mas vou seguir os planos, junto do pessoal do tópico que estou tratando.


#7

Então, mas esse é para se usar com o Arduino. No meu caso, eu quero um USB para usar diretamente no PC.


#8

Pode ser utilizado em vários cenários, PC, Arduinos, etc…


#9

oi jessica olha vc pode suar o multimedidor com o esp8266 liganfo o esp8266 ao modulo conversor serial rs485…
eu fiz um supervisorio em que fiz integracao de 5 multmedidores, siemens , shinaider…e mqis uma marca…em que na rede modubus serial o esp8266 e master recebe os registradores e os converte a modbus ip…ficou exelente


#10

Olá Jorge, boa noite!

Pode compartilhar o esquema, código e configurações, acho que vai dar certinho com oque queremos.


#11

Sobre os cabos que vocês utilizam, andei pesquisando um pouco sobre e estou com dúvida. No caso, se o meu conversor RS-485 tiver entrada para GND, eu uso o terramento do cabo até essa entrada ?
Por que eu não sei nada de cabos, sei que o RS485 tem um cabo de blindagem certo? Esse ponto de aterramento da blindagem entra em todos os medidores, e também no meu conversor USB RS485?


#12

Olá @jessica.sa13!

O Meio fisico RS485 é bidirecional “half-duplex”, ou seja, somente dispositivo transmite de cada vez e todos escutam. Os dois fios existentes são para transmissão do mesmo sinal defasados em 180 graus (quando um é 1 outro é 0 e vice-versa). Quando chega no destino, um dos sinais é “desinvertido” e somado. Com isso, qualquer ruído que tenha sido acoplado no caminho (interferência), será somado em defasagem, consequentemente sendo anulado. Isso se chama “Rejeição de modo comum”. Esse é o motivo de o RS485 suportar distancias muito superiores ao RS-232, que tem somente um fio para RX e outro para TX, sendo mais suscetível a ruídos. Porém, com a desvantagem de ser somente RX ou somente TX de cada vez, para isso o protocolo MODBUS vem bem a calhar por ser do tipo mestre-escravo com endereçamento.

A malha de terra ou aterramento no cabo RS485 é uma proteção a mais e desnecessária para a comunicação, não sendo preciso conectar o cabo de terra que tenhas no teu cabo em nada. Basta respeitar os fios “A” e “B” identificados, não devem ser invertidos. Não queima mas não funciona se inverter. A Malha tem sentido se o cabo for utilizado em locais externos sujeitos à descargas atmosfericas, neste caso o aterramento serve para proteger os circuitos, e não recomendado ser ligado na placa se não vai fritar tudo, a malha deve ser devidamente aterrada em um aterramento adequado.

A documentação oficial do pessoal do modbus.org fala que o terra (malha, comum) é opcional e deve ser conectado na placa… mas acho que eles não conhecem Manaus, a terra que mais cai raio no Brasil… :sweat_smile:


#13

@Gulart obrigada :slight_smile:
Se houver avanços aqui falo com você


#14

Mina e manos , comprei um multimedidor chinesinho e para minha surpresa veio com rs485. Entrei no google pra entender melhor esse bicho de 700 cabeças. Caí nesse tópico. Senti uma ponta de esperança no Brasil vendo uma menina ávida por conhecimento pedindo ajuda e várias pessoas ofertando experiência de grátis. Parabéns pra vcs.


#15

Claro que estamos aqui para ajudar.

Qual o modelo do medidor? Tem que encontrar a tabela de registradores.

A partir desse ponto fica fácil.


#16

Bom dia. Acompanhei o tópico do início. Sou eletrotécnico e só agora estou iniciando contato com automação e programação. Então me perdoem as perguntas ingênuas. Se alguém puder me ajudar, fico agradecido.
Tenho uma situação onde um medidor da concessionária já dispõe de uma saída para usuário. Minha dúvida é se para conseguir a leitura dos dados e da memória de massa utilizando essa saída para o usuário, eu só preciso de um conversor do sinal de pulso para usb, conectar ao computador e utilizar o SCADA? O medidor é um ELO 2180SP.


#17

Boa noite. Se não me engano o protocolo dos medidores fornecidos pela concessionárias liberam somente o protocolo ABNT CODI. Necessário um conversor específico com isolador óptico.