Scripting


#1

Olá a todos,

Estou tentando executar um script após a ocorrência de um evento usando tratadores de evento. O problema é que não estou sabendo como fazer scripts (no menu principal do ScadaBR (scripting), sem que seja um meta data point). O help do ScadaBR nessa seção não está funcionando e não encontrei nenhuma outra referência. Agradeço muito quem puder me ajudar.

Abraços


Scripts ScadaBR
#2

Olá joaopve,

Também tive bastante dificuldade na primeira vez que fui escrever um scripting, nunca acionei nenhum dos meus via eventos, os que eu uso são sempre acionados por botões, eles meio que tomam conta de um roteiro para a execução de um ensaio de motores.

Vamos por partes, primeiro entre em scripting, crie um novo, dê o nome e aí em “pontos do contexto” você pode selecionar os DataPoints que vc deseja recuperar o valor deles no meio do scripting (atenção, só é preciso adicionar esses pontos de contexto se precisa ler e utilizar algum valor de algum datapoint, caso precise apenas escrever em um datapoint não precisa adicionar nada de pontos do contexto, veremos abaixo), caso tenha adicionado algum datapoint, vai aparecer da frente dele um campo chamado “Var” aí vc vai escrever um apelido pelo qual deseja chamar esse datapoint no meio do scripting.

Em “Objetos do Contexto”, vc tem 2 opções:
-Comandos para DataSource, aqui caso tenha interesse marque a caixa “Add”, isso serve apenas para o caso de habilitar e desabilitar um DataSource, bem simples assim;
-Comandos para DataPoint, aqui se marcar “Add” vc vai poder habilitar e desabilitar um datapoint e também vai poder escrever em um datapoint, no meu caso eu fiz escrita, por isso marquei essa caixa e no campo “Var” vc dá um apelido para o recurso que se chama DataPoint, no meu caso eu coloquei com “dp” o apelido, no exemplo abaixo fica mais claro, sempre que quiser escrever em um datapoint vai ter que dar um comando que começa com esse apelido assim: “dp.write…”

Bom, feito isso, arregace as mangas que vai ter que escrever, para te ajudar vou colocar um exemplo aqui em baixo do que eu fiz em um dos meus scriptings. Só para ficar mais claro, a linguagem é JavaScript, não sei nada dessa linguagem tb, mas é importante saber que comentários são inseridos utilizando “//” então o que ver na frente disso é explicação ok?!

Nesse scripting abaixo não foi necessário adicionar nenhum “ponto do contexto” porque eu não to usando nenhum valor de datapoint (não faço leituras), eu só escrevo valores em datapoints, para escrever vc só precisa saber usar a sintaxe certa, saber o número do XID do DataPoint (sempre que cria um novo datapoint ele gera automaticamente um XID, é só ir no DataSource, abrir os DataPoints, clicar em editar o datapoint que vc vai descobrir o valor do XID) e saber o valor que vai escrever no Data Point aí fica assim:

dp.writeDataPoint(‘XID’,VALOR);

-------------------------------------------------------------------Início do Scripting-----------------------------------------------------

dp.writeDataPoint(‘DP_392414’,100);
//Aqui estou escrevendo o valor “100” em um datapoint de XID=DP_392414

dp.writeDataPoint(‘DP_350022’,‘Bloqueando Motor’);
//Também é possível escrever texto, só tem q configurar o datapoint para alfanumérico

dp.writeDataPoint(‘DP_936911’,‘Bloqueado’);
dp.writeDataPoint(‘DP_663288’,1);

var inicio = new Date().getTime();
var atual = new Date().getTime();
while((atual - inicio) < 10000)
{
atual = new Date().getTime();
}
//Essas 6 linhas são só para fazer o scripting ficar parado 10s, descobri aqui no fórum isso aí, mas parece que só para ficar parado tem uma função mais simples que tem na sintaxe dela algo de “delay” mas não lembro. Lembrando que está em milisegundos por isso dos 10000.

dp.writeDataPoint(‘DP_392414’,0);
dp.writeDataPoint(‘DP_350022’,‘Desbloqueando Motor’);
dp.writeDataPoint(‘DP_936911’,‘Parado’);
dp.writeDataPoint(‘DP_663288’,0);

var inicio = new Date().getTime();
var atual = new Date().getTime();
while((atual - inicio) < 5000)
{
atual = new Date().getTime();
}
//Aqui espera só 5segundos

dp.writeDataPoint(‘DP_350022’,‘Ensaio Concluído’);

-------------------------------------------------------------------Fim do Scripting-----------------------------------------------------

Bom, esse scripting é bem simples mas já dá para ter uma idéia. Aqui só estou usando variáveis virtuais por isso não me importei tanto em fazer leituras

Tenho outro scripting bem curtinho também mas já tem mais sintaxes para te ajudar, este scripting serve para aumentar a carga em um motor, cada vez que dou um clique no botão que aciona o scripting, ele aumenta em “10” o valor da Carga, porém, como estou medindo esse valor em porcentagem, não queria que o valor passasse de 100%, então coloquei uma condição para a partir de 100 não somar mais.
Usei um “Vertical Level” para mostrar o valor da Carga e coloquei um botão em cima do level e outro em baixo, cada um acionava um scripting, o de cima aumentava a carga em 10% e o de baixo diminuia a carga em 10%, deu um resulto muito legal.

Nesse scripting eu precisei ter acesso ao valor atual da variável (fazer leitura) então eu precisei adicionar o DataPoint ao “Ponto do Contexto” e dei apelido para ele de “carga”

Abaixo está esse scripting como mais um exemplo:

-------------------------------------------------------------------Início do Scripting-----------------------------------------------------

B = carga.value;
//Aqui eu carreguei um variável “B” com o valor do datapoint “carga”.

if (B != 100) A = B+10;
;
// Se B for diferente de 100 -> Então faça A=B+10 , senão, não faça nada, com lógica acho q não funciona usar direto o carga.value , por isso usei a variável “B” e “A”, parece que não precisa declarar elas antes.

dp.writeDataPoint(‘DP_392414’,A);
//Por fim carrega o valor de A no DataPoint “carga” que tem o XID=DP_392414.

-------------------------------------------------------------------Fim do Scripting-----------------------------------------------------

Por fim, fique com esses 2 links, tem praticamente todas as informações que precisa para realizar contas em JavaScript nos scriptings:
http://www.mspc.eng.br/info/jscriptMath.shtml
http://www.mspc.eng.br/info/jscriptOper.shtml#aritm

É isso aí, acho que com esses passos, já dá para começar um scripting né, espero ter ajudado.

Abraço e paz!


Botão executando duas funções
#3

Olá Fabio,

Obrigado pela resposta, o exemplo está realmente muito bom.
Algo que me confundiu foi que quando eu clicava no botão verde a esquerda, para validar o script, uma caixa abria dizendo “Not implemented!”. E também não tinha notado o botão que executava o script, pois também está com algum problema pois tudo que aparece é um botão vermelho com um ponto de exclamação. Ta aí uma pequena correção a ser feita pelos desenvolvedores.


#4

Engraçado, nem tinha notado esse botão verde do lado do “Script” haUIhAUuAHiu, por isso que é bom a comunidade, realmente estão mal sinalizados os botões, o que eu faço para testar os “scriptings” é clicar no botão vermelho de “!”, mas tb não está fácil de descobrir isso, porque colocando o mouse sobre ele é mostrado “???commom.rum???” o que não dá a noção correta.

Olha, algo que notei, é que como a interface do programador é simples, os erros são muito difíceis de serem detectados, então a cada comando novo que eu inseria, eu clicava para testar, sempre que der certo vai mostrar a mensagem “Script OK” caso dê um erro vai ser preciso analisar linha por linha, na verdade eu aprendi a mexer no “Scripting” por teste e erro, tentava uma sintaxe e clicava em testar até descobrir, é importante saber, que na hora que vc clica em testar lá no botão vermelho, ele não procura só por erros de sintaxe, ele realmente executa o scripting todo, então um teste legal é vc ficar com 2 páginas do ScadaBR abertas, uma no “Scripting” e outra na representação gráfica correspondente ou na Watch List, aí manda testar na página do “Scripting” e na outra página vc pode ver ele realizando todos os cálculos e ações.

Para análise de erro, talvez seja melhor utilizar um programa próprio para programação em JavaScript, embora eu não faça idéia de qual pode ser bom, assim como já vi em “linguagem C”, o compilador analisa e mostra onde está o erro, depois que der tudo certo, é só copiar e colar no ScadaBR.

É isso aí, mas conseguiu criar o seu Scripting?

Abraço!


#5

Eu fiz exatamente isso que você falou pra testar o script hehehe. Funcionou tudo certinho sim. Valeu cara.
Abraço


#6

Ótimas dicas!
Me ajudou muito estes exemplos!!!

VALEU!


#7

Olá!
Fiz estes scripts dos exemplos e sempre me retorna erro. Alguém tem alguma dica do que pode estar errado?
Grato,

Jfranck


#8

Já conseguiu arrumar? Senão posta o erro aí, quem sabe alguém pode ajudar.

Abraço!


#9

Hola no hablo portugues pero espero me puedan entender, necesito crear un script pero todo los ejemplos están en la versión 0.9 de scadabr que es algo diferente a la  nueva versión ni siquiera en el manual explican la forma de hacerlo alguien me puede ayudar?

 

lo que quiero hacer es lo siguiente 

 

if (p17.value > p7.value)

p18.value = 1;


#10

Olá. Também estou tentando utilizar a função Scripting no ScadaBR porém não consegui fazer funcionar.
Estou tentando ler o valor de uma variável binária (chave) e se a chave for 1 gostaria de habilitar uma variável binária virtual. Segue código:

A=p3.value;
if(A ==1) dp.writeDataPoint(‘DP_101915’,1);
else dp.writeDataPoint(‘DP_101915’,0);

Também tentei ler uma variável temperatura (vinda de um LM35) e de acordo com o valor da temperatura setar ou não uma variável binária virtual.
Segue código que escrevi:

temp = p5.value;
if(temp<=‘26’)
dp.writeDataPoint(‘DP_101915’,1);
else
dp.writeDataPoint(‘DP_101915’,0);

Ambos os scripts não funcionaram. Ele até da Sucesso na execução do script porém a variável binária virtual que estou tentando alterar o valor não muda.


#11

Olá Márcia, tudo bom?
Para o Script 1:

O que você tem que fazer é associar um datapoint meta a este script, então se seu datapoint chave_1 (que chamou de p3) for de um datasource meta está ótimo.

no data source meta o script é assim:

 if (p3.value==true)
 {
 return true;
 }
 else
 {
 return false;
 }

Por este script da foto uma coisa a considerar

use o comando void antes de dp.writeDatapoint
if (A==true(ou 1))

A=p3.value;
 if (A==1)
 {
  void  dp.writeDataPoint('DP_101915',1);
   
 }
 else
 {
 void   dp.writeDataPoint('DP_101915',0);

}

Agora, na representação gráfica você vai colocar um botão relacionado ao datasource meta para ligar e desligar a chave_1. E vai adicionar um botão script com nome como desejar. Quando você quiser desligar os datapoints clique no botão para chave_1 para que fique off, e clique em no botão script, e vice versa.


Para o Script 2:

O Script está correto e com o comando void deve funcionar.
para o valor 26 não sei se contém aspas. Faça o teste e coloque aqui o resultado para tirar a dúvida.

temp = p5.value;
if(temp<='26')
void dp.writeDataPoint('DP_101915',1);
else
void dp.writeDataPoint('DP_101915',0);

#12

Muito bom, só o script dois que não precisa das aspas simples na condição do if.

troque:

if(temp<=‘26’)

por

if(temp<=26)

e use sempre que possível a estrutura de if assim:

if (condição){
comando1;
comando2;

comando n;
}else{
comando1;
comando2;

comando m;
}

assim vc consegue colocar várias comandos em cada retorno.


#13

Olá,

Li as respostas e achei muito bom, não entendi por que devemos colocar o void antes do datawrite, é obrigatório? tem alguma vantagem?

obrigado.