Compito di laboratorio 4: Controllo PI

Implementazione di un semplice controller PI

Data una variabile di processo \(PV\) e un setpoint \(SP\), il controllo proporzionale-integrale-derivativo determina il valore di una variabile manipolata MV mediante l’equazione

\[\begin{align} MV & = \bar{MV} + k_p\left(SP - PV\right) + k_i \int_0^t \left(SP-PV)\right)dt \end{align}\]

dove \(k_p\) e \(k_i\) sono rispettivamente il coefficiente proporzionale e quello integrale. Il valore \(\bar{MV}\) è un valore nominale o iniziale della variabile manipolata.

L’effettiva implementazione del controllo PI viene normalmente eseguita calcolando quanto \(MV\) dovrebbe cambiare in ogni fase temporale. Definire l’errore al momento \(k\) come

\[\begin{align} e_k & = SP_k - PV_k \end{align}\]

quindi i valori consecutivi di \(MV\) sono dati da

\[\begin{align} MV_{k-1} & = \bar{MV} + k_p e_{k-1} + k_i \sum_{j=0}^{k-1} e_{j} \\ MV_{k} & = \bar{MV} + k_p e_{k} + k_i \sum_{j=0}^{k} e_{j} \end{align}\]

Prendendo le differenze si ottiene una formula pratica per aggiornare il valore di \(MV\) in risposta alle misurazioni

\[\begin{align} MV_{k} & = MV_{k-1} + k_p(e_{k} - e_{k-1}) + k_i e_{k} \end{align}\]

Il codice seguente definisce un oggetto Python che implementa questo algoritmo.

class PI:
    def __init__(self, kp=1, ki=0, MV=0):
        self.kp = kp
        self.ki = ki
        self.e_prev = 0
        self.MV = MV

    def update(self, SP, PV):
        e = SP - PV
        self.e = e
        self.MV += self.kp * (e - self.e_prev) + self.ki * e
        self.MV = max(0, min(100, self.MV))
        self.e_prev = e
        return self.MV

Esercizio 1. Eseguire il tuning del controllore PI per il laboratorio di controllo della temperatura

La cella seguente fornisce un’implementazione iniziale del controllo PI per il riscaldatore T1. Questo è configurato per testare con la modalità di simulazione offline di tclab. Sperimenta la simulazione per trovare i valori appropriati per \(k_p\) e \(k_i\). L’obiettivo della progettazione è raggiungere il setpoint e rimanere all’interno di una zona di +/- 2 gradi il più rapidamente possibile.

from tclab import setup, clock, Historian, Plotter

TCLab = setup(connected=False, speedup = 20)

pi = PI(kp=2, ki=0.1)
SP = 50

with TCLab() as lab:
    h = Historian(lab.sources)
    p = Plotter(h, 800)
    for t in clock(800):
        PV = lab.T1               # measure the the process variable
        MV = pi.update(SP, PV)    # PI control to determine the MV
        lab.Q1(MV)                # set the heater power
        p.update(t)               # log data

TCLab Model disconnected successfully.

Esercizio 2. Test hardware del controller PI

  • Copia e incolla il codice sopra nella cella sottostante. Collega il codice all’hardware tclab modificando ‘connesso’ a ‘Vero’. Regola l’orizzonte dell’esperimento su 1200 secondi per avere tutto il tempo necessario per i test.

  • Metti alla prova il tuo controller. Le prestazioni corrispondono alla simulazione?

  • Dopo che il controller ha raggiunto il setpoint, introdurre un disturbo. Un esempio di disturbo potrebbe essere aumentare il flusso d’aria attorno al dispositivo o toccare il riscaldatore con qualcosa di termicamente conduttivo (fai attenzione, non usare le dita. 50 gradi C sono abbastanza caldi da bruciare la pelle).

  • Aggiungi una cella di testo qui sotto e commenta i tuoi risultati. Vedete delle carenze in questa implementazione del controllo?

# put your code here

Scrivi i tuoi commenti in questa cella.

Esercizio 3. Controllo PI multivariabile

L’esercizio successivo consiste nell’estendere il sistema per controllare entrambi i riscaldatori. Non avrai abbastanza tempo in laboratorio per farlo sperimentalmente, quindi esegui questo esercizio utilizzando la modalità di simulazione di tclab.

  • Copia e incolla il codice dell’esercizio 1 nella cella sottostante.

  • Aggiungi un secondo controller PI (rinomina il primo pi_1 e chiama il secondo pi_2, ad esempio). Regolare il setpoint per il primo riscaldatore a 40 gradi C e il secondo a 35 gradi C. Sintonizzare i controller per ottenere una rapida acquisizione dei setpoint.

# put your code here