Introduzione a labview | DAQ code laboratory

Introduzione a labview

In questo articolo verranno introdotti i concetti base sulla programmazione in LabView. In particolare, verranno accennati concetti relativi alla logica di esecuzione di un programma in labview, e il polimorfismo degli elementi in labview.

Data Flow

A differenza dei linguaggi di programmazione quali: C++, java, C#, Visual Basic, il linguaggio di programmazione LabView non è basato sulla definizione di un testo descrittivo dei passi che il programma deve eseguire. Tali linguaggio sono detti text-based ed il testo definisce il modello del controllo del flusso di esecuzione del programma. Tale controllo è sequenziale, ordinato secondo l’ordine di inserimento delle varie istruzione nel testo. 

LabView è completamente diverso. È un linguaggio di programmazione completamente grafico. Il Programma viene quindi descritto collegando una serie di blocchetti/nodi funzionali, che eseguono una specifica azione e caratterizzati da alcuni terminali di ingresso ed altri d’uscita. L’atto del collegamento attraverso una wire, significa scambiare un informazione da un blocchetto sorgente ad uno o più destinazioni.

E bene fare la prima precisazione:

Una linea di collegamento (wire) tra due blocchetti deve avere un unica sorgente, mentre può essere collegata anche a più destinazioni.

Nel caso in cui questa condizione non si rispettata, anche solo per una singola wire, il programma in labview non è eseguibile e segnalerà la wire in questione come errata tratteggiandola e sbiadendola.

Non essendoci un testo a descrivere la logica del programma ma un grafo di blocchetti funzionali, non è più possibile individuare l’ordine di esecuzione delle singole operazioni con il numero della riga di codice. Infatti, la logica di esecuzione di LabView è detta Data Flow e si basa su pochi semplici concetti:

Un blocchetto o nodo funzionale di labview potrà essere eseguito se tutti i suoi ingressi sono definiti. La definizione degli ingressi può avvenire o attraverso il “fluire”  dell’informazione da un blocchetto che lo precede, o se l’ingresso in questione non è collegato a nulla ad un valore di default prefissato. 

Quando un nodo completa la sua esecuzione, valorizza i dati relativi ai suoi terminali d’uscita che, se connessi ad una wire, fluiscono verso i nodi successivi. 

È bene notare, che ogni nodo può avere da nessuno a più terminali di ingresso o d’uscita. Non è necessario collegare a qualcosa i terminali di ingresso per cui è definito un valore di default (ovviamente se il valore di default va bene per la logica del programma che si sta realizzando). Mentre, tutti gli ingressi per cui non è definito un valore di default vanno obbligatoriamente collegati, altrimenti labview non permetterà l’esecuzione del programma. Non è necessario collegare le uscite di un nodo labview a qualcosa.

Polimorfismo

Uno dei grossi vantaggi della realizzazione di un programma in labview è dettata dal “polimorfismo” relativo a diversi nodi funzionali. Per polimorfismo si intende la capacità di un nodo funzionale di modificare il suo comportamento in funzione del tipo di dati ad esso in ingresso. Quindi ad esempio lo stesso operatore di somma, si comporterà in maniera differente in funzione di quali saranno i suoi ingressi. Nel caso in cui:

  • Entrambi i suoi ingressi siano scalari, si comporterà come una semplice somma.
  • Un suo ingresso è uno scalare e l’atro un array, allora sommerà ad ogni elemento dell’array l’altro ingresso scalare
  • Entrambi i suoi ingressi sono array: effettuerà la somma elemento per elemento degli array. Nel caso in cui gli ingressi non siano della stessa dimensione, l’array d’uscita avrà dimensione pari all’array di dimensione minore.
  • Uno scalare ed un tipo complesso predefinito come una forma d’onda (waveform): labview sommerà al segnale descritto nella forma d’onda la costante in ingresso.
  • ……