2 de diciembre de 2010

Visualización del tiempo ciclo con Step7 + WinCC Flexible

Una de las cosas que, en mi opinión, no debe faltar en una máquina que disponga de panel de visualización, es una pantalla dedicada al tiempo ciclo. Es curioso ver como en muchas inspecciones de máquinas, el ingeniero de métodos y tiempos, cronómetro en mano, comprueba que nuestra máquina dé cadencia. Si en vez de eso, le damos una tabla de tiempos tomados de forma precisa por el PLC, le simplificaremos la labor y seguramente lo agradecerá... y ya sabemos que el ingeniero de métodos y tiempos es un tipo con el que conviene llevarse bien ;)

Nota: entiéndase tiempo de ciclo como el tiempo que transcurre desde que obtenemos una pieza terminada y la siguiente.

Para ello voy a suponer que mi máquina está comandada por un PLC S7-300 y como HMI tengo un panel táctil de Siemens como el MP277, y sobre esta base voy a programar lo que sería una visualización sencilla de los últimos diez tiempos de ciclo.

En este ejemplo el PLC calculará el tiempo ciclo y mediante una variable booleana le indicará al panel que recoja el dato. Luego el panel leerá el dato y lo introducirá en una tabla de valores, los visualizará por orden de recepción (primero el más reciente) y marcará con color verde el menor y con color amarillo el mayor. La visualización quedará tal como se muestra a continuación:


Empecemos con la programación en el PLC.
He programado un bloque de función (FB) donde calculo el tiempo ciclo. Como entradas tiene una señal de habilitación HABILIT, que es necesario activar para que se ponga a controlar (p. ej. solo interesa el tiempo ciclo en modo automático). A continuación debemos introducir una señal CONTROL que se active una única vez al terminar cada ciclo de máquina. Podría ser, por ejemplo, un detector de pieza en salida, pero yo prefiero poner el estado final de la lógica de funcionamiento. El tiempo ciclo será el intervalo entre dos flancos positivos consecutivos en dicha señal. La entrada T_LIMITE sirve para descartar tiempos ciclo muy altos (p. ej. si el operario salió a tomar el bocadillo), solo se considerarán los tiempos de ciclo inferiores. Si queremos visualizar todos, hay que poner aquí un tiempo suficientemente alto.

En las salidas tenemos un booleano PULSO que, cada vez que hay un nuevo tiempo de ciclo, da un pulso de dos segundos, que nos servirá para decirle al panel que recoja un nuevo dato. Finalmente en la salida T_CICLO tendremos el tiempo de ciclo medido en milisegundos (formato TIME). Nótese que el tiempo de ciclo mínimo a medir será de dos segundos (más un pequeño margen de seguridad), en máquinas más rápidas este código no sirve.

Una llamada al FB descrito puede ser como esta:



Nota: los tiempos se gestionan internamente, el FB no consume temporizadores Simatic.

Está programado en diagrama de contactos (KOP) y para incorporarlo a un proyecto de Step7 copia el siguiente código a un fichero fuente y compílalo:
FUNCTION_BLOCK FB13
TITLE =CONTROL TIEMPO CICLO
//http://notasdeautomatizacion.blogspot.com
VERSION : 0.1


VAR_INPUT
HABILIT : BOOL ; //HABILITACIÓN
CONTROL : BOOL ; //SEÑAL DE CONTROL DE TIEMPO CICLO
T_LIMITE : TIME ; //TIEMPO MÁXIMO PARA CONSIDERAR UN TIEMPO CICLO
END_VAR
VAR_OUTPUT
PULSO : BOOL ; //PULSO PARA INDICAR UN NUEVO TIEMPO CICLO
T_CICLO : TIME ; //TIEMPO CICLO (EN MILISEGUNDOS)
END_VAR
VAR
PRIMER_CTRL : BOOL ;
FP_HABILIT : BOOL ;
FP_CTRL : BOOL ;
T_INI_CICLO : TIME ;
T_AUX_PULSO : TIME ;
END_VAR
VAR_TEMP
TIME_TICKS : TIME ;
END_VAR
BEGIN
NETWORK
TITLE =LECTURA DEL TIEMPO DEL SISTEMA
//EN MILISEGUNDOS TRASCURRIDOS DESDE EL ÚLTIMO ARRANQUE DEL PLC
CALL "TIME_TCK" (
RET_VAL := #TIME_TICKS);
NOP 0;
NETWORK
TITLE =PRIMER CONTROL
//CUANDO SE HABILITA NO SE TIENE EN CUENTA LA PRIMERA SEÑAL DE CONTROL
//(EL PRIMER TIEMPO CICLO SE DA CON LA SEGUNDA SEÑAL DE CONTROL)
U #HABILIT;
FP #FP_HABILIT;
S #PRIMER_CTRL;
NETWORK
TITLE =SEÑAL DE CONTROL DE TIEMPO CICLO
//EL TIEMPO CICLO SE CALCULA ENTRE DOS FLANCOS POSITIVOS DE LA SEÑAL DE CONTROL
//CUANDO HAY UN NUEVO TIEMPO CICLO SE DA UN PULSO DE DOS SEGUNDOS
U #CONTROL;
FP #FP_CTRL;
U #HABILIT;
= L 4.0;
U L 4.0;
UN #PRIMER_CTRL;
= L 4.1;
U L 4.1;
SPBNB _001;
L #TIME_TICKS;
L #T_INI_CICLO;
-D ;
T #T_CICLO;
_001: NOP 0;
U L 4.1;
SPBNB _002;
L #TIME_TICKS;
T #T_INI_CICLO;
_002: NOP 0;
U L 4.1;
U( ;
L #T_CICLO;
L #T_LIMITE;
<=D ;
) ;
= L 4.2;
U L 4.2;
SPBNB _003;
L #TIME_TICKS;
L T#2S;
+D ;
T #T_AUX_PULSO;
_003: NOP 0;
U L 4.2;
BLD 102;
S #PULSO;
U L 4.0;
U #PRIMER_CTRL;
= L 4.1;
U L 4.1;
SPBNB _004;
L #TIME_TICKS;
T #T_INI_CICLO;
_004: NOP 0;
U L 4.1;
BLD 102;
R #PRIMER_CTRL;
NETWORK
TITLE =PULSO DE LECTURA DE TIEMPO CICLO
//RESET AL PASAR DOS SEGUNDOS DESDE SU ACTIVACIÓN
U #PULSO;
U( ;
L #TIME_TICKS;
L #T_AUX_PULSO;
>=D ;
) ;
R #PULSO;
END_FUNCTION_BLOCK

Nota: si una vez compilado te falla la conversión de AWL a KOP, desactiva en las opciones del editor de Step7, en la pestaña FUP/KOP, la casilla Comprobar los tipos de operandos.

Hasta aquí la parte de programación en el PLC, ahora vamos al WinCC Flexible.

Lo primero será enlazar la variable del PLC que nos indicará que hay un nuevo tiempo ciclo:


Importante: en esta variable deberemos cambiar el modo de adquisición a Ciclo continuo, para así ir obteniendo los tiempos incluso sin estar en la pantalla donde se utiliza.

También debemos enlazar la variable donde hay que leer el tiempo de ciclo:


Ahora crearemos dos tablas de variables (internas, sin conexión con el PLC) con la cantidad de tiempos de ciclo que queramos mostrar, en mi caso diez. La primera, TIEMPOS, servirá para almacenar los tiempos de ciclo ordenados, en formato entero (16 bits) y la segunda, MARCAR, voy a usarla para marcar los colores de la representación de los tiempos de ciclo mayor y menor.


Creadas las variables necesarias, pasamos a la programación del script. Agregamos un script nuevo al proyecto (lo he llamado TIEMPO_CICLO) y copiamos el siguiente código:

'SE LLAMARÁ AL SCRIPT CADA VEZ QUE CAMBIE "PULSO CICLO"
'PERO SOLO SE AÑADIRÁ UN TIEMPO SI ES TRUE
If SmartTags("PULSO CICLO") = True Then

Const NUM_TIEMPOS = 10 'NÚMERO DE TIEMPOS QUE SE ALMACENAN

Dim INDICE 'ÍNDICE PARA RECORRER LOS TIEMPOS
Dim INDICE_CORTO 'ÍNDICE DEL TIEMPO MÁS CORTO
Dim INDICE_LARGO 'ÍNDICE DEL TIEMPO MÁS LARGO

'HACEMOS SITIO EN LA TABLA DE TIEMPOS
'SE DESCARTA EL ÚLTIMO TIEMPO Y SE MUEVEN HACIA ABAJO
For INDICE = NUM_TIEMPOS - 1 To 1 Step -1
SmartTags("TIEMPOS")(INDICE) = SmartTags("TIEMPOS")(INDICE -1)
Next

'SE ALMACENA EL TIEMPO CICLO ACTUAL COMO EL MÁS RECIENTE
'EN DÉCIMAS DE SEGUNDO
SmartTags("TIEMPOS")(0) = SmartTags("T_CICLO") / 100

'BÚSQUEDA DE LOS TIEMPO MÁS CORTO Y MÁS LARGO
INDICE_CORTO = 0
INDICE_LARGO = 0
For INDICE = 1 To NUM_TIEMPOS - 1
If SmartTags("TIEMPOS")(INDICE) < SmartTags("TIEMPOS")(INDICE_CORTO) And _
SmartTags("TIEMPOS")(INDICE) > 0 Then
INDICE_CORTO = INDICE
End If

If SmartTags("TIEMPOS")(INDICE) > SmartTags("TIEMPOS")(INDICE_LARGO) Then
INDICE_LARGO = INDICE
End If
Next

'SI LOS ÍNDICE CORTO Y LARGO SON IGUALES NO SE HACE NADA
If INDICE_CORTO <> INDICE_LARGO Then

For INDICE = 0 To NUM_TIEMPOS - 1
SmartTags("MARCAR")(INDICE) = 0 'FONDO BLANCO

If INDICE = INDICE_LARGO Then
SmartTags("MARCAR")(INDICE) = 2 'FONDO AMARILLO
End If

If INDICE = INDICE_CORTO Then
SmartTags("MARCAR")(INDICE) = 1 'FONDO VERDE
End If
Next

End If

End If

En el script debemos adaptar la constante NUM_TIEMPOS al número de tiempos de ciclo que deseemos mostrar. Básicamente, lo que hace es ir incorporando, de manera ordenada, los tiempos de ciclo descartando el más antiguo. Como expresar el tiempo en milisegundos puede ser excesivo, se divide entre cien para mostrarlo en décimas de segundo. Luego se repasa la tabla de tiempos buscando el más breve y el más largo, asignando en el índice correspondiente de la tabla MARCAR un uno si es el más breve o un dos si es el más largo (el resto se mantienen a cero).

El siguiente paso es saber cuándo ejecutar el script, y para ello tenemos la variable PULSO CICLO (o el nombre que le hayas asignado). Vamos a sus eventos y en Cambio de valor asignamos nuestro script, así logramos que se ejecute cada vez que se detecte un pulso.


Ahora solo nos queda preparar nuestra pantalla de tiempos de ciclo, con diez (o los que hayamos programado) campos de salida:


Para que cambien los colores de fondo de la representación de los tiempos más largo y más corto, debemos activar para cada campo de salida Animaciones -> Apariencia y asignar como variable MARCAR con su índice correspondiente.


Y con esto ya tendríamos la visualización de tiempos de ciclo terminada.

Me quedo con la sensación de que esta aplicación es más larga de explicar que de implementar. Es evidente que hay muchas maneras de mejorarla: se pueden guardar los tiempos en un histórico, representarlos gráficamente y lo que se nos ocurra (y nos permita el WinCC Flexible). Si alguien implementa alguna mejora o se le ocurre alguna manera más eficiente de hacer esto mismo, estaría encantado de echarle un vistazo.

1 comentario:

  1. hola que tal, estoy tratando de guardar en una base de datos sql los valores booleanos de mis salidas del plc, cómo puedo convertir las variables con conexión al plc a variables internas?

    ResponderEliminar

Por favor, no pidas copias de programas comerciales, licencias o números de serie.