0 calificaciones0% encontró este documento útil (0 votos) 183 vistas53 páginasT10
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido,
reclámalo aquí.
Formatos disponibles
Descarga como PDF o lee en línea desde Scribd
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 datosA. 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 cableElcable 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 seejecutardn 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 utilizadasEl 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 compartidaB. 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 tiempoEl 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-1Ejercicio 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-2C. 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énControlar 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 2Figura 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 simpleEl 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-3D. 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 globalesNotificadores
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 colasLa 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énEnqueue 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 colasEjercicio 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 ejerAutorrevisi6n: 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-processAutorrevisié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