Protección de referencias en LabVIEW
¿Alguna vez te has pasado horas intentando localizar un fallo sólo para descubrir que era algo sencillo? O peor: algo que no sabías que no sabías. Cuando se programa en LabVIEW, un lenguaje que satisface simultáneamente las necesidades de programadores veteranos y neófitos por igual, lo básico puede a veces perderse en la abstracción; por todas las cosas que LabVIEW oculta de usted también puede crear errores que son aparentemente inexplicables e increíblemente difíciles de rastrear. Uno de esos errores es cuando LabVIEW decide limpiar las referencias; que en la práctica es menos un error y más una característica.
LabVIEW tiene dos reglas generales cuando se trata de referencias:
- Cuando se crea una referencia, se asocia con la jerarquía VI del VI donde se encuentra la "función de creación".
- LabVIEW liberará/cerrará cualquier referencia asociada con una jerarquía VI que esté inactiva.
Esta limpieza de referencias es una especie de 'recolector de basura' donde LabVIEW busca elementos que cree que ya no se utilizan. Esto afecta generalmente a los elementos que se pasan por referencia en lugar de por valor. En la mayoría de los casos, la programación normal (no avanzada) de LabVIEW no violará ninguna de estas reglas; pero una vez que tenga que crear una jerarquía VI separada o lanzar VIs dinámicamente donde se crean referencias, el ciclo de vida de las Jerarquías VI asociadas se vuelve importante para lograr cierta funcionalidad.
Hemos incluido tres ejemplos que proporcionan situaciones en las que las referencias se pueden perder (de lo simple a lo avanzado), a continuación se proporcionan breves resúmenes, para ver estos ejemplos en acción, descargue el código fuente (LabVIEW 2015) disponible aquí: lv-reference-protect.zip
Ejemplo 01: Este ejemplo muestra un simple error que puede hacer perder una referencia. Cuando un bucle for se ejecuta cero veces, los túneles simples emitirán el valor predeterminado del tipo de datos en lugar de los datos que están cableados; el uso de un registro de desplazamiento preservará los datos si el bucle for se ejecuta cero veces.
Ejemplo 02: Este ejemplo proporciona un puñado de situaciones donde las referencias pueden volverse inválidas al lanzar un VI dinámicamente.
Ejemplo 03: Este ejemplo muestra una solución para preservar una referencia creada en otra jerarquía VI usando el método run VI y cómo mantenerla viva mientras está en uso. Este método refleja la funcionalidad del proxy caller cuando se utilizan las funciones de llamada asíncrona.