Discussione:Controllo PID

Da Wikipedia, l'enciclopedia libera.
Vai alla navigazione Vai alla ricerca
Questa voce rientra tra gli argomenti trattati dal progetto tematico sottoindicato.
Puoi consultare le discussioni in corso, aprirne una nuova o segnalarne una avviata qui.
Controlli automatici
La voce è stata monitorata per definirne lo stato e aiutarne lo sviluppo.
Ha ottenuto una valutazione di livello sufficiente (gennaio 2009).
BLievi problemi relativi all'accuratezza dei contenuti. Informazioni esaustive nella gran parte dei casi, ma alcuni aspetti non sono del tutto approfonditi o altri non sono direttamente attinenti. Il tema non è stabile e potrebbe in breve necessitare di aggiornamenti. (che significa?)
BLievi problemi di scrittura. Qualche inciampo nello stile. Linguaggio non sempre scorrevole. Strutturazione in paragrafi adeguata, ma ancora migliorabile sotto alcuni aspetti. (che significa?)
CSeri problemi relativi alla verificabilità della voce. Carenza di fonti attendibili. Alcuni aspetti del tema sono completamente privi di fonti a supporto. Presenza o necessità del template {{cn}}. La delicatezza del tema richiede una speciale attenzione alle fonti. (che significa?)
BLievi problemi relativi alla dotazione di immagini e altri supporti grafici nella voce. Mancano alcuni file o altri sono inadeguati. (che significa?)
Monitoraggio effettuato nel gennaio 2009

Pseudocodice[modifica wikitesto]

Non so per quale motivo è stata eliminata l'unica cosa utile (presente invece in wikieng) della pagina, l'implementazione pratica del PID (ovviamente non si possono calcolare integrali e derivate algebriche di valori campionati (di funzioni sconosciute). E non è possibile per la maggior parte dei PLC fare un analisi in frequenza. Naturalmente è utile per capire il perchè il controllore PID è fatto in questo modo una base matematica.

Scusa l'ignoranza, ma che vuol dire "pseudocodice"? Che nono corrisponde a nessun linguaggio di programmazione reale? In questo caso penso sia molto più utile avere un'implementazione scritta in qualche linguaggio di programmazione specifico, così almeno si può provare. Ad esempio si potrebbe inserire un esempio con il linguaggio utilizzato in Matlab (Simulink), che viene spesso utilizzato in ambito ingegneristico. --Aushulz (msg) 20:24, 9 ott 2009 (CEST)[rispondi]
Come non detto. Leggendo la discussione al Bar di matematica ho capito che lo pseudocodice è meglio di altri linguaggi di programmazione. --Aushulz (msg) 23:53, 9 ott 2009 (CEST)[rispondi]
In effetti non avevo letto quella decisione, mi pare coerente con lo spirito di wikipedia. Il codice l'ho preso da wikipedia eng. Ciskje (msg)

Quest'articolo è pieno di errori!!! --212.141.219.138 (msg) 15:18, 18 dic 2008 (CET)[rispondi]

È una battuta? Se ti riferisci all'occorrenza della parola "errore" nella voce, sappi che si presenta solo 5 volte. Se pensi che ci siano errori grammaticali, puoi correggerli (io non ne trovo). Se ti riferisci alla wikificazione, accomodati pure, ogni miglioramento della voce è ben accetto. --Aushulz (msg) 15:44, 18 dic 2008 (CET)[rispondi]
Intendo proprio errori nei concetti, anche gravi! Non ho ancora letto la voce interamente e al momento non ho tempo di correggerla, ma lo farò al più presto. Ho letto solo velocemente la sezione di "azione integrale", e ti assicuro che è sbagliata! Ad esempio:
"L'azione integrale "sente" se c'è differenza tra i due valori di misura e set point. Se i due valori sono coincidenti, l'azione integrale è nulla. Se invece c'è differenza tra i due valori, l'azione integrale si manifesta..."
oppure:
"Appena i due valori coincideranno, l'azione integrale si annulla e la corsa dell'organo finale di regolazione cessa di variare per tale causa."
Assolutamente no!! E' proporzionale all'integrale, non al valore istantaneo!! Se l'errore si annulla, non si annulla l'azione integrale!--212.141.219.138 (msg) 17:45, 18 dic 2008 (CET)[rispondi]
Effettivamente c'erano ampi margini di miglioramento. Ho riscritto l'articolo cercando di renderlo più "enciclopedico", cioè più comprensibile ai profani. Se uno vuole tutti i dettagli la bibliografia è lì per quello. 193.175.53.21 (msg) 12:00, 3 lug 2009 (CEST)[rispondi]
All'utente 193.175.53.21: hai ridotto drasticamente le dimensioni della voce. Non ho dato una lettura prima e dopo del tuo intervento, comunque se hai eliminato alcune parti per rendere la voce più chiara, puoi prendere in considerazione l'idea di scrivere le parti che hai tolto nelle voci più specifiche o creare nuove voci che contengano tali argomenti. --Aushulz (msg) 14:27, 3 lug 2009 (CEST)[rispondi]

Buongiorno, ho letto il codice, ma non capisco alcune cose e sono presenti degli errori concettuali oltre che di codifica: Innanzitutto il calcolo delle 3 grandezze deve avvenire contemporaneamente e sulla stessa base di tempo, altrimenti hai un sistema che è lentissimo (oltre che potenzialmente non funzionante): prendiamo il caso dell'integrale, solo per fare questa procedura passa 0,1s... ok finchè devi regolare la temperatura in una stanza, ma se hai qualcosa un attimo più veloce nei cambiamenti non ci stai più dietro. Fare un integrale su 20 acquisizioni (0,1s) e e poi fare il differenziale su 0,05s che senso ha? Bisogna usare la stessa base di tempo che è la base di variazione dell'errore (quindi dell'ingresso) Poi vengono determinati i valori del PID sulla base dell'acquisizione dell'A/D... ma la base di calcolo (l'ingresso del PID) è l'errore (differenza tra setpoit e valore misurato)! nell'integrale il discorso della "media mobile" (che di fatto non viene utilizzata, e non capisco nemmeno a cosa dovrebbe servire, visto che cambiare "a" significa solo di fatto cambiare il dx, ) non viene poi utilizzato, il dx è di fatto un termine costante, il delay dovrebbe essere pari al dx e non un numero puro, Ki non è inizializzato. Nella derivata... manca la derivata! è solo la differenza tra due valori successivi, bisogna dividere per il dx (che anche in questo caso è pari a quei 5ms del delay) Le funzioni prendono tutte "grandezza" in ingresso... e poi non la usano, così come la funzione errore, è scritta e non viene usata.

Ho dei seri dubbi che questo codice possa essere funzionante, se non per pura fortuna

correzioni nel codice per arduino[modifica wikitesto]

time, previoustime e interval è inutile identificarlo come float, anzi dopo poco tempo si azzererebbero per overflow, in genere le variabili contenti millis() vanno specificate come unsigned long

Collegamenti esterni modificati[modifica wikitesto]

Gentili utenti,

ho appena modificato 1 collegamento esterno sulla pagina Controllo PID. Per cortesia controllate la mia modifica. Se avete qualche domanda o se fosse necessario far sì che il bot ignori i link o l'intera pagina, date un'occhiata a queste FAQ. Ho effettuato le seguenti modifiche:

Fate riferimento alle FAQ per informazioni su come correggere gli errori del bot.

Saluti.—InternetArchiveBot (Segnala un errore) 03:57, 14 mar 2019 (CET)[rispondi]

La prima parte in pseudo-codice è chiarissima, concisa e esente da errori.

Invece il codice presentato come esempio fa solo confusione. Questo codice si riferisce a una implementazione particolare, che risente pesantemente del contesto per cui è stata scritta. La misura della derivata viene fatta tra il campione attuale e tre campioni indietro nel tempo e questo è un trucco per diminuire il rumore di quantizzazione. Un trucco valido solo nel contesto del processore per cui è stato scritto il firmware e legato alla tempistica della particolare implementazione per cui è stato pensato.

Per me il codice presentato come esempio sarebbe da eliminare. Bisognerebbe piuttosto ampliare la sezione sui metodi di calcolo per i coefficienti Kp, Ki e Kd, che è il vero punto critico di questi algoritmi.

Se volete controllare le mie conoscenze, sono Livio, il creatore del Theremino System.

Saluti a tutti. Livio

Mi scuso se ho sbagliato il punto di intervento, non sono un esperto di questa enciclopedia. Eventualmente correggete il mio messaggio...Questo commento senza la firma utente è stato inserito da ‎87.8.213.160 (discussioni · contributi).

Per quanto riguarda lo pseudocodice, a tempo discreto quale è e deve essere, dt non dovrebbe essere usato nelle operazioni di calcolo.
Circa l'implementazione per quel PIC un'implementazione reale non mi dispiace, però dovrebbero essere esplicitati i trucchetti, altrimenti passa l'idea che siano operazioni generiche. Se non ricordo male la velocità dell'ADC della 16F penso che il ritardo per approssimare la derivata sia pure troppo. --Vito (msg) 12:04, 2 giu 2019 (CEST)[rispondi]

Concordo appieno con Vituzzu e anche secondo me il ritardo per approssimare la derivata è troppo.

Inoltre c'è un grosso errore nei coefficienti del Metodo Ziegler–Nichols.

- Nella colonna Ki il valore della seconda riga "1,2 * Kp / Pu" dovrebbe invece essere "Kp * Pu / 1.2"

- E il valore della terza riga "2 * Kp / Pu" dovrebbe invece essere "Kp * Pu / 2"

Controllare in questa pagina : https://en.wikipedia.org/wiki/Ziegler%E2%80%93Nichols_method

Se non si fanno queste correzioni si calcola un valore di Ki notevolmente maggiore, che porta sicuramente il sistema in oscillazione.

Saluti LivioQuesto commento senza la firma utente è stato inserito da 87.8.213.160 (discussioni · contributi).

Non sono nemmeno entusiasta sul fatto che molte operazioni si potrebbero semplificare, vabbè che a 200hz ci stiamo larghi, però un esempio didattico dovrebbe puntare a diffondere buone pratiche utili per ottenere bande passanti maggiori. Per i coefficienti il primo libro che ho sottomano è il Basso, Chisci, Falugi prendo i valori da lì usando la notazione tradizionale in termini di Ti e Tc, penso che gli errori nascano proprio dal tentativo di abbandonarla. --Vito (msg) 12:54, 2 giu 2019 (CEST)[rispondi]

Forse anche la mia correzione è sbagliata. In effetti semplificare la notazione Ti e Tc non è facile e per arrivare a formule certe mi ci vorrà del tempo. Però sono sicuro che le due formule scritte in questa pagina per Ki sono sbagliate. Facciamo un caso pratico (che è abbastanza significativo e che conosco bene perché ci lavoro da mesi):

- Oscillation frequency = 4.7 Hz

- Period = 0.213 sec

- Ki (secondo la formula di questa pagina 2 * Kp / Tu) = 2 * 0.6 = 5.6

E un valore oltre il 5 è assolutamente esagerato, ho anche provato a usarlo ma il tutto auto-oscilla solo a guardarlo. Il valore giusto è intorno a 0.06.

Saluti Livio


Ho fatto e rifatto i calcoli e sono certo che le formule di questa pagina sono sbagliate.

Nel caso completo del PID e partendo dalle formule della pagina : https://en.wikipedia.org/wiki/Ziegler%E2%80%93Nichols_method i coefficienti Ki e Kd (per il guadagno) vengono così:

Ti = Tu / 2

Ki = Kp / Ti

Ki = Kp * 2 / Tu

Ki(Gain) = 1 / Ki

Quindi Ki(Gain) = 1 / Kp * Tu / 2


Td = Tu / 8

Kd = Kp * Td

Kd = Kp * 8 / Tu

Kd(Gain) = 1 / Kd

Quindi Kd(Gain) = 1 / Kp * Tu / 8

Sarebbe quindi bene far controllare i miei ragionamenti da un matematico e poi correggere le formule.

Saluti Livio

A parte le correzioni, che vanno fatte e controllate comunque, secondo me le due sezioni con il codice esempio e lo pseudocodice sono troppo specifiche per questa voce che parla in generale del controllo PID (come è stato fatto notare), per cui andrebbero spostate da un'altra parte (Wikibooks o forse meglio Wikiversità). --Daniele Pugliesi (msg) 18:36, 2 giu 2019 (CEST)[rispondi]

Lascerei lo pseudo-codice, è conciso e ben scritto. In poche righe mostra la semplicità del metodo PID. Senza quel codice si potrebbe pensare al PID come ad un algoritmo complesso. Ma il PID è estremamente semplice sia da capire che da codificare e quel pezzetto di codice lo dimostra più di mille parole.

Ok. Ho tolto dalla voce il codice di esempio. Se qualcuno volesse trasferirlo ad altro progetto (verificando che funzioni ed eventualmente correggendolo), si trova qui.
Riguardo allo pseudocodice, si tratta comunque di un testo senza fonti, per cui probabilmente in futuro verrà eliminato anche questo dalla voce. --Daniele Pugliesi (msg) 09:52, 3 giu 2019 (CEST)[rispondi]

Ecco una buona fonte per lo pseudo-codice: http://www.concordia.sk/programming/machine-learning-robotics/193-pid-regulator Nella pagina del link lo pseudo-codice è indentato meglio che qui. - E' contornato da buone spiegazioni - C'è anche una immagine che schematizza il PID meglio di quella attuale. - Ci sono link a un codice completo e alle simulazioni. Per piacere aggiungete voi il link, non vorrei fare dei pasticci.

Riguardo alle formule sono definitivamente sbagliate, la seconda riga deve essere Ki = Pu / 1.2 e la terza Ki = Pu / 2 potete controllare a pagina 13 di questo PDF http://luigiglielmo.eu/wp-content/uploads/2014/12/PID.pdf

Ecco un altro link che conferma che la formula per l'integrale è sbagliata: http://pages.mtu.edu/~tbco/cm416/zn.html

Ecco un altro link che conferma che la formula per l'integrale è sbagliata: http://www.cumacini.altervista.org/Sistemi/Ziegler_Nichols.pdf


Visto che nessuno lo faceva ho corretto io la tabella del metodo Ziegler/Nichols. Se qualcuno ha dei dubbi controlli i link che ho fornito qui sopra.

Grazie. --Daniele Pugliesi (msg) 15:41, 29 giu 2019 (CEST)[rispondi]