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.