Funções

Permitem converter os valores dos pontos de natureza analógica de contagens em unidades de engenharia.

Os registradores dos Dispositivos são transmitidos ao SCADA como contagens ou valores numéricos sem uma unidade ou grandeza definida; às vezes requerem escalonamentos, inversões, conversões de ponto flutuante, etc. Por isso, muitas vezes é necessário convertê-los por meio de uma função apropriada.

Para isso utiliza-se uma Função, que conterá um trecho de código JavaScript que será executado tomando como entrada o valor do registrador e devolverá como saída o valor convertido.

Dessa forma, podemos converter o valor bruto 996 em 9,96 Volts aplicando uma Função que divide por 100.

As funções também são utilizadas na seção Cálculos para realizar operações com o valor de um ou mais pontos ou instruções SQL.

Captura de tela

Definição

  • Clique em Novo na parte superior direita da janela
  • Preencha os seguintes campos
    Campo Descrição
    Nome Nome da Função. Será exibido sob este nome na coluna correspondente da seção Pontos
    Função Informe a função JavaScript a utilizar. Para conversões de valores de pontos, ela deve receber um único argumento; já se for utilizada em um cálculo, deve receber tantos argumentos quantos valores de entrada forem necessários
  • Clique em Salvar
  • A partir de agora, a nova função estará disponível para ser atribuída nas seções Pontos e Cálculos

Exemplos de funções

Retas

Sua fórmula será do tipo a*x+b; a função deve ser do tipo:

function(x) { return m*x+b;	}

Substitua o coeficiente angular m e o coeficiente linear b pelos valores correspondentes.

O valor bruto sem unidade proveniente do registrador será tomado como parâmetro de entrada x e será calculada a ordenada y.

Por exemplo, se o valor de entrada for 123, o coeficiente angular 2 e o coeficiente linear 5, o valor do ponto será 251

Ponto Flutuante de 32 bits

Função para converter um registrador de 32 bits (ou dois registradores MODBUS de 16 bits consecutivos) quando seu conteúdo tem formato de ponto flutuante de precisão simples (1 bit de sinal, 8 bits de expoente e 23 bits de mantissa).

 1    8               23
+-+--------+-----------------------+
|S|  Exp   |  Mantissa             |
+-+--------+-----------------------+
31 30    23 22                    0

function ieee32ToFloat(intval) {
    var fval = 0.0;
    var x;//exponent
    var m;//mantissa
    var s;//sign
    s = (intval & 0x80000000)?-1:1;
    x = ((intval >> 23) & 0xFF);
    m = (intval & 0x7FFFFF);
    switch(x) {
        case 0:
            //zero, do nothing, ignore negative zero and subnormals
            break;
        case 0xFF:
            if (m) fval = NaN;
            else if (s > 0) fval = Number.POSITIVE_INFINITY;
            else fval = Number.NEGATIVE_INFINITY;
            break;
        default:
            x -= 127;
            m += 0x800000;
            fval = s * (m / 8388608.0) * Math.pow(2, x);
            break;
		}
    return fval;
	}

Ponto Flutuante de 16 bits

Função para converter um registrador de 16 bits quando seu conteúdo tem formato de ponto flutuante de meia precisão (1 bit de sinal, 5 bits de expoente e 10 bits de mantissa).

 1    5      10
+-+-----+----------+
|S| Exp |  Mantissa|
+-+-----+----------+
15 14 10 9        0

function ieee16ToFloat(intval) {
    var exponent = (intval & 0x7C00) >> 10;
        fraction = intval & 0x03FF;
    return (intval >> 15 ? -1 : 1) * (
        exponent ?
        (
            exponent === 0x1F ?
            fraction ? NaN : Infinity :
            Math.pow(2, exponent - 15) * (1 + fraction / 0x400)
        ) :
        6.103515625e-5 * (fraction / 0x400)
    );

Exemplos de funções para a seção Cálculos

Soma de três valores

Esta simples função permite somar o valor de três pontos. Diferentemente das funções anteriores, não pensadas para cálculos, esta recebe três parâmetros de entrada.

function(a,b,c) { return a+b+c;	}

Potência aparente

Função com dois argumentos de entrada, onde p é a potência ativa e q a reativa.

function(p,q) { return Math.sqrt(Math.pow(p,2)+Math.pow(q,2)); }