Ajuda urgente na construção de driver TCP/IP para leituras de contadores de energia

Boas a todos,

Estou a desenvolver um driver para comunicação com contadores de energia que utiliza o Protocolo TCP/IP para ligação com os contadores.« de energia.

Neste momento já consigo realizar a comunicação entre o ScadaBR e os contadores de energia só que estou com um problema na implementação de múltiplos pedidos quando utilizo o mesmo Ip e porta de destino.

Isto é a ligação aos contadores é efectuado por intermédio de um conversor Ethernet para RS485 onde o bus RS485 esta ligado a varios contadores de energia. Em que o IP e porta de acesso aos contadores é o mesmo para todos variando apenas o ID de cada um.

Pelo que me apercebi até agora é que quando o ScadaBR dispara os pedidos de leitura utiliza varios Threads para esse efeito abrindo simultáneamente varias ligações ao mesmo IP e Porta o que faz com que as leituras dos dados sejam interrompidas.

Necessitava de saber se existe alguma forma de poder colocar os pedidos despoletados pelo ScadaBR num list ou fila de modo a que as leituras fossem executadas de forma sequencial umas a seguir as outras.

Cumprimentos,

Olá!

Vi que esta pergunta foi feita a um ano atras… estava meio afastado do projeto ScadaBR mas andei retornando ao projeto e ao forum.

Acredito que este problema tenha duas soluções:
1 - Utilize apenas um Datasource para todos os medidores, pois o ScadaBR abre um socket de conexão para cada vez que for atualizar, e um escravo de cada vez. Isso vai impedir que existam conexões simultâneas.
2 - A outra solução é alterar o firmware deste seu concentrador RS485/IP. Eu utilizo uma solução parecida em outro projeto, usando um Arduino para fazer o transporte entre os protocolos, ele aceita 8 conexões simultâneas, porém gerencia o acesso aos escravos de forma que um pedido não sobreescreva o outro.

Espero poder te ajudado mesmo que atrasado.

Daniel

Boas,

Obrigado pelas dicas.

Vou tentar a primeira hipótese, mas mesmo assim não sei se vai dar, mas vou tentar esta abordagem.
Vou explicar um pouco o meu problema:
Quanto a segunda hipótese não posso usar devido ao facto destes contadores estarem selados pela companhia eléctrica, só tenho acesso a linha de comunicação que em alguns casos é RS232 e outros é RS485.
Quando tenho um bus RS485 este liga vários contadores de energia no mesmo bus. Depois coloco um conversor de Ethernet para RS485 no inicio do bus para poder aceder por IP a cada um dos contadores.
O Acesso pode ser local ou remoto. Por vezes tenho mais do que um acesso IP para vários contadores pelo que não consigo ter tudo dentro do mesmo Datasource.
O problema é que se com uma mensagem conseguisse receber logo os dados dos contadores não teria problema de acessos, mas o problema é que para conseguir ter os dados dos contadores é necessário trocar 8 mensagens entre o Master e o Slave, só no fim destas mensagens é que o contador fornece os dados. Devido a isto o acesso aos dados tornasse um pouco mais demorado pelo que necessitava de controlar os pedidos de forma sequencial a cada contador só quando a ligação a um contador terminasse é que devia iniciar o pedido a outro contador.

Cumprimentos,

Augusto

Olá Augusto!
O protocolo de comunicação com os medidores é IEC62056 ou ABNT14522?
No caso, pelo que entendi, tu estás a desenvolver um gateway entre os medidores no protocolo do medidor via RS232/485 local ou multiponto e o ScadaBR, utilizando imagino que ModbusIP entre o gateway e o ScadaBR.
É um pouco dificil opinar sem saber um pouco mais de como você está implementando este gateway, mas uma saída que me ocorre, já que o tempo de retorno do medidor é elevado, é aumentar o timeout de comunicação lá nas configurações do Datasource de forma a permitir que quando o gateway receber uma requisição de leitura de determinado endereço via modbus dê tempo do gateway receber a resposta do medidor e encaminhar ao ScadaBR. Seria uma comunicação blocante, ou seja, o cliente Modbus (no caso o teu gateway) não vai retornar ao ScadaBR até receber o retorno do medidor e o ScadaBR vai ficar esperando o retorno antes de solicitar um novo dado ao gateway.
Eu já implementei uma solução praticamente deste jeito em Python, o gateway rodava no mesmo computador do scadabr.

Ola Gulart,

O protocolo em causa é o IEC 870-5-102 Rede Elétrica Espanhola.
O que eu estou a desenvolver é o protocolo directamente no SCadaBR. O driver que coloquei no ScadaBR comunica directamente com o Contador de energia, não utilizo Gateways.
O que utilizo para ter conexão IP com o Contador é apenas conversores de meio fisico de transmissão dos dados, tipo Moxa Nport 5130, que converter Ethernet para linha RS485.
Quanto ao tempo de the execução do protocolo é mesmo assim a troca de mensagens é demorada mesmo com ligação direta ao equipamento.

Neste momento com a tua sugestão de passar o acesso a cada contador no mesmo bus RS485 para o DataPoint esta a resultar. Pois já consigo ter o envio de dados sequencial que me permite o acesso por contador permitindo que a troca de mensagens seja executada por cada contador e só no fim de acabar é que faz pedido a um novo contador.
Ainda estou a ultimar o código para que fique mais estável e não fique bloqueio caso aja alguma excepção.

Desde já um obrigado pelas dicas.

Abraço,

Ola Gulart,

Consegui finalmente dar a volta a questão e esta a funcionar.
Estando já em produção, neste momento recolhe dados de 5 em 5 minutos do contador sem problema.

Aqui fica um screen da curva diária Potencia activa dos quatro contadores que esta a ler.

Obrigado pela ajuda.