PESTAÑA DEL ENTORNO DE PROGRAMACIÓN.

Excepto en pequeñas aplicaciones, es importante que todo programa tenga una estructura clara y eficiente, dividido en pequeños fragmentos con una función específica. Si se diseña de esta forma, el programa definitivo se monta a base de una serie de condiciones generales y llamadas a los fragmentos especializados en tareas concretas. Estos "fragmentos" de programa los denominaremos "BLOQUES DE PROGRAMA". La función de alguno de estos bloques ya es conocida por el tema de introducción, en el ejemplo del Grafcet (el mismo que aparece en la siguiente imagen). Cada etapa es un bloque de programa que se ejecuta solo si la etapa se encuentra activa y deja de ejecutarse cuando se cumple la transición que sigue a la etapa porque pasa el control a la siguiente. Cada transición o condición lógica que pasa el control a la siguiente etapa, es también un bloque de programa, aunque su contenido sea solamente una condición lógica muy simple, como por ejemplo, comprobar si se pulsa un determinado botón. En ocasiones, un bloque de etapa puede estar incluso vacío de contenido, como pudiera ser el caso de esperar sin hacer nada hasta que se verifique una condición.

Cuando se pulsa sobre una etapa o una transición se muestra una lista de opciones que permiten construir el Grafcet, así como editar dicha etapa o transición. Un Grafcet se suele denominar habitualmente como "secuencia", de ahí el texto del botón que permite comenzar un nuevo Grafcet: "Iniciar secuencia". Con los botones "Siguiente" y "Anterior" se irá pasando de una a otra secuencia y si se pasa la última existente se habilita el botón "Iniciar secuencia" para poder crear una nueva. Cuando se pulsa sobre un texto (a la derecha de cada etapa y transición) se activa el modo de escritura para poder editar el comentario. La tecla ENTER no se utiliza para aceptar el texto sino para introducir nueva linea, el modo de escritura finaliza simplemente con pulsar fuera de la zona de texto. El tamaño de letra es por defecto 10 y se cambia escribiendo un nuevo valor y pulsando ENTER. El botón "Nº rep" permite definir un número de repeticiones, de momento nos bastará con saber que es un recurso que impide el bloqueo del ordenador cuando programemos incorrectamente un bucle, que consiste en la repetición de un fragmento de programa hasta que se cumpla una condición que pone fin a la repetición. Si por error al programar no se cumple nunca esa condición, resultará un bucle sin fin que no cederá el control y el ordenador queda frecuentemente bloqueado en esos casos. El botón "Nº rep" sirve para definir un número máximo de repeticiones y cuando sea alcanzado en un bucle se detiene la aplicación y se informa sobre la posible existencia de un bucle sin fin.

Otros tipos de bloques, pensados para ser dedicados a tareas concretas, son los que se ejecutan por llamada desde cualquier otro bloque de programa. En la lista desplegable de la pestaña de programación podemos seleccionar la opción "Bloque de ejecución por llamada" y pulsar el botón "Editar" para crear el nuevo bloque y proceder a su programación. Estos tipos de bloques suelen recibir el nombre de "subrutinas" y así se nombran también en AutoJava, con un número añadido para distinguir cada una de las demás, por ejemplo, la primera subrutina tendrá el nombre "subrutina00", la siguiente "subrutina01" y así sucesivamente. Cuando se crea una nueva subrutina se añade su nombre en la lista de bloques de programa y así poder editarla en cualquier otro momento, o borrarla con el botón "Borrar", el cual solo se habilita cuando el bloque seleccionado sea una subrutina. Una subrutina siempre se ejecutará dependiendo de una condición lógica (programada en cualquier bloque): Si dicha condición resulta ser verdadera, la subrutina se ejecuta, pero si resulta falsa continuará el programa como si la subrutina no existiera.

En la mayoría de los programas existirán datos, variables o características que solo necesitan ser difinidos una vez (este pudiera ser el caso del tamaño del panel sobre el que presentar los contenidos de la aplicación). Se comprenderá entonces que el código que defina estas características no tiene la necesidad de ser ejecutado repetidamente. Con este fin existe el bloque de ejecución única, de forma que todo lo que en él se programe se ejecutará una sola vez en el momento que arranca la aplicación.

Al contrario, pueden existir características que deban estar actualizadas en todo momento, o condiciones que deban ser comprobadas continuamente. Un ejemplo sería el caso de querer abandonar una actividad en el momento que lo decida el usuario, sin tener que esperar hasta que la actividad finalice. Otro caso sería la presentación de información que se modifica con mucha frecuencia, lo que hace necesario actualizar los datos que se presentan de forma ininterrumpida. Para esto existe el bloque de ejecución permanente, el incansable de AutoJava porque nunca cesa su actividad. A menos que la aplicación sea muy pequeña, no será recomendable intentar programar todo el código en este bloque, porque todo lo que no precise una atención permanente debería ser ejecutado, preferiblemente, solo en los momentos que se necesite, para lo cuál serían propias las subrutinas o el Grafcet.

VENTANA DE EDICIÓN DE BLOQUES DE PROGRAMA.

Cada vez que se edita un bloque de programa aparece una ventana como la que se ve a continuación (corresponde en este caso al bloque de ejecución permanente, lo que se indica en el título de la ventana). Es aquí donde realmente se programa y como puede verse en la zona inferior de la ventana, se trata de una programación gráfica que se basa en lo que llamaremos "ASIGNACIONES". En esencia no es diferente a cualquier otro tipo de programación, pero aquí cada concepto tiene su propia representación gráfica y se inserta seleccionando con el ratón y pulsando de nuevo en el lugar en que se quiera colocar. Para borrar se pulsará con el ratón para seleccionar y a continuación se pulsa la tecla DEL. La franja de color naranja, a la derecha de la retícula es sensible al ratón: Pulsando con el botón izquierdo se inserta nueva fila en la posición pulsada y pulsando con el botón derecho elimina la fila (si está vacía).

Definiremos como ASIGNACIÓN a la consulta de una o varias informaciones (datos de consulta de la lista superior izquierda) que se relacionan según unas reglas determinadas (definidas con bloques) y se genera otra información resultante que se "asigna" a un dato de control (datos de la lista superior derecha). Los datos a consultar se colocan en la zona izquierda, las reglas que se apliquen para relacionar los datos se configuran con bloques que se colocan en las celdillas de la zona de bloques y la información resultante, que fluye por la linea de salida del bloque final, se asigna a un dato de control que se coloca en la zona derecha o zona de control.

En los siguientes ejemplos veremos algunas equivalencias entre nuestro lenguaje cotidiano y el sistema de programación por asignaciones. La asignación más sencilla posible no utiliza bloques, como sucede en el último ejemplo donde se define el nombre de un programa por asignación directa de un texto. Los bloques toman las informaciones que reciben por la izquierda (sus entradas), las relacionan y generan un resultado que transmiten por su salida, así el bloque sumador del primer ejemplo toma un valor constante (45) y otro variable, los suma y transmite el valor de la suma a la variable 2. Relaciones más complejas se consiguen interconectando tantos bloques como sea necesario, así en el tercer ejemplo se hace una división y se comprueba si su resultado es igual a 25. El bloque final transmite verdadero o falso y la subrutina seleccionada se ejecutará solo si recibe verdadero. Las lineas de conexiones se dibujan automáticamente, siempre con tendencia hacia la derecha y abajo, de modo que solo es necesario colocar cada bloque en la posición correcta y si nos equivocamos, le borraremos y le insertaremos de nuevo.

Existen 63 tipos de bloques que se encuentran debajo de las listas de datos de consulta y datos de control. Cuando se pasa el ratón sobre uno cualquiera se muestra inmediatamente la función que desempeña, aunque muchos de ellos tienen un símbolo claro, como sucede con los operadores matemáticos (suma, resta, etc.).

Las listas de datos y de control son algo así como un menú que permite recorrer todas las informaciones fijas y todas las informaciones de consulta y de control de cada componente y cada elemento existente. Cuando se crea un componente o un elemento nuevo (o cuando se abre un componente), todas las informaciones que le sean propias se añaden automáticamente a las listas. Las opciones que aparecen en mayúsculas abren nuevas opciones, mientras que las que aparecen en minúsculas son informaciones que se pueden insertar directamente en el programa (a la izquierda los datos de consulta y a la derecha los datos de control). Cuando la información es de un elemento de un componente, llevará incluído el nombre del componente y el nombre del elemento, separados por un punto. Por ejemplo:

(bool) forzar dibujado de nenes00.texto_leno00

se refiere al elemento texto_lleno00 del componente nenes00 y se trata de un dato de control que mostrará el elemento en pantalla solamente si recibe un estado lógico verdadero, debido a la indicación (bool) que le precede.

LOS TIPOS DE INFORMACIÓN.

El color de las entradas y la salida de cada bloque se corresponde con el tipo de información que espera recibir y el tipo de información que transmite. El verde expresa valor numérico, el negro un estado lógico (verdadero o falso), el morado una cadena de texto y el rojo un punto (el punto contiene dos coordenadas que definen una posición concreta respecto del origen).

Los datos de consulta y los datos de control indican entre paréntesis el tipo de información que contienen o el tipo de información que esperan recibir, por ejemplo, no es lo mismo (número) 57 que (texto) 57. (bool) expresa un estado lógico que será verdadero o falso, esta identificación procede de un antiguo matemático y filósofo llamado George Boole. Las identificaciones (número), (texto) y (punto) ya son tan claras que no necesitan más explicación.

TIENE SENTIDO PONER UN DATO BOOL DONDE SE ESPERA UN DATO NUMÉRICO Y VICEVERSA. Esto se debe a que AutoJava considera equivalente un estado lógico falso y el valor numérico 0. También será equivalente un estado lógico verdadero y el valor numérico 1. Por ejemplo, en la primera asignación que vemos en la siguiente imagen, el componente "lampara00" se dibujará en el paso 0 si no se pulsa el botón izquierdo del ratón (por resultar falsa la consulta) y se dibujará en el paso 1 cuando se pulse el botón izquierdo del ratón (por resultar verdadera la consulta). Suponiendo que "lampara00" contiene una lámpara apagada en el paso 0 y encendida en el paso 1, el resultado equivale a encender la lámpara cuando se pulsa el ratón (este sencillo concepto permite representar y controlar cualquier cosa que solo pueda tener dos estados, como es el caso de una lámpara: apagada o encendida). En la segunda asignación vemos que se multiplica un dato bool por otro numérico: Si no se pulsa el ratón resulta un estado falso o valor 0 y el producto es 0, pero si se pulsa el botón izquierdo del ratón resulta un estado verdadero o valor 1 y el producto será 5.

Cuando un dato numérico se asigna a un dato bool, es tratado como verdadero si el valor numérico es distinto de 0 y es tratado como falso si el valor numérico es 0. Con las cadenas de texto sucede algo similar: Puede ser tratado como verdadero si la cadena contiene algún caracter y falso si está vacía.

En AutoJava no se distingue entre valores numéricos enteros y reales, todos son tratados como datos de tipo "número". Así, el valor 49 se interpreta automáticamente como entero, pero 49.0 se interpreta como real. Si en una operación interviene un valor entero y otro real, el entero es convertido a real automáticamente y el resultado será real. Igualmente, cuando se espera un valor entero pero se recibe un valor real, dicho valor se convierte a entero automáticamente haciendo desaparecer sus decimales. En las conversiones a entero no se ha previsto un redondeado al entero más próximo porque basta con sumar 0.5 al valor real que será convertido. Por ejemplo el entero más próximo a 49.35 es 49 (49.35 + 0.5 = 49.85 que al quitar los decimales da 49). Al contrario, el entero más próximo a 49.62 es 50 (49.62 + 0.5 = 50.12 que al quitar los decimales da 50).

Si conoce el sistema de numeración binario, puede que le interese saber cuántos bits utiliza un valor numérico. En AutoJava, los enteros utilizan siempre 32 bits y los reales 64 bits. No se ha previsto ningún otro tamaño para los datos numéricos.

Al crear algún mensaje como información al usuario, es típico que el texto se forme combinando texto y valores numéricos que pueden ser variables. Por ejemplo, en un test se podría informar con "Ha acertado 23 preguntas de 25", donde el valor 23 es variable porque el número de aciertos también lo es. Cuando se combina un dato de texto con otro numérico, el número se convierte a texto sin más. Para encadenar textos y números existe un tipo de bloque que hace esta tarea exactamente. En general, donde se espera un dato de texto pero se recibe número, estado lógico o punto, es convertido a texto automáticamente. Por ejemplo, un estado lógico se convierte a "verdadero" o "falso", dependiendo del estado. Si el dato es numérico, se convierte a texto con los mismos caracteres que formen el número y si es dato de punto, resultará un texto formado por las dos coordenadas separadas por una coma.

Un último tipo de dato es el "punto", compuesto por dos coordenadas que definen un punto en la pantalla. Para definir manualmente un punto se escribe simplemente las dos coordenadas separadas por una coma, por ejemplo 43,-67 o 23.54,-65.798 etc. El primer valor es la coordenada X y el segundo la coordenada Y. Si el contenido que se muestre no se desplaza, el origen de coordenadas estará en la esquina superior izquierda de la ventana, es decir, LA COORDENADA X AUMENTA A LA DERECHA Y LA COORDENADA Y AUMENTA HACIA ABAJO.

Aquí finaliza la revisión de AutoJava, más bien extensa pero necesaria para hacerse una idea general sobre las posibilidades y la forma de trabajo. El resto de los temas profundizarán en campos más reducidos, con ejemplos para practicar directamente, pues se supone que las bases ya estarán asimiladas.

LOS CICLOS DE PROGRAMA.

Cuando una aplicación esté ejecutándose no significa necesariamente que su programa se ejecute, ya que se puede encontrar inactiva. Sin embargo, siempre reaccionará ante la pulsación de teclas o el ratón porque son las vías de comunicación con el usuario y éste puede estar pidiendo algo a la aplicación. Cuando se pulsa una tecla o el ratón, el programa se ejecuta una vez para satisfacer una posible demanda y vuelve a la inactividad a menos que en el programa se haya establecido lo contrario. Esto es suficiente para aplicaciones sin una actividad que deba correr por sí sola (como pudiera ser una animación). En una animación es necesario que el programa se ejecute a intervalos regulares de tiempo para asegurar que todo se actualiza y simule movimiento.

Para cumplir la exigencia que impone toda actividad que funcione sola (como una animación), existe una opción de control que permite ejecutar el programa con la frecuencia deseada, sin intervención del usuario. Esta opción se designa como "(número) ciclos por segundo" y se encuentra en la lista de opciones de control pulsando en "CONTROL DE LA APLICACIÓN" (vease en el tema 7: Control de contenidos). Su significado es, naturalmente, el número de veces que el programa deberá ejecutarse por segundo. El valor que asignemos a esta opción de control podrá ser constante o variable: Si es variable, la velocidad irá aumentando o disminuyendo según el valor que vaya teniendo la variable en cada momento y si es constante, siempre se ejecutará a igual velocidad. Si el valor asignado es cero, entonces la actividad se detiene y solo reaccionará de nuevo pulsando una tecla o el ratón.

Si el programa se crea en una secuencia y se encuentra un número de ciclos constante en una etapa, proseguirá con esa velocidad constante a medida que recorre las siguientes etapas, hasta que encuentre de nuevo otro número de ciclos diferente. Por ejemplo, en la etapa 0 pudiéramos programar 0 ciclos por segundo y la actividad estaría detenida. Si pasamos la etapa 0 con la pulsación de un botón (por ejemplo) y en la etapa 1 hemos programado 10 ciclos por segundo, entonces el resultado sería inactividad hasta pulsar el botón, en cuyo momento comenzaría a repetir cíclicamente la ejecución.

También hay que tener en cuenta que si hay varias aplicaciones funcionando, solo una tendrá el control del teclado. Esto lo vemos cuando hay varios programas abiertos, cada uno en su propia ventana, y solo uno tiene interacción con el usuario (el que tenga su ventana resaltada) mientras que los demás no reaccionan hasta que se los active con el ratón mediante una pulsación. En páginas web sucede lo mismo, es necesario pulsar dentro de la zona de la aplicación para que asuma el control del teclado, ya que hasta ese momento lo tendrá el documento.

Volver a las opciones de edición.

Volver a las opciones de archivo.