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