A differenza di allora, adesso oltre che a funzionare, mi piace cercare di ottimizzare i miei programmi per evitare di avere del codice che divora risorse come uno squalo senza restituire nulla in cambio. Man mano che trovo qualche cosa di utile, cercherò di scriverla qui in un post, non aspettatevi un vero e proprio tutorial o un corso di LabVIEW, ma più semplicemente una collezione di informazioni che spero vi possano essere utili come lo sono state a me.
Finita l'introduzione, veniamo al discorso di oggi. Ottimizzare l'esecuzione della top level application, ovvero come utilizzare gli eventi.
La prima volta che avete scritto un VI, avete preso un semplice operatore matematico, diciamo la somma collegati due controlli agli ingressi e un indicatore in uscita, tutto qui. La delusione sarà comparsa sui vostri occhi quando l'avete eseguita per la prima volta, infatti appena il tasto run, l'applicazione sarà già finita senza lasciarvi nemmeno il tempo di inserire i numeri da sommare. Allora siete tornati al diagramma e avete rinchiuso il tutto all'interno di un ciclo while con l'intento di tenere l'applicazione sempre attiva. Alla condizione di uscita avete connesso un controllo booleano sottoforma di pulsante sul pannello frontale in modo da poter terminare l'esecuzione (il diagramma è quello nell'immagine qui a lato). Funziona? Certo che funziona, il vostro pc continuerà a ripetere le operazioni all'interno del ciclo while e anche se voi non riuscite a vederlo, il computer continuerà a calcolare la somma anche quando non cambia nulla.
A vista non cambia nulla, se andate a vedere le risorse del vostro PC, in particolare l'utilizzo della CPU, noterete che nonostante l'interfaccia grafica non stia cambiando il computer resta impegnato a fare e rifare gli stessi conti. Se prendete il manuale di LabVIEW, troverete una "soluzione" per questo abuso di risorse: aggiungete un ritardo nel ciclo (icona orologio). In questo modo tra un'esecuzione e l'altra, il PC tira un sospiro di x ms - 100 nel diagramma qui a lato - così che l'utente continua a vedere i conti fatti in tempo reale senza uccidere troppo la CPU. Qui sorgono le prime domande: è 100 ms il ritardo giusto? vale per tutti i processori? non si può ottimizzare?
Ottimizziamo
Se il calcolo lo doveste fare voi a mente, come fareste? Di certo non continuerei a rifare i conti che ho già fatto, ma solo quando uno dei due input viene modificato. La parola magica è evento: eseguiamo le operazioni solo quando avviene una certa condizione, come nel caso specifico quando viene cambiato il valore di un controllo. Questa è sicuramente la soluzione ottimizzata, perché indipendentemente dalle altre condizioni, il vostro codice verrà eseguito solo quando serve.
Si può fare? Certo che si può. Non è una prerogativa di LabVIEW, anzi in genere è una caratteristica di tutti le librerie che permettono di sviluppare interfacce grafiche. Per esempio, all'interno delle librerie Qt, questo meccanismo si chiama Signals & Slots, infatti ogni volta che l'utente interagisce con l'interfaccia grafica - diciamo preme un tasto o cambia un numero - quell'elemento emette un segnale particolare che può venire captato da qualche ricevente (slot) che agisce di conseguenza.
Nel caso di LabVIEW si deve utilizzare l'event structure che è particolarmente simile a quella di un case perché ci sono diversi fogli, uno per ogni evento e ciascuno di essi contiene il codice che deve essere eseguito in ciascuno caso.
Quali eventi?
Adesso arriva la parte difficile, se così si può dire. Dobbiamo individuare tutti gli eventi a cui siamo interessati. Nella nostra semplice applicazione dobbiamo tenere sotto controllo due eventi:
- Quando uno dei due controlli che corrispondono agli addendi della nostra somma cambia di valore
- Quando l'utente clicca sul pulsante stop, che anche in questo caso possiamo ricondurre ad un cambio di valore del terminale booleano corrispondente.
Adesso che ho stimolato la vostra curiosità, andate a vedere tutti i dettagli della struttura per eventi nella documentazione e se volete potete scaricare il vi contenente la versione ad eventi della Top Level Application.
TopLevel With Event Structure.vi (22.5 kB)
LabView... che gran figata.
RispondiEliminaLo usai all'università per automatizzare le misure di test sulle fibre scintillanti, e alla fine del batch di misure tirava fuori anche un fit delle misure appena fatte (più che altro per controllare se qualcosa era andato storto).
uso labview da un po' prima della tesi di laurea, anzi devo dire che se ho scelto di fare quella tesi è stato proprio perché parte del lavoro era in labview che già conoscevo.
RispondiEliminada allora ne ho sempre avuto a che fare, con alterni risultati. secondo me per interfacciare strumenti non c'è nulla di più efficiente.
oggi mi hanno chiamato dalla NI per vedere come finalizzare l'acquisto delle licenze e ho parlato un dieci minuti buoni con il nostro referente. era una persona molto preparata, non il tipico commerciale e, valore aggiunto non da poco, lui mi ha detto che generalmente ogni 15 giorni passa dalle nostre parti ed è disponibile a venire a vedere le nostre esigenze, i problemi e le richieste. di persona e non via un call center.
La NI (National Instruments, suppongo) mi ha sempre fatto buona impressione, anche se non trattavo io con i commerciali.
RispondiEliminaHo appena iniziato a lavorare in LabView, grazie mille del consiglio! Devo ancora abituarmi a questo tipo di programmazione grafica, anche se per ora continuo a preferire la vecchia programmazione con file di testo. Devo però ammettere la semplicità con cui LabView permette di interfacciarsi ai vari strumenti è quasi imbarazzante!
RispondiEliminabravo! adesso sto preparando la seconda puntata... su come fare un front-panel (e corrispondente diagramma) che cambia in funzione del livello dell'utente che si è loggato.
RispondiEliminadetta così sembra molto più complessa di quello che è in realtà.
Wow, che stile! ;)
RispondiElimina