17 de octubre de 2011

Tres maneras de generar pulsos en un controlador Logix5000

Es raro que programando una máquina no sea necesaria una señal pulsante, generalmente para funciones de señalización. En controladores de Rockwell, por ejemplo del tipo SLC 500, podemos echar mano de bits de sistema que cumplen esta función. Sin embargo, en la gama de controladores Logix5000, si necesitamos un pulso deberemos generarlo nosotros. En esta entrada voy a proponer tres maneras de generar una señal pulsante de un segundo de duración: primero usando temporizadores (PULSO_TEMP), luego leyendo el tiempo del sistema (PULSO_SIS) y finalmente usando tareas periódicas (PULSO_TAREA).

El código en lógica de escalera para generar un pulso con temporizadores podría tener este aspecto:

(Pincha para ver mejor la imagen)

Uso dos temporizadores, uno para controlar el semiciclo activo del pulso y otro para el semiciclo inactivo, y a cada uno de ellos le asigno una duración de 500 ms. Esta es la opción que requiere más programación.

Otra forma de generar el pulso es leyendo el tiempo del sistema. Para ello tenemos que echar mano de la instrucción GSV (Get System Value), que sirve para leer distintos parámetros de estado del controlador. El tiempo del sistema lo obtendré en una tabla de siete DINT, así que voy a crear un tipo de dato para almacenarlo. Voy al árbol del proyecto y sobre Data Types → User Defined, con el botón derecho del ratón, pulso sobre New Data Type...


Y genero un tipo de datos que voy a llamar FECHA_HORA con siete datos de formato DINT donde se almacenarán consecutivamente el año, el mes, el día, la hora, el minuto, los segundo y los microsegundos (ojo con este último dato, son microsegundos, no milisegundos - nunca me había encontrado un PLC con semejante resolución de tiempo).


Ahora declaramos una variable con este nuevo tipo de dato (yo la he llamado T_ACTUAL) y ya podemos programar:


En el primer renglón uso la instrucción GSV para almacenar en la variable T_ACTUAL la lectura del tiempo del sistema. En el dato T_ACTUAL.Microseconds tendré un valor entre 0 y 999 999; para generar el pulso de un segundo veo si ese valor es menor de 500 000 (medio segundo), activándolo en caso afirmativo.

Las dos formas de generar intermitencias que acabamos de ver tienen un inconveniente, y es que dependemos del tiempo de ciclo del PLC para ejecutar las instrucciones, restando precisión a los pulsos. Esto no tiene importancia si vamos a usar la intermitencia para la señalización, por ejemplo, de una baliza luminosa, pero puede que precisemos pulsos lo más exactos posibles, en este caso debemos usar una tarea periódica.

Una tarea periódica se ejecuta cada cierto tiempo regular definido por el usuario y se usa para funciones que requieran una ejecución precisa o determinista. Dependiendo del tipo de PLC Logix5000 se pueden crear hasta 32 tareas periódicas (en la gama CompactLogix solo cuatro) y asignar un nivel de prioridad a cada una. Cada vez que se cumple el tiempo de la tarea periódica, se interrumpe la tarea continua, se ejecuta una vez y luego devuelve el control en el mismo punto donde se interrumpió la tarea continua.

Para crear una tarea periódica, en el árbol de proyecto, pulsamos con el botón derecho del ratón sobre Tasks y seleccionamos New Task...


Le asignamos un nombre (en mi caso PULSOS).


Vamos a la pestaña Configuration y en Period asignamos un valor de 500 ms.


Dentro de esta nueva tarea creamos un programa (GENERADOR) y dentro del programa una rutina (PULSO_TAREA). Esta rutina la asigno como rutina principal al programa:


El código de esta rutina es algo tan sencillo como el siguiente renglón:


Cada 500 ms se ejecuta la rutina y en ella invierto la señal del pulso.

En la siguiente captura de pantalla se ven los tres pulsos funcionando simultánemante:


Por si alguien tiene interés, el proyecto para RSLogix 5000 de esta entrada está disponible aquí.

Y hasta aquí esta sencilla entrada sobre programación de pulsos en Logix, si algún lector tiene algún método diferente le agradeceré que lo comparta en los comentarios.

7 comentarios:

  1. Yo los suelo generar con una combinación del primero y el segundo: un temporizador por el total del tiempo y una comparación tipo LES del valor del temporizador (.ACC) y la mitad del tiempo total (.PRE) que activa el pulso.

    ResponderEliminar
  2. Hola Anónimo, gracias por tu aporte. A primera vista parece más eficiente que usar dos temporizadores.

    ResponderEliminar
  3. Ya sabes que en cuestión de gustos... En principio, al procesador le cuesta menos un timer y una comparación que 2 timers...

    ResponderEliminar
  4. excelente explicacion gracias!!
    mi correo : oscar-7@hotmail.com o liveglying7@gmail.com tambien me apaciona la automatizacion y la robotica marc fanuc

    ResponderEliminar
  5. EXCELENTE, ME AYUDO MUCHO...SIGUE ASI

    ResponderEliminar
  6. la hora del reloj la puedo usar con un comparador y que esta si esta en 1 me active un contador y comienze a mandar pulsos a ese contador y luego cambia de hora y lo hace con otro contador, así sucesivamente?

    ResponderEliminar

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