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.[divider]
Contenido
El 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…[divider]
… 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 …[divider]
¿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.[divider]
¿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.[divider]
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.[divider]
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).[divider]
Referencias:
Enseño a programar PLC de Siemens a través de mis cursos.
Más información sobre mi aquí
Puedes seguirme en cualquiera de las siguientes redes sociales.
13 Comentarios
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.
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.
¿Significa esto que «PEW 0» al contrario de «EW 0» puede variar a lo largo de un mismo scan?.
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).
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?
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.
muy bien explicado todo y los comentarios despejan dudas.
Gracias Kuka!
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
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
bueno el curso para asomarse al principio de la programación, mas aun como comentas requiere de mucha dedicación para entender el funcionamiento y ser un buen programador. Saludos
Que tal como está podria decirme que significa exactamente las siglas PEW ,PAW le agradezco mucho
Son entradas y salidas de periferia respectivamente.