En la siguiente imagen de la pestaña de programación vemos un grafcet o secuencia ya construída con varias etapas y transiciones. Las etapas se representan con un cuadrado y un número en el interior, aunque en AutoJava se utilizan dos números separados por un punto, el primero indica el número de secuencia y el segundo el número de etapa, por ejemplo 3.25 corresponderá a la etapa 25 de la secuencia 3. Las transiciones se representan por un trazo entre dos etapas y tienen la misión de retener el control hasta que se cumpla la condición lógica que contienen. La primera etapa de un grafcet se remarca con doble recuadro y es la única que tiene el control en el momento que arranca la aplicación. Cuando se cumpla su condición de transición pasa el control a la siguiente etapa y la etapa actual se desactiva. Una transición puede ser cierta en el momento más inesperado, pero eso no significa que se activará la etapa que siga a esa transición, a menos que la etapa anterior esté activa. Si en una aplicación se programan varias secuencias, al arrancar tendrá el control la primera etapa de cada una de ellas, es decir, cada proceso estará pendiente de la condición que se le haya impuesto para comenzar su trabajo y tendrá su propia autonomía, como si estuvieran ejecutándose varios programas a la vez.
Cada etapa y cada transición es un fragmento de programa. A estos fragmentos los denominaremos BLOQUES DE PROGRAMA. Son también bloques de programa los que aparecen en la lista desplegable de la pestaña del entorno de programación y su significado ya se ha descrito en el tema 2, apartado sobre la programación. Para comenzar una nueva secuencia pulsaremos el botón "Iniciar secuencia", que estará habilitado cuando todavía no se haya creado ninguna y cuando pasemos la última existente (botones "Anterior" y "Siguiente" para recorrer las que ya existan). Al iniciar una nueva secuencia aparecerá automáticamente la primera etapa y la primera transición, finalizado con una casilla de salto a la primera etapa. Una casilla de salto siempre se encontrará al final de un recorrido de etapas y transiciones, distinguible por su color amarillo en cuyo interior se identifica la etapa en la que continuará el control. Lo normalizado es que el final de un recorrido se una mediante una linea con la etapa en la que siga el control, pero estas lineas pueden hacer menos claro el esquema en la pantalla del ordenador porque nos obligaría a mover frecuentemente todo el esquema para encontrar donde continúan los recorridos (una indicación directa es más rápido de interpretar).
Cuando el esquema es muy grande se hace necesario moverlo con soltura para localizar fácilmente la parte deseada. Esto se consigue pulsando y arrastrando con el botón izquierdo del ratón y pulsando el botón derecho se recupera la posición original. Con la barra deslizadora de la pestaña del entorno de programación se ajusta la anchura de los comentarios y el tamaño de letra se puede cambiar escribiendo uno nuevo y pulsando ENTER. Para editar un comentario basta con pulsar dentro para activarlo, apareciendo el cursor de texto. Los comentarios admiten múltiples lineas por lo que la tecla ENTER tiene la función de crear nueva linea y no se utiliza para aceptar el contenido. Para dar por terminado un comentario bastará con pulsar fuera del comentario.
CONSTRUCCIÓN DE SECUENCIAS
En la siguiente figura se encuentra un ejemplo que corresponde a un juego para acertar números aleatorios. Se muestran las opciones que salen al pulsar con el ratón un salto, transición y etapa. Con estas opciones es muy sencillo construir cualquier estructura. Una nueva etapa se puede insertar desde un salto o desde una transición, en el primer caso se inserta antes del salto y en el segundo después de la transición. Los caminos que comienzan en las transiciones (2) y (3) se han creado con la opción "Abrir camino alternativo", partiendo de la transición (1).
A la vista de la secuencia, es claro que cuando se pulsa ENTER y a la vez el número coincide con el generado por el programa, se cumple la transición (3) y el control pasa a la etapa 20, donde se confirma al usuario. Al soltar la tecla ENTER se cumple la transición (6) y pasa el control de nuevo a la etapa 0. El siguiente paso será programar cada etapa y transición de la secuencia, lo que veremos más adelante. De momento, sin haber programado nada, ya estaría esbozado el esqueleto del programa y creada la lógica de saltos.
Las opciones para editar etapa y transición abren la ventana de edición. Esta ventana es la misma para etapas, transiciones y bloques de ejecución única, permanente y subrutinas, lo que también se explica en el tema 2, apartado sobre la programación.. La opción para activar etapa obliga a que se ejecute dicha etapa manualmente, aunque no la corresponda según la lógica de la secuencia. Si la etapa que se activa es la 0, todas las demás etapas se desactivan (la que lo esté). La utilidad puede ser la de llevar al programa a unas condiciones determinadas después de un error por el que haga algo no esperado.
La opción "Como bucle..." que aparece al pulsar una etapa, permite definir si dicha etapa funcionará como un bucle. En caso afirmativo, cuando a la etapa la llega el control no lo abandonará hasta que su transición se haga verdadera, es decir, se repetirá su código una y otra vez sin actualizarse la pantalla y sin ejecutar ninguna otra etapa de la misma o de otra secuencia. Un bucle tiene sentido cuando algo tenga que repetirse un número determinado de veces y de forma inmediata, como pueda ser el cálculo de muchos puntos para una gráfica o almacenar datos en una lista uno tras otro. Si la etapa no es un bucle, estas tareas pueden hacerse igualmente pero más lento, ya que entonces cada repetición consume un ciclo de programa completo, mientras que como bucle se ejecutan todas las repeticiones en un solo ciclo. El botón "Nº rep." permitirá definir el número máximo de repeticiones a partir del cual se considera que ha entrado en un lazo infinito (no cedería nunca el control y con un poco de mala suerte solo saldríamos apagando el ordenador). Si es previsible, por ejemplo, que no pasen de 50 repeticiones, se puede establecer un valor de 100 (por ejemplo). Si al ejecutarse un bucle se supera el número de repeticiones establecido como límite, la aplicación es detenida y se informa sobre la existencia de un posible bucle sin fin, evitando el bloqueo del ordenador. Si el problema se debe a que se ha establecido un valor pequeño como número máximo de repeticiones, se resolverá haciéndolo más grande, en caso contrario tendremos realmente una transición que nunca se cumple y habrá que buscar el problema.
El siguiente ejemplo muestra una secuencia que dibuja una espiral de 72 puntos (en la posición del ratón) cada vez que se pulse el ratón. En la etapa 0.1 es donde se calculan las coordenadas del punto que corresponda a un ángulo igual a la variable 0. Puesto que la etapa 0.1 es un bucle (se distingue por su color), el cálculo del punto se repite una y otra vez hasta que se cumpla la transición, lo que ocurrirá cuando el ángulo complete dos vueltas (720º). Nótese que el ángulo se incrementa en la etapa 0.1, de no haber sido así no pasaría nunca los 720º y permanecería bloqueado en la etapa 0.1 hasta llegar al número máximo de repeticiones establecido, la aplicación sería detenida y se informaría del problema. Si la etapa 0.1 no fuera un bucle, la espiral se dibujaría igualmente pero no de forma instantánea sino a la velocidad que se hubiera programado la ejecución de ciclos de programa, añadiéndose un punto más a la gráfica en cada ciclo ejecutado.
Es importante tener en cuenta que la única forma de salir de un bucle es mediante su transición, cuya condición lógica debe hacerse verdadera en el bloque de programa del bucle, porque el sistema se dedica en esos momentos solamente a la ejecución del bucle, sin poder comprobar ninguna circunstancia ajena al bucle como pudiera ser la pulsación de una tecla o el ratón. Por ejemplo, si se programa la terminación de un bucle con la condición de pulsar el ratón, entonces entraría en un lazo sin fin porque el sistema sigue entendiendo que el ratón no está pulsado, ya que no lo comprobará por dedicarse únicamente a la ejecución del bucle. En el ejemplo anterior se garantiza que la transición se acabará cumpliendo porque en la etapa bucle se incrementa la variable 0 de 10 en 10. En 72 repeticiones habrá superado el valor 720, la transición se cumplirá y la etapa bucle dejará de tener el control.
A continuación puede verse el contenido de los bloques de programa de cada etapa y transición en el ejemplo anterior. El bloque OR de la primera transición transmite estado verdadero cuando sea verdadero el estado que recibe en cualquiera de sus entradas, es decir, cuando se pulse el botón izquierdo del ratón o cuando se pulse el botón derecho. Para representar la espiral se ha utilizado una linea abierta con 72 puntos (linea_abierta01 concretamente) y como las coordenadas que se calculan corresponderán a un punto de dicha linea abierta, es necesario determinar qué punto será modificado. Como el ángulo (variable 0) se incrementará de 10 en 10, el número de punto será igual a la variable 0 dividido entre 10 (esto es la primera asignación de la etapa 0.1). El bloque PTO transmite un punto cuya coordenada X será el valor que recibe en su primera entrada y la coordenada Y el valor que recibe en la segunda entrada. Por lo tanto, se ha conectado en sus entradas el equivalente a las ecuaciones que se indican como comentario de la etapa. Seguidamente se cambia incondicionalmente el punto seleccionado por el nuevo punto que se ha calculado, lo que se consigue con un estado lógico "verdadero". Por último, se suma 10 grados a la variable 0 como se indica en el comentario de la etapa 0.1. En la etapa 0.2 no se ha programado nada, es solo una etapa en espera de que se suelte el ratón. Si se permitiera volver a la etapa 0 con el ratón pulsado, la primera transición se cumpliría y volvería a calcularse la espiral, dando como resultado una espiral que seguiría al ratón mientras se mantuviera pulsado. La última transición solo se distingue de la primera en el bloque INV (inversor), que invierte el estado lógico, por lo tanto, si la primera transición es cierta cuando se pulsa el ratón, la última transición será cierta cuando NO se pulsa el ratón.
Por último, la opción "Abrir camino simultáneo" inicia otro camino paralelo que se ejecutará a la vez, es decir, no consiste en una selección del camino sino de varios que ejecutarán tareas simultáneas. En la siguiente figura vemos un ejemplo: Una vez creadas las etapas 0, 1 y 2, se pulsa en la transición (1) y luego en "Abrir camino simultáneo". Aparecerá un cuadro pidiendo el número para la primera etapa del nuevo camino (en el ejemplo se habría introducido 20) y luego el número de etapa después de la que se cerrarán (en el ejemplo después de la etapa 2). La etapa 21 se ha insertado posteriormente desde la transición (4).
Según la secuencia anterior, los caminos que pasan por las etapas 1-2 y 20-21 se ejecutan a la vez pero no de forma sincronizada sino al ritmo de la tarea que desarrollen. En caminos simultáneos, el recorrido que finalice en primer lugar es obligado a esperar hasta que finalicen todos los caminos simultáneos. Por ejemplo, si el 1-2 termina primero, se mantiene activa la etapa 2 hasta que también esté activa la etapa 21. En esas condiciones, todavía es necesario que sean verdaderas a la vez las transiciones 3 y 5 para avanzar y saltar a la etapa 0.
PARTICULARIDADES DEL GRAFCET EN AUTOJAVA
En la norma que rige el uso e interpretación del Grafcet no aparece el concepto de etapas que funcionen como un bucle, es por lo tanto una modificicación válida solo en este programa. En AutoJava, los bucles solo pueden programarse dentro de una secuencia, no existen instrucciones concretas para programar bucles. Por esta razón, siempre que necesitemos un bucle será necesario hacerlo en una secuencia.
En la norma del Grafcet, las acciones de las etapas son ejecuciones de tipo lógico como arrancar o parar un motor, encender o apagar una lámpara. En AutoJava también es posible programar cualquier instrucción válida como las operaciones matemáticas, tratamiento de cadenas de texto o control de elementos y componentes propios de AutoJava.
En la norma del Grafcet existen dos formas de ejecutar acciones en las etapas: Con memoria y sin memoria. En el ejemplo de la siguiente imagen vemos este concepto aplicado al encendido y apagado de una luz roja que debe estar encendida en las etapas 1 y 2 y apagada en las demás etapas. En la versión "sin memoria" es necesario mantener la luz en la etapa 2 porque sinó se apagaría. En la versión "con memoria", la luz se mantiene encendida en la etapa 2 pero es necesario apagarla expresamente en la etapa 3 (el 1 y el 0 es una forma de expresar conexión y desconexión respectivamente). En AutoJava todo funciona con memoria, de forma que el estado verdadero que se asigna en la etapa 1 se mantiene en la etapa 2 y es necesario asignar falso en la etapa 3 para que la luz se apague. La información que se asigne a datos numéricos, cadenas de texto o puntos tendrá la misma consideración: Se mantiene hasta que sea modificado expresamente en otra etapa.