Buffer circolare

Discussioni generali sulla programmazione in LabVIEW, domande, problemi e soluzioni.

Moderatore: ILVG mod

  • Advertisement

Buffer circolare

Messaggioda renaso » ven nov 03, 2017 8:46 am

Ciao a tutti,
mi servirebbe creare una FGV per un buffer circolare.
Mi servirebbero gli ultimi 5 secondi max di un'acquisizione che va a 10kh, possibile in qualsiasi momento.
La FGV deve essere valida per almeno 6 acquisizioni identiche in parallelo, ognuna con 5 segnali a 10khz, quindi ho un 3D array e le acquisizioni le gestisco tramite la page.

In allegato quello che ho fatto.

Il buffer sarà sempre in SET per tutto il tempo (l'acquisizione non si ferma mai) e non posso permettermi di fare degli start e stop della misura.
Nelle parti di codice dove mi servirà farò il GET e taglierò in base a quanto sengale mi servirà.

Sembra funzionare.

Siccome sarà sempre in background vorrei sapere se secondo voi c'è un metodo più elegante per fare il SET, perchè credo che ci sia memory allocation e vorrei proprio evitarla. Il replace subset del 2D array non si può fare credo quindi non vedo altra soluzione del build o insert???

Grazie
Allegati
Example.zip
LV2014
(37.36 KiB) Scaricato 253 volte
renaso
Super Utente +
Super Utente +
 
Messaggi: 260
Iscritto il: lun dic 27, 2010 7:18 pm

Advertisement

Re: Buffer circolare

Messaggioda aris » gio nov 09, 2017 10:40 am

Mi è capitato di dover fare buffer circolari ed ho ovviato con una semplice coda.....

Lunghezza della coda definita dal numero di punti che vuoi in memoria, accodamento tramite "Lossy Enqueue"(in automatico si gestisce l'IN/OUT dei dati piu recenti/vecchi) e preview della coda per leggere cio che hai in memoria.

Aris
E' sempre colpa di una massa.....e se non è quella è un if!
Avatar utente
aris
Super Utente ++
Super Utente ++
 
Messaggi: 645
Iscritto il: ven lug 30, 2004 10:49 am
Località: Medolla -MO-

Re: Buffer circolare

Messaggioda renaso » gio nov 09, 2017 12:36 pm

Ciao Aris,
non la vedo come una bella soluzione. Quando mi serviranno i dati dovrò per forza fare il build di tutti i pacchetti 2D DBL accodati per il numero di pacchetti che mi serviranno e ricostruire la forma d'onda...
renaso
Super Utente +
Super Utente +
 
Messaggi: 260
Iscritto il: lun dic 27, 2010 7:18 pm

Re: Buffer circolare

Messaggioda aris » gio nov 09, 2017 1:09 pm

Vero, che è cio che fai oggi nel "SET", quindi dipende da dove vuoi essere piu "veloce".
Comunuqe, per cercare di ottimizzare la memoria, usare le code mi sembra la via piu sicura e rapida....ma magari mi perdo qualche dettaglio io.
E' sempre colpa di una massa.....e se non è quella è un if!
Avatar utente
aris
Super Utente ++
Super Utente ++
 
Messaggi: 645
Iscritto il: ven lug 30, 2004 10:49 am
Località: Medolla -MO-

Re: Buffer circolare

Messaggioda paracarro » gio nov 09, 2017 4:15 pm

renaso ha scritto:Ciao a tutti,
mi servirebbe creare una FGV per un buffer circolare.
Mi servirebbero gli ultimi 5 secondi max di un'acquisizione che va a 10kh, possibile in qualsiasi momento.
La FGV deve essere valida per almeno 6 acquisizioni identiche in parallelo, ognuna con 5 segnali a 10khz, quindi ho un 3D array e le acquisizioni le gestisco tramite la page.

In allegato quello che ho fatto.

Il buffer sarà sempre in SET per tutto il tempo (l'acquisizione non si ferma mai) e non posso permettermi di fare degli start e stop della misura.
Nelle parti di codice dove mi servirà farò il GET e taglierò in base a quanto sengale mi servirà.

Sembra funzionare.

Siccome sarà sempre in background vorrei sapere se secondo voi c'è un metodo più elegante per fare il SET, perchè credo che ci sia memory allocation e vorrei proprio evitarla. Il replace subset del 2D array non si può fare credo quindi non vedo altra soluzione del build o insert???

Grazie


ah beh! Se si tratta di eleganza, allora possiamo dare libero sfogo alla fantasia.

L'array 3D non si può vedere: meglio avere un VI "gestore di buffer circolare" rientrante e istanziarne tanti quante sono le stazioni a disposizione.
In questo modo potresti gestire un buffer bidimensionale per ogni stazione.
Inoltre i VI instanziati girerebbero in parallelo. evitando che l'accesso il lettura/scrittura di un buffer sia vietato per una stazione mentre si sta accedendo al buffer di un'altra.

Il codice eseguibile e sorgente del VI sarebbe comunque unico, evitando duplicazioni che inficerebbero la manutenibilità

Vietatissimo l'uso di "Build Array" e pure di "Transpose 2D Array".

bye
Mai dire Mai
paracarro
Moderatore
 
Messaggi: 877
Iscritto il: lun ago 18, 2003 3:04 pm
Località: MILANO

Re: Buffer circolare

Messaggioda nicola » lun nov 13, 2017 2:53 pm

Io non ho capito usi un array 3d per salvare una tabella 2d e due scalari (STation e dimension)?

Perchè non usare un cluster per ogni station con un 2d per le misure e 1 int per la dimension.

Perchè poi le code no, se usi il loss enqueue e il get status con una coda a dimensione fissa ...

Ti allego un esempio
Allegati
Example2.zip
lv2014
(72.42 KiB) Scaricato 231 volte
Nicola |ILVG STAFF

Bytelabs.it
Avatar utente
nicola
Moderatore
 
Messaggi: 1525
Iscritto il: gio gen 08, 2004 3:30 pm
Località: Ferrara

Re: Buffer circolare

Messaggioda renaso » ven nov 17, 2017 4:32 pm

Ciao,
intanto grazie a tutti per i feedback.

il discorso è migliorare le performance della vi.

Anzichè la 3a dimensione potrei anche gestire 6 shifter register e gestire la cosa con un case a 6 stati.
Ripeto quello che vorrei evitare con le code è quello di ricostruirmi ogni volta l'array in uscita nella chiamata GET per intenderci ma credo sia inevitabile.
Diciamo che il buffer sia di 1000 elementi ed ad ogni lettura metto 100 elementi.
Creo una coda di 10 elementi
Il primo set metto dentro 100 elementi, il secondo set 100, 3° 100, ... sempre 100.h
Di fatto avrò una coda composta da 10 elementi di 100 pti l'uno in 2D array double. Il preview mi farebbe vedere solo l'ultimo ma il get status tutti. Ora avrò 10 pacchetti 2D da ribuildare per far si di avere 1 unico 2D con tutta la storia, sbaglio? è inevitabile

Le code in termini di efficienza sarebbero il top ed è quello che mi serve, perdere 2 ms per ricostruire fuori non dovrebbe essere un problema o vedete soluzioni migliori?

Non ho capito il cluster come ottimizzerebbe la gestione?
Il 3D mi gestisce la stazione.
Il 2D lo storico acquisizione del buffer.

Grazie
renaso
Super Utente +
Super Utente +
 
Messaggi: 260
Iscritto il: lun dic 27, 2010 7:18 pm

Re: Buffer circolare

Messaggioda renaso » lun nov 20, 2017 10:55 am

Ciao,
ho rifatto la vi con le code
Che ne pensate?
Allegati
ExampleQueue.zip
(72.21 KiB) Scaricato 255 volte
renaso
Super Utente +
Super Utente +
 
Messaggi: 260
Iscritto il: lun dic 27, 2010 7:18 pm

Re: Buffer circolare

Messaggioda nicola » dom mar 11, 2018 8:40 am

Esatto
Nicola |ILVG STAFF

Bytelabs.it
Avatar utente
nicola
Moderatore
 
Messaggi: 1525
Iscritto il: gio gen 08, 2004 3:30 pm
Località: Ferrara



  • Advertisement

Torna a Programmazione

Chi c’è in linea

Visitano il forum: Google [Bot] e 4 ospiti

cron

Pannello di Controllo Utente

Login

Advertisement

Chi c’è in linea

In totale ci sono 5 utenti connessi :: 1 iscritto, 0 nascosti e 4 ospiti (basato sugli utenti attivi negli ultimi 5 minuti)
Record di utenti connessi: 119 registrato il dom mar 31, 2013 11:39 pm

Visitano il forum: Google [Bot] e 4 ospiti