Tutorial: Línea de botellas

Continuando con la serie de tutoriales donde hemos resuelto los distintos simuladores dentro de LogixPro, en esta ocasión revisaremos uno de los más complejos que corresponde a la línea de producción de botellas. Lo más rescatable de este simulador es que, considerando que se trata de una aplicación industrial, si logramos entender su funcionamiento y ofrecemos una solución completa, será beneficiosa para realizar soluciones a procesos industriales reales donde sí podremos encontrar un PLC, esto no significa que la soluciones anteriores no sean igual de importantes, pero, encontrar un controlador lógico fuera de un entorno industrial es complicado.


Fig. 1: Línea de botellas.

Empecemos analizando el sistema en cuestión para identificar las entradas del sistema, las posibles variables internas a utilizar y así realizar la tabla de ordenamiento de variables.

Análisis del sistema

Podemos observar que el sistema comienza en el panel de control con un sistema de arranque y paro típico, tenemos una lámpara indicadora de que el proceso está en marcha, un conjunto de displays que realizarán la cuenta de cuantos productos se han procesado y un selector de modo, el cual será utilizado al final.

Fig. 2: Panel de control.

La línea de producción inicia en la parte superior izquierda donde encontramos una serie de sensores que detectarán tres cualidades de las botellas: si está presente una, si es grande y/o si está rota. Esto es vital pues a partir de los valores leídos por estos sensores, será la forma en que se prosiga a las distintas etapas del proceso. Más adelante observamos la etapa de llenado, la cual consta de un pistón que bajará y llenará las botellas según su tamaño y si no se detectó que estuvieran rotas. 

Fig. 3: Inicio de la línea.

En caso de detectar que una botella está rota, se procederá a desecharla, triturando el vidrio y depositándolo en una caja que se moverá cuando esté llena (según lo leído por el sensor).

Fig. 4: Etapa de botella rota.

Regresando a la línea principal, una vez que la botella esté llena (independientemente de su tamaño), se procederá colocarle una tapa y finalmente encontramos con una bifurcación para separar las botellas llenas y tapadas por tamaño.

Fig. 5: Etapas de llenado, tapado y bifurcación.

Parecen ser demasiadas variables a considerar y la verdad es que sí, sin embargo, hay una instrucción que nos permitirá identificar y mantener en la memoria del controlador, los valores detectados por los sensores. Esta es "bit shift".

Bit shift o corrimiento de bits

En lo que respecta a la detección de los sensores de tipo digital, sabemos que el controlador lo entiende como un bit que puede ser 1 (uno) lógico si se presenta la condición indicada o un 0 (cero) lógico si no se presenta, estos valores cambian constantemente cuando se presenta una nueva condición y dicho valor se actualiza, sin embargo, ¿existe una forma de mantener ese valor a lo largo de las distintas etapas del proceso? En este caso contamos con las instrucción de corrimiento de bits a la izquierda "bit shift left" o a la derecha "bit shift right". En esta instrucción, el valor de un bit leído en una etapa se mantiene a lo largo de la longitud de la palabra (entiéndase por palabra un conjunto de 16 bits).

Fig. 6: Instrucción Bit Shift Left.

Podemos observar que la instrucción requiere de cuatro parámetros que son los siguientes:
  • File: Es la palabra donde se procesará la información leída por los sensores. Comúnmente se utiliza una variable de tipo B3.
  • Control: Aquí se coloca un registro que, internamente, almacenará el estatus de los bits, el tamaño de la palabra y el bit de apuntador. Aquí se usa una variable de tipo R6.
  • Bit Address: Dirección el bit que pasará la información. En este caso serán los sensores con dirección I:1.
  • Length: Total de bits que serán desplazados a lo largo de la palabra. En este caso usaremos 32, es decir, dos palabras.
Fig. 7: Corrimiento de bits.

Y entonces, ¿Cómo utilizaremos la instrucción dentro de nuestro programa? Retomando la representación de la línea principal, observamos que, desde la detección de las distintas condiciones de las botellas, existen una serie de espacios (dado que es una producción continua) que deberá de avanzar la botella detectada para estar en la posición de las distintas etapas. Veamos esto con una ilustración.

Fig. 8:  Posiciones de la botella detectada.

Observamos que existen 10 espacios desde que la botella detectada por el sensor de presencia llega a la etapa de llenado y 20 espacios hasta que llega al tapado. 10 espacios desde que se detecta una botella rota hasta que está por llegar a la compuerta de desecho y 22 espacios desde que se detecta el tamaño de la botella hasta la compuerta de bifurcación. Estos son los bits indicadores que debemos considerar para proceder con las distintas etapas dadas las condiciones detectadas por los sensores.

Tabla de ordenamiento de variables

Una vez hecha la inspección anterior, podemos proceder a ordenar nuestras variables.



En este caso, separamos las distintas variables debido a que existen muchas entradas, salidas y binarios en el sistema. Tuvimos que utilizar abreviaturas para evitar grandes cantidades de texto en cada instrucción y, además, se indican en rojo dos variables de entrada que no serán utilizadas.  

Teniendo esta información ordenada, podemos proceder con la programación.

Programación

Iniciamos el programa con una subrutina que reiniciará los valores de los Timers, contadores y enteros, esta es una buena práctica que tiene como objetivo el limpiar la memoria del controlador.

Fig. 9: Salto a subrutina de limpieza.


Regresando a la rutina principal y como es de esperarse, el sistema arranca con un enclavamiento prioritario al RESET, el cual permitirá una ejecución continua hasta que se presione el botón de paro, esto también permitirá el encendido de la lámpara indicadora, el conveyor de la bifurcación y el triturador.

Fig. 10: Arranque del sistema y condiciones del encendido del conveyor principal.

La rutina principal termina con dos saltos a subrutinas diferentes que corresponden a los modos de operación A y B, donde A separará las botellas grandes en la bifurcación, mientras que B separará las botellas chicas.

Fig. 11: Saltos a subrutinas de ejecución.

Como mencionamos anteriormente, la primera subrutina (con identificador U:3) corresponde a un "clear" de todas las variables de tipo binario utilizadas, así como la única variable de tipo entero del programa:

Fig. 12: Subrutina de limpieza.

Respecto a las rutinas de ejecución, podemos decir que son prácticamente iguales salvo por una instrucción. La primera, indicada como U:4 corresponde al modo A y comienza con las condiciones de encendido del conveyor de la línea principal, estas son: que el sistema esté encendido, que el conveyor de las botellas rotas no esté activado, que la caja de vidrio triturado no esté llena (para evitar que introduzcan más vidrios rotos cuando no hay caja), que los pitones de llenado y tapado no estén abajo (para evitar que éstos rompan la botella en dichas etapas), que el sensor de existencia no detecte una botella o que los bits indicadores de botella llena y botella tapada indiquen ese estado al final de la línea.

Fig. 13: Movimiento del conveyor de la línea principal.

Después  nos encontramos con las instrucciones de corrimiento de bits, las cuales permitirán mantener el estado leído por los sensores de la línea principal a lo largo de dos palabras (32 bits) de memoria.


Fig. 14: Corrimiento de bits.

Continuamos con las condiciones de apertura de las compuertas de las líneas secundarias, para ambas será necesario que el sistema esté activo y que no se haya detectado que la botella está llena ni tapada. La más sencilla corresponde a la bifurcación, donde bastará con que una botella detectada como grande llegue a la compuerta correspondiente para ser separada de la línea principal. Por otro lado, cuando se detecta una botella rota, será necesario que, de igual forma, llegue a la compuerta correspondiente, donde, además de ser desechada, incrementará el contador de botellas rotas. La instrucción unlatch permite limpiar el bit indicador para cerrar la compuerta. 

Fig. 15: Compuertas de líneas secundrias.


De forma análoga, los pistones de llenado y tapado requerirán condiciones específicas, comenzando porque el sistema esté siendo ejecutado y el conveyor de la línea principal no esté en movimiento. El primero de estos descenderá cuando la botella no esté llena, cuando exista una botella en posición y esta no se haya detectado como rota. Dadas las condiciones del sistema, bastará con que una botella llegue a la etapa de tapado para que ésta se active. 

Fig. 16: Activación de los pistones,.


Cuando el sensor detecta el tamaño de la botella, se detecte que el pistón de llenado bajó completamente pues la botella se encontraría en la posición respectiva, se activará cada una de las cargas correspondientes al tamaño detectado, además, un par de contadores incrementales permitirán almacenar cuántas se han procesado. 

Fig. 17: Selección de carga a vaciar.

Para la activación de los bits indicadores de botellas llenas y tapadas son necesarias las siguientes instrucción, además de un enclavamiento para mantener ese valor mientras concluye su recorrido dentro de la línea.

Fig. 18: Indicadores de llenado y tapado.

La parte más compleja de la rutina corresponde al conteo de botellas rotas procesadas. Todo comienza cuando una botella rota existe y está en la posición indicada, dependiendo de su tamaño y considerando que una botella chica es 2/3 de una grande, el valor entero de 3 será procesado cuando se detecte una botella grande rota y el valor de 2 cuando sea una botella chica. Para indicar que la caja está llena hemos establecido un valor entero de 26 que corresponde al numero de "tercios" de botella que queremos almacenar sin que esta se derrame por exceso de carga. 

Al final, para mover el conveyor de ese subproceso, será necesario que el sistema esté en ejecución, que el conveyor principal esté detenido (para evitar derrames) y que la caja esté llena o aún no esté en la posición indicada. Estas condiciones también permitirán el incremento de un contador destinado al número de cajas llenas.

Fig. 19: Subproceso de botellas rotas y cajas llenas.

Esta subrutina termina con la limpieza del entero que lleva la cuenta de la cantidad de botellas rotas procesadas, un salto a la subrutina de los multiplexores y una instrucción de retorno a la rutina principal cuando termina cada ciclo de ejecución. 

Fig. 20: Final de subrutina de modo A.

Como mencionamos anteriormente, el único cambio para diferenciar los distintos modos está en el renglón 3 de la subrutina anterior, donde bastará con cambiar a una instrucción "XIC" la correspondiente a la botella grande en la bifurcación (la última antes de la bobina de salida en el renglón principal):

Fig. 21: Cambio de modo.

Finalmente, la última subrutina corresponde enteramente a los displays del panel de control, aquí contamos con un timer on delay que estará siempre en operación contando de 0 a 4. En los peldaños siguientes, se comparará cada uno de los valores de dicha cuenta con los detectados por los contadores de las etapas de proceso, si los valores son iguales, se incrementará en 1 cada vez que sea procesado un tipo de botella o de caja. 


Podemos observar el sistema trabajando en el siguiente vídeo.


Conclusiones

Definitivamente podemos decir que éste ha sido uno de los programas más grandes y complejos que hemos desarrollado, utiliza un par de instrucciones que no habíamos revisado hasta este momento y se vale de todo lo que hemos explicado anteriormente para lograr un funcionamiento correcto. 

A pesar de lo complicado que parece, la clave está en la instrucción de corrimiento de bits pues es la que nos permite almacenar un estado en la memoria del controlador y, a partir de la posición que ocupe en el arreglo de bits, será que podemos activar (o no) las distintas etapas del proceso, esto es de vital importancia pues, al ser una aplicación casi-real, podemos transponer este conocimiento a cualquier línea de proceso en operación continua, de modo que bastará con conocer el estado de un par de bits (y su posición dentro del proceso) para llevar a cabo su puesta en marcha.

¿Tienes dudas, sugerencias o comentarios? ¿Se te ocurre cómo activar el modo C? Escríbenos en la sección de comentarios o a través de nuestras redes sociales. 

¿Te gusta nuestro contenido? Apóyanos haciendo click en los anuncios que aparecen en nuestra página o considera una donación a mediante paypal en este enlace.

Si llegaste hasta aquí, te agradezco con este enlace para descargar el programa previamente explicado. 

Como siempre, gracias por leer.

-AHN

Comentarios