Simplificando a leitura de valores via script no ScadaBR


#1

Olá, pessoal!

Como muitas pessoas têm dificuldades em utilizar os recursos de programação via scripts no ScadaBR, hoje eu irei apresentar um código que facilita muito a criação e desenvolvimento desses scripts.

Trata-se de uma “classe” que possibilita a leitura das informações de qualquer data point com grande facilidade. Eis aí o código:

Código da classe:

function dataPointInfo(identifier) {
	var dpDAO = new com.serotonin.mango.db.dao.DataPointDao();
	var pvDAO = new com.serotonin.mango.db.dao.PointValueDao();
	var dpVO = dpDAO.getDataPoint(identifier);
	var sdf = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	
	var tipos = {
		0: "Desconhecido",
		1: "Binário",
		2: "Multiestados",
		3: "Numérico",
		4: "Alfanumérico",
		5: "Imagem"
	};
	
	// Propriedades do data point
	this.id = parseInt(dpVO.getId());
	this.xid = String(dpVO.getXid());
	this.nome = String(dpVO.getName());
	this.codigoTipo = parseInt(dpVO.getPointLocator().getDataTypeId());
	this.tipo = tipos[this.codigoTipo];
	this.setavel = String(dpVO.getPointLocator().isSettable()) == "true" ? true : false;
	
	// Converte objetos Java para Javascript
	this.formataValor = function(valor) {
		switch (this.codigoTipo) {
			case 1:
				return String(valor) == "true" ? true : false;
			break;
			
			case 3:
				return Number(valor);
			break;
			
			case 2:
			case 4:
				return String(valor);
			break;
			
			case 0:
			case 5:
				throw new "Erro: Tipo inválido";
			break;
		}
	};
	
	// Último valor do data point
	this.valor = function() {
		return this.formataValor(pvDAO.getLatestPointValue(this.id).value);
	};
	this.ultimoValor = this.valor;
	
	// Último tempo do data point (humanamente legível)
	this.tempo = function() {
		return String(sdf.format(pvDAO.getLatestPointValue(this.id).time));
	};
	this.ultimoTempo = this.tempo;
	
	// Último tempo do data point (timestamp)
	this.tempoBruto = function() {
		return parseInt(pvDAO.getLatestPointValue(this.id).time)
	};
	this.ultimoTempoBruto = this.tempoBruto;
	
	// Últimos X valores do data point
	this.ultimosValores = function(maxValues) {
		var valoresJava = pvDAO.getLatestPointValues(this.id, maxValues);
		var valoresJS = new Array();
		for (var i = 0; i < valoresJava.size(); i++) {
			valoresJS.push(this.formataValor(valoresJava.get(i).value));
		}
		
		return valoresJS;
	};
	
	// Tempo das últimas X mudanças de valor do data point (humanamente legível)
	this.ultimosTempos = function(maxValues) {
		var temposJava = pvDAO.getLatestPointValues(this.id, maxValues);
		var temposJS = new Array();
		for (var i = 0; i < temposJava.size(); i++) {
			temposJS.push(String(sdf.format(temposJava.get(i).time)));
		}
		
		return temposJS;
	};
	
	// Tempo das últimas X mudanças de valor do data point (timestamp)
	this.ultimosTemposBrutos = function(maxValues) {
		var temposJava = pvDAO.getLatestPointValues(this.id, maxValues);
		var temposJS = new Array();
		for (var i = 0; i < temposJava.size(); i++) {
			temposJS.push(parseInt(temposJava.get(i).time));
		}
		
		return temposJS;
	};
	
	this.valoresEntre = function(startTime, endTime) {
		var valoresJava = pvDAO.getPointValuesBetween(this.id, startTime, endTime);
		var valoresJS = new Array();
		for (var i = 0; i < valoresJava.size(); i++) {
			valoresJS.push(this.formataValor(valoresJava.get(i).value));
		}
		
		return valoresJS.reverse();
	};
	
	this.temposEntre = function(startTime, endTime) {
		var temposJava = pvDAO.getPointValuesBetween(this.id, startTime, endTime);
		var temposJS = new Array();
		for (var i = 0; i < temposJava.size(); i++) {
			temposJS.push(String(sdf.format(temposJava.get(i).time)));
		}
		
		return temposJS.reverse();
	};
	
	this.temposBrutosEntre = function(startTime, endTime) {
		var temposJava = pvDAO.getPointValuesBetween(this.id, startTime, endTime);
		var temposJS = new Array();
		for (var i = 0; i < temposJava.size(); i++) {
			temposJS.push(parseInt(temposJava.get(i).time));
		}
		
		return temposJS.reverse();
	};
	
	this.valorEm = function(time) {
		var pointValue = pvDAO.getPointValueAt(this.id, time);
		if (!pointValue)
			pointValue = pvDAO.getPointValueBefore(this.id, time);
		
		return this.formataValor(pointValue.value);
	};
}

Como utilizar esse código?

Para utilizar essa classe em seus scripts, você precisa:

  1. Copiar o código da classe acima e colocá-lo nas linhas finais do seu script.
  2. Instanciar a classe utilizando a palavra especial new e passando como argumento o ID ou o XID do data point que você deseja ler. Ao instanciar a classe você criará um novo objeto, então, não esqueça de salvar este objeto em uma variável.
  3. Chamar as propriedades e métodos do objeto utilizando o ponto (.) seguido do nome da propriedade/método.

Vamos mostrar um exemplo prático do que foi dito acima?

// Instanciando a classe usando o ID:
var ponto1 = new dataPointInfo(12);
// Instanciando a classe usando o XID
var ponto2 = new dataPointInfo("DP_201122");

// Lendo uma propriedade
ponto1.setavel; // retornará true ou false

// Chamando um método
ponto2.ultimoValor(); // retornará o útimo valor daquele data point

// Nas últimas linhas você deve colocar o código COMPLETO
// da classe (aqui omitimos para simplificação do exemplo)
function dataPointInfo(identifier) {
    /* Código da classe ... */
}

Como é possível supor, esta classe pode ser instanciada quantas vezes você quiser, o que permite criar objetos para ler informações de praticamente qualquer data point nos seus scripts.

Métodos e propriedades implementados

Vamos agora ver todos os métodos e propriedades que essa classe implementa:

Resumo dos métodos e propriedades

Propriedades:

  • id
  • xid
  • nome
  • tipo
  • codigoTipo
  • setavel

Métodos:

  • valor()
  • ultimoValor()
  • tempo()
  • ultimoTempo()
  • tempoBruto()
  • ultimoTempoBruto()
  • ultimosValores(maxValue)
  • ultimosTempos(maxValue)
  • ultimosTemposBrutos(maxValue)
  • valoresEntre(startTime, endTime)
  • temposEntre(startTime, endTime)
  • temposBrutosEntre(startTime, endTime)
  • valorEm(time)

Propriedades

.id

Descrição: Esta propriedade retorna o valor numérico do ID do seu data point.
Tipo de dado: Número inteiro


.xid

Descrição: Esta propriedade retorna o valor do XID do seu data point.
Tipo de dado: String


.nome

Descrição: Esta propriedade retorna o nome do seu data point.
Tipo de dado: String


.tipo

Descrição: Esta propriedade retorna o tipo do seu data point (binário, numérico, multiestados, alfanumérico, imagem…).
Tipo de dado: String


.codigoTipo

Descrição: Esta propriedade retorna um código que corresponde ao tipo de dado do seu data point (binário, numérico, multiestados, alfanumérico, imagem…). Esses códigos são definidos como constantes, conforme a tabela a seguir:
Tipo de dado: Número inteiro

Código Tipo de dado
0 Desconhecido
1 Binário
2 Multiestados
3 Numérico
4 Alfanumérico
5 Imagem

.setavel

Descrição: Esta propriedade retorna se o data point é setável (configurável) ou não. Quando um data point é setável, você pode utilizar o ScadaBR para escrever novos valores no data point. Caso contrário, o data point só pode ser lido no ScadaBR, não sendo permitida a escrita de valores.
Tipo de dado: Booleano


Métodos

.valor()

Descrição: retorna o valor mais atual do data point.
Parâmetros: nenhum.
Tipo de retorno: conforme o tipo do data point (binário, numérico, etc.).

Exemplo:

var ponto = new dataPointInfo("DP_039209");

ponto.valor();

.ultimoValor()

Este método é um alias para .valor(), comportando-se de forma idêntica. Veja o método .valor() para mais informações.


.tempo()

Descrição: retorna o tempo (data e hora) da última mudança de valor do data point registrada no banco de dados. O tempo é exibido no formato aaaa-mm-dd hh:mm:ss
Parâmetros: nenhum.
Tipo de retorno: String

Exemplo:

var ponto = new dataPointInfo("DP_039209");

ponto.tempo();

.ultimoTempo()

Este método é um alias para .tempo(), comportando-se de forma idêntica. Veja o método .tempo() para mais informações.


.tempoBruto()

Descrição: retorna o tempo (data e hora) da última mudança de valor do data point registrada no banco de dados. O tempo é exibido no formato de timestamp (número de milissegundos desde 1970-01-01 00:00:00 UTC +0)
Parâmetros: nenhum.
Tipo de retorno: Long (timestamp)

Exemplo:

var ponto = new dataPointInfo("DP_039209");

ponto.tempoBruto();

.ultimoTempoBruto()

Este método é um alias para .tempoBruto(), comportando-se de forma idêntica. Veja o método .tempoBruto() para mais informações.


.ultimosValores(maxValues)

Descrição: retorna os últimos n valores do data point salvos no banco de dados.

Parâmetros:

  • maxValues: (Inteiro) o número máximo de valores a ser retornado. Por exemplo: especificar maxValues como 5 retornará os últimos 5 valores do data point.

Tipo de retorno: um array Javascript contendo os n últimos valores. O índice 0 do array representa o valor mais recente, o índice 1 representa o segundo mais recente e assim sucessivamente.

Exemplo:

var ponto = new dataPointInfo("DP_039209");

// Lê os 3 valores mais recentes
var valoresArray = ponto.ultimosValores(3);

valoresArray[0]; // Valor mais recente dos 3
valoresArray[1];
valoresArray[2]; // Valor mais antigo dos 3

.ultimosTempos(maxValues)

Descrição: retorna os tempos (data e hora) das útlimas n mudanças de valor do data point salvas no banco de dados.

Parâmetros:

  • maxValues: (Inteiro) o número máximo a ser retornado. Por exemplo: especificar maxValues como 5 retornará os tempos das últimas 5 mudanças de valor do data point.

Tipo de retorno: um array Javascript contendo os n últimos tempos. O índice 0 do array representa o tempo da mudança mais recente, o índice 1 representa o tempo da segunda mudança mais recente e assim sucessivamente. Os tempos são exibidos no formato aaaa-mm-dd hh:mm:ss.

Exemplo:

var ponto = new dataPointInfo("DP_039209");

// Lê os tempos das últimas 3 mudanças de valor
var temposArray = ponto.ultimosTempos(3);

temposArray[0]; // Data e hora da mudança mais recente de valor

// Data e hora das outras mudanças de valor:
temposArray[1];
temposArray[2];

.ultimosTemposBrutos(maxValues)

Descrição: retorna os tempos (data e hora) das útlimas n mudanças de valor do data point salvas no banco de dados.

Parâmetros:

  • maxValues: (Inteiro) o número máximo a ser retornado. Por exemplo: especificar maxValues como 5 retornará os tempos das últimas 5 mudanças de valor do data point.

Tipo de retorno: um array Javascript contendo os n últimos tempos. O índice 0 do array representa o tempo da mudança mais recente, o índice 1 representa o tempo da segunda mudança mais recente e assim sucessivamente. Os tempos são exibidos no formato de timestamp (número de milissegundos desde 1970-01-01 00:00:00 UTC +0).

Exemplo:

var ponto = new dataPointInfo("DP_039209");

// Lê os tempos das últimas 3 mudanças de valor
var temposArray = ponto.ultimosTemposBrutos(3);

temposArray[0]; // Timestamp da mudança mais recente de valor

// Timestamp das outras mudanças de valor:
temposArray[1];
temposArray[2];

.valoresEntre(startTime, endTime)

Descrição: retorna os valores do data point salvos no banco de dados entre os dois timestamps informados.

Parâmetros:

  • startTime: (Long) timestamp inicial da pesquisa (data mais antiga)
  • endTime: (Long) timestamp final da pesquisa (data mais recente)

Tipo de retorno: um array Javascript contendo os valores registrados no banco de dados entre as datas especificadas. O índice 0 do array representa o valor mais recente, o índice 1 representa o segundo mais recente e assim sucessivamente.

Observações: Um timestamp é o número de milissegundos transcorridos desde 1970-01-01 00:00:00 UTC +0. O intervalo da pesquisa inclui a data inicial (startTime) mas não inclui a data final (endTime).

Exemplo:

var ponto = new dataPointInfo("DP_039209");

// Timestamp da data atual
var dataAtual = new Date().getTime();
// Timestamp da data há 20 segundos atrás (20 segundos = 20.000 milissegundos)
var vinteSegundosAtras = dataAtual - 20000;

// Lê os valores entre as datas especificadas
var valoresArray = ponto.valoresEntre(vinteSegundosAtras, dataAtual);

valoresArray.length; // Retorna a quantidade de valores encontrados (tamanho do array)
valoresArray[0]; // O primeiro valor é sempre o mais recente

.temposEntre(startTime, endTime)

Descrição: retorna os tempos (data e hora) em que ocorreram mudanças no valor do data point. Os valores retornados ficam restritos ao período entre os dois timestamps informados como parâmetros.

Parâmetros:

  • startTime: (Long) timestamp inicial da pesquisa (data mais antiga)
  • endTime: (Long) timestamp final da pesquisa (data mais recente)

Tipo de retorno: um array Javascript contendo os tempos em que ocorreram mudanças no valor do data point, registrados no banco de dados entre as datas especificadas. O índice 0 do array representa o tempo mais recente, o índice 1 representa o segundo mais recente e assim sucessivamente. Os tempos retornados são exibidos no formato aaaa-mm-dd hh:mm:ss.

Observações: Um timestamp é o número de milissegundos transcorridos desde 1970-01-01 00:00:00 UTC +0. O intervalo da pesquisa inclui a data inicial (startTime) mas não inclui a data final (endTime).

Exemplo:

var ponto = new dataPointInfo("DP_039209");

// Timestamp da data atual
var dataAtual = new Date().getTime();
// Timestamp da data há 20 segundos atrás (20 segundos = 20.000 milissegundos)
var vinteSegundosAtras = dataAtual - 20000;

// Lê os tempos das mudança de valor entre as datas especificadas
var temposArray = ponto.temposEntre(vinteSegundosAtras, dataAtual);

temposArray.length; // Retorna a quantidade de tempos encontrados (tamanho do array)
temposArray[0]; // A data e hora da mudança mais recente de valor do data point

.temposBrutosEntre(startTime, endTime)

Descrição: retorna os tempos (em formato de timestamp) em que ocorreram mudanças no valor do data point. Os valores retornados ficam restritos ao período entre os dois timestamps informados como parâmetros.

Parâmetros:

  • startTime: (Long) timestamp inicial da pesquisa (data mais antiga)
  • endTime: (Long) timestamp final da pesquisa (data mais recente)

Tipo de retorno: um array Javascript contendo os tempos em que ocorreram mudanças no valor do data point, registrados no banco de dados entre as datas especificadas. O índice 0 do array representa o tempo mais recente, o índice 1 representa o segundo mais recente e assim sucessivamente. Os tempos retornados são exibidos no formato de timestamp (número de milissegundos desde 1970-01-01 00:00:00 UTC +0).

Observações: O intervalo da pesquisa inclui a data inicial (startTime) mas não inclui a data final (endTime).

Exemplo:

var ponto = new dataPointInfo("DP_039209");

// Timestamp da data atual
var dataAtual = new Date().getTime();
// Timestamp da data há 20 segundos atrás (20 segundos = 20.000 milissegundos)
var vinteSegundosAtras = dataAtual - 20000;

// Lê os tempos das mudança de valor entre as datas especificadas
var temposArray = ponto.temposEntre(vinteSegundosAtras, dataAtual);

temposArray.length; // Retorna a quantidade de tempos encontrados (tamanho do array)
temposArray[0]; // O timestamp da mudança mais recente de valor do data point

.valorEm(time)

Descrição: retorna o valor que o data point possuía na data e hora informadas (informar a data/hora como um timestamp). Se não houver um valor salvo no banco de dados para este momento exato, retorna o valor na data anterior mais próxima.

Parâmetros:

  • time: (Long) timestamp do momento a ser pesquisado

Tipo de retorno: conforme o tipo do data point (binário, numérico, etc.).

Observações: Um timestamp é o número de milissegundos transcorridos desde 1970-01-01 00:00:00 UTC +0.

Exemplo:

var ponto = new dataPointInfo("DP_039209");

// Definindo as partes da data
var ano = 2020;
var mes = 10;
var dia = 25;
var hora = 20;
var minuto = 15;
var segundo = 30;
// Criando uma data Javascript
var data = new Date(ano, mes, dia, hora, minuto, segundo);
var dataTimestamp = data.getTime();

// Lê o valor que o data point tinha na data especificada
// (no caso, em 25 de outubro de 2020 às 20h15min30s)
var valor = ponto.valorEm(dataTimestamp);

#2

Parabéns Celso, este código é fenomenal e deverá ajudar muita gente!


#3

Celso, muito obrigado pelo seu conteúdo. Gostei demais eu tô precisando disso, porém no meu caso eu gostaria de implementar dentro de um custom jsp como eu poderia fazer isso? Se puder me dar um insight agradeço muito.


#4

JSP no ScadaBR não é exatamente o meu forte, quem conhece mais sobre isso é o @WagnerdeQueiroz