Controllo Temperatura con controllo PID (TCONT_S)

Supponiamo di dover controllare la temperatura di un liquido all’interno di un serbatoio. Come esempio facciamo riferimento al processo simulato creato precedentemente in questo articolo.

Per effettuare il controllo della temperatura del liquido dell’esempio precedentemente indicato useremo un PID, ovvero il TCONT_S (FB59).

Dal manuale Siemens possiamo vedere che questo PID è quello più adatto al nostro caso, infatti il manuale dice: “The TCONT_S instruction is used on SIMATIC S7 automation systems to control technical temperature processes with binary manipulated value output signals”.
Quindi questo tipo di PID (che in realtà è un PI) è adatto per controllare la temperatura di un processo attraverso un uscita Booleana. Nel nostro caso l’output del PID ha la funzione di interrompere o meno il passaggio della corrente nella resistenza (che viene usata per scaldare il liquido) attraverso l’utilizzo di un relè a stato solido (SSR).

Per comodità creiamo una FB dove inseriremo il PID (e faremo anche altre operazioni di conversione, ricordandoci che in questo caso stiamo controllando un processo simulato) e poi richiameremo un istanza di questa funzione all’interno di un altro “Cycle time Interrupt” (OB32). Infatti una nota molto importante è che il PID deve essere eseguito ad intervalli regolari, ed inoltre il tag di input “CYCLE” del PID deve avere lo stesso valore del periodo dell’OB32.

Ovviamente anche in questo caso bisogna tenere conto del teorema del campionamento e quindi la frequenza di esecuzione del PID (che per evitare fraintendimenti è pari all’inverso del periodo di esecuzione del PID, ovvero “CYCLE”) deve essere almeno doppia alla banda del sistema a ciclo chiuso (cioè del sistema controllato, e quindi non di quello in catena aperta).

La FB che contiene il PID TCONT_S (programmata in LAD), avrà le seguenti variabili:

Input:

  • “temperatura” di tipo “Real”
  • “manual_mode” di tipo “Bool”
  • “tempo_integrale_Ti” di tipo “Real”
  • “guadagno _PID” di tipo “Real”
  • “set_point” di tipo “Int”
  • “Cycle_PID” di tipo Real

Output:

  • “out_relay” di tipo “Bool”

Static:

  • “set_point_dint” di tipo “DInt”
  • “set_point_real” di tipo “Real”
  • “TCONT_S_Instance” di tipo “TCONT_S”

e sarà:

PID_controller_fine

Taratura PI:

Siccome il processo che sto simulando non presenta alcun ritardo, per la taratura del PI non posso sicuramente usare il metodo di Ziegler-Nichols in anello aperto (che è comunque un metodo empirico non molto preciso), decido quindi di analizzare la funzione di trasferimento del sistema e studiare il tutto attraverso il luogo delle radici (utilizzando Matlab).

La funzione di trasferimento del sistema che dobbiamo controllare (il sistema che stiamo simulando) sarà:

prima

Invece la f.d.t del PID sarà:

seconda

Quindi la funzione di trasferimento F(s) in anello aperto è:

terza

Aiutandoci con il luogo delle radici (tracciato con Matlab) ho la seguente situazione:

matlab2

Ovviamente nella realtà non possiamo effettuare una cancellazione zero-polo (ovvero in questo caso scegliendo Ti=300) in quanto non si conosce mai il modello esatto del sistema, ma avremmo sempre un modello approssimato. Quindi dobbiamo scegliere prima il tempo di integrazione, e il criterio con cui viene solitamente scelto è quello di rispettare una specifica sul tempo di assestamento; essendo il sistema a ciclo chiuso un sistema del secondo ordine, il tempo di assestamento è pari a:

quinto

dove α è la parte reale del polo dominante a ciclo chiuso (ovviamente deve essere negativa).

quindi se supponiamo per semplicità di volere un tempo di assestamento minore o uguale di 3 secondi allora dovrà essere: α<= -1 .

Dalla figura del luogo delle radici sopra posso vedere che mettendo Ti=1 sto rispettando sicuramente questa specifica.

Tuttavia bisogna anche considerare che più è basso il tempo di integrazione scelto più dovrà essere alta la frequenza di esecuzione del Cycle Time Interrupt che contiente il PID, infatti anche il manuale della Siemens consiglia che il periodo con cui viene eseguito il Cycle time Interrupt non sia superiore al 10% del tempo di integrazione Ti del PID (ovvero testuali parole: “The CYCLE sampling time match the time difference between two calls (cycle time of the cyclic interrupt OB taking into account the reduction ratios). The controller sampling time should not exceed 10% of the calculated integration time of the controller (TI)” ).

Pertanto visto che il sistema ad anello aperto ha una costante di tempo abbastanza grande (ovvero 300 sec) scelgo di eseguire il Cycle time Interrupt del PID ogni 200 ms e di conseguenza il tempo Ti dovrà essere maggiore di 0.2*10=2 sec. Scegliamo quindi un tempo di integrazione superiore a 2 secondi ma non troppo (altrimenti diminuirebbe il contributo dell’azione integrale), ovvero scelgo Ti= 5 sec.

Pertanto tracciando nuovamente il luogo delle radici con Matlab della f.d.t. ad anello aperto:

quarta

ottengo:

rlocus2

Il valore di kp nel punto doppio a sinistra è pari ad 2.38, pertanto per evitare di avere dei poli complessi coniugati nella f.d.t a ciclo chiuso (e quindi un oscillazione dell’uscita) dovrò scegliere un valore di Kp sufficientemente superiore ad 2.38 . Scelgo Kp=30,  e traccio il diagramma di Bode della f.d.t a ciclo chiuso per trovare la banda a 3 dB e verificare che sia inferiore alla metà della frequenza di esecuzione del PID (per rispettare il teorema del campionamento). Ricordando che abbiamo scelto un periodo di esecuzione del PID pari a 0.2 sec avremmo:

quinta

Quindi come detto traccio il diagramma di Bode della f.d.t a ciclo chiuso per verificare che il teorema del campionamento sia rispettato. Ossia:

bode111

mentre il diagramma:

bode222

Come si può vedere la specifica sulla banda passante è rispettata. Ricapitolando abbiamo

  • CYCLE=0.2 sec
  • Kp=30
  • Ti=5 sec

A questo punto come detto precedentemente verrà richiamata un istanza di questa funzione in un “Cycle time Interrupt” (OB32), cioè:

istanza_PID_questa

 

 

 

You may also like...


Warning: count(): Parameter must be an array or an object that implements Countable in /membri/fabioplc/wp-includes/class-wp-comment-query.php on line 399
Menu Title