Fazendo Redundância com ScadaBR

Caros colegas,

Boa tarde.

Estou com um problema utilizando o ScadaBR. Preciso usar enableDataSource e disableDataSource para deixar apenas um servidor varrendo uma rede de CLPs e atualizando o outro que não deve varrer os CLPs. Isto funciona se chamo os scripts através de um botão na tela gráfica mas falha se associado a um tratador de eventos de valores de uma variável atualizada pelo UCARP.

Agradeço desde já a ajuda.

Descrição detalhada do problema:

Estou desenvolvendo uma aplicação para controlar estações de trem/metro utilizando servidores Linux UBUNTU Server 12.04 em uma maquina HP Proliant DL380G7 com Scadabr redundantes dois a dois da seguinte forma:

            -dois instalados em cada uma das 30 estações de metro ou trem

            -dois no centro de operações – CCO, que recebe dados em tempo real das estações e envia comandos para as estações.

A fim de ter redundância, cada servidor pode ser mestre ou backup.

Em cada estação, o servidor mestre varre os CLPs etc e atualiza um data source modbus  TCP/IP com aproximadamente 600 pontos. Parte destes dados são tratados (ou copiados) em um meta data source, e os data points são copiados no servidor backup da estação e no mestre do CCO através de publishers. O servidor backup da estação apenas recebe os dados do mestre e não deve varre os CLPs da estação. Porem, se o servidor mestre falhar o servidor backup se torna mestre e passa a varrer os CLPs e enviar dados para o servidor Mestre do CCO.

A configuração de rede foi feita utilizando UCARP, que permite que haja um IP virtual para cada par de servidores. O UCARP estabelece qual servidor do par é mestre, e qual deve ser backup, e executa um script para o mestre e outro script para o backup, que chama um programa em Java que atualiza uma variável EstadoOperacional (Numérica) em um Meta Data Source do SCADABR utilizando a API.

A variável EstadoOperacional vale 1 para o servidor mestre e 2 para servidor backup.

Este procedimento esta funcionando bem. Quando desligo o cabo de um servidor o outro servidor (backup) passa a ser mestre e muda o valor da variável EstadoOperacional para 1 no ScadaBR. Da mesma forma o servidor mestre passa a ser backup e atualiza a sua variável EstadoOperacional para 2.

Criei um Detector de eventos associado a variável EstadoOperacional da seguinte forma:

            Tipo: Limite superior

            Alias: Backup

            Nível de informação: Informação

            Limite superior:1.1

            Duração: 5 segundos

Nos tratadores de evento criei um tratador para o detector acima da seguinte forma:

            Tipo: Script

            Alias: Backup

            Script quando ativo: HabBackup

            Script quando inativo: HabMestre

O script HabBackup foi criado no scripting do ScadaBR:

println(“DP_887874 com 2000”);

DP.writeDataPoint(‘DP_887874’,2000);                    <- Seta uma variável para mostrar

println(“DS_XXX001”);

DS.disableDataSource(‘DS_XXX001’);                     <-  Para desabilitar a varredura do CLP

println(“REC_XXX001”);

DS.enableDataSource(‘REC_XXX001’);                   <-  Para receber dados do outro

 

O script HabMestre:

 

println(“DP_887874 com 1000”);

DP.writeDataPoint(‘DP_887874’,1000);                    <- Seta uma variável para mostrar

println(“DS_XXX001”);

DS.enableDataSource(‘DS_XXX001’);                     <-  Para habilitar a varredura do CLP

println(“REC_XXX001”);

DS.disableDataSource(‘REC_XXX001’);                  <-  Para parar de receber dados do outro

 

Em uma tela gráfica criei dois Botões (script) e associei cada script e funcionou. Quando executo HabMestre o servidor varre os CLPs e atualiza o servidor backup da estação e o mestre do CCO com os dados através dos publishers. Quando aperto o botão backup o servidor para de varrer os CLPs e habilita a recepção dos dados do mestre.

Porem, com o evento associado a variável operacional, no log do Tomcat tenho o seguinte erro quando tento executar o comando enableDataSource ou disableDataSource do script:

 

javax.script.ScriptException: sun.org.mozilla.javascript.internal.WrappedException: Wrapped com.serotonin.mango.vo.permission.PermissionException: Not logged in (<Unknown source>#4) in <Unknown source> at line number 4

            at com.sun.script.javascript.RhinoScriptEngine.eval(RhinoScriptEngine.java:153)

            at com.sun.script.javascript.RhinoScriptEngine.eval(RhinoScriptEngine.java:167)

            at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:247)

            at br.org.scadabr.rt.scripting.ContextualizedScriptRT.execute(ContextualizedScriptRT.java:119)

            at com.serotonin.mango.rt.event.handlers.ScriptHandlerRT.eventRaised(ScriptHandlerRT.java:36)

            at com.serotonin.mango.rt.EventManager.handleRaiseEvent(EventManager.java:322)

            at com.serotonin.mango.rt.EventManager.raiseEvent(EventManager.java:144)

            at com.serotonin.mango.rt.event.detectors.PointEventDetectorRT.raiseEvent(PointEventDetectorRT.java:51)

            at com.serotonin.mango.rt.event.detectors.AnalogHighLimitDetectorRT.setEventActive(AnalogHighLimitDetectorRT.java:125)

            at com.serotonin.mango.rt.event.detectors.TimeDelayedEventDetectorRT.scheduleTimeoutImpl(TimeDelayedEventDetectorRT.java:81)

            at com.serotonin.mango.rt.event.detectors.TimeoutDetectorRT.scheduleTimeout(TimeoutDetectorRT.java:89)

            at com.serotonin.mango.util.timeout.TimeoutTask.run(TimeoutTask.java:29)

            at com.serotonin.timer.TimerTask.run(TimerTask.java:78)

            at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)

            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)

            at java.lang.Thread.run(Thread.java:662)

 

Desde ja agradeço muito a ajuda.

Atenciosamente,

James

 

1 curtida

Oi James,

Fantastico sua descrição. Interessante como a qualidade dos tópicos vem aumentando aqui no Fórum.

Vou ser bem objetivo aqui:

O erro reportado é devido a alguma falha de permissão. Isso pode ter ocorrido por configurar o Script com um usuário e o tratador com outro usuário. "Pode"...

Como esta implementação do Scripting é recente, pode conter alguns bugs ainda não reportados. Não quer dizer que seja esse o fato, mas que precisamos investigar =]

Faz um favor pra gente, informa pra gente se você configurou o sistema com um usuário geral ou se utilizou vários administradores ou usuários. 

Temos aplicações que utilizam bastante essa combinação tratador de evento+scripting, até mesmo por que alguns protocolos/controladores/drivers precisam reiniciar a comunicação após uma reinicialização.

Abs

Caro Diego,

Obrigado pela resposta.

Todo o desenvolvimento foi feito no usuario admin/admin: os scripts, os eventos, etc. Ainda não estruturei a aplicação para operação nas estações e CCO, manutenção,restabelecimento e administração.

Não tenho ideia por que deste erro no script que habilita/desabilita os data sources do CLP e recebimento do publisher.

Obrigado,

James

Oi James,

Só pra deixar mais claro - O "REC_XXX001" é um Recuperador HTTP certo? Vou verificar se falta algum permissionamento no tratador de eventos e no scripting quanto a este tipo de data source.

Mas posso te adiantar um pulo do gato aqui - Com o JS do Scripting você pode instanciar um objeto e modificar diretamento o DS. 

var dataSource = new com.serotonin.mango.db.dao.DataSourceDao.getDataSource("REC_XXX001");

dataSource.setEnabled(true);

 

Tenta ai e se não der certo a gente segue procurando. Isso serve temporáriamente, mas o o caminho correto é nossa equipe investigar isso. Vou abrir um ticket no trac pra isso.

Abs

Caro Diego,

Tentei utilizar a sua sugestão e deu o seguinte resultado:

DP_887874 com 2000
DS_XXX001
javax.script.ScriptException: sun.org.mozilla.javascript.internal.EvaluatorException: Java class "com.serotonin.mango.db.dao.DataSourceDao" has no public instance field or method named "getDataSource". (<Unknown source>#5) in <Unknown source> at line number 5
 at com.sun.script.javascript.RhinoScriptEngine.eval(RhinoScriptEngine.java:153)

O script foi:

println("DP_887874 com 2000");
DP.writeDataPoint('DP_887874',2000);

println("DS_XXX001");
var DS1=new com.serotonin.mango.db.dao.DataSourceDao.getDataSource("DS_XXX001");
DS1.setEnabled(false);

println("REC_XXX001");
var DS2=new com.serotonin.mango.db.dao.DataSourceDao.getDataSource("REC_XXX001");
DS2.setEnabled(true);

Por favor, onde estão os fontes do ScadaBR e como fazer download?
Atenciosamente,
James

 

Caros colegas, boa tarde.

A execução do script associado ao evento de limite superior da o erro quando faz enableDataSource:

javax.script.ScriptException: sun.org.mozilla.javascript.internal.WrappedException: Wrapped com.serotonin.mango.vo.permission.PermissionException: Not logged in (<Unknown source>#1) in <Unknown source> at line number 1

A base de dados do ScadaBR contem as seguintes informacoes dos scripts e usuarios:

root@LinuxServer:/usr/jdk1.6.0_35/db# /etc/init.d/tomcat stop
Using CATALINA_BASE:   /usr/tomcat
Using CATALINA_HOME:   /usr/tomcat
Using CATALINA_TMPDIR: /usr/tomcat/temp
Using JRE_HOME:        /usr/jdk1.6.0_35
Using CLASSPATH:       /usr/tomcat/bin/bootstrap.jar
root@LinuxServer:/usr/jdk1.6.0_35/db# java org.apache.derby.tools.ij
versão ij 10.6
ij> connect 'jdbc:derby:/usr/tomcat/bin/scadabrDB';
ij> select * from scripts;
ID         |USERID     |XID                                               |NAME                                    |SCRIPT                                                                                                                          |DATA                                                                                                                           
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
5          |2          |SC_366934                                         |HabEscravo                              |DS.disableDataSource("DS_XXX001");


                                                                                           |aced00057372003262722e6f72672e736361646162722e766f2e736372697074696e672e436f6e7465787475616c697a6564536372697074564ffffffffffff&
6          |2          |SC_315950                                         |HabMestre                               |DS.enableDataSource("DS_XXX001");


                                                                                            |aced00057372003262722e6f72672e736361646162722e766f2e736372697074696e672e436f6e7465787475616c697a6564536372697074564ffffffffffff&

2 linhas selecionadas
ij> select * from users;
ID         |USERNAME                                |PASSWORD                      |EMAIL                                                                                                                           |PHONE                                   |&|&|LASTLOGIN           |SELECTEDWA&|HOMEURL                                                                                                                         |RECEIVEALA&|&
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2          |admin                                   |0DPiKuNIrrVmD8IUCuw1hQxNqZc=  |admin@yourMangoDomain.com                                                                                                       |                                        |Y|N|1354627835713       |2          |                                                                                                                                |0          |N

1 linha selecionada
ij> quit;

Nao entendo porque da problema de permissão se so tem um usuario e os scripts sao do usuario existente, apenas quando associado aos tratadores de eventos. Quando chamo os scripts na tela grafica com um botao (script) funciona OK.

Por favor, alguma sugestão?

Atenciosamente,

James 

Oi James,

Isso pode ser um bug no permissionamento do script para habilitar e desabilitar o DS. Nós utilizamos o script com esta função e nunca notamos este erro, mas vai entrar para nossa lista no TRAC.

Podes nos informar qual versão de JVM estás utilizando?

 

Abs

Caro Diego, boa tarde.

Eu nao entendo porque os scripts associados a botoes na tela grafica fazem o disable/enableDataSource corretamente, e quando associado ao evento de limite superior de valor de variavel nao funcionam.

A configuração instalada no servidor é:

Linux Debian 6.0.4:  Kernel Linux 2.6.32-5-amd64

Tomcat6: apache-tomcat-6.0.35.tar

Java: jdk-6u35-linux-i586.bin

     Java SE Runtime environment (build 1.6.0_35-b10)

     Java HotSpot server VM (build 20.10-b01, mixed mode)

ScadaBR: ScadaBR.zip baixado do site renomeado para ScadaBR.war e copiado em <TOMCAT>/webapps/ScadaBR.war

O mesmo problema ocorreu em um Linux Ubuntu 12.04.1 Server

Atenciosamente,

James

 

Oi James, 

Realmente, isso pode sim ser um erro. Estamos revisando a classe com as funções do Scripting e ela utiliza a permissão do "user". Este usuário é o usuário de contexto. Era para funcionar com os eventos sem problema algum.

Mas testei aqui na versão que estamos trabalhando e também não consigo fazer isso funcionar.

Vamos conversando a medida que evoluimos no Debug.

Abs

Caro Diego,

Bom dia. Obrigado pela ajuda, apenas falta esta pendencia para começar os testes da avaliação do ScadaBR para sistemas de controle de estação. Espero que achemos uma solução pois estou muito bem impressionado com tudo que testei ate agora.

Poder desabilitar data sources é vital no processo de redundancia: deixar o mestre varrendo os perifericos de estação e fazendo o publishing dos dados para o backup (que nao deve varrer os perifericos, o que sobrecarregaria a rede), e o processo de chavear a varredura para o backup em caso de falha do mestre.

Qualquer duvida por favor me informe.

Abs, e Boas Festas para todos!

James

 

Senhores,

Enfrento a mesma dificuldade de habilitar e desabilitar Data Source via Scripting. Quando o faço através do botão de Scripting na representação gráfica, tudo ocorre normalmente. Contudo, quando tento fazê-lo via Scripting nada me é retornado.

Aparentemente, dividimos da mesma dúvida James, e por isso peço, por gentileza, que me indique o caminho que você seguiu para sanar tal problema.

Att,

Pedro

Caro Pedro,

Não achei nenhuma solução de imediato para o problema, então passei a fazer os testes de outras funcionalidades para a estação, como geração de telas, publishers, carga de rede, melhoria de performance do linux, etc.

O unico problema encontrado ate agora foi este. Aguardo uma sugestao do forum.

Atenciosamente,

James

 

Oi Pedro, James,

Recentemente corrigimos um bug no ScadaBR que evitava este tipo de correção automática em caso de perda na comunicação e que permite seu método de redundância. No svn a correção já está disponível no branch

  • rbautomação-fgsv

E será lançada na próxima versão do ScadaBR.

Abraços

Amigos,

   Baixei no site a última versão do ScadaBR, e estou rodando o mesmo em um servidor na internet. Gostaria de saber como faço para utilizar esta correção mencionada no post anterior, pois estou tendo o mesmo problema em habilitar e desabilitar um datasource. Abri uma nova thread, mas não tive exito.

   Sei que o tópico é antigo, mas se alguém puder me indicar o caminho das pedras, fico agradecido.

 

Sds,