Criando Expression Variables para cálculos de valores em tempo real.

Descrição

As Expression Variables do EPM possibilitam a aplicação de um processamento sobre dados de tempo real de uma ou mais variáveis do EPM, além, é claro, de armazenar os resultados para posteriores visualizações e análises.
Dentre suas aplicações, as mais comumente encontradas relacionam-se a cálculos de indicadores de desempenho e inferências; no entanto, podem ser utilizadas para filtrar ruídos de medida e/ou de processo, conversões de unidades mais complexas, mapeamento de uma tabela de estados discretos, ou seja, existem inúmeras possibilidades de aplicações, uma vez que as expressões a serem avaliadas são em linguagem Python. Este artigo abordará, através de três exemplos práticos, alguns dos conceitos fundamentais para a criação de Expression Variables no EPM. Ao final, pretende-se que o leitor esteja minimamente capacitado a criar as Expression Variables que atendam às suas necessidades.

NOTA: Para mais detalhes sobre as Expression Variables, consultar o manual do EPM.


Exemplo 1

Imagine uma válvula de controle que possui uma Basic Variable (tag_01) que recebe um valor inteiro de campo e que indica o seu estado atual, conforme a tabela a seguir:

 

 Valor (int)  Estado (string)
 0  maintenance (em manutenção)
 1  manual (manual)
 2  automatic (automático)
 3  cascade (cascata)

 

 

Para facilitar a visualização em relatórios e em dashboards, é desejável que estes valores sejam apresentados no formato de texto; para tanto, uma das alternativas é mapear esta tabela de estados discretos utilizando uma Expression Variable. As etapas para tanto são apresentadas a seguir:

1.1 Criar uma Expression Variable (expvar_01) que tem na sua tabela de variáveis de entrada a Basic Variable tag_01, com o apelido state e Mem. Cache igual a 1. Adicionar também a seguinte expressão:

O resultado é apresentado a seguir:


Figura 1: Configurações da sub-aba Expression/Execution Module da Expression Variable expvar_01.

Observe que as expressões sempre retornam um valor, o qual é atribuído à Expression Variable toda vez que for avaliada segundo um dado evento configurado. Neste exemplo, o que se fez foi utilizar a estrutura de dados do tipo dictionary do Python, que associa valores a chaves identificadoras.

1.2 Definir o evento de avaliação da expressão como sendo toda mudança de valor da Basic Variable tag_01. Isso é feito na aba sub-aba Expression/Execution Event, selecionando-se a própria variável de entrada para ser monitorada.


Figura 2: Configuração do evento que dispara a avaliação da expressão.

1.3 Testar a expressão na sub-aba Expression/Test. A etapa de teste de uma expressão garante que ela esteja funcionando como o esperado, requisito necessário para habilitar o comando Run na faixa de opções, que coloca a Expression Variable em um estado de avaliação continuada toda a vez que seu evento associado for disparado. Para testá-la, deve-se informar um valor bem como o tipo de dado correspondente. Na sequência, deve-se pressionar o comando Test na faixa de opções. A seguir o resultado da execução de um teste para o valor 1, que deverá ter como retorno da avaliação o texto: manual


Figura 3: Teste da expressão com resultado positivo.

Note que o tipo de retorno da expressão é automaticamente interpretado como sendo do tipo String.  Observe também que o comando Run agora está habilitado, sendo possível colocar a Expression Variable no estado de Running.

1.4 Para colocar a Expression Variable para rodar, basta pressionar o botão Run na faixa de opções; para interromper a execução, pressione o botão Stop. Abaixo é exibido o valor de uma das avaliações da expvar_01.


Figura 4: Acompanhamento e visualização do resultado de uma das avaliações da expressão.

Note que o campo REC da expvar_01 não está marcado, indicando que este valor está disponível apenas em tempo real, ou seja, não está sendo armazenado. Para armazená-lo, basta selecionar a opção Record na aba Storage da expvar_01.

 

 

 

Exemplo 2

Imagine uma Basic Variable (tag_02) que recebe os valores de um medidor de vazão via um servidor de dados OPC DA Classic. Este tipo de variável costuma apresentar ruídos de medida, e no caso em questão, precisamos desta informação já filtrada para utilizarmos em um cálculo posterior de uma inferência. Para resolver esta questão, uma das alternativas é criar uma Expression Variable que aplica um filtro em tempo real para eliminação deste ruído. Existem diversas formas de implementação de um filtro para resolver o problema; por questões didáticas, será utilizado um filtro com a seguinte expressão:

Onde:
y : é o valor filtrado
y_1 : o valor filtrado na avaliação anterior da expressão
x : o valor da medida da variável de processo com ruído de medida

Os passos a serem seguidos são equivalentes ao do Exemplo 1, porém agora temos uma particularidade, que é a utilização da própria Expression Variable (seu valor anterior) sendo utilizada na expressão. Desta forma, é necessário informar também um valor de inicialização para ser utilizado a primeira vez que a Expression Variable for colocada para rodar. Os passos são os seguintes:

2.1 Criar uma Expression Variable (expvar_02) que tem na sua tabela de variáveis de entrada a Basic Variable tag_02, com o apelido x e Mem. Cache igual a 1, bem como a própria expvar_02 com o apelido y_1 e Mem. Cache também igual a 1. Adicionar também a seguinte expressão:

O resultado é apresentado a seguir:


Figura 5: Configurações da sub-aba Expression/Execution Module da Expression Variable expvar_02.

Observe que para poder inserir a própria Expression Variable (expvar_02) na sua tabela de entrada, é necessário salvar a operação assim que ela for adicionada à tabela de Expression Variables.

2.2 Definir o evento de avaliação da expressão como sendo toda mudança de valor da Basic Variable tag_02. Isso é feito na aba sub-aba Expression/Execution Event selecionando-se a própria variável de entrada para ser monitorada.


Figura 6: Configuração do evento que dispara a avaliação da expressão.

Observe que a variável expvar_02 está desabilitada para monitorar o valor, uma vez que corresponde a própria variável da expressão.

2.3 Na sub-aba Expression/Initialization, marcar a opção Use Initial Values e fornecer valores iniciais para as variáveis:


Figura 7: Configuração dos valores de inicialização da expressão.

2.4 Testar a expressão na sub-aba Expression/Test pressionando o comando Test na faixa de opções. A seguir o resultado da execução de um teste para o valor 1 nas duas variáveis, que deverá ter como retorno da avaliação o valor 1.


Figura 8: Teste da expressão com resultado positivo.

2.5 Colocar a Expression Variable para rodar pressionando o botão Run na faixa de opções. Abaixo é exibido um gráfico do Chart Analysis do EPM Studio a comparação entre os valores de processo com ruídos de medida e o valor filtrado calculado pela expressão em tempo real.


Figura 9: Comparação entre o valor da medida de processo e a expressão que filtra os ruídos de medida.

Notar que existe um pequeno atraso no sinal filtrado, o que é de se esperar devido a natureza deste tipo de filtro calculado em tempo real.

 

Exemplo 3

Imagine o mesmo caso anterior, porém agora será utilizado um filtro que calcula a média dos últimos 5 valores da variável de processo através da seguinte expressão:

Onde:
x_filt: é o valor filtrado
x_0: o valor da medida da variável de processo com ruído de medida no tempo atual
x_1 a x_4: os valores da medida da variável de processo nas amostragens anteriores(de -1 a -4)

Os passos a serem seguidos são equivalentes ao do Exemplo 1, conforme mostrado a seguir:

3.1 Criar uma Expression Variable (expvar_03) que tem na sua tabela de variáveis de entrada a Basic Variable tag_02, com o apelido x e Mem. Cache igual a 5. Adicionar também a seguinte expressão:

Nesta expressão, x é uma lista do Python com 5 elementos onde a posição [0] corresponde ao objeto que contém o valor atual, posição [1] corresponde ao anterior, e assim sucessivamente. Para proceder com o somatório destes elementos e posterior divisão por 5, para o cálculo da média, deve-se criar um vetor contendo apenas os valores deste objeto, uma vez que cada item desta lista contém as propriedades: Value, Timestamp e Quality. A parte da expressão (item.Value for item in x) faz exatamente isso, para cada item da lista x, ele pega o seu valor (item.Value) e adiciona em um vetor – operação comumente utilizada na linguagem Python para criar um vetor utilizando o comando de laço for. Na sequência, a função sum é aplicada ao vetor resultante deste laço, seguida da divisão por 5.

NOTA: Para que o resultado da divisão seja um número de ponto flutuante, o denominador deve ser expresso com suas casas decimais (no caso 5.0), caso contrário o Python 2.7 (versão utilizada pelo EPM) interpretará que esta é uma divisão inteira e truncará o resultado para poder retornar um valor inteiro.

A janela de configuração é apresentada a seguir:


Figura 10: Configurações da sub-aba Expression/Execution Module da Expression Variable expvar_02.

3.2 Definir o evento de avaliação da expressão como sendo toda mudança de valor da Basic Variable tag_02.


Figura 11: Configuração do evento que dispara a avaliação da expressão.

3.3 Testar a expressão na sub-aba Expression/Test pressionando o comando Test na faixa de opções. A seguir o resultado da execução de um teste para os valores de 1 a 5 no vetor do Mem. Cache.


Figura 12: Teste da expressão com resultado positivo.

3.4 Colocar a Expression Variable para rodar pressionando o botão Run na faixa de opções. Em seguida podemos ver um gráfico do Chart Analysis do EPM Studio com a comparação entre os valores de processo com ruídos de medida e o valor filtrado calculado pela expressão em tempo real.


Figura 13: Comparação entre o valor da medida de processo e a expressão que filtra os ruídos de medida.

Note que neste caso também existe um pequeno atraso no sinal filtrado, devido ao mesmo motivo do caso anterior.

Print Friendly, PDF & Email

Este artigo foi útil? Was this helpful?

Classificação média - Average rating 0 / 5. Count: 0

Deixe seu Comentário

Seu endereço de e-mail não será publicado. Campos marcados com asterisco são obrigatórios *