Forum Italiano sui Prodotti NI

annulla
Visualizzazione dei risultati per 
Cerca invece 
Intendevi dire: 

interazione strutture event,while e case

Buonasera

 

premetto che non ho molta esperienza,in ogni caso ho la necessità di dover gestire file di testo (.txt come in allegato) di grandi dimensioni. Ho creato un programma che mi consentisse di leggere in modo corretto i dati e che con una struttura case,mi consentisse anche di analizzare solo una parte dei dati visualizzati agendo durante l'esecuzione direttamente sui controlli "start samples" e "duration",ottendendo un riscontro immediato. Tuttavia per evitare di spezzettare il file di origine in numerose parti (vista la grande mole di dati) e per avere maggiore libertà,ho inserito nel ciclo while principale una struttura event,che mi consente di "spacchettare" il file di partenza in porzioni più piccole,da poter analizzare durante l'esecuzione. Inserendo l'event structure però non riesco più a far funzionare la struttura case come prima, e non ne capisco il motivo.

Allego una parte del file che analizzo e il programmino citato.

Ringrazio anticipatamente.

Scarica tutti
0 Kudos
Messaggio 1 di 10
6.876Visualizzazioni

Ciao Salvatore,

la ragione per cui il ciclo while non sembra eseguire più correttamente è che la struttura ad eventi rimane in attesa di uno degli eventi registrati. Questo fa sì che il ciclo while che contiene la struttura ad eventi non esegue, rimane in uno stato "idle" nell'attesa di un evento, quindi tutte le altre funzioni che sono poste nel ciclo non vengono mai eseguite se non quando viene generato un evento (cosa che determina l'esecuzione del caso event relativo e il "risvegliarsi" del ciclo while, che farà un'iterazione). Questa caratteristica della event structure permette di ottimizzare l'utilizzo di risorse da parte del VI, in quanto la CPU non viene utilizzata: il codice viene notificato dell'accadimento di un evento senza dover effettuare un polling continuo dell'interfaccia utente.

Tipicamente quindi il design pattern per la gestione di eventi di interfaccia consinste in un ciclo while con la sola struttura ad eventi all'interno. Per eseguire del codice in corrispondenza di un evento, è consigliabile utilizzare un'architettura a cicli paralleli (producer/consumer (events) design pattern), con un loop che gestisce gli eventi e un altro loop che esegue determinate funzioni a seguito dell'evento stesso; la comunicazione tra i loop avviene tramite code.

Puoi fare riferimento al template LabVIEW (File -> New... -> VI-> From Template-> Frameworks-> Design Patterns-> Producer/Consumer Design Pattern (Events)) oppure a questo esempio. Qui trovi una presentazione sui design pattern (event structure compresa).

Se invece non hai la necessità di eseguire codice in parallelo a seguito dell'accadimento di un evento, ma semplicemente eseguire del codice con un certo rate a meno che accada un evento, puoi sfruttare l'evento di timeout della struttura ad eventi. Questo evento viene generato dopo il tempo in msec specificato tramite il terminale Timeout della struttura (che di default, se non si collega nulla, è infinito, quindi la struttura aspetta sempre), quindi, a meno che accada un altro evento registrato, ogni "Timeout" ms viene eseguito il codice contenuto nel caso di Timeout.

Spero che le indicazioni siano chiare ed utili!

Ciao,

 

Licia

0 Kudos
Messaggio 2 di 10
6.864Visualizzazioni

Ciao Licia,

 

grazie per la risposta,la trovo molto utile!

ho scoperto stamattina che mi devo dedicare ad un'altra parte del codice (che non è in allegato) e spero di risolvere in fretta,ma appena concluso mi dedicherò a quello! Comunque ho la necessità di eseguire i codici in parallelo,nel senso che vorrei che i dati che vengono letti dalla struttura event, siano poi disponibili per essere ulteriormente manipolati all'interno del while principale, avevo provato semplicemente ad utilizzare due cicli separati (un while per l'event case e l'altro per tutto il resto) ma con scarsi risultati...

Grazie ancora per la risposta

Salvatore

0 Kudos
Messaggio 3 di 10
6.858Visualizzazioni

Salve, sto provando ad utilizzare il modello producer/consumer ma non riesco comunque ad ottenere quello che voglio. Ho allegato due esempi, nel primo uso il modello producer/consumer data, in cui non ho ancora inserito la struttura event, ma in ogni caso il ciclo consumer si limita a visualizzare i dati del ciclo producer, senza permettermi di agire su di essi.

Nel secondo allegato (prova_2) ho usato il modello producer/consumer events, ed ho inserito anche la struttura events, ma ottengo gli stessi risultati del caso precedente. Leggendo l'help di labview, mi sembra di capire che il modello che serve a me è il primo cioè il producer/consumer design pattern (data).

 

Qulacuno ha qualche idea su come possa risolvere la questione?

grazie mille in anticipo!

Scarica tutti
0 Kudos
Messaggio 4 di 10
6.811Visualizzazioni

Facendo varie prove ho capito che il mio problema sta nella struttura event,nel senso che rimuovendola riesco a manipolare i dati che leggo, mentre se la inserisco è come se i dati diventassero statici, non riesco più ad agire su di essi come se il ciclo aspettasse qlcs che non avviene, se non alla successiva pressione dei tasti che gestiscono la struttura event.

Qualcuno ha qualche idea su come aggirare il problema?

Grazie

 

Salvatore

0 Kudos
Messaggio 5 di 10
6.800Visualizzazioni

Ciao Salvatore,

facendo riferimento al tuo VI ProducerConsumerEvents  prova_2.vi, i dati vengono letti da file e messi in coda solo quando clicchi su Enqueue Element. Solo in questo caso, il ciclo consumer, trovando una nuova waveform nella coda, andrà ad eseguire elaborandola.

Spero di aver chiarito il problema.

Ciao,

 

Licia

0 Kudos
Messaggio 6 di 10
6.792Visualizzazioni

Ciao Licia,

grazie per la risposta! Si, avevo capito che il funzionamento è quello da te descritto.

Io però vorrei poter ottenere qualcosa di diverso, cioè vorrei poter fare quello che fa il programma in allegato, cioè leggere i dati e,qualora io lo voglia, poter agire su di essi (il limitare una parte del segnale è solo una delle cose che dovrei fare sul segnale analizzato), però integrando la struttura event. Cioè vorrei che la struttura event mi selezionasse una parte dei dati, e successivamente vorrei poter agire su quei dati, non su quelli successivi. Questo perchè, come scritto nel primo post, i dati che devo analizzare sono molto pesanti e di difficile gestione.

E' forse un limite della struttura event o come è più probabile che sia, sono io che non riesco a fare questa cosa?

Grazie ancora

 

Salvatore

0 Kudos
Messaggio 7 di 10
6.788Visualizzazioni

Scusate, ho dimenticato di allegare il file...

0 Kudos
Messaggio 8 di 10
6.778Visualizzazioni

Ciao Salvatore,

una domanda: il file che leggi è sempre lo stesso? Noto infatti in quest'ultimo VI che nel ciclo producer continui a rileggere tutto lo stesso file e a rimetterlo in coda e questo non è molto efficiente.

Tu vorresti leggere tutto un file e successivamente elaborare parti diverse del file in base ad una selezione dell'utente?

Ciao,

 

Licia

0 Kudos
Messaggio 9 di 10
6.776Visualizzazioni

No, i file sono diversi, la parte relativa alla lettura (quindi il vi "Read from spreadsheet fie") li ho inseriti nel ciclo while per poter variare il file da analizzare durante l'esecuzione del programma, per evitare di dover terminare e riprendere l'esecuzione dello stesso.

 

Quello che vorrei fare è questo: il file di testo nel primo allegato contiene due cicli. Il file originale che mi è stato fornito e che contiene circa 250 cicli, ho provveduto a dividerlo in file più piccoli da circa 50 cicli ognuno. Quello che voglio fare è far leggere a LV uno di questi file, con la struttura event selezionare un pacchetto di tot campioni (circa 16000) relativi al singolo ciclo, quindi lavorare "dinamicamente" (lo so che non è corretto dire così,ma non riesco a spiegarmi meglio) su quei dati selezionati. La struttura event mi serve per passare da un ciclo all'altro, andando avanti o indietro.

 

Ad esempio, con il file di testo che ho allegato precedentemente, se seleziono con la struttura event il primo ciclo e voglio analizzare solo una parte di tale ciclo con il tasto "delimita", non lo posso fare, posso farlo solo per la successiva iterazione, cioè per il ciclo successivo.

Grazie per l'aiuto

0 Kudos
Messaggio 10 di 10
6.771Visualizzazioni