7 de septiembre de 2010

Los contadores de horas de funcionamiento (run-time meters) de los S7-300/400

Los PLC de Siemens de las series S7-300 y S7-400 (y también el WinAC) vienen equipados con contadores de horas de funcionamiento (CHF). Se trata de temporizadores con una resolución mínima de una hora, aunque su formato no es como un temporizador Simatic: se almacenan en enteros con signo de 16 ó 32 bits y puede haber uno o varios, dependiendo del modelo de PLC. Por ejemplo, un PLC 313C-2DP viene equipado con uno de 32 bits, el WinAC tiene ocho de 16 bits, etc.

En la información del módulo del PLC 313C-2DP podemos ver su contador de horas de funcionamiento:


Ocho contadores de horas de funcionamiento de un sistema WinAC:


Si los CHF son de 16 bits podemos contabilizar como máximo 32 727 horas, que son unos 3,7 años, lo cual puede quedarse corto, problema que no existe con los de 32 bits. Podemos usarlos para, por ejemplo, contabilizar las horas que está el PLC en funcionamiento, las horas que está funcionando en modo automático o, lo que en mi opinión sería su uso más lógico, saber las horas de trabajo efectivo de la máquina.

Para programar los CHF también tenemos que tener en cuenta su resolución, si son de 16 bits tendremos que hacer uso de los SFC 2 "SET_RTM", 3 "CTRL_RTM" y 4 "READ_RTM" para leerlos, ajustarlos a un valor, arrancarlos y pararlos. Si son 32 bits, con un único SFC 101 "RTM" es posible realizar todas las operaciones. En la ayuda de Step7 vienen todos estos SFC perfectamente documentados.

NOTA: Los CHF de 32 bits también pueden utilizarse con los SFC 2, 3 y 4, pero se comportarán como si fuesen de 16 bits, desaprovechando su mayor rango.

Para saber si los CHF de nuestro PLC son de 16 ó 32 bits podemos verlo en su hoja de características o también podemos ver si tiene el SFC 101 integrado, en cuyo caso serán de 32 bits.

El PLC 313C-2DP viene con el bloque de sistema SFC 101 integrado, lo que nos indica que el CHF es de 32 bits:


Sin embargo, en un WinAC el SFC 101 no está presente, disponiendo únicamente de los SFC 2, 3 y 4 para programar los CHF:


En la siguiente imagen muestro un sencillo código en KOP para manejar el único CHF del 313C-2DP, lo que hace es activarlo si se detecta que la máquina está en automático, deteniéndolo en caso contrario y mediante una señal realiza la puesta a cero:


El código equivalente para un CHF de 16 bits sería como sigue:


Si el PLC pasa a STOP o si paramos un CHF, su valor quedará memorizado. Cada vez que arranquemos el PLC el CHF debe volver a ponerse en marcha.

Hasta ahora ningún cliente me ha pedido que contabilice las horas de funcionamiento de una máquina; sin embargo me parece interesante utilizarlos por una propiedad que tienen que aún no he mencionado: su especial remanencia. Me sucedió en una intervención que tras sobrescribir un bloque de datos (DB) que contenía contadores de piezas, estos se reiniciaron a su valor inicial, perdiéndose su valor de trabajo, y resultó que el cliente estaba haciendo algún tipo de seguimiento basado en el contador total de piezas de la máquina, y claro, se lo chafé. Por lo general es un inconveniente menor que se puede evitar tomando sencillas precauciones, pero para asegurarnos que ningún despiste nos provocará la pérdida de un dato importante, podemos usar un CHF.

Y es que los CHF se almacenan en una zona especial del PLC que los hacen inmunes a cambios en el programa. Su valor permanece incluso si hacemos un borrado total y la única manera de acceder a ellos es a través de los SFC que mencioné anteriormente. Las únicas operaciones que afectan a los CHF son la actualización del sistema operativo del PLC o bien restableciéndolo al estado de suministro, en cuyo caso se resetean al valor cero.

Si no arrancamos los CHF, haciendo uso del modo de ajuste, tenemos unas memorias perfectas para salvaguardar datos importantes. Por ejemplo, yo he usado el CHF de 32 bits del 313C-2DP para almacenar el valor de un contador de piezas. Para ello he modificado el contador simple de 32 bits de la entrada anterior (con idéntica funcionalidad) para hacer uso del CHF:

FUNCTION_BLOCK FB 100
TITLE =CONTADOR SIMPLE DE 32 BITS EN EL RTM Nº 0
//CUENTA ENTRE 0 Y 2 147 483 647
//¡EL RTM NO DEBE PONERSE NUNCA EN MARCHA EN NINGUNA PARTE DEL PROGRAMA!
VERSION : 0.1


VAR_INPUT
CONTAR : BOOL ; //INCREMENTA EL CONTADOR EN CADA FLANCO POSITIVO DE ESTA ENTRADA
REINIC : BOOL ; //REINICIALIZACIÓN DEL CONTADOR (PUESTA A CERO)
END_VAR
VAR_OUTPUT
CUENTA : DINT ; //VALOR DEL CONTADOR
CONTANDO : BOOL ; //SEÑAL ACTIVA CUANDO SE ESTÁ INCREMENTANDO EL CONTADOR
END_VAR
VAR
FP : BOOL ; //VARIABLE AUXILIAR PARA DETECTAR FLANCOS POSITIVOS
END_VAR
VAR_TEMP
ERROR : INT ;
AUX_DINT : DINT ;
RTM_ON : BOOL ; //COMPROBACIÓN DE SI EL RTM ESTÁ EN MARCHA (¡NO DEBE ESTARLO!)
END_VAR
BEGIN
NETWORK
TITLE =CÓDIGO AWL
//NOTASDEAUTOMATIZACION.BLOGSPOT.COM
U #REINIC; // SI SE REINICIA EL CONTADOR
SPBN SLT0;

CALL "RTM" (// SE PONE EL RTM A CERO
NR := B#16#0,// RTM Nª 0
MODE := B#16#4,// MODO 4 (ASIGNACIÓN DE VALOR)
PV := L#0,// VALOR A ASIGNAR CERO
RET_VAL := #ERROR,// PARA VERIFICAR SI HAY ALGÚN ERROR (NO LO USO)
CQ := #RTM_ON,// PARA VERIFICAR SI EL RTM ESTÁ EN FUNCIONAMIENTO (DEBERÍA SER SIEMPRE 0)
CV := #CUENTA);// VALOR DEL CONTADOR

R #CONTANDO; // SI SE ESTÁ REINICIALIZANDO NO SE ESTÁ CONTANDO
BE ;

SLT0: U #CONTAR; // SI SE DETECTA UN FLANCO POSITIVO
FP #FP; // EN LA SEÑAL DE CONTAJE
= #CONTANDO; // SE ACTIVA LA SALIDA #CONTANDO

CALL "RTM" (// SE LEE EL RTM
NR := B#16#0,// RTM Nº 0
MODE := B#16#0,// MODO 0 (CONSULTA DEL RTM)
PV := L#0,// PARÁMETRO IRRELEVANTE EN EL MODO 0
RET_VAL := #ERROR,// PARA VERIFICAR SI HAY ALGÚN ERROR (NO LO USO)
CQ := #RTM_ON,// PARA VERIFICAR SI EL RTM ESTÁ EN FUNCIONAMIENTO (DEBERÍA SER SIEMPRE 0)
CV := #CUENTA);// VALOR DEL CONTADOR

UN #CONTANDO; // SI NO SE ESTÁ #CONTANDO
BEB ; // SE FINALIZA EL BLOQUE

L #CUENTA; // SI SE ESTÁ #CONTANDO SE INCREMENTA LA #CUENTA
L L#1;
+D ;
T #AUX_DINT;

CALL "RTM" (// SE ESCRIBE EL VALOR INCREMENTADO EN EL RTM
NR := B#16#0,// RTM Nª 0
MODE := B#16#4,// MODO 4 (ASIGNACIÓN DE VALOR)
PV := #AUX_DINT,// VALOR A ASIGNAR (#CUENTA INCREMENTADA EN 1)
RET_VAL := #ERROR,// PARA VERIFICAR SI HAY ALGÚN ERROR (NO LO USO)
CQ := #RTM_ON,// PARA VERIFICAR SI EL RTM ESTÁ EN FUNCIONAMIENTO (DEBERÍA SER SIEMPRE 0)
CV := #CUENTA);// VALOR DEL CONTADOR
BE ;
END_FUNCTION_BLOCK

Actualización: también tienes el código en este proyecto de Step7.

El contador en funcionamiento:


Como siempre, cualquier comentario será bienvenido.

2 comentarios:

  1. Muy interesante. Enhorabuena por el blog. Lo he encontrado de casualidad y la verdad es que está muy currado.

    ResponderEliminar

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