En esta ventana primero se muestra el número del diagrama (Events Case) y, a continuación, la lista de los eventos que pueden dar lugar a la ejecución del diagrama (Event Specifiers). Para añadir o eliminar eventos se usan los botones de abajo (Add Event y Remove). Para definir un evento primero hay que especificar su fuente en Event Sources, los eventos de las secciones Application y This VI están predefinidos y son acciones típicas como cerrar la ventana, presionar una tecla, etc. La fuente de eventos Dynamic sólo está disponible cuando se activa Show Dynamic Event Terminals y se cablean convenientemente. Para más información puede consultarse el tema dedicado a programación multihilo en la sección 10.5; Panes se activa cuando el Panel Frontal se divide en varias partes, Splitters sólo se activa cuando hay uno de estos elementos en el Panel Frontal y, finalmente, Controls muestra una lista de todos los controles que hay en el VI. En Events se podrá elegir el evento concreto asociado a la fuente seleccionada.
En este ejemplo se ejecutará el diagrama únicamente cuando el control llamado Boolean cambie de valor.
Figura 2-14. Ventana de configuración de eventos.
En la parte izquierda de cada subdiagrama de la estructura EVENT se sitúa Event Data Node que aporta información sobre la fuente del evento, por ejemplo una referencia al control, su valor actual, el valor anterior al evento, etc.
Si se observa con detalle la figura 2-14 puede verse que hay eventos marcados con una flecha roja que acaban en una interrogación y otros con el mismo nombre pero con una flecha verde y sin interrogación. Los que tienen la flecha roja e interrogación se llaman filtros. Los filtros se ejecutan antes que la acción asociada al evento, pudiendo, entre otras cosas, desactivarlo. Cuando se selecciona un filter event aparecerá automáticamente un nodo en la parte derecha del diagrama llamado Event Filter Node.
El ejemplo de la figura 2-15 muestra el uso de los filter events para descartar un evento; en este caso sirve para impedir que el usuario cierre el Panel Frontal del VI.
Figura 2-15. Ejemplo de uso de filtros en un evento.
Finalmente hay que citar algunas recomendaciones que hace National Instruments sobre el uso de la estructura EVENT, como no usar un EVENT dentro de otro ni dos EVENT dentro del mismo bucle.
Si un EVENT se inserta dentro de un WHILE y éste acaba mediante un botón (un botón de stop del tipo latch when released/pressed) con un evento asociado a dicho botón, se debe insertar el botón dentro del subdiagrama asociado al cambio de valor de dicho botón. La razón es asegurarse que la evaluación de la condición del bucle se realice después de la ejecución del EVENT. En caso de que el botón de stop se conectara directamente al terminal de condición del WHILE, quedaría en paralelo con el EVENT; el problema es que el EVENT congelará su ejecución hasta que se produzca un evento (por ejemplo un cambio de valor en el botón de stop); mientras esa parte del programa está congelada se evaluaría la condición de terminar el código del evento con el valor del botón de stop en reposo, es decir, se evalúa la condición antes de presionar el botón y, por tanto, antes de ejecutar el EVENT; el efecto es que serían necesarias dos pulsaciones del botón para detenerse.
Los cambios de valor en controles de forma programada no generan eventos (en eventos registrados de forma estática), sólo se generan cuando se realiza el cambio de valor mediante la interfaz de usuario. Una excepción es cuando se escribe empleando la propiedad Value (signaling).
En esta sección se han estudiado únicamente los eventos estáticos, pero hay dos tipos más: eventos dinámicos y definidos por el usuario. Éstos se explicarán en el tema sobre programación multihilo en la sección 10.5.
2.6. TIMED LOOP y TIMED SEQUENCE
TIMED LOOP es una estructura que apareció en la versión 7.1. Su funcionamiento consiste en repetir el código de su interior con unas determinadas especificaciones de tiempo o hasta que se cumpla cierta condición, por lo que es muy usado en aplicaciones de tiempo real.
Su dibujo recuerda a un WHILE circundado por un halo azul, aunque a diferencia de éste, no es necesario establecer una condición de parada o continuación. También presenta varios nodos, que son (de izquierda a derecha):
• Input: permite configurar el funcionamiento del bucle por medio de un asistente o cableando los datos. Este nodo puede extenderse para cablear más datos de los mostrados.
• Left Data: proporciona información sobre la iteración anterior, por ejemplo el tiempo que ha tardado (Iteration Duration), si le ha dado tiempo a acabar la tarea antes de que empiece una nueva ejecución (Finished Late? [i-1]) y otras.
• Right Data: se trata de una configuración dinámica que permite modificar los parámetros de configuración de la estructura para la siguiente iteración. Los parámetros son prácticamente los mismos que en el Input Node, excepto el nombre del bucle y el origen del reloj.
• Output: al igual que el Left Data Node, el Output Node proporciona información, pero en este caso la información se genera después de que el bucle se haya detenido.
Figura 2-16. Estructura TIMED LOOP.
La configuración puede realizarse cableando los valores adecuados en el Input Node o mediante los parámetros que aparecen haciendo doble clic sobre el primer y tercer nodo.
Figura 2-17. Ventana de configuración del TIMED LOOP.
A continuación se verán algunas de las principales partes mostradas en la figura 2-17.
Loop Timing Source es la fuente de reloj. Cuando el programa se ejecute sobre un PC, la fuente será un reloj de 1 kHz del sistema operativo; si la ejecución se realiza en otros dispositivos, puede haber otras fuentes disponibles. Para seleccionar la fuente desde el programa puede usarse el VI Create Timing Source, en la paleta Programming > Structures > Timed Structures. Los otros VI de esta paleta permiten abortar programadamente un TIMED LOOP (Stop Timed Structure), sincronizarlos (Syncronize Timed Structure Starts), controlar el comienzo de cada uno (Build Timing Source Hierarchy) y crear, disparar y borrar una origen de reloj.
Figura 2-18. Estructuras temporizadas.
El periodo será el tiempo que pase entre el comienzo de dos iteraciones, y el offset el tiempo que el bucle espera antes de empezar la primera ejecución. Deadline es el tiempo máximo con que cuenta el bucle para ejecutar el código en su interior; en caso de que la ejecución lleve más tiempo se avisará con Finished Late? [i-1]. Los modos de Action on Late Iterations configuran la forma en que el bucle responde cuando la ejecución lleva más tiempo del especificado; las opciones son autoexplicativas, básicamente sirven para ‘alinear’ el comienzo de las ejecuciones y ‘saltar’ iteraciones. En sistemas multinúcleo también se puede elegir con qué procesador se ejecutará el bucle con Processor Assignment.
Para ejecutarse, cada TIMED LOOP crea su propio sistema de ejecución que contiene un único hilo (ver capítulo 10 dedicado a multihilo). La prioridad se refiere a la preferencia de ejecución entre un bucle y los demás. Los valores más altos corresponderán a TIMED LOOP con mayor prioridad. Cuando dos o más bucles vayan