6 de julio de 2012

Midiendo el tiempo de arranque de una máquina con un script en WinCC Flexible

Hace ya unas semanas un lector me hizo una consulta sobre cómo medir el tiempo de arranque de una máquina con un script en WinCC Flexible. En su momento no tuve tiempo de responderle, pero he hecho una prueba y aprovecho para publicarla en el blog.

Lo que se pretende es visualizar en una pantalla el tiempo de arranque de una máquina. No existe la posibilidad de modificar el programa PLC, con lo que toda la programación deberá hacerse sobre WinCC Flexible.

Con este planteamiento lo primero es localizar dos variables en el programa PLC que nos sirvan para identificar los momentos de inicio y fin de arranque. Para mi ejemplo he enlazado dos variables llamadas INICIO_CICLO y FIN_CICLO que cumplirán esta función y mediante dos botones desde el HMI simularé su activación. También crearé con formato Long tres variables internas, una para el tiempo de inicio (TIEMPO_INICIAL), otra para el tiempo final (TIEMPO_FINAL) y la tercera para la diferencia entre ambos (TIEMPO_MEDIDO), que será el tiempo de arranque buscado.


Estas variables deberemos enlazarlas desde el HMI, seleccionando en su configuración Ciclo continuo y ajustando el Tiempo de adquisición al más bajo posible: 100 ms. Así el panel estará leyendo cada 100 ms el valor de estas variables desde el PLC. Por lo tanto es importante que estas variables en el PLC estén activadas durante más de 100 ms.


A continuación tendremos que crear un par de scripts, que se ejecutarán cuando estas variables cambien, uno para cuando se detecte que se ha iniciado el arranque y otro para cuando finalice.


Dentro de los scrips usaré la función de Visual Basic Script Timer, que cuando la llamamos nos devuelve el número de segundos que han transcurrido desde las 00:00 horas, teniendo por tanto un rango entre 0 y 86399 segundos. No he encontrado una función que tenga una resolución temporal inferior al segundo, con lo que si necesitamos más precisión esta no es la forma de hacerlo.

Si escribimos Timer en el editor de scripts y pulsamos la tecla F1 aparecerá la ayuda para esta función, que nos dice lo siguiente:
Microsoft® Visual Basic® Scripting Edition
Timer Function   Language Reference Version 5

--------------------------------------------------------------------------------
Description
Returns the number of seconds that have elapsed since 12:00 AM (midnight).
The following example uses the Timer function to determine the time it takes to iterate a For...Next loop N times:
Function TimeIt(N)
  Dim StartTime, EndTime
  StartTime = Timer
  For I = 1 To N
  Next
  EndTime = Timer
  TimeIt = EndTime - StartTime
End Function  
El código del script para detectar el inicio del arranque es el siguiente:
'Script a asociar a la variable que indique el inicio de ciclo
'Si la variable que marca el inicio del ciclo está a uno
If SmartTags("INICIO_CICLO") = True Then
'Se guarda el tiempo inicial
'La función Timer devuelve el nº de segundos que han pasado desde las 00:00 horas
SmartTags("TIEMPO_INICIAL") = Timer
End If
y el código para el script que se asocia a la variable del fin de arranque es este:
'Script a asociar a la variable que indique el final del ciclo
'Si la variable que marca el final del ciclo está a uno
If SmartTags("FIN_CICLO") = True Then
'Se guarda el tiempo final
'La función Timer devuelve el nº de segundos que han pasado desde las 00:00 horas
SmartTags("TIEMPO_FINAL") = Timer
'Se calcula la diferencia entre el tiempo inicial y el tiempo final
'para tener el tiempo de arranque buscado
'Si el tiempo final es mayor que el tiempo inicial se restan
If SmartTags("TIEMPO_FINAL") > SmartTags("TIEMPO_INICIAL") Then
SmartTags("TIEMPO_MEDIDO") = SmartTags("TIEMPO_FINAL") - SmartTags("TIEMPO_INICIAL")
'Si el tiempo final es menor que el inicial, es que dentro del intervalo está la puesta a cero
Else
SmartTags("TIEMPO_MEDIDO") = SmartTags("TIEMPO_FINAL") + _
                            SmartTags("TIEMPO_INICIAL") - 86400
End If
End If
Ahora hay que asociar los scripts a sus variables correspondientes. Seleccionamos cada variable y en sus propiedades, bajo Eventos -> Cambio de valor le asignamos el script adecuado.




Y listo, cuando se den las condiciones de inicio de arranque y posteriormente el de fin de arranque, en la variable TIEMPO_FINAL tendremos el tiempo en segundos buscado.


Esto no es más que un ejemplo muy sencillo. No sé si será la mejor opción, pero funciona razonablemente bien. Lo he probado con máquinas virtuales ejecutando WinAC y un Runtime de WinCC Flexible, y tienes el proyecto de prueba aquí.

El mayor problema que veo es la limitación de no poder modificar el programa PLC. Puede que no sea sencillo localizar variables que nos marquen inequívocamente el inicio y el fin del arranque y tal vez tendremos que elaborar un poco más (usando operaciones lógicas con varias variables) su detección. Si se te ocurre una solución mejor estaré encantado de que me la cuentes.

No conozco documentación específica sobre programación de scripts en WinCC Flexible salvo la que se instala con el propio programa: creo que lo mejor para aprender es trastear con el propio editor y consultar su ayuda, que es bastante completa.

Como siempre agradeceré cualquier comentario.

6 comentarios:

  1. 1-entiendo que el ejemplo es para medir un motor electrico una vez arrancado y a traves de sensores devolver los datos del tiempo en segundos al plc ?
    o bien
    2-sirve para calcular el tiempo de arranque real de un motor electrico simulado en wincc ?
    no acabo de ver el ejemplo para que utilidad seria de los 2 puntos o sirve para los dos puntos a la vez?

    ResponderEliminar
    Respuestas
    1. El objeto de este ejemplo es medir el tiempo entre dos cambios en variables del PLC para mostrar el resultado en el HMI. Es la respuesta que di a un lector que necesitaba medir el tiempo de arranque de una máquina pero no podía modificar el programa PLC, teniendo que hacer toda la programación en WinCC Flexible.

      Un saludo y gracias por el interés.

      Eliminar
  2. de acuerdo, pero esas variables de donde salen, de que tipo son ? :
    datos del entorno exterior:
    - son variables (exteriores)tomadas de un sensor ?
    - son variables dinamicas cuya informacion provienen de un sensor ?
    datos del entorno plc:
    - son variables (interiores) solo para el algoritmo del programa del plc ?
    - son variables fijas limitadas por el programador plc (como minimo o maximo)

    ResponderEliminar
  3. ayudaria poner un dibujo de la relacion de datos con el motor, el plc, sensores, wincc, y la dichosa variable para tener una mejor perspectiva de lo que se habla, por favor un simple esquema, es mejor que 1000 palabras.

    ResponderEliminar
    Respuestas
    1. A ver, este es un ejemplo genérico en el que se mide el tiempo entre dos cambios de valor en dos variables. ¿Qué variables escoger? Pues depende de cada caso en concreto. Por ejemplo, en una máquina se inicia el arranque con la salida que da marcha al contactor del motor de un grupo hidráulico, pues enlazaría mi variable del panel INICIO_CICLO a esta salida. Y el arranque se da terminado cuando un presostato me dice que la presión mínima de trabajo se ha alcanzado, pues la entrada digital de presostato la enlazaría con FIN_CICLO. Así, aplicando el código de esta entrada podría medir el tiempo de arranque.

      Esto es un ejemplo genérico, que puede servir de base para aplicaciones concretas para las que, seguramente, habría que elaborarlo un poco más.

      Un saludo y espero haberte aclarado algo las cosas.

      Eliminar

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