Cómo hacer un filtro EMA en TIA Portal (SCL)

Cómo hacer un filtro EMA en TIA Portal (SCL)

Hoy vamos a ver cómo crear un filtro EMA en TIA Portal usando SCL, con la fórmula, un bloque de función completo y un ejemplo paso a paso para que lo tengas funcionando en tu autómata.

Ya veo que te has quedado con las cejas arqueadas pensando... ¿soy el único que no sé qué es un filtro EMA?

Pues no, no lo eres. Seguro.

El filtro exponencial EMA (Exponential Moving Average), o en castellano media móvil exponencial, tiene varias características muy chulas para nuestros PLC:

  • Es muy sencillo de implementar.
  • Carga muy poco la CPU.
  • Puedes configurar fácilmente si quieres un filtrado paso bajo o paso alto.
  • No necesita guardar un array de muestras, solo el valor anterior.

Normalmente realizamos filtrados del ruido mediante filtros por muestreo, como ya vimos en el post del filtro definitivo en TIA Portal.

Tomamos el valor de la señal, hacemos una media, o similar, y ya está. Funciona, y funciona muy bien. Pero hoy damos un pasito más, ¿te parece?

¿Qué es el filtro EMA y para qué sirve en un PLC?

El filtro EMA es una media móvil que da más peso a las muestras recientes y menos a las antiguas, de forma exponencial. En vez de guardar las últimas N lecturas y promediarlas, solo necesitas el valor filtrado del ciclo anterior. Eso lo hace ideal para el PLC, porque apenas ocupa memoria y no carga la CPU.

La fórmula que vamos a aplicar es la siguiente:

Ver código · 1 línea
An = Alpha * Señal + (1 - Alpha) * An-1

Donde:

  • An: señal filtrada del ciclo actual.
  • Alpha: un valor entre 0 y 1 que ajusta la agresividad del filtro.
  • An-1: señal filtrada del ciclo anterior.

De la fórmula se desprenden varias cosas:

  • Con Alpha = 0, no obtendremos señal alguna, ya que no tendríamos en cuenta la señal actual (el filtro se queda congelado en el valor anterior).
  • Con Alpha = 1, no habría filtrado, y el valor filtrado sería igual a la señal sin tratar.
  • Es tremendamente sencilla de aplicar, porque se trata de realizar dos multiplicaciones y una suma.
Regla práctica: cuanto más pequeño el Alpha, más suave (y más lento) el filtrado. Cuanto más grande, más rápido responde pero deja pasar más ruido.

¿Cómo implementar el filtro EMA en TIA Portal?

Yo lo voy a hacer en SCL bajo TIA Portal, pero es aplicable a Step 7 tradicional sin ningún problema, y en FUP (KOP también, aunque queda más engorroso). La idea es crear un bloque de función (FB) con memoria propia para guardar el valor filtrado anterior, y luego llamarlo desde el OB1 con la señal que queramos filtrar.

Estos son los pasos:

  1. Crea un bloque de función nuevo, por ejemplo FB_FiltroEMA, y márcalo como lenguaje SCL.
  2. Define la interfaz: una entrada para la señal cruda, una entrada para el Alpha, una salida para la señal filtrada y una variable estática (Static) para guardar el valor anterior.
  3. Escribe la fórmula dentro del bloque.
  4. Llama al FB desde el OB1 con su DB de instancia.

Interfaz del bloque FB_FiltroEMA

Configura la interfaz del FB así:

  • Input: Senal_In : Real (la señal a filtrar).
  • Input: Alpha : Real (valor entre 0 y 1).
  • Output: Senal_Filtrada : Real (la salida filtrada).
  • Static: An_1 : Real (memoria del valor filtrado anterior).

Código SCL completo del filtro EMA

Este es el cuerpo del bloque FB_FiltroEMA:

Ver código · 18 líneas
// FB_FiltroEMA
// Filtro de media movil exponencial (EMA)
// An = Alpha * Senal + (1 - Alpha) * An-1

// Limitamos Alpha entre 0 y 1 por seguridad
IF #Alpha > 1.0 THEN
    #Alpha := 1.0;
END_IF;

IF #Alpha < 0.0 THEN
    #Alpha := 0.0;
END_IF;

// Aplicamos la formula EMA
#Senal_Filtrada := #Alpha * #Senal_In + (1.0 - #Alpha) * #An_1;

// Guardamos el valor filtrado para el proximo ciclo
#An_1 := #Senal_Filtrada;

Fíjate en el detalle importante: guardamos An_1 con el valor ya filtrado, no con la señal cruda. Ese es el corazón del filtro EMA. Al ser una variable Static, la CPU la conserva entre ciclo y ciclo dentro del DB de instancia.

Llamada al FB desde el OB1

Ahora llamamos al bloque desde el OB1 (o el OB cíclico que uses). Al arrastrar el FB, TIA Portal te pedirá crear un DB de instancia, por ejemplo iFiltroEMA:

Ver código · 6 líneas
// OB1 - Llamada al filtro EMA
// Filtramos la senal analogica escalada que tengamos en "Temperatura_Cruda"

"iFiltroEMA"(Senal_In  := "Temperatura_Cruda",
            Alpha     := 0.2,
            Senal_Filtrada => "Temperatura_Filtrada");

Con Alpha := 0.2 tendrás un filtrado suave (paso bajo), que elimina bien el ruido pero responde con cierto retardo. Si necesitas que reaccione más rápido, sube el Alpha.

Cómo elegir el valor de Alpha (paso bajo o paso alto)

Este es el punto donde la gente se atasca. Te dejo una orientación práctica:

  • Filtrado paso bajo (señal suave): Alpha en torno a 0,6 o más alto. Deja pasar los cambios lentos y respeta bastante la señal.
  • Filtrado más agresivo contra ruido: Alpha en torno a 0,2. Suaviza mucho, pero introduce retardo.

Lo mejor es que dejes el Alpha en una variable y lo ajustes en caliente desde el HMI mientras miras la señal filtrada en una curva. En dos minutos encuentras el valor que te encaja para tu proceso.

El vídeo del ejemplo paso a paso

Para realizar el ejemplo, he usado:

Let's go!

¿Qué te ha parecido?

Espero que te haya parecido interesante. Como ves, con un FB de cuatro líneas de SCL ya tienes un filtro EMA que carga poquísimo la CPU y que puedes ajustar entre paso bajo y una respuesta más rápida solo tocando el Alpha.

Si vienes de filtrar por muestreo, te recomiendo que compares este método con el del filtro definitivo en TIA Portal. Verás que el EMA te ahorra memoria y código.

Y si quieres soltarte del todo con SCL para hacerte tus propios bloques, en el curso de SCL en TIA Portal montamos bloques como este paso a paso.

¡¡Espero tus comentarios!!

Recuerda que puedes apuntarte en Guorker.com donde, por una cuota mensual, tendrás tarifa plana en todos los cursos disponibles en la plataforma.

Comentarios (7)
GERARDO HERNANDEZ
muy interesante me gustaria tener mas tiempo para aprender.
Franco
hola iñigo, como modifico la formula si deseo hacer un filtro paso alto, en teoría, en el ejemplo vos mostras un filtro paso bajo, es decir, supresión de altas frecuencias, pero si yo deseo suprimir las bajas frecuencias, que modificaría en la formula?.. si yo subo el alpha, dejo pasar tanto bajas como altas, es decir alpha casi 1.
Francisco Arellano
Muchas gracias por el aporte, actualmente estoy en realizando un proyecto aca en Mexico y precisamente tuve detalles con una señal analógica donde variaba bastante y no me permitia relizar bien mi aplicacion y con ésta informacion pude resolverla. Saludos!!!
Iñigo Gútiez
Genial Francisco!
Ivan
Podrías explicar que tanto variaba tu señal y como lo resolviste exactamente
geremias matos cotero
hola, Iñigo xf como quedaría en step 7 tradicional, muchas gracias por el gran aporte de las experiencias.
Iñigo Gútiez
Básicamente igual. Es simplemente hacer la misma formula en awl, o en kop...