Forum Italiano sui Prodotti NI

annulla
Visualizzazione dei risultati per 
Cerca invece 
Intendevi dire: 

Problemi con output analogico + PID + controllo multivariabile

Salve
mi presento. Sono un ricercatore del Poli di Milano. Non sono molto pratico di programmazione LabView quindi sono a chiedere l'aiuto di qualche buon'anima.
 
Ho diversi problemi e comincerò ad esporli in maniera di importanza.
 
Devo comandare un motore ad induzione con un segnale di tipo generico (sinusoide, quadra, ecc...) e al contempo devo acquisire due canali. Uno è la posizione angolare del motore (che dovrebbe essere pari al segnale che do in pasto al motore come comando) e l'altro è un segnale proveniente da un pirometro.
 
Il problema consiste nel fatto che il segnale di comando del motore e quello di ritorno sono identici tranne in alcuni brevi momenti in cui il segnale di posizione sembra riscriversi identico a se stesso? Problema di riscrittura? Ma?! Ho provato a staccare il motore e a misurare direttamente il segnale che genero con il VI di generazione di funzione. Identico problema. Ciò significa che il problema è contenuto dal codice alla scheda, non è sull'attuatore. Vi lascio il sofware che ho scritto (è uno sviluppo di un esempio che c'era in labview). Vi lascio anche il file excel che salvo. Sulla quarta colonna c'è il tempo, sulla terza il segnale del pirometro ma che non era collegato, sulla seconda il segnale che genero via sofware e sulla prima il segnale di output misurato? Li vedete i gradinetti sulla sinusoide? Ma che roba è? Così il motore non mi funziona bene!!! Il software è LV 7.1 i files sono "SineGalvo_prova2" e "DATA.lxs". Il problema non dovrebbe essere sulla modalità di salvataggio. Ho provato anche la soluzione con il VI "Write to SpredSheet" ma non cambia nulla. Dovrei avere una sinusoide perfetta come comando almeno a 200Hz comapionando a 1000 Hz.
 
Quello che mi sembra strano è che ho usato lo stesso schema base per fare un controllo PID e non mi ha mai dato problemi di tal genere il segnale di uscita anche alla massima frequenza di 1000 Hz. Chissà come mai? Il sofware è "Controllo Tempra + PID".
 
Inoltre come vedete il buffer è settato a 0. Se metto un po' di buffer in input e output posso fare una bufferizzata circolare usando lo stesso schema o devo per forza usare le waveforms?
 
Ho provato a fare la stessa cosa di prima con le waveforms con il VI "AIAO" che vi allego, e in questo caso non mi da il problema, ma ho un sacco di problemi a gestire il salvataggio e non sarei molto avvantaggiato a sviluppare il programma. Preferisco ragionare sul dato singolo.
 
Inoltre a breve dovò fare un controllo di tipo multivariabile. Posso far girare due PID nello stesso ciclo while? O devo fare girare due while in contemporanea?
 
Grazie mille a chiunque mi rispondesse
 
Saluti
 
Moreno
 
 
 
 
 
 
 
0 Kudos
Messaggio 1 di 12
6.132Visualizzazioni
Ciao Moreno,
 
scusa per il ritardo nella risposta. Ho bisogno di farti un paio di domande per capire meglio il problema e cercare di darti il maggior aiuto possibile. Inanzitutto ho dato un'occhiata ai dati Excel ed ho notato i valori a "scalino" generati dal tuo programma in alcuni periodi della sinusoide; da quello che posso capire dai test che hai effettuato il problema potrebbe essere legato alla funzione di scrittura su file inserita nel while loop del VI "SineGalvo_prova2.vi". Poichè il VI che usa il PID non mostra il problema, ed allo stesso tempo non usa la funzione di scrittura file, ti invito a provare il tuo VI "SineGalvo_prova2.vi" togliendo temporaneamente la parte di salvataggio.
 
Il vantaggio di poter utilizzare acquisizioni/generazioni bufferizzate è legato alla possibilità di svincolarsi dalla temporizzazione software dell'applicazione; lavorando con valori puntuali la frequenza con la quale genererai i punti della sinusoide che comanda il motore sarà dipendente dalla velocità con la quale il ciclo while itera volta per volta (e quindi una temporizzazione software). Al contrario un'acquisizione/generazione bufferizzata permette di sfruttare maggiormente la temporizzazione hardware legata al clock della scheda DAQ. E' per questo motivo che durante l'acqusizione bufferizzata il problema degli "scalini" non si presenta.
 
Se hai la necessità di lavorare gestendo singoli punti allora esistono alcune tecniche che permettono di parallelizzare le gestione della scheda e la scrittura su file separatamente. A questo proposito ti invito a dare un'occhiata al seguente esempio:   Using Local Variables, Queues, and Notifiers to Synchronize Data with Parallel Loops;

Spero che questo possa esserti di aiuto,

Cordiali saluti,

Fabio

Fabio M.
NI
Principal Engineer
0 Kudos
Messaggio 2 di 12
6.098Visualizzazioni

Ciao Fabio_81

grazie per la risposta!

Ho pensato anche io ad un possibile problema dovuto al salvataggio ma prima di provare a salvare all'interno del loop direttamente su file avevo provato anche la soluzione con il Write su Spreadsheet.vi salvando alla fine gli array generati all'interno del loop, proprio come nel programma che ho usato nel per il controllo. Quindi ho paura che il problema non sia nel salvataggio...

Ma se uso un'acquisizione bufferizzata devo usare per forza le waveform? O posso agire ancora sul singolo dato? Se uso le wavefrom immagino che ad ogni ciclo nel loop devo processare una waveform composta da n punti. Questo significa che per usare il mio PID.vi che agisce sul singolo punto devo fare un altro ciclo per agire su ogni punto della waveform?

Non sai se c'è in giro qualche esempio di acquisizione + output + salvataggio di tipo bufferizzato?

Nell' AIAO.vi che trovi in allegato ho tentato di fare qualcosa basandomi su un esempio ma non riesco a salvare correttamente la tensione generata dalla scheda. Mentre salvo bene quella generata dal software. Vorrei non dover inizializzare l'AO Write.vi fuori dal ciclo. Questo perchè usandolo anche per un controllo PID mi scrive una funzione che non mi servirebbe.

Se può servire io usa una scheda DAQ 6052E e una morsettira 68-scb

Sono un po' in stallo 🙂

Per il momento grazie ancora

Ciao

Moreno

 

 

 

0 Kudos
Messaggio 3 di 12
6.092Visualizzazioni
Ciao Moreno,
 
da quello che mi stai dicendo sembra quindi che anche togliendo la parte di scrittura dall'interno del ciclo le cose non cambiano; ciò sembra molto strano poichè da quello che hai scritto, cioè che il VI "ControlloTempra.vi" funziona correttamente, allora anche il VI "SineGalvo_prova2.vi" dovrebbe comportarsi in modo corretto, avendo come sola differenza la parte di scrittua su file. Prova magari a partire del vi AIAO.vi e modifica la fase di lettura usando la funzione scan invece della read (come hai fatto nel VI SineGalvo.vi). Se ti serve lavorare con punti singoli (ad es. per utilizzare il controllo PID) puoi usare la funzione index array e selezionare un singolo punto.
 
Per il discorso waveform invece, questo tipo di dati non è altro che un cluster contenente un vettore di punti ed altri dati scalari. Esse vengono usate, come hai visto, per acquisizioni/generazioni bufferizzate e quindi non sono adatte ad essere utilizzate per lavorare point-by-point come nel caso di un algoritmo di controllo.
 
Cordiali saluti,
 
 
Fabio M.
NI
Principal Engineer
0 Kudos
Messaggio 4 di 12
6.082Visualizzazioni

Ciao Fabio_81

Ma quindi non è possibile fare il controllo PID con una logica bufferizzata circolare? Con un PID bisogna sempre agire sul singolo dato?

Non si può proprio usare le waveforms come al solito per una bufferizzata e successivamente estrarre con l'index array ogni singolo dato in un sottociclo, fare agire il PID, e ricostruire un waveform di segnale di comando da restituire al ciclo maggiore? Altrimenti per controlli PID con scan rates > 1 kHz come si fa? Mi sembra di capire che agendo sul singolo punto più in la di 1 kHz non si possa andare, o sbaglio?

Comunque nei prossimi giorni provo la tua soluzione, confido sul fatto che funzioni

Grazie ancora

Ciao ciao

Moreno

 

0 Kudos
Messaggio 5 di 12
6.062Visualizzazioni
Ciao Moreno,
 
la soluzione che proponi tu è proprio quella che ti suggerivo nel mio post precedente; se imposti un'acquisizione bufferizzata e vuoi gestire un controllo PID (che è single point) all'interno del ciclo while, allora devi usare la funzione Index array ed estrarre un punto alla volta.
 
Per PID con scan rates superiori ad un 1 kHz occorre considerare non tanto la programmazione del codice quanto la velocità massima delle iterazioni del ciclo while in un PC con sistema operativo "general purpose" come Windows; esso infatti metta di disposizione un clock ad 1 kHz, ovvero un tempo ciclo dell'ordine dei millisecondi e non inferiore.
 
Cordiali saluti,
 
Fabio
Fabio M.
NI
Principal Engineer
0 Kudos
Messaggio 6 di 12
6.032Visualizzazioni

Ciao Fabio

ancora una domana poi non ti rompo più...

Ma con la logica bufferizzata perchè non dovrebbe funzionare? Se funziona per le acquisizioni. agisco comunque sul signolo dato poi i dati processati passano al buffer ecc...non capisco bene dove sta il problema, comunque

Se voglio eseguire un controllo PID a più di 1kHz che devo fare? Qul'è la soluzione migliore con gli strumenti che possiedo, ovvero LabView 7.1 e una DAQ 6052E?

Grazie mille!

Ciao

Moreno

0 Kudos
Messaggio 7 di 12
6.023Visualizzazioni
Ciao Moreno,
 
non ho mai detto che il controllo PID non funziona se si usa una logica bufferizzata per l'acquisizione/generazione dei dati. Ho illustrato semplicemente che, una volta a disposizione l'array di dati proveniente dal buffer di acquisizione, è sufficente chiamare la funzione "Index Array.vi per estrarre un punto dal vettore ed usarlo come input al PID.
 
Per quanto riguarda l'aumento della frequenza per il controllo PID, il collo di bottiglia non è ne LabVIEW nè la scheda DAQ6025E, quanto il sistema operativo (Windows) che ha una temporizzazione dell'ordine dei millisecondi e ti impedisce quindi di eseguire iterazioni a velocità più elevate. La soluzione più adeguata nel caso ci sia la necessità di implementare algoritmi di controllo con frequenze > 1 kHz è l'utilizzo di un sistema operativo Real Time. Eccoti un poco di documentazione a riguardo:
 
 
 
 
Cordiali saluti,
 
Fabio
Fabio M.
NI
Principal Engineer
0 Kudos
Messaggio 8 di 12
6.011Visualizzazioni
Grazie per gli aiuti sin qui ricevuti.
Ho risolto il problema facendo un'acquisizione bufferizzata circolare in output e in input, come nel file allegato (Galvo.vi)

Ora vorrei fare controllare il gavanometro in modo bufferizzato, ma al contempo, generare un uscita di tensione costante su un altro canale? Che fare? Uso due blocchetti di write?

Grazie mille

Ciao

Moreno
0 Kudos
Messaggio 9 di 12
5.793Visualizzazioni
Ciao Moreno,
 
ti basterà selezionare due canali anzichè uno nella funzione "DAQmx Create Channel" e scrivere il valore di tensione costante come input alla funzione DAQmx Write (es. dando un ingresso un vettore 2D avente nella prima riga i valori da scrivere sul primo canale mentre nella seconda riga il valore costante di tensione da pilotare sul secondo canale).
 
Cordiali saluti,
 
Fabio
Fabio M.
NI
Principal Engineer
0 Kudos
Messaggio 10 di 12
5.722Visualizzazioni