Procesamiento cíclico de un programa

Una de las cosas que hay veces que dejamos de lado cuando empezamos a trabajar y programar con los autómatas es no hacer mucho caso en cómo trabaja el PLC y como es el procesamiento cíclico que realiza el autómata.

Es muy sencillo, pero es conveniente tener las ideas claras desde el principio para luego, por un lado aprovecharnos de ello para poder realizar tareas y por otro, para no llevarnos sorpresas y pensar que hay comportamientos supuestamente anómalos.

Procesamiento cíclicoEl procesamiento cíclico

Una vez arrancado el programa desde cero, se ejecuta el OB100 que lo usaremos para dar valores iniciales ya que sólo se ejecuta una vez.

Puede existir o no. Si existe se ejecuta antes de entrar en  modo cíclico.

El modo cíclico funciona de la siguiente forma:

  • Se actualizan las salidas.
  • Se actualizan las entradas
  • Se ejecuta el contenido del OB1

… y vuelta a empezar.

Las salidas físicas y entradas físicas tienen asociadas sendas tablas de salidas y entradas. Cuando se actualizan, lo que hace el PLC es volcar la tabla de salidas sobre las salidas físicas y las entradas físicas se vuelcan sobre la tabla de entradas.

Ojo, porque durante la duración del programa (típicamente entre 1 y 100 ms) aunque las entradas físicas cambien de estado durante el ciclo, estos no serán tenidos en cuenta hasta el ciclo siguiente y se vuelvan a actualizar.

Esto lleva a la siguiente pregunta, si no se actualizan hasta el siguiente ciclo…

… las entradas ¿son una especie de marcas?

Pues sí, son una epecie de marcas y esto hace que si al principio del ciclo del OB1 (después de actualizar la tabla de entradas) forzamos una entrada haciendo esto: SET

= E0.0

Lo que sucederá es que la entrada estará a TRUE para la ejecución en el programa  independientemente de qué haga la entrada real. No es recomendable forzar las entradas, pero que sepas que poder, se puede.

Ahora entonces surge la siguiente pregunta …

¿Se pueden leer las entradas físicas en un momento dado?

La respuesta es Sí. Se pueden leer accediendo a la periferia mediante:

L PEB X, para leer el byte X

L PEW, para leer la palabra X.

L PED, para leer la doble palabra X.

Lo único que no se puede leer es un bit en concreto. Al menos tendremos que leer un byte completo.

Estas lecturas se suelen realizar en los OB cíclicos. Lo interesante es saber la lectura de la entrada en el momento que se ejecuta el OB. No tiene mucho sentido realizar una ejecución cíclica con entradas si luego va a depender del último estado de las entradas que dependen del tiempo de ciclo global.

¿Que hay de las salidas físicas?

Las salidas son igualmente marcas que se vuelcan actualizando las salidas físicas. Pero la actualización de estas salidas se pueden realizar antes forzandolas de forma similar a la lectura de las entradas:

T PAB 0

T PAW 0

T PAD 0

Al igual que en el caso anterior, se deben forzar la salida al menos de byte en byte.

Esta forma de dar las salidas se suelen usar también en OB cíclicos. Por ejemplo, un OB a tiempo muy pequeño en el que se lea la entrada física y se ejecuta la salida sobre las salidas físicas.

Los temporizadores

Una peculiaridad es que los temporizadores de S5 trabajan independientemente del tiempo de ciclo. Trabajan en paralelo y darán su estado instantáneamente y por tanto pueden cambiar de estado en mitad de la ejecución del OB1. Esto normalmente no es preocupante, pero hay que tenerlo en cuenta si la parte del programa donde se activa y donde se lee el estado dista mucho con tiempos de ciclo muy altos.  Normalmente no dará problemas, pero podría ya que en el mismo ciclo, el temporizador tendría a la hora de ejecutar el código dos estados diferentes.

Con los temporizadores IEC la cosa cambia ya que son temporizadores de software y no habrá problemas comentados anteriormente. Tomaran el valor cuando se ejecute el código y se chequee su estado.

Los OB cíclicos

Los OB de ejecución cíclicos (por ejemplo el OB35) se ejecutan a tiempo fijo. No dependen de la ejecución del OB1 ya que de hecho, el OB1 pausa su ejecución para ejecutar este OB. Esto hace que el tiempo de ciclo del OB1 si normalmente ya es variable dependiendo del programa, la inclusión de un OB cíclico lo hace aún más variable ya que se alargará cuando se pause para ejecutar el OB35 por ejemplo, cosa que en general, no se hará en todos los ciclos de scan del PLC (el OB35 puede estarse ejecutando cada 100ms y el OB1 ejecutánsose de media cada 20ms haciendo que 1 de cada 5 se alargue para ejecutar el OB35).

Referencias:

email

About Iñigo Gútiez

Ingeniero Industrial por la E.T.S. de Ingenieros de Bilbao. Dedicado profesionalmente desde hace 10 años como ingeniero de proyectos a la programación y automatización de instalaciones industriales en el sector del vidrio para automoción.Google

11 Responses to Procesamiento cíclico de un programa

  1. JMM 19 enero, 2013 at 12:30 am #

    Hola Íñigo:

    Un par de cosas, si las entradas son una especie de marcas ¿se podrían utilizar las que no se usen físicamente como marcas?, ¿se te ha presentado el caso de tener que echar mano de ellas alguna vez?.
    Cuando te refieres a periferia (y en los manuales también), ¿te refieres a que como la CPU no lleva conexiones de I o Q a bordo las entradas y salidas estarán el la periferia? ¿y que pasa con las que si llevan entradas y salidas integradas?. Gracias por responder, ya que no tengo muy claro el concepto de “periferia”.
    Saludos.

  2. Iñigo Gútiez 19 enero, 2013 at 12:47 am #

    Lo primero, muchas gracias por tu comentario.

    Vayamos por partes:
    Ni se te ocurra usar las entradas como marcas… sería como para matarte!!!
    Lo que significa es que si tu haces en cualquier parte del programa un

    SET
    S E0.0

    A partir de este momento, en el resto del programa, la E1.0 tendrá valor 1 independientemente del valor fisico de la entrada. En el siguiente ciclo de scan, la entrada se actualiza e imaginemos que está a cero.
    La E0.0 estárá a cero hasta que llegue el punto del programa en el que haces el Set y a partir de ahi seguirá a uno hasta el siguiente ciclo. Simplemente la puedes forzar.

    Alguna vez lo he usado pero para depurar el programa y es extrañísimo usarlo y una chapuza (con perdón). La idea es que sepáis que realmente se pueden modificar porque cuando haces una lectua de la E0.0 no haces una lectura de la entrada físicamente, sino del estado que tenía al principio del nuevo ciclo de scan.

    Cuando se habla de leer o escribir en la periferia es leer o escribir físicamente el estado de las entradas o salidas, estén donde estén integradas: en tarjetas del propio PLC, añadidas y del tipo que sean, bien digitales o analógicas.

    Si haces un
    L PEW o un L EW normalmente valdrán lo mismo, pero no necesariamente.

    En el PEW lees el estado actual e instantáneo de la palabra de entradas y cuando haces un L EW haces una lectura de cómo estaban las entradas justo antes de iniciar el ciclo actual del OB1 ¿ves la diferencia?
    Lo mismo con hacer un T AW o hacer un T PAW.
    En el primero, transferirás el valor al final del ciclo y en el segundo harás la transferencia en ese instante.

    Espero haberte solucionado la duda y no liarte más.

  3. Carlos 3 marzo, 2013 at 11:28 am #

    ¿Significa esto que “PEW 0″ al contrario de “EW 0″ puede variar a lo largo de un mismo scan?.

  4. Iñigo Gútiez 4 marzo, 2013 at 8:13 pm #

    La lectura del PEW 0 es la lectura física de la palabra 0. Imagina que tienes cableadas 16 entradas en la palabra 0. Si haces un L PEW 0 haces una lectura instantánea de ese momento, de cómo estás las 16 entradas. En cambio, hacer un L EW0 es hacer una lectura de cómo estaban cuando comenzó el ciclo de scan en curso.

    En general, no hará falta trabajar con la periferia directamente salvo para casos en los que se necesite mucha precisión de lectura (por ejemplo la lectura de un encóder).

    Por tanto, y contestando a tu pregunta, sí, el PEW puede variar durante un ciclo de scan. Piensa que en algún momento su valor va a variar, por lo que en ese ciclo de scan podrías hacer al menos dos lecturas diferentes, por ejemplo al principio del OB1 y otra si la haces al final).

  5. Carmelo 28 marzo, 2013 at 10:25 pm #

    Hola Iñigo,

    Cuando hacemos un

    L PEB X, para leer el byte X

    entiendo que refrescamos el área de memoria que contiene el byte X. Por lo que entonces en realidad hacemos dos pasos

    uno refrescar el dato en la memoria
    dos leer este dato desde la memoria

    Por tanto las siguientes consultas que hagamos en el OB serían con L EB X y trabajaríamos con un dato relativamente moderno.

    ¿Es cierto?

  6. Iñigo Gútiez 29 marzo, 2013 at 5:16 pm #

    Hola Carmelo,

    Hasta donde yo see no es como comentas, simplemente lees el contenido real de la periferia pero no se actualiza parcialmente la imagen de proceso.

    No he hecho nunca una prueba, pero se puede hacer para ver si realmente es así.

    Un saludo y gracias por comentar.

  7. Kuka 19 abril, 2013 at 5:46 pm #

    muy bien explicado todo y los comentarios despejan dudas.

  8. Iñigo Gútiez 19 abril, 2013 at 6:55 pm #

    Gracias Kuka!

  9. Miguel 14 mayo, 2013 at 11:40 am #

    Hola, me gustaría saber como obtener la velocidad en (RPM), de un encoder absoluto, con que instrucciones de una CPU 313C-2 DP SIEMENS

  10. Iñigo Gútiez 14 mayo, 2013 at 5:58 pm #

    Hola Miguel,

    Si es un encoder absoluto como comentas, tendrás la lectura directa del número de pulsos ¿no?. Con hacer las lecturas a intervalos fijos y almacenando las posiciones, luego es hacer 4 números sabiendo el tiempo entre medidas y los pulsos por vuelta del encoder.

    Un saludo

Trackbacks/Pingbacks

  1. 1. INTRODUCCIÓN A LA PROGRAMACIÓN EN STEP 7 | Programación SIEMENSProgramación SIEMENS - 4 septiembre, 2013

    […] Como ya he ido adelantando existen unos módulos que son los encargados de ejecutar los programas de usuario. En el siguiente esquema puedes ver de forma gráfica cómo es la ejecución cíclico del programa (ya visto anteriormente aquí) […]

Deja un comentario