Forum Italiano sui Prodotti NI

annulla
Visualizzazione dei risultati per 
Cerca invece 
Intendevi dire: 

wait until next ms multiple

Buona sera,

 

scusate la domanda sicuramente banale ma non riesco a venirne a capo. Sto usando il "wait until next ms multiple" affinche possa aquiside dei dati ogni venti minuti ( per esempio alle 16:00 16:20 16:40...) pero mi aquisisce dati a tempi strani. Se faccio partire il mio algoritmo alle 16:00, mi aquisisce ovviamente alle 16:00 pero poi alle 16:17 16:37 16:57...e cosi via ogni 20 minuti. Ho letto nel Help che ci puo essere un problema di tempo con la prima aquisizione e per questo occorre collegare il wait until next ms multiple con lo zero. Pero la modalita' per fare questo mi e´ poco chiara, sempre se e' questo il problema. Grazie mille per la disponibilita'.

 

Saluti.

 

Giacomo

0 Kudos
Messaggio 1 di 5
3.303Visualizzazioni

Ciao Giacomo,

"collegare 0" in input intende questa cosa:

 

wait.png

 

Tuttavia, poiché il periodo di acquisizione è molto ampio (20 minuti), ti consiglio decisamente di usare il seguente approccio:

 

meth2.png

 

In questo modo il loop è reattivo perché risponde al più in un tempo di 100 ms. Utilizzando invece il blocchetto WAIT UNTIL NEXT ms MULTIPLE come proponi tu blocchi l'esecuzione del tuo ciclo per 20 minuti.

0 Kudos
Messaggio 2 di 5
3.293Visualizzazioni

Grazie mille AC_85,

 

in realta' vorrei proprio bloccare l'esecuzione del ciclo perche' l'algoritmo e' abbastanza pesante per il mio pc e vorrei alleggerire il piu' possibile il mio ciclo. Quindi vorrei proprio che alla fine dell'esecuzione del ciclo il programma "dorma" fino al ´prossimo ciclo.

Pero', scusa l' ignoranza, ritornando al "collegare 0" , che in realta' mi era chiero, la cosa che non capisco e' che se collego zero non posso mettere il 1200 ms di durata del mio ciclo. Come fare? Devo inserire due  wait until next ms multiple??

 

Grazie mille per la risposta, saluti.

 

Giacomo 

0 Kudos
Messaggio 3 di 5
3.291Visualizzazioni

@gia88 wrote:

Grazie mille AC_85,

 

Pero', scusa l' ignoranza, ritornando al "collegare 0" , che in realta' mi era chiero, la cosa che non capisco e' che se collego zero non posso mettere il 1200 ms di durata del mio ciclo. Come fare? Devo inserire due  wait until next ms multiple??

 

Grazie mille per la risposta, saluti.

 

Giacomo 


Scusami, avevo capito una cosa per un'altra.

Effettivamente hai ragione, non è molto chiaro il fatto di dover collegare zero al VI. Non ho mai avuto la necessità di farlo prima.

 



in realta' vorrei proprio bloccare l'esecuzione del ciclo perche' l'algoritmo e' abbastanza pesante per il mio pc e vorrei alleggerire il piu' possibile il mio ciclo. Quindi vorrei proprio che alla fine dell'esecuzione del ciclo il programma "dorma" fino al ´prossimo ciclo.


Giacomo


 

Nell'approccio che ti ho proposto, il ciclo viene eseguito ogni 100 ms o più, ma, quando l'algortimo non è eseguito, non fa assolutamente nulla e la CPU non è di fatto impegnata, quindi non vai ad "appesantire" l'esecuzione del tuo algoritmo. Puoi verificare il carico della CPU con il task manager. Continuo quindi a consigliarti questo approccio.


Ci sarebbe anche un' altra alternativa, ma non ho abbastanza dettagli per dire se è adatta al tuo caso. La soluzione è quella di usare due cicli while:

- il primo ciclo while aspetta che passino i famosi 20 minuti ed eventualmente effettua anche delle altre operazioni. Ogni venti minuti, tale ciclo manda un "trigger" al secondo ciclo tramite un notifier o coda.

- il secondo ciclo contiene il tuo algoritmo che viene "triggerato" su comando proveniente dal primo ciclo.

Se ti serve un esempio di codice, scrivi pure

0 Kudos
Messaggio 4 di 5
3.278Visualizzazioni

Sono d'accordo con  AC_85, nella sua soluzione  quando l'algortimo presente nel case structure non è eseguito, quel ciclo non fa altro se non contare e di fatto ad "appesantire" l'esecuzione del tuo algoritmo, puoi controllare da task manager il consumo di risorse.

 

Per quanto riguarda l'esecuzione con due cicli while ti propongo sotto un esempio di realizzazione:

In questo esempio il ciclo inferiore non fa altro che contare il tempo che passa e generare un evento ogni TOT minuti (nel mio esempio ogni minuto)

impostati da te. Nel Ciclo superiore il tuo algoritmo viene inserito in una event structure che di fatto mette in pausa la sua esecuzione finchè non riceve la segnalazione dell'evento. 

 

Per realizzarlo ho utilizzato un costrutto un po' avanzato e forse non strettamente necessario, però di sicuro molto pratico, che è quello degli User Events, di cui ti copio sotto alcuni link che ne parlano:

 

Creating custom events

http://zone.ni.com/reference/en-XX/help/371361K-01/lvhowto/creating_user_events/

 

User Events Example

https://decibel.ni.com/content/docs/DOC-31576

 

Buon lavoro e buon weekend! 🙂

 

Enrico

 

EventEveryXmin.PNG

0 Kudos
Messaggio 5 di 5
3.272Visualizzazioni