Introduzione
In LabVIEW, la funzione First Call? è un elemento spesso sottovalutato ma fondamentale per garantire un’inizializzazione sicura e controllata all’interno dei VIs. Questa funzione restituisce TRUE solo alla prima esecuzione del VI nel contesto in cui è caricato, permettendo di distinguere il primo ciclo di un algoritmo dai successivi. È particolarmente utile nelle Functional Global Variables (FGVs) e nei meccanismi di sincronizzazione avanzata.
Cos’è “First Call?”
La funzione First Call?, situata nella palette Programming > Synchronization, restituisce TRUE solo la prima volta che il VI viene eseguito dopo l’avvio del chiamante di livello superiore, come quando si clicca sul pulsante Run o si utilizza il metodo Run VI. Se un secondo chiamante di livello superiore chiama il VI mentre il primo è ancora in esecuzione, First Call? non restituirà nuovamente TRUE.
Dopo che tutti i chiamanti di livello superiore diventano inattivi e un chiamante di livello superiore inizia nuovamente, First Call? restituirà TRUE la prima volta che il VI viene eseguito dopo lo stato inattivo .
Approfondimento: First Call on NI
Applicazioni pratiche
Inizializzazione in FGV
Nelle Functional Global Variables (FGVs), l’uso di First Call? è estremamente utile per effettuare un’inizializzazione una tantum.
Ad esempio, per creare un riferimento a una risorsa, come una Queue o un oggetto DAQmx, e mantenerlo per tutta la durata dell’esecuzione del programma, si può utilizzare uno Shift Register o un Feedback Node, ponendo il blocco di inizializzazione all’interno del ramo TRUE di una Case Structure condizionata da First Call?.
Singleton pattern con Feedback Node
Quando si preferisce una rappresentazione più compatta rispetto agli shift register, si può sostituire lo shift register con un Feedback Node.
La logica resta la stessa: il valore iniziale viene scritto nel Feedback Node al primo ciclo (First Call? = TRUE), mentre nei cicli successivi, il nodo restituisce semplicemente il valore memorizzato.
Questa alternativa è particolarmente efficace per VIs riutilizzabili e per semplificare la lettura del diagramma.
Gestione Queue/Notifier/Event/File
First Call? può essere utilizzato per inizializzare una reference con il suo creatore solo quando un VI viene eseguito la prima volta. Ad esempio, per una Queue, la funzione Obtain Queue viene chiamata solo la prima volta, il riferimento viene salvato nello shift register, e le operazioni di enqueue/dequeue successive riutilizzano lo stesso riferimento.
Uso in VI rientranti
In LabVIEW, un VI rientrante può essere eseguito da più chiamanti contemporaneamente, ma ogni chiamante ha il proprio spazio dati separato. Questo significa che le variabili interne del VI (inclusi shift register, feedback node e anche la funzione First Call?) non vengono condivise tra le varie chiamate.
Quando si usa First Call? in un VI rientrante condiviso, questa funzione restituirà TRUE la prima volta che ogni chiamante lo esegue, perché ciascun chiamante ha una sua “istanza” indipendente del VI e quindi anche della funzione stessa .
Best Practice
- Chiarezza: l’inizializzazione è esplicitamente localizzata.
- Efficienza: risorse create una sola volta, evitando overhead inutili.
- Robustezza: evita condizioni impreviste nei cicli successivi.
- Manutenibilità: facilita la comprensione del flusso di controllo e dei riferimenti.
Esempio Pratico
Una Main UI, chiama una seconda VI che visualizza solo una visualizzazione del grafico e i dati gli vengono passati tramite un evento Data.

Un VI con i feedback node, crea l’evento tutte le prime volte il vi viene istanziato in memoria, le altre istanze espongono invece la reference registrata tramite il feedback node.

Considerazioni finali
La funzione First Call? è uno strumento semplice ma potente che, se ben compreso, può migliorare significativamente la qualità del software in LabVIEW.
Integrata in FGVs per l’inizializzazione di reference come Queue, Notifier, Occurrence o in qualsiasi meccanismo che richieda un’inizializzazione controllata, è sinonimo di un’architettura solida e professionale.
È uno strumento che ogni sviluppatore LabVIEW esperto impara ad apprezzare e utilizzare in modo strategico, soprattutto nelle Functional Global Variables (FGVs) e nei meccanismi di sincronizzazione avanzata.