Una funzione semplice, ma fondamentale
All’interno dell’ambiente LabVIEW, esiste una funzione tanto essenziale quanto spesso sottovalutata: First Call?.
Collocata nella palette Programming > Synchronization, questa funzione restituisce TRUE solo alla prima esecuzione del VI nel contesto in cui è caricato.
Apparentemente banale, ma è proprio in questa unicità che risiede la sua potenza: consente di distinguere il primo ciclo di un algoritmo dai successivi, permettendo inizializzazioni sicure, centralizzate e controllate.
È 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.
Functional Global Variables: inizializzare una sola volta
Nelle FGV, l’uso di First Call? è estremamente utile per effettuare un’inizializzazione una tantum.
Immaginiamo di voler creare un riferimento a una risorsa, come una Queue o un oggetto DAQmx, e mantenerlo per tutta la durata dell’esecuzione del programma.
Utilizzando uno Shift Register o un Feedback Node, e ponendo il blocco di inizializzazione all’interno del ramo TRUE del Case Structure condizionato da “First Call?”, in metalinguaggio qualcosa del genere:
Questo garantisce che la risorsa venga creata una sola volta, mentre alle chiamate successive viene semplicemente richiamata dallo shift register.

[FirstCall?]
Case Structure
If TRUE Case –> reference = inizializza risorsa
→ shift register
If FALSE Case –> usa il reference memorizzato
È un pattern elegante e sicuro, che evita duplicazioni, memory leak o race condition.
Di seguito un esempio che crea la connection solo la prima volta che il VI viene eseguito (non caricato, ma eseguito).

Utilizzo frequente Queue, Notifier, Event
Si può, quindi usare First Call? per inizializzare una reference con il suo creatore, solo quando un VI viene eseguito la prima volta.
Senza dover ricorrere a FGVs Action Engine, singletone, con tutte le funzioni necessarie integrate nella FGV. Torna più utile farlo solo in creazione portando in uscita la ref generata. Il vi così creato di init Queue, Notifier, Event, File ecc., alla prima chiamata crea la ref, nelle altre la legge solo, mediante lo shift register o il feedback node.
Esempio
Obtain Queue
(ma lo stesso per ogni api, by reference) viene chiamato solo la prima volta.- Il riferimento viene salvato nello shift register.
- Le operazioni di enqueue/dequeue successive riutilizzano lo stesso riferimento.
Notifier Ignore Previous
Quando usi la funzione Wait on Notification, il terminale Ignore Previous (boolean) – indica se il nodo deve ignorare o meno notifiche già avvenute prima della chiamata.
In parole semplici:
Se Ignore Previous è TRUE, il nodo attenderà solo una notifica futura, ignorando ogni notifica che potrebbe essere stata inviata prima che il nodo si mettesse in ascolto.
Se è FALSE, e c’è una notifica pendente non ancora letta, questa verrà subito ricevuta.
Con il first call in questo ingresso
- Al primo ciclo: impostato a TRUE (ignora il segnale precedente).
- Nei cicli successivi: impostato a FALSE (considera solo nuovi segnali).
- È utile per evitare l’attivazione del processo su segnali già esistenti al momento della registrazione.
Feedback Node come alternativa
Quando si preferisce una rappresentazione più compatta rispetto agli shift register — ad esempio all’interno di un singolo ciclo o per una funzione incapsulata — 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).
- Nei cicli successivi, il nodo restituisce semplicemente il valore memorizzato.
Questa alternativa è particolarmente efficace per VIs riutilizzabili e per semplificare la lettura del diagramma.
“First Call?” nei 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.
Esempio pratico:
Immagina di avere un VI rientrante che inizializza una reference.
Se lo chiami da due cicli paralleli:
Ciclo A chiamerà il VI e “First Call?” restituirà TRUE (prima chiamata per quel ciclo).
Ciclo B, anche se in esecuzione contemporanea, ha un altro spazio dati e quindi anche lui vedrà “First Call?” come TRUE alla sua prima esecuzione.
Quindi, ogni contesto d’uso indipendente del VI rientrante ha una propria prima chiamata, con comportamenti distinti e separati.
Best practice e vantaggi
L’approccio con First Call? presenta vantaggi concreti:
- 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.
Recap finale
La funzione First Call? è uno di quei piccoli strumenti che, se ben compresi, possono migliorare 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.