T10

Descargar como pdf
Descargar como pdf
Está en la página 1de 53
Comunicaci6n entre multiples bucles En la leceién 1, Técnicas de diseto tipicas, aprendié las dificultades de transferir datos entre multiples bucles mientras mantiene la ejecucién paralela en los bucles. Esta leccidn describe técnicas de comunicacién para transferir datos entre miltiples bucles. Estas técnicas de comunicaci6n incluyen variables, notificadores y colas, También aprenderd los problemas de programacién al utilizar estas técnicas y métodos para solucionarlos. Temas A. Variables B. Variables globales funcionales C. Condiciones de carrera D. Sincronizacién de la transferencia de datos A. Variables En LabVIEW, el orden de ejecucién de los comandos no esté determinado por el orden secuencial de los comandos sino por el flujo de datos. Por lo tanto, puede crear diagramas de bloque que tengan operaciones simulténeas. Por ejemplo, puede ejecutar dos bucles For simulténeamente y mostrar los resultados en el panel frontal, como se ve en la figura 2-1 Figura 2-1. Dos bucles For ejecuténdose simulténeamente Sin embargo, si usa cables para pasar datos entre diagramas de bloques paralelos, ya no funcionarén en paralelo. Los diagramas de bloques paralelos pueden ser dos bucles paralelos en el mismo diagrama de bloques sin dependencia de flujo de datos o dos VIs a los que se lame a la vez. Eldiagrama de bloques de la figura 2-2 no ejecuta los dos bucles en paralelo debido al cable entre los dos subVIs. Figura 2-2. Dependencia de datos que impone el cable Elcable crea una dependencia de datos, porque el segundo bucle no se inicia hasta que termine el primero y pase los datos por su tinel. Para que los dos bucles se ejecuten a la vez, retire el cable. Para pasar datos entre los subVIs, use otra técnica, como una variable. En LabVIEW, las variables son elementos del diagrama de bloques que le permiten acceder a otra ubicacién 0 almacenar datos en ella. La ubicacién real de los datos depende del tipo de variable. Las variables locales almacenan datos en los controles e indicadores de! panel frontal. Las variables globales y las variables compartidas tipo single-process almacenan datos en repositorios especiales a los que puede accederse desde varios VIs. Las variables globales funcionales almacenan datos en registros de desplazamiento del bucle While. Independientemente de dénde almacene Jos datos la variable, todas las variables permiten eludir el flujo de datos normal pasando datos de un lugar a otro sin necesidad de un cable de interconexi6n. Por este motivo, las variables resultan ttiles en arquitecturas paralelas, pero también tienen ciertos inconvenientes, como las condiciones de carrera, Uso de variables en un solo VI Las variables locales transfieren datos dentro de un solo VI. Sn LabVIEW usted lee datos de un objeto del panel frontal o escribe datos en él usando su terminal del diagrama de bloques. Sin embargo, un objeto del panel frontal s6lo tiene un terminal del diagrama de bloques, y quizé su aplicacién necesite acceder a los datos de ese terminal desde mas de una ubicacién. Las variables locales y globales pasan informacién entre ubicaciones en la aplicaci6n que no se pueden conectar con un cable. Use variables locales para acceder a objetos del panel frontal desde més de una ubicacién en un solo VI. Use variables globales para acceder y pasar datos entre varios VIs. Creaci6n de variables locales Haga clic con el botén derecho en un objeto del panel frontal 0 en un terminal del diagrama de bloques y seleccione Create»Local Variable en el mend contextual para crear una variable local. Aparecera un icono de variable local para el objeto en el diagrama de bloques, ‘También puede seleccionar una variable local en la paleta de Funciones y colocarla en el diagrama de bloques. El nodo de variable local, mostrado a la izquierda, atin no esta asociado con un control o indicador. Para asociar una variable local con un control o indicador, haga clic con el botén derecho en el nodo de la variable local y seleccione Select Item en el menti contextual. El menti contextual expandido muestra todos los objetos del panel frontal que tienen etiquetas propietarias. LabVIEW usa etiquetas propietarias para asociar variables locales con objetos del panel frontal, Por lo tanto, etiquete controles e indicadores del panel frontal con etiquetas propietarias descriptivas. Lectura y escritura de variables ‘Tras crear una variable local o global, puede leer datos desde una variable 0 escribir datos en ella. De forma predeterminada, una variable nueva recibe datos. Este tipo de variable funciona como indicador y es de escritura local © global. Cuando escribe datos nuevos en la variable local o global, el control o indicador del panel frontal asociado se actualiza con los nuevos datos, También puede configurar una variable para que acttie como una fuente de datos o de lectura local o global. Haga clic con el bot6n derecho en la variable y seleccione Change To Read en el ment contextual para configurar la variable y que actiie como un control. Cuando se ejecuta este nodo, el VI lee los datos en el control o indicador del panel frontal asociado. Para cambiar la variable de modo que reciba datos del diagrama de bloques en lugar de suministrar datos, haga clic con el bot6n derecho en la variable y seleccione Change To Write en el menti contextual. En el diagrama de bloques puede distinguir variables de lectura locales 0 globales de variables de escritura locales o globales del mismo modo que distingue controles de indicadores. Una variable de lectura local global tiene un borde grueso similar a un control. Una variable de escritura local © global tiene un borde fino similar a un indicador. Ejemplo de variable local En laseceién Paralelismo de la leccién 1, Técnicas de diseno tipicas, vio un ejemplo de un VI que usaba bucles paralelos. El panel frontal contenia un Gnico interruptor que detenta la generacién de datos mostrada en dos grdficos tipo “graph”. En el diagrama de bloques, los datos para cada grafico tipo “chart” se generan en un bucle While individual para permitir la temporizacién separada de cada bucle. El terminal Loop Control detenia ambos bucles While. En este ejemplo, los dos bucles deben compartir el interruptor para que se detengan ambos a la vez. Para que ambos grificos tipo “chart” se actualicen segtin lo esperado, los bucles While deben funcionar en paralelo. Si conecta un cable entre los bucles While para pasar los datos del interruptor, los bucles While se ejecutardn en serie en lugar de en paralelo. La figura 2-3 muestra un diagrama de bloques de este VI que usa una variable local para pasar los datos del interruptor. EI bucle 2 lee una variable local asociada con el interruptor. Cuando configura el interruptor en False en el panel frontal, el terminal del interruptor del bucle | escribe un valor False en el terminal condicional en el bucle 1. El bucle 2 lee la variable local Loop Control y escribe False en el terminal condicional del bucle 2. Asf, los bucles se ejecutan en paralelo y terminan simulténeamente cuando apaga el interruptor del panel frontal individual. = chan? Ee) Ea Figura 2-3. Variable local utilizada para detener bucles paralelos Con una variable local puede escribir o leer desde un control o indicador del panel frontal. Escribir en una variable local es similar a pasar datos a cualquier otro terminal. Sin embargo, con una variable local puede escribir en ella aunque sea un control o leer en ella aunque sea un indicador. En efecto, con una variable local puede acceder a un objeto del panel frontal tanto una entrada como una salida. Por ejemplo, si la interfaz de usuario requiere que los usuarios inicien la sesin, puede borrar las solicitudes Login y Passwora cada vez que un ‘nuevo usuario inicie la sesién, Use una variable local para leer desde los controles de cadena de caracteres Login y Password cuando un usuario inicie la sesi6n y para escribir cadenas de caracteres vacias en es controles cuando el usuario cierte la sesi6n, Uso de variables entre Vis Puede usar variables para acceder y pasar datos entre varios VIs qu ejecutan simulténeamente. Una variable local comparte datos dentro de un VI. Una variable global también comparte datos, pero entre varios VIs. Por ejemplo, suponga que tiene dos Vis ejecutdndose simulténeamente. Cada VI contiene un bucle While y escribe puntos de datos en un grifico tipo “waveform chart”. El primer VI contiene un control booleano para terminar ambos VIs. Puede usar una variable global para terminar ambos bucles con tun solo control booleano. Si ambos bucles estuvieran en un solo diagrama de bloques dentro del mismo VI, podrfa usar una variable local para terminar los bucles. También puede utilizar una variable compartida tipo mismo modo que usa una variable global. Una variable compartida es similar a una variable local o global, pero permite compartir datos en una red, Una variable compartida puede ser tipo single-process 0 publicada en red, Aunque las variables compartidas publicadas en red van més alld del mbito de este curso, con la variable compartida tipo single-process podré cambiar mas tarde a una variable compartida publicada en red. ngle-process del Use una variable global para compartir datos entre VIs en el mismo ordenador, especialmente si no usa un archivo de proyecto. Use una variable compartida tipo single-process si necesita compartir la informacién de la variable entre VIs en varios ordenadores en el futuro, Creaci6n de variables globales Use variables globales para aeceder y pasar datos entre varios Vis que se ejecutan simultineamente. Las variables globales son objetos de LabVIEW integrados. Cuando crea una variable global, LabVIEW crea automiticamente un VI global especial, que tiene panel frontal pero no diagrama de bloques. Afiada controles e indicadores al panel frontal del VI global para definir los tipos de datos de las variables globales que contiene. Este panel frontal es un contenedor desde donde varios VIs pueden acceder a datos. Por ejemplo, suponga que tiene dos VIs que se ejecutan simulténeamente, Cada VI contiene un bucle While y escribe puntos de datos en un gréfico tipo “waveform chart”. El primer VI contiene un control booleano para terminar ambos VIs. Debe usar una variable global para terminar ambos bucles con un solo control booleano. Si ambos bucles estuvieran en un solo diagrama de bloques dentro del mismo VI, podria usar una variable local para terminar los bucles. Complete estos pasos para crear una variable global 1. Seleccione una variable global, mostrada a la izquierda, en la paleta de Funciones y coléquela en el diagrama de bloques. Haga doble clic en el nodo de la variable global para ver el panel frontal del VI global. Coloque controles ¢ indicadores en este panel frontal del mismo modo que en un pane! frontal estandar. 3. LabVIEW usa etiquetas propietarias para identificar variables globales. Por lo tanto, etiquete controles ¢ indicadores del panel frontal con etiquetas propietarias descriptivas. Puede crear varios VIs globales, cada uno con un objeto del panel frontal , si desea agrupar variables similares, puede crear un VI global con varios objetos del panel frontal. Puede crear varias variables globales, cada una con un objeto del panel frontal 0 puede crear una variable global con varios objetos del panel frontal, Una variable global con varios objetos es mas eficaz, porque puede agrupar variables relacionadas. El diagrama de bloques de un VI puede incluir varios nodos de variables globales que estan asociados con coniroles ¢ indicadores de! panel frontal de una variable global. Estos nodos de variables globales son copias del primer nodo de la variable global que colocé en el diagrama de bloques del VI global o son nodos de variable global de Vis globales que colocé en el VI actual. Usted coloca VIs globales en otros Vis del mismo modo que coloca subVIs en otros Vis. Cada vez que coloca un nuevo nodo de variable global en un diagrama de bloques, LabVIEW crea un nuevo VI asociado s6lo con ese nodo de variable global y copias de él La figura 2-4 muestra la ventana del panel frontal de una variable global con un valor numérico, una cadena de caracteres y un cluster que contiene un control numérico y otro booleano. La barra de herramientas ‘no muestra los botones Run, Stop u otros relacionados como una ventana normal de un panel frontal. £5 ty Database Global vi Front Pane! [Fie GR ew Bie Gpeate Took Whoo Ee [Fema Viee ] cs ae i ‘em Number o | I Figura 2-4. Ventana del panel frontal de una variable global 4, Tras terminar de colocar objetos en el panel frontal del VI global, guardelo y vuelva al diagrama de bloques del VI original. A continuacién, debe seleccionar el objeto en el VI global al que desee acceder. Haga clic en el nodo de variable global y seleccione un objeto del panel frontal en el ment contextual. El menti contextual muestra todos los objetos del panel frontal del VI global que tienen etiquetas propietarias. También puede hacer clic con el bot6n derecho en el nodo de variable global y seleccionar un objeto del panel frontal del ment contextual Select Item. También puede usar la herramienta de operaciones y de etiquetado para hacer clic en el nodo de variable global y seleccionar el objeto del pane! frontal del mend contextual. Si desea usar esta variable global en otros Vs, seleccione la opeién Select a VI en la paleta de Funciones. Por defecto, la variable global se asocia con el primer objeto de! panel frontal con una etiqueta propietaria que colocé en el VI global. Haga clic con el botén derecho en el nodo de la variable global que colocé en el diagrama de bloques y seleccione un objeto del panel frontal en el ment contextual Select Item para asociar la variable global con los datos de otro abjeto de! panel frontal. Creaci6n de variables compartidas tipo single-process Debe utilizar un archivo de proyecto para usar una variable compartida. Para crear una variable compartida tipo single-process, haga clic con el botén derecho en My Computer en la ventana Project Explorer y seleccione New» Variable. Aparecerd el cuadro de didlogo Shared Variable Properties, como en la figura 2-5. Figura 2-5. Cuadro de didlogo Shared Variable Properties En Variable Type, seleccione Single Process. Dé a la variable un nombre y un tipo de datos. Tras crear la variable compartida, apareceré autométicamente en una nueva biblioteca de su archivo de proyecto. Guarde Ja libreria, Puede afiadir otras variables compartidas a esta biblioteca si es necesario, Puede arrastrar y soltar la variable desde el listado de la ventana Project Explorer directamente en el diagrama de bloques. Use el menti contextual para cambiar entre escritura o lectura. Use los clusters de error de la variable para imponer el flujo de datos. bles con precaucion Las variables locales y globales son conceptos avanzados de LabVIEW. Inherentemente no forman parte del modelo de ejecucién del flujo de datos de LabVIEW, Los diagramas de bloques pueden resultar dificiles de leer cuando usa variables locales y globales, por lo que debe usarlos con cuidado. Un empleo incorrecto de las variables globales y locales, como utilizarlas en lugar de un panel de conectores o para acceder a valores de cada marco de una estructura de secuencia, puede llevar a comportamientos inesperados. Si abusa de las variables locales y globales, como por ejemplo usindolas para evitar largos cables en el diagrama de bloques o para su: al flujo de datos, ralentizaré el rendimiento, Las variables en ocasiones se utilizan de forma innecesaria, El ejemplo de la figura 2-6 muestra una aplicaci6n de semaforo implementada como una maquina de estados. Cada estado actualiza las luces para la siguiente etapa de la secuencia de luces. En el estado que se muestra, el tréfico este y oeste tiene una luz verde, mientras que el trifico norte y sur tiene una roja, Esta etapa espera 4 segundos, como muestra la funcién Wait (ms). er] | Figura 2-6. Demasiadas variables utilizadas El ejemplo de fa figura 2-7 cumple la misma tarea, pero con mayor eficiencia y utilizando un mejor disefio. Observe que este ejemplo es mucho mas sencillo de leer y comprender que el anterior, principalmente al | reducirse el uso de variables. Al colocar los indicadores en el bucle While fuera de la estructura Case, los indicadores pueden actualizarse tras cada estado sin utilizar una variable. Este ejemplo es menos dificil de modificar para ampliar la funcionalidad, como afiadir sefiales de giro a la izquierda, que el ejemplo anterior. Eaoreomr zw B= | cB eel i “ Ge @ Figura 2-7. Variables reducidas Inicializaci6n de variables Para inicializar una variable local o global, compruebe que ésta contenga valores de datos conocidos antes de que se ejecute ef VI. De lo contrario, las variables podrfan contener datos que hagan que el VI funcione incorrectamente, Si la variable depende de un resultado de computacién para el valor inicial, asegtirese de que LabVIEW escriba el valor para la variable antes de que intente acceder a ésta para cualquier otra accién. Cablear la acci6n de escritura en paralelo con el resto del VI puede provocar | una condicién de carrera Para que se ejecute primero, puede aislar el cédigo que escribe el valor inicial de la variable en el primer marco de una estructura de secuencia o en un subVI y cablear el subVI para que se ejecute primero en el flujo de datos del diagrama de bloques. Si no inicializa la variable antes de que el VI lea ésta por primera vez, Ja variable contendré el valor predeterminado del objeto del panel frontal asociado, La figura 2-8 muestra un error comin al usar variables. Una variable compartida sincroniza las condiciones de parada de dos bucles. Este ejemplo funciona la primera vez. que se ejecuta, porque el valor predeterminado de un booleano es False. Sin embargo, cada vez que se ejecute este VI, el control Stop escribe un valor True en la variable, Por lo tanto, la segunda vez y las siguientes que se ejecute este VI, el bucle inferior se detendra después de tan solo una iteracién, a menos que el primer bucle actualice la variable con la suficiente rapidez Figura 2-8. Error al incilizar una variable compartida La figura 2-9 muestra el VI con c6digo aitadido para inicializar la variable compartida, Inicialice la variable antes de que empiecen los bucles para asegurarse de que el segundo bucle no se detenga inmediatamente. ep peas] igura 2-9. Inicializando correctamente una variable compartida B. Variables globales funcionales — Puede utilizar registros de desplazamiento sin inicializar en bucles For 0 While para almacenar datos, siempre que el VI esté en la memoria. El registro de desplazamiento retiene el tiltimo estado de aquél. Coloque un bucle While en un subVI y use registros de desplazamiento para almacenar datos que pueden leerse desde él o escribirse en él. Usar esta técnica es similar a usar una variable global. Este método se suele denominar variable global funcional. La ventaja de este método frente a una variable global es que puede controlar el acceso a los datos en el registro de desplazamiento. La forma general de una variable global funcional incluye un registro de desplazamiento sin inicializar con un bucle For o While de una sola iteraci6n, como en Ia figura 2-10. \z<—@) Function Global Variable Code Output os) Registro de desplazamiento sin inicializar Figura 2-10. Formato de variables globales funcionales Una variable global funcional normalmente tiene un pardmetro de entrada action que especifica qué tarea realiza el VI. El VI usa un registro de desplazamiento sin inicializar en un bucle While para retener el resultado de la operacién, La figura 2-11 muestra una variable global funcional simple con funcionalidad set y get. Figura 2-11. Variable global funcional con funcionalidad set y get En este ejemplo, los datos pasan al VI y el registro de desplazamiento almacena los datos si configura el tipo de datos enumerado en Set. Los datos se capturan desde el registro de desplazamiento si el tipo de datos enumerado se configura en Get. Aunque puede usar variables globales funcionales para implementar variables globales simples, como en el ejemplo anterior, resultan especialmente titiles para implementar estructuras de datos mas complejas, como una pila o un biifer de puesta en cola, También puede usar variables globales funcionales para proteger el acceso a recursos globales, como archivos, instrumentos y dispositivos de adquisicién de datos, que no puede representar con una variable global, BJ Nota_Una variable global funcional es un subVI que no es reentrante. Esto significa que cuando se llama al subVI desde varias ubicaciones, se utiliza la misma copia del subVI. Por lo tanto, una llamada al subV1 s6lo puede ocurrir a la vez. Uso de variables globales funcionales para la temporizacién Una aplicacién potente de las variables globales funcionales es realizar j6n en su VI. Muchos Vis que realizan medicién y automatizacién requieren alguna forma de temporizacién, A menudo un instrumento o dispositivo de hardware necesita tiempo para inicializarse. Debe crear temporizaciGn explicita en su VI para tener en cuenta el tiempo ‘0 requerido para inicializar un sistema. Usted puede crear una variable ¢global funcional que mide el tiempo transcurrido entre cada vez que se Hama al VI, como en la figura 2-12. [Flnsed Tie" Oot . f | at ozeftine in secnds I a \o a Figura 2-12. Variable global funcional Elapsed Time El caso Elapsed Time obtiene la fecha y hora actuales en segundos y lo resta del tiempo que esta almacenado en el registro de desplazamiento. El caso Reset Time inicializa la variable global funcional con un valor de tiempo conocido. El VI Elapsed Time Express implementa la misma funcionalidad que esta variable global funcional, La ventaja de usar la variable global funcional es que puede personalizar la implementaci6n fécilmente, como por ejemplo, afiadir una opcién de pausa. Ejercicio 2-1 Objetivo Escenario Disefio VI Variables Usar variables para escribir en un control y leer desde é1 Tiene un proyecto de LabVIEW que implementa una estacion meteorolégica de temperatura, La estacién meteorolégica adquiere una temperatura cada medio segundo, analiza cada temperatura para determinar sies demasiado alta o baja y alerta al usuario si hay peligro de golpe de calor © congelacién. El VI registra los datos si hay una alarma, Dos controles del panel frontal determinan los puntos de ajuste: el limite superior de temperatura y el inferior. Sin embargo, nada impide al usuario configurar un I{mite inferior que sea mayor que el Ifmite superior. Use variables para establecer el limite inferior igual que el limite superior si 1 usuario configura un limite inferior que sea mayor que el limite superior. Los VIs de este proyecto ya se han escrito, Su tinica tarea es modificar los Vis para que el Ifmite inferior se establezca igual que el limite superior cuando sea necesario. Definiciones de estados La siguiente tabla describe los estados de la maquina de estados. Estado Deseripeién Siguiente estado Adquisicion Ajustar el tiempo a cero, adquitir | Andlisis datos desde el sensor de temperatura y leer los controles del panel frontal Determinar el nivel de alarmas Registro de datos si ocurre una | alarma, comprobar el tiempo si | no hay alarmas Registro de datos Registrar los datos en un archivo | Comprobar el tiempo ASCII delimitado con tabulaciones Comprobar el tiempo | Comprobar sil tiempo es superior | Adquisicisn si ha transcurrido © igual a 0,5 segundos el tiempo, comprobar el tiempo si no ha transcurtido el tiempo El cambio del valor del control de limite de temperatura inferior debe suceder después de que el usuario haya introducido el valor pero antes de que el valor determine el nivel de alarma, Por lo tanto, realice modificaciones en el VI en el estado Adquisicién 0 Analisis 0 coloque un nuevo estado entre ambos. 1. Antes de determinar qué opcién usar, observe mejor el contenido de los estados Adquisicién y Andlis O Abrael proyecto weather station situado en el directorio \LabVIEW Basics I1\Variables. AbraWeather Station UI.vi. Revise el contenido de los estados Adquisicién y Analisis, que corresponden con los casos Acquisition y Analysis de la estructura Case. Opciones de disefio Tiene tres opciones de diseiio distintas para modificar este proyecto. Opeién Descripcién Ventajas/Inconvenientes 1 | Inserte una estructura Case | Mal disefo: el estado de enel estado Adquisicién | adquisicién tiene otra tarea para reiniciar los controles | afiadida, en lugar de centrarse antes de que una variable _ | s6lo en la adquisici6n. local escriba los valores en el cluster. 2 | Inserte un nuevo estado en | Capacidad de control cuando Ja maquina de estados que | ocurre el estado compruebe los controles y Jos reinicie si es necesatio. 3 ue el subVI Fécil de implementar porque la e Warnings para | funcionalidad ya se encuentra restablecer los controles. | parcialmente. Sin embargo, si se usa la funcionalidad actual, siempre se pierde un conjunto de datos al reiniciar el control de limite inferior. Este ejercicio implementa la Opeién 2 como solucién. Nuevas definiciones de estado para la opcién 2 La siguiente tabla describe las nuevas definiciones de estado que se implementaréin, Estado Descripcién Siguiente estado Adquisicién | Adquirir datos desde Comprobacién de rango el sensor de temperatura en el canal AIO y leer los controles del panel frontal Comprobacién | Leer los controles del panel de rango frontal y configurar el limite inferior igual que el limite superior si éste es inferior que el limite inferior Anilisis Determinar el nivel de Registro de datos alarmas, ocurre una alarma, ‘comprobar el tiempo si no hay alarmas Registro Registrar los datos en un | Comprobar el tiempo de datos archivo ASCII delimitado con tabulaciones Comprobar | Comprobar si el tiempo | Adquisicién si ha el tiempo. es superior o igual a transcurrido el tiempo, 0,5 segundos comprobar el tiempo si no ha transcurrido el tiempo Implementacién I. Siweather station. 1vproj no esti abierto atin, dbralo desde el directorio \LabVIEW Basics IT\variables. FZ Nota _ Sino tiene un dispositivo de adquisicién de datos y un Accesorio de sefales DAQ, use los archivos situados en el directorio \LabVZEW Basics I1\ No Hardware Required\variables. 2. Afada el estado Range Check a la maquina de estados. Q En la ventana Project Explorer, abra vieather Station States. ct haciendo doble clic en la lista. Este es el control enumerado con tipo definido que define los estados de la maquina de estados. Haga clic con el botén derecho en el control y seleccione Edit Items en el ment contextual, 2 Inserte un elemento y modifiquelo como en la tabla 2-1. No aftada una lista vacfa. Tabla 2-1. Control enumerado de estado Elemento Display digital Adquisicion 0 Comprobacién de rango I Anilisis a Registro de datos yt 3 | Comprobar el tiempo GQ Guarde y cierre el control O Siveather station UI.vi no esté abierto, ébralo haciendo doble clic en la lista de la ventana Project Explorer. Abra el diagrama de bloques. Haga clic con el botén derecho en la estructura Case y seleccione Add Case for Every Value en el menti contextual. Como el control enumerado tiene un nuevo valor, aparecerd un nuevo caso en la estructura Case, En Measurement & Automation Explorer (MAX), cree una escala personalizada para el sensor de temperatura del Accesorio de sefiales DAQ. La conversi6n del sensor es lineal y la frmula es Tensién x 100 = Celsius. [Direape nom nt ep [er a nfigurat Ch nysiten bata esha 2B tore andes Sa Woke seee sole 2 ap Mow + Boner sinone a cooogoogooansa oa a “jas. teal Lance MAX haciendo doble clic en el icono del escritorio 0 seleccionando Tools»Measurement & Automation Explorer en LabVIEW. Haga clic con el botén derecho en la seccién Seales y seleecione Create New en el menti contextual. Seleccione NI-DAQmx Seale. Haga clic en Next. Seleccione Linear. Llame a la escala Temperature, Haga clic en Finish, Cambie Scaling Parameters Slope a 100. Escriba Celsius como Sealed Units. Haga clic en el bot6n Save en la barra de herramientas para guardat la escala, Cierre MAX seleccionando File»Exit. 4, Lea los controles de Imite superior e inferior en el estado Range Check, en lugar del estado Acquisition. apd Ti Te as eased Figura 2-13. Estado de adquisicién completado Q Wuelva al diagrama de bloques del VI Weather Station UL Seleccione el caso Acquisition en la estructura Case de la maquina de estados. Q. Dentro del caso Acquisition, cambie el enum Next State a Range Check. _Realice una copia del enum Next State pulsando y arrastrando una copia fuera de! bucle While. GQ Mueva los controles numéricos Upper Limit y Lower Limit fuera del bucle While. Cambie el tamafo de la funcién Bundle by Name a un elemento, ‘como en la figura 2-13, Seleccione el caso Range Check en la estructura Case de la maquina de estados. _ Mueva los controles numéricos Upper Limit y Lower Limit y el enum Next State en el estado Range Check. 5. Configure el estado Range Check para que cambie al estado Analysis. Enel caso Range Check, cablee el enum Next State al tine! de salida Next State. O Cambie el enum Next State a Analysis. 6. Siel limite superior es inferior al limite inferior, use una variable local para escribir el valor del limite superior al control Lower Li fe onent ate» feanatvsis =} a | | Fa —reeratsns— a ia 5 a | am gtd tine olen pees ca ‘oO Figura 2-14. Estado Range Check completado: True b Afiada una funcién Less? al estado Range Check. rl Afiada una estructura Case a la derecha de la funcién Less?. 1 Bscriba los controles Upper Limit y Lower Limit en la funcién Less? y la estructura Case como en Ja figura 2-14. Haga clic con el botén derecho en el control Lower Limit y seleccione Create»Local Variable en el menti contextual. 1 Mueva ta variable local dentro del caso True de la estructura Case feu G Aifada una funcién Bundle By Name a la derecha de la estructura Case. Q Expanda la funcién Bundle By Name a dos elementos. Q Seleccione T Upper Limit en el primer elemento y T Lower Limit en el segundo. Q Afiada una constante False a la estructura Case externa, Q Cable el caso como en la figura 2-14. 7. Sie limite superior es igual 0 mayor que el limite inferior, pase los valores de los controles al cluster de temperatura. — [ears a a I i | = ‘ Figura 2-15. Estado Range Check completado: False Cambie al caso False de Ia estructura Case interior. O Cable los datos de Upper Limit y Lower Limit a través del caso. 8. Guarde el VI. 9, Guarde el proyecto, Prueba 1. Ejecute el V1 Q Dé un nombre al archivo de registro cuando se lo indique. Q Escriba un valor en el control Upper Limit que sea inferior al valor del control Lower Limit. ;Actia el VI como esperaba? n Detenga el VI tras terminar Cierre el VIy el proyecto. Fin del ejercicio 2-1 Ejercicio 2-2 Opcional: proyecto de datos globales Objetivo Cree un proyecto que cont variable compartida tipo \ga varios VIs que compartan datos usando una igle-process, Escenario Cree un VI que genere una onda sinusoidal. Cree otro VI que muestre la onda sinusoidal y permita al usuario modificar el tiempo entre cada adquisici6n de datos de la onda sinusoidal. Use un bot6n de parada para detener ambos VIs. Disefio Son necesarios dos Vis y dos datos globales para implementar el VI: + Primer VI: generar el seno, escribir el seno en una variable compartida Data, leer la variable compartida Stop para detener el bucle * Segundo VI: leer la variable compartida Data, mostrar en un grafico tipo “chart”, escribir el bot6n Stop en la variable compartida Stop + Primera variable compartida: Stop (tipo de datos booleano) + Segunda variable compartida: Data (tipo de datos numérico) Implementacién 1, Abra un proyecto en blanco. Guarde el proyecto como Global Data. 1vproj en el directorio ( \LabVIEW Basics TI\Global Data. 3. Cree la variable compartida Stop. Dé ala variable estas propiedades. — Name: stop — Data Type: Boolean — Variable Type: Single-process Haga clic en OK para certar el cuadro de didlogo Shared Variable Properties. Observe que se crea una nueva libreria en la ventana Project Explorer para albergar la variable 4. Guarde Ia libreria. Haga clic con el botén derecho en la libreria y seleccione Save en el menti contextual. a Q Guarde la librerfa como Global Data. 1vlib en el directorio \LabVIEW Basics IT\Global Data. Cree Ia variable compartida Data. Cambie a la ventana Project Explorer. y seleccione New» Variable en el mend contextual. @_Dé a Ja nueva variable estas propiedad — Name: Data ~ Data Type: Double ~ Variable Type: Single-process Haga clic en OK para cerrar el cuadro de didlogo Shared Variable Properties. VI Generate Data 2. Abra un VIen blanco. Guarde el VI como Generate Data. vi en el directorio \LabVIEW Basics II\Global Data. Afiada un indicador numérico a la ventana del panel frontal. Llame al indicador numérico Data, Cambie al diagrama de bloques del VI. Cree el diagrama de bloques de la figura 2-16, No se ofrecen instrucciones de implementacién. Se muestran etiquetas para ayudarle, ta 1. Figura 2-16. Diagrama de bloques de Generate Data sin variables Guarde el VI. 8. Bscriba los datos generados en la variable compartida Data. O Seleccione la variable compartida Data de la ventana Project Explorer y arristrela dentro del bucle While del diagrama de bloques del VI Generate Data Q. Haga clic con el botén derecho en la variable global y seleccione Change to Write en el menti contextual. Q Cable a salida Sin(x) de la funcién Sine a la variable compartida Data. 9. Lea la variable compartida Stop para detener el bucle While. Q Cambi a la ventana Project Explorer. O Seleccione la variable compartida Stop y arristrela al bucle While del diagrama de bloques Generate Data. vi Q Cablee la variable compartida Stop al terminal Loop Condition 10. Inicialice la variable compartida Stop. Q Cambie a la ventana Project Explorer. Seleccione la variable compartida Stop y arrdstrela ala izquierda del bucle While del diagrama de bloques Generate Data.vi Q Haga clic con el botén derecho en la variable compartida Stop y seleccione Change to Write en el ment contextual. Haga clic con el bot6n derecho en la entrada de la variable compartida Stop y seleccione Create»Constant en el menti contextual para crear una constante False. Use la herramienta de operaciones para cambiar la constante a False si es necesario. 11. Use Jos elusters de error de la variable compartida para garantizar el orden de operaciones. Consulte la figura 2-17 para obtener ayuda al cablear este diagrama de bloques. White Loop Figura 2-17. Diagrama de bloques Generate Data con variables compartidas 12, Guarde el VI 13, Cierre el diagrama de bloques, pero deje el pane! frontal abierto. VI Read Data 1. Abra un Vien blanco. Guarde el VI como Read Data. vi en el directorio C: \Exercises\ LabVIEW Basics IT\Global Data 3. Cree el panel frontal de la figura 2-18. Te aly) dechae oe ~ ors} 160 Figura 2-18, Panel frontal de lectura de datos 4. Afiada un control deslizante vertical y Ilimelo Time Delay (ms). lizante escribiendo 200 en el valor © Cambie el rango del control des superior mostrado. sor Haga clic con el botdn derecho en el control deslizante y seleccione Representation»U32 en el menti contextual. O Afada un grafico tipo “waveform chart” y Ilimelo Data Chart: Cambie tos rangos de la escala xe y y las etiquetas del grético tipo “chart” a los valores de la figura 2-18, Ajada un bot6n Stop y oculte la etiqueta. Abra el diagrama de bloques. Cree el diagrama de bloques de la figura 2-19, Se muestran etiquetas para ayudarle. Figura 2-19. Diagrama de bloques Read Data sin variables compartidas Lea los datos de Ia variable compartida Data y muéstrelos en el gréfico tipo “waveform chart” Cambie a Ja ventana Project Explorer. Q Seleccione la variable compartida Data y arrdstrela al bucle While del diagrama de bloques del VI Read Data. Q Cable la salida de Ja variable compartida Data al indicador Data Chart. .. Cablee el valor del control Stop a la variable compartida Stop. Cambie a la ventana Project Explorer. O Seleccione la variable compartida Stop y arrastrela al bucle While dentro del diagrama de bloques Read Data. vi. Prueba Haga clic con el botén derecho en la variable compartida Stop y seleccione Change to Write en el menti contextual. Cablee el control Stop a la variable compartida Stop. 9. Use los clusters de error de Ia variable compartida para garantizar el orden de operaciones. Consulte la figura 2-20 para obtener ayuda al cablear este diagrama de bloques. eayins) MaLLEHEND nse a) Figura 2-20. Diagrama de bloques Read Data con variables compartidas 10. Guarde el VI. 11. Cierre el diagrama de bloques. 12. Guarde el proyecto. 1, Ejecute el VI Generate Data. 2. Ejecute el VI Read Data, 3. Modifique el valor del control Time Delay (is). El contro! Time Delay (ms) determina la frecuencia de lectura de la variable compartida. ; Qué sucede si pone Time Delay a cero? Cuando accede a datos globales, puede leer el valor més de una vez antes de que se actualice con un nuevo valor o puede perder un nuevo valor, en funcién del valor de Time Delay. 4, Detenga y cierre los VI y el proyecto tras terminar, Reto Cree una variable global funcional para controlar los datos Stop y tisela en el VI Generate Data y VI Read Data para compartir e! botén de parada entre dos VIs. Fin del ejercicio 2-2 C. Condiciones de carrera Una condicién de carrera ocurre cuando la temporizacién de eventos o Ja programacién de tareas afecta involuntariamente a un valor de salida de datos. Las condiciones de carrera suponen un problema comin en los programas que ejecutan varias tareas en paralelo y comparten datos entre ellos. Piense en el siguiente ejemplo en las figuras 2-21 y 2-22, otacount pasa Figura 2-22. Ejemplo de condicién de carrera: bucle 2 Ambos bucles incrementan una variable compartida durante cada iteraci6n, Si ejecuta este VI, el resultado esperado tras hacer clic en el bot6n Stop es que Total Count sea igual a la suma de Count 1 y Count 2. Si ejecuta el VI durante un periodo corto de tiempo, normalmente verd el resultado esperado. Sin embargo, si ejecuta el VI durante més tiempo, Total Count es inferior a la suma de Count 1 y Count 2, porque este VI contiene una condicién de carrera, En un ordenador con un solo procesador, las acciones de un programa multitarea como este ejemplo realmente suceden secuencialmente, pero LabVIEW y el sistema operativo cambian répidamente las tareas para que ¢ ejecuten a la vez. La condicién de carrera de este ejemplo ocurre cuando el cambio de una tarea a la otra ocurre en un determinado momento. Observe que ambos bucles realizan las siguientes operaciones: + Leer la variable compartida + Incrementar el valor leido + Escribir el valor incrementado en la variable compartida {Qué sucede ahora si las operaciones del bucle se han programado en este orden’: 1. El bucle 1 lee la variable compartida. 2. El bucle 2 lee la variable compartida. 3. El bucle 1 incrementa el valor lefdo. 4, El bucle 2 incrementa el valor lefdo. 5. Elbucle | escribe el valor incrementado en la variable compartida. 6. El bucle 2 escribe el valor incrementado en la variable compartida. En este ejemplo, ambos bucles escriben el mismo valor en ta variable. El incremento del primer bucle se sobrescribe con el bucle 2. Esto genera una condici6n de carrera, que puede causar graves problemas si desea que el programa calcule un recuento exacto. En este ejemplo concreto, existen varias instrucciones entre la lectura de la variable compartida y su escritura, Por lo tanto, el VI tiene menos probabilidad de cambiar entre los bucles en el momento equivocado. Esto explica por qué este VI se ejecuta con precisién durante cortos periodos y sélo pierde varios recuentos durante periodos més largos. Las condiciones de carrera son dificiles de identificar y de depurar, porque el resultado depende del orden en que el sistema operativo ejecuta tareas programadas y la temporizacién de eventos externos. El modo en que las {areas interacitian entre sf y el sistema operativo, as{ como la temporizacién arbitraria de los eventos externos convierten este orden en esencialmente aleatorio. A menudo el c6digo con una condicién de carrera puede devolver el mismo resultado miles de veces en la prueba, pero aun asi puede devolver un resultado distinto, que puede aparecer cuando se esta usando el cédigo. Para evitar condiciones de carrera, lo mejor es seguir estas técnicas: * Control y limitacién de recursos compartidos + Identificar y proteger secciones criticas del eédigo, + Especificar el orden de ejecucién Controlar y limitar recursos compartidos Las condiciones de carrera son muy comunes cuando dos tareas tienen acceso tanto de lectura como de escritura en un recurso, como en el caso del ejemplo anterior. Un recurso es cualquier entidad compartida entre Jos procesos. Cuando se trata con condiciones de carrera, los recursos compartidos mis comunes son el almacenamiento de datos, como las variables, Otros ejemplos de recursos son archivos y referencias a recursos de hardware. Permitir que un recurso se altere desde varias ubicaciones suele introducir la posibilidad de una condici6n de carrera. Por lo tanto, una forma ideal de evitar condiciones de carrera es minimizar recursos compartidos y el nitimero de escritores en los recursos compartidos restantes. En general, no es perjudicial tener varios lectores y monitores para un recurso compartido. Sin embargo, intente usar sélo un escritor o controlador para un recurso compartido. La mayorfa de las condiciones de carrera s6lo ocurren cuando un recurso tiene varios escritores, En el ejemplo anterior, puede reducir la dependencia de recursos compartidos, si cada bucle mantiene su recuento localmente. A continuacién, comparta los recuentos finales tras hacer clic en el botn Stop. Esto supone s6lo una tinica lectura y una tinica escritura en un recurso compartido y elimina la posibilidad de una condicién de carrera. Si todos los recursos compartidos tienen s6lo un tinico escritor o controlador y el VI tiene un orden de instrucciones bien secuenciado, no habré condiciones de carrera. Proteccién de secciones criticas Una secci6n eritica de cédigo es e6digo que debe actuar con coherencia en todas las circunstancias. En los programas multitarea, una tarea puede interrumpir otra que se esté ejecutando. En casi todos los sistemas operativos modernos esto sucede constantemente. Normalmente esto no tiene efecto en el cédigo que se ejecuta, pero cuando la tarea que interrumpe altera un recurso compartido que la tarea interrumpida supone que es constante, ocurre una condicién de carrera, Las figuras 2-21 y 2-22 contienen secciones de cédigo eriticas. Si uno de los bucles interrumpe al otro bucle mientras esta ejecutando el cédigo en su seccién critica, puede ocurrir una condicién de carrera. Una forma de eliminar las condiciones de carrera es identificar y proteger las secciones, criticas del cédigo. Existen numerosas técnicas para proteger secciones criticas. Dos de las mas eficaces son las variables globales funcionales y los seméforos. Variables globales funcionales Una forma de proteger secciones criticas es colocarlas en subVIs. Puede amar s6lo a un subVI no reentrante desde una ubicacién a la vez. Por lo tanto, si coloca eddigo eritico en un subVI no reentrante, evitard que otros procesos que Haman al subVI interrumpan el eédigo. Usar la arquitectura de variables globales funcionales para proteger secciones criticas resulta especialmente eficaz, ya que los registros de desplazamiento pueden sustituir métodos de almacenamiento menos protegidos como las variables compartidas globales o de tipo single-process. Las variables globales funcionales también sirven para crear subVIs multifuncionales que controlen todas las tareas asociadas con un recurso concreto. Tras idemtificar cada secci6n de e6digo critico en su VI, agrupe las secciones por los recursos a los que acceden y cree una variable global funcional para cada recurso. Las secciones criticas que realizan distintas operaciones pueden convertirse en un comando para la variable global funcional. Puede agrupar secciones criticas que realicen la misma operacién en un comando, reutilizando el c6digo. Puede utilizar variables globales funcionales para proteger secciones criticas del cédigo de la figura 2-21 y 2-22. Para eliminar la condicién de carrera, sustituya las variables compartidas por una variable global funcional y coloque el cédigo para incrementar el contador de la variable global funcional, como en las figuras 2-23, 2-24 y 2-25. runing total | L comer a a i a Figura 2-23. Uso de variables funcionales globales para proteger la secci6n critica en el bucle 1 (= |=, Paget poy | esti i Figura 2-24. Uso de variables funcionales globales para proteger la seocién critica en el bucle 2 Figura 2-25. La variable global funcional elimina la condici6n de carrera Seméaforos Los seméforos son mecanismos de sincronizacién especfficamente disefiados para proteger recursos y secciones criticas de cédigo. Puede evitar que las secciones criticas de cédigo se interrumpan entre si encerrindolas entre un VI Acquire Semaphore y Release Semaphore. De forma predeterminada, un semaforo s6lo permite que una tarea lo adquiera simultdneamente. Por lo tanto, una vez que una de las tareas entra en una seccién critica, las otras tareas no pueden entrar en sus secciones eriticas hasta que se complete la primera tarea. Si se hace correctamente, esto elimina la posibilidad de una condicién de carrera, Puede utilizar semaforos para proteger secciones criticas de los Vis, como las secciones eriticas de las figuras 2-21 y 2-22. Un seméforo con nombre permite compartirlo entre VIs. Debe abrirel semsforo en cada VI, adquirirlo justo antes de la secci6n critica y por ditimo liberarlo tras la seccién critica. La figura 2-26 y la figura 2-27 muestran una solucién a la condicién de carrera usando seméforos. tna semmhareeloere bs Cal ifiees | OY Faas aa he ra = a ——E corsnsenatvteaeense | ese Sentra oomenatrareg 2S, (BS) Figura 2-27. Proteccién de la secci6n critica con un seméforo en el bucle 2 Especificacién del orden de ejecucién El cédigo en el que el flujo de datos no se usa correctamente para controlar el orden de ejecucién puede causar condiciones de carrera. Si no se establece una dependencia de datos, LabVIEW puede programar tareas en cualquier orden, con lo que pueden surgir condiciones de carrera si las tareas. dependen entre sf. Piense en el ejemplo de la figura 2-28. Figura 2-28. Condicién de carrera simple El cédigo de este ejemplo tiene cuatro posibles resultados, en funcién del orden en que se ejecuten las operaciones. Resultado 1: Valor = (Valor x 5) +2 1. El terminal lee el valor. E] valor x 5 se almacena en Value. La variable local lee el valor x 5. 3 4, (Valor x 5) +2 se almacena en Value. Resultado 2: Valor = (Valor + 2) x 5 1. La variable local lee el valor. 2. El valor + 2 se almacena en Value. El terminal lee el valor+2. 4, (Valor + 2) x 5 se almacena en Value. Resultado 3: Valor = Valor x 5 1. Bl terminal lee el valor. La variable local lee el valor. El valor + 2 se almacena en Value. 3, 4. El valor x 5 se almacena en Value. Resultado 4: Valor = Valor +2 1. Bl terminal lee el valor. 2. La variable local lee el valor. 3. El valor x 5 se almacena en Value. 4, El valor +2 se almacena en Value. Aunque este cédigo se considera una condicién de carrera, el eédigo normalmente actiia menos al azar que el ejemplo de la primera condicién de carrera, porque LabVIEW suele asignar un orden coherente a las operaciones. Sin embargo, debe evitar situaciones como ésta porque el orden y el comportamiento del VI puede variar. Por ejemplo, el orden puede cambiar al ejecutar el VI en condiciones distintas 0 al actualizar el VIa una versién mas nueva de LabVIEW. Afortunadamente las condiciones de carrera de este tipo se solucionan ficilmente controlando el flujo de datos. Ejercicio 2-3 Concept Objetivo Descripcion VI Bank Eliminar una condici6n de carrera en un V1. Debe identificar y solucionar un problema con el software del servidor en un banco. El servidor del banco gestiona solicitudes de varios origenes y debe procesarlas rapidamente. Para aumentar su eficacia, el servidor usa dos bucles paralelos: uno para controlar los depésitos de la cuenta y otro para controlar los reintegros. El problema con el servidor es que algunas solicitudes de ingreso o reintegro se pierden, lo que descuadra los balances. Identificar la condicién de carrera 1, Abra Bank. vi en el directorio \LabVIEW Basics II\Bank. 2. Bjecute el VI. 3. Realice un ingreso, un reintegro y una transaccién simulténea para familiarizarse con el programa. 4, Configure Deposit Amount en 20 y Withdrawal Amount en 10. 5. Abra el diagrama de bloques del VI Bank mientras se esté ejecutando, 6. Dispongael diagrama de bloques del VI Bank para poder verlo mientras trabaja en la interfaz de usuario. 7. Habilite el resaltado de ejecucién en el diagrama de bloques haciendo clic en Highlight Execution, 8. Haga clic en el bot6n Simultaneous Transactions y observe el cdigo mientras se ejecuta, El balance debe incrementarse en 10. Observe que el ingreso o el reintegro se ha perdido, lo que hace que el balance aumente en 20 0 disminuya en 10. 9, Detenga el VI. Rastreé el problema hasta la condicién de carrera en una seccién de un cédigo que controla depésitos y reintegros de una sola cuenta, Aunque puede ver el problema con el resaltado de ejecucién activado, durante el funcionamiento normal, el problema ocurtira esporddicamente, Eliminar la condici6n de carrera Elimine la condicién de carrera protegiendo Ia seccidn erftica del eédigo usando un semaforo. En el VI, las secciones criticas de cédigo son las que encierra una estructura Sequence, 1. Guarde el Vi como Bank with Semaphores.vi enel directorio \LabVIEW Basics IT\Bank. 2. Use semaforos para proteger las secciones er la figura 2-29. icas de c6digo, como en = Figura 2-29. Banco con seréforo Q Afiada un VI Obtain Semaphore Reference a la izquierda de los bucles While. Q Cable el VI Obtain Semaphore Reference como en la figura 2-29. Afiada el VI Acquire Semaphore al bucle Deposit Handler, ala izquierda de la estructura Sequence. G1 Afiada otro VI Acquire Semaphore al bucle Withdrawal Handler, ala izquierda de la estructura Sequence. © Cable el VI Acquire Semaphore como en la figura 2-29. 6g C Anada un VI Release Semaphore al buele Deposit Handler, ala derecha de la estructura Sequence Afiada otro VI Release Semaphore al bucle Withdrawal Handler, ala derecha de la estructura Sequence. Q Cablee el VI Release Semaphore como en la figura 2-29. Afiada un VI Release Semaphore Reference a la derecha de los bucles While. G Cablee el VI Release Semaphore Reference como en la figura 2-29. Observe que el VI Release Semaphore Reference s6lo requiere la referencia al seméforo. Guarde el VI. Repita los pasos detallados en la seccién Identificar la condicién de carrera para probar la modificacién de este VI Cierre el VI tras terminar. Fin del ejercicio 2-3 D. Sincronizaci6n de la transferencia de datos Variables Las variables resultan muy dtiles en LabVIEW para pasar datos entre procesos paralelos. Los notificadores y las colas son métodos para pasar datos entre procesos paralelos que tienen ventajas respecto al uso de variables por la posibilidad de sincronizar la transferencia de datos. Para que se comuniquen los bucles paralelos, debe usar una forma de datos compartidos disponibles globalmente. El uso de una variable global rompe el paradigma del flujo de datos de Lab VIEW, permite condiciones de carrera y conlleva mas esfuerzo que pasar los datos por cable. El ejemplo de la figura 2-30 es una implementacién menos efectiva de un patrén de disefio maestro/esclavo, Este ejemplo utiliza una variable, que causa dos problemas: no hay temporizacién entre el maestro y el esclavo y la variable puede provocar condiciones de carrera, El maestro no puede seffalar al esclavo que hay datos disponibles, por lo que el bucle esclavo debe seguir sondeando la variable para determinar si cambian los datos. Figura 2-30. Arquitectura maestro/esclavo usando variables globales Notificadores Una implementacién més eficaz del patrén de diseito maestro/ese notificadores para sincronizar la transferencia de datos. Un noti datos junto con una notificacién de que los datos estan disponibles. Si usa un notificador para pasar datos de! maestro al esclavo, eliminaré problemas con condiciones de carrera. El uso de notificadores también permite una buena sincronizacién, ya que el maestro y el esclavo se temporizan cuando hay datos disponibles, lo que implementa de forma elegante el patrén de disefio maestro/esclavo. La figura 2-31 muestra el patrdn de disefio maestro/esclavo usando notificadores. Cor sta (canbe ay tos) a ene Figura 2-31. Patron de disefio de maestro/esclavo usando notificadores El notificador se crea antes de que los bucles empiecen a usar la funcién Obtain Notifier. El bucle maestro usa la funcién Send Notification para notificar al bucle esclavo durante la funcién Wait on Notification. Una vez que el VI ha terminado de usar los notificadores, la funcién Release Notifier los libera. Estas son las ventajas de usar notificadores en el patrén de disefio maestro/esclavo: + Ambos bucles se sincronizan con el bucle maestro. El bucle esclavo slo se ejecuta cuando el bucle maestro envia una notificacién. + Puede usar notificadores para crear datos disponibles globalmente. A: puede enviar datos con una notificaci6n. Por ejemplo, en la figura 2-31, la funcién Send Notification envfa la cadena de caracteres instruction. + El uso de notificadores crea c6digo eficaz. No necesita sondear para determinar cudndo habré datos disponibles desde el bucle maestro. No obstante, el uso de notificadores puede tener inconvenientes. Un notificador no almacena temporalmente los datos. Si el bucle maestro envia otro dato antes de que los bucles esclavos lean el primer dato, ese dato se sobrescribird y se perderd. Colas Las colas son similares a los notificadores, salvo que aquéllas pueden almacenar varios datos. De forma predeterminada las colas funcionan con la estrategia “primero en entrar, primero en salir”, en inglés First In First Out (FIFO). Por lo tanto, el primer dato de una colaes el primero en salir de ella. Use una cola cuando desee procesar todos los datos que contenga. Use un notificador cuando desee procesar s6lo los datos actuales. Cuando se usa el patrén de diseflo productor/consumidor, las colas pasan datos y sincronizan los bucles. Hana Tang racasny na aa] reuse thease reuse wide Figura 2-32. Patron de disefio de productor/consumidor con uso de colas La cola se crea antes de que los bucles empiecen a usar la funeién Obtain Queue. El bucle productor usa la funcién Enqueue Element para aftadir datos a la cola. El bucle consumidor elimina los datos de la cola utilizando la funcién Dequeue Element. El bucle consumidor no se ejecuta hasta que haya datos en la cola, Una vez que el VI ha terminado de usar las colas, la funci6n Release Queue las libera, Cuando se libera la cola, la funciGn Dequeue Element genera un error, deteniendo efectivamente el bucle consumidor. Asi no hay por qué utilizar una variable para detener los bucles Estas son las ventajas de usar colas productor/consumidor en el patrén de disefio + Ambos bucles se sineronizan con el bucle productor. El bucle consumidor sdlo se ejecuta cuando haya datos en la cola + Puede utilizar colas para crear datos en cola disponibles globalmente, eliminando la posibilidad de pérdida de datos en la cola cuando se afiadan datos nuevos a ella. + Eluso de colas crea e6digo eficaz. No necesita sondear para determinar cuindo habré datos disponibles desde el bucle productor. Las colas también son titiles para albergar solicitudes de estado en una maquina de estados. En la implementacién de una maquina de estados que haaprendido, si se solicitan dos estados simultdneamente, puede perder uno de ellos. Una cola almacena la segunda solicitud de estado y la ejecuta cuando ha terminado la primera. Estudio de un caso: proyecto del curso El proyecto del curso adquiere datos de temperatura y de velocidad del viento y los analiza para determinar si la situaci6n requiere una alarma, Si la temperatura es demasiado alta o baja, alerta al usuario de un peligro de golpe de calor o congelacién, También controla la velocidad del viento para generar una alarma de fuerte viento en su caso. El diagrama de bloques consta de dos bucles paralelos, que se sincronizan utilizando colas. Un bucle adquiere datos para la temperatura y la velocidad del viento y el otro analiza los datos. Los bucles del diagrama funcional usan el patrén de disefio productor/consumidor y pasan los datos a través de la cola, Las colas ayudan a procesar cada lectura adquirida con el DAQ Assistant. El cédigo para adquirir la temperatura y la velocidad del viento se sitda en el bucle productor, El cédigo que contiene la maquina de estados para analizar as condiciones de temperatura-tiempo se encuentra en el caso sin error de! bucle consumidor. El cédigo que utiliza una cola es més legible y eficiente que el que usa sélo arquitectura de la maquina de estados. La funci6n Obtain Queue crea la referencia de la cola. El bucle productor usa la funcién Enqueue Element para afiadir datos obtenidos del DAQ Assistant a la cola, El bucle consumidor usa la funcién Dequeue Element para obtener los datos de la cola y suministrarlos a la maquina de estados para su andlisis. La funcién Release Quene marca el final de la cola destruyéndola. El uso de colas también elimina la necesidad de una variable compartida para detener los bucles, porque la funcién Dequeue Element detiene el bucle consumidor cuando se libera una cola. La figura 2-33 muestra el diagrama de bloques que consta de un bucle productor y consumidor. Las funciones de cola permiten la transferencia de datos y la sincronizacién entre los bucles. | —~ © [auermeareneateeandcmcccale [cits cdainet need Figura 2-33. Transferencia de datos y sincronizacién de bucles paralelos usando colas Ejercicio 2-4 VI Queues vs Local Variables Objetivo En este ejercicio, examinard un VI de patron de disefio productor/consumidor integrado que usa colas para evitar condiciones de carrera y sincronizar la transferencia de datos entre dos bucles paralelos independientes, Descripcién Complete estos pasos para ejecutar y examinar un VI de patrén de disenio productor/eonsumidor integrado que transfiera datos que genere el bucle productor para cada bucle consumidor utilizando variables y colas. 1 Abra Queues vs Local Variables. vi enel directorio \LabVIEW Basics IT\Queues versus Local variables. El panel frontal de este VI aparece en la figura 2-34. Produce oop sine BA | Producer Loop i Lop ine = 50s Sth Gob dh wh a wh ails | téoMtmmunynohorion local ales Conse Looe se ‘Local Variables Consumer Loop 104 site . +# of missed points . ° || "baa abo ab o sb co 10 eb ob scoide | UmoTmedos) Tine Sine er Prdiee T cueues Cenc oxp see WS | Goes Commer op 104 5 FoFelonertsh queue 4 i , s+ 10-4 a ; ee 8 10 20 90 40 60 6 7 eo 90 sG0i09 | LoxpTme(s) "ne Sue aProaucer ~ | sro sltse Figura 2-34. Panel frontal del Vi Queues vs Local Variables 2. Ejecute el VI. El bucle productor genera datos y los transfiere a cada bucle consumidor mediante una variable local y una cola. 3. Abra y examine el diagrama de bloques de este VI —— H || Netsp meres arcmne pareatatne EEE 88 Local Vertis cue eal ani umm connerion, i fal Freer # facie Figura 2-35. Diagrama de bloques del VI Queues vs Local Variables Creacién de una cola % La funci6n Obtain Queue, situada a la izquierda del Producer Loop, 10>} crea la cola. La constante de cadena de caracteres My Data, cableada a la entrada name (unnamed) de la funcién Obtain Queue, asigna un nombre a la cola que desea obtener 0 crear, La cconstante numérica Data Type, cableada a la entrada element data type de la funcién Obtain Queue, especifica el tipo de datos que desea que contenga la cola. Introduccion en cola de datos que genera el bucle productor Ey La funcién Enqueue Element del Producer Loop aflade cada dato que genera bean el subVI Sine Wave a la parte final de la cola. Extraccién de datos de la cola del Producer Loop dentro del Queue’s Consumer Loop = La funcién Dequeue Element del Queue’s Consumer Loop elimina un oma) elemento de la parte delantera de la cola y produce el dato en el grifico tipo “waveform graph” del bucle Queue’s Consumer Loop. La funcién Get Queue Status del Queue’s Consumer Loop indica cudntos elementos quedan en la cola, Para procesar estos datos, debe ejecutar el Queue’s Consumer Loop mas rapidamente que el Producer Loop, o seguir procesando una vez que se haya detenido el Producer Loop. Espera a que se vacie la cola El bucle While dentro de la estructura Flat Sequence espera a que se vacie Ja cola antes de detener el VI. Haga referencia a este bucle While como Queue Wait Loop. La funcién Get Queue Status del Queue Wait Loop devuelve informacién sobre el estado actual de la cola, como el némero de datos que contiene actualmente, La funcién Equal To 0? cableada a la condicién de parada del Queue Wait Loop comprueba si la cola esta vacfa. La funcién Release Queue a la derecha del Queue Wait Loop libera y borra la referencia a la cola, El Simple Error Handler a la derecha de la funci6n Release Queue informa de os errores al final de la ejecucién. Local Variable’s Consumer Loop El Producer Loop genera datos de onda sinusoidal y los escribe en una variable local, mientras que el Local Variable’s Consumer Loop lee periédicamente los datos de la onda sinusoidal desde la misma variable local. El VI Points Difference del Local Variable’s Consumer Loop produce el ndimero de puntos omitidos o el nimero de puntos duplicados leidos. Cambie al panel frontal de este VI 1. Seleccione la velocidad del tiempo del bucle del Local Variable’s Consumer Loop y observe el grafico tipo “waveform graph” del Local Variable’s Consumer Loop y los resultados generados en el indicador # of missed points. El Loop Time (ms) seleccionado debe ser Same as Producer; observe los griicos tipo “waveform graphs” del Producer Loop y del Local Variable’s Consumer Loop. Puede ocurrir una condicién de carrera a raiz de puntos omitidos o datos duplicados. @ Seleccione Maximum Speed en el mend desplegable del control Loop Time (ms) y observe el grifico tipo “waveform graph” del Local Variable’s Consumer Loop. Ocurre una condicién de carrera porque los datos se consumen més répidamente de lo que se producen, lo que hace que la variable local lea el mismo valor varias veces, Seleccione 1/2 as Producer en el mend desplegable del control Loop Time (ms) y observe el grfico tipo “waveform graph” del Local Variable’s Consumer Loop. Ocurre una condicién de carrera porque los datos se producen mas rpidamente de lo que se consumen, Los datos cambian antes de que la variable local pueda leerlos. Q Seleccione las opciones restantes del ment desplegable del control Loop Time (ms) y observe la recuperacién de los datos, Q Detenga el VI. La transferencia de datos entre dos bucles paralelos no sincronizados utilizando variables locales produce una condicién de carrera. Esto ocurre cuando el Producer Loop esté escribiendo un valor en una variable local, mientras que el Local Variable’s Consumer Loop lee peri6dicamente el valor desde la misma variable local. Como los bucles paralelos no estin incronizados, el valor puede escribirse antes de que se haya lefdo 0 viceversa, lo que produce la inanicién de datos o el exceso de datos. 2. Ejecute el VI. Seleccione la velocidad del tiempo del bucle del Queue’s Consumer Loop y observe el grifico tipo “waveform graph” del Queue’s Consumer Loop y los resultados generados en el indicador # of elements in queue. Q EI Loop Time (ms) seleccionado debe ser Same as Producer; observe el valor del indicador # of elements in queue. El valor debe permanecer en cero. Por lo tanto, con las colas no perder dati cuando los bucles productor y consumidor se estén ejecutando a la misma velocidad, © Seleccione Maximum Speed en el menti desplegable del control Loop Time (ms) y observe el valor de # of elements in queue El valor debe permanecer en cero. Por Jo tanto, con as colas no perderd datos cuando el bucle consumidor se esté ejecutando mas rapidamente que el productor. G Seleccione 1/2 as Producer en el menti desplegable del control Loop Time (ms) y observe el valor de # of elements in queue. Los puntos de datos se acumulardn en la cola. Tendré que procesar Jos elementos acumulados en Ia cola antes de llegar al tamaiio maximo de ésta para no perder datos. Seleccione las opciones restantes del menti desplegable del control Loop Time (ms) y observe la sincronizacién de la transferencia de datos entre el bucle productor y el bucle consumidor utilizando colas. Detenga el Vi. Cuando el Producer Loop y el Queue’s Consumer Loop se ejecutan a la misma velocidad, no cambiard el niimero de elementos de la cola. Cuando el Queue’s Consumer Loop se ejecuta més lentamente, la cola se rellena répidamente y el Producer Loop debe esperar a que el Queue Consumer Loop elimine los elementos. Cuando el Queue Consumer Loop se ejecuta més rpidamente, la cola se rellena lentamente y el bucle consumidor debe esperar a que el bucle productor inserte elementos. Asi, las colas sincronizan la transferencia de datos entre los dos bucles paralelos independientes y se evita la pérdida o duplicacién de datos. 3. Cierre el VI. No guarde los cambios. 2-4 Fin del ejer Autorrevisi6n: cuestionario Use variables frecuentemente a. Verdadero b. Falso {Cuil de lo siguiente no puede transferir datos? a. Semiiforos Variables globales funcionales Notificadores . Colas {Cuil de lo siguiente debe utilizarse en un proyecto? Variable local b. Variable global Variable global funcional 4. Variable compartida tipo single-process {Cual de lo siguiente no puede utilizarse para pasar datos entre varios VIs? a. Variable local b. Variable global Variable global funcional 4d. Variable compartida tipo single-process Autorrevisién: respuestas al cuestionario 1. Use variables frecuentemente en su VI. a, Verdadero b. Falso {Cudl de lo siguiente no puede transferir datos? a. Seméforos b. Variables globales funcionales Notificadores d. Colas Cul de lo siguiente debe utilizarse en un proyecto? ‘Variable local b. Variable global c. Variable global funcional 4. Variable compartida tipo single-proc 4, ;,Cual de lo siguiente no puede utilizarse para pasar datos entre varios VIs? a. Variable local b. Variable global c. Variable global funcional d. Variable compartida tipo single-process

También podría gustarte