cz
en

Zaregulovávání soustav v Domat IDE, 2. část

Dopravní zpoždění


Dopravní zpoždění je doba, která uplyne mezi akčním zásahem a jeho projevením se na měřené hodnotě. Typicky jde o čas, který zabere doprava média mezi ventilem a čidlem. Snažíme se, aby tato doba byla co nejkratší, ideálně v řádu sekund. Při dlouhém dopravním zpoždění může být soustava až nezaregulovatelná. Voda se v potrubí pohybuje rychlostí cca. 1 m/s, vzduch ve VZT kanálu asi 2 – 5 m/s. Proto by například u VZT s vodním ohřevem měl být regulační ventil co nejblíže registru ohřevu a čidlo teploty na vzduchu bezprostředně za ventilátorem (při dodržení zklidňovací délky potrubí).

Na následujícím obrázku je simulovaný průběh vstupů a výstupu PI regulátoru, který reguluje soustavu 1. řádu se zesílením 0,9 a časovou konstantou 20 s. Dopravní zpoždění soustavy je 0 s. Parametry regulátoru jsou Xp = 15 K, Ti = 30 s.

Regulátor s Xp = 15 K, Ti = 30 s, soustava bez dopravního zpoždění

Po zavedení jednotkového skoku (změna požadované hodnoty z 20 na 22 °C) skutečná hodnota (zelená) plynule dosáhne hodnoty požadované (modrá), výstup regulátoru (červeně) se ustálí během asi 20 s na nové hodnotě. To lze považovat za ideální chování.

Jakmile ovšem zavedeme do soustavy dopravní zpoždění – zde 3 s, v praxi by to bylo více –, například nahradíme elektroohřev s topnými spirálami vodním ohřívačem, ustálení již trvá několikanásobně déle (asi 40 s), nicméně stále bychom mohli systém mít za dobře nastavený:

Regulátor s Xp = 15 K, Ti = 30 s, dopravní zpoždění soustavy 3 s

Pokud dopravní zpoždění dále zvýšíme, stačí na 5 s, k čemuž stačí při montáži prodloužit vzdálenost mezi ventilem a registrem ohřevu, k ustálení dojde až za skoro 2 minuty a navíc dochází k překmitu (což u vzduchotechniky nevadí, ovšem u horkovodního výměníku by již mohl vybavit bezpečnostní termostat):

Regulátor s Xp = 15 K, Ti = 30 s, dopravní zpoždění soustavy 5 s

Kdybychom chtěli toto chování zlepšit, začneme nejspíše zvětšením šířky pásma. Po jejím zdvojnásobení na 30 K se soustava již chová přijatelně:

Regulátor s Xp = 30 K, Ti = 30 s, dopravní zpoždění soustavy 5 s

Podobně bychom řešili i reálné regulační obvody.

Ofset


U některých situací můžeme využít ofset, tedy vodorovný posun charakteristiky.

Význam ofsetu

Typické použití je u kaskádní regulace teploty, kdy první PI regulátor porovnává skutečnou teplotu v místnosti s požadovanou hodnotou a jeho výstupem je korekce teploty pro požadovanou hodnotu na přívodu. Zjednodušené schéma je zde:

Bloky programu pro kaskádní regulaci teploty

Regulátor prostoru bude nastaven tak, aby při rozdílu teploty v prostoru a požadované teploty poskytl korekci požadované teploty přívodní. Omezovací blok zajišťuje dodržení hygienického minima a maxima (15 … 35 °C). Na obrázku je rozdíl teplot 20 – 19 = 1 K, systém lehce nedotápí, proto je požadovaná hodnota na přívodu zvýšena o 5 K na 25 °C.

Minimum a maximum


V předchozím případě pracujeme ale také s parametry Min a Max. Jde o meze, v nichž se smí pohybovat výstupní signál. Výchozí hodnoty jsou 0 a 100 %, což odpovídá většině výstupních periferií, jako jsou ventily a klapky – rozsah 0 až 100 % dává smysl pro vizualizaci i uvádění do provozu, ve výstupním driveru se tato hodnota převádí na fyzický signál 0…10 V či 4…20 mA.

V kaskádní regulaci není u regulátoru prostoru Min a Max nastaveno na 0 a 100 (%), ale -10 a 10 (K). V těchto hodnotách se totiž bude pohybovat korekce. Z toho plyne i nastavení šířky pásma – tento parametr je z důvodů kompatibility se staršími verzemi programu vztažen na 100 jednotek výstupu, tedy běžně na 0…100 %. Je to vlastně definice strmosti. Zde máme ovšem rozsah výstupu -10 … 10 = 20 K, tedy při nastavení Xp = 20 bude efektivní šířka pásma 4 K (18 … 22 °C).

Ofset v kaskádním regulátoru pro prostor

Platí tedy:

Xp = 100 * Xpeff / (Max – Min)

přičemž aby při rovnosti teploty požadované a teploty v prostoru byl výstup korekce 0, musíme celou křivku posunout doprava o ofset

Of = Xpeff / 2

Nezapomeňme, že Xpeff, efektivní šířka pásma, je rozsah změn měřené veličiny, který u P regulátoru odpovídá rozsahu výstupního signálu – na obrázku výše se pohybujeme po šikmé části charakteristiky: x je v intervalu 18 … 22 °C, výstup v intervalu -10 … 10 K. Podobně pro Xpeff = 8 K (tedy korekce by byla 10 K při rozdílu teplot 4 K) bychom nastavili Xp = 40, Of = 4.

Někdy se v praxi toto poměrně komplikované nastavení obchází tak, že se regulátor nechá s výchozími mezemi 0 … 100 % nebo -100 … 100 % a korekce se následně spočítá pomocí dvoubodové lineární transformace:

Bloky programu pro kaskádní regulaci teploty s přepočtem výstupu regulátoru v prostoru

Vlastní PI(D) regulátor


Ostatní parametry PI regulátoru jsou popsány v nápovědě k Domat IDE. V knihovně najdeme ještě regulátor PID, který navíc obsahuje derivační složku, ale ten se používá jen výjimečně. Vzhledem ke komplikovaným vlastnostem regulovaných soustav je bezpečnější použít dostatečně zatlumený PI regulátor, čímž se zvýší stabilita regulovaného okruhu.

Někdy se může stát, že implementace PI regulátoru ze standardní knihovny Lib.Core nebude pro určité použití vyhovovat: například by mohlo být vhodné při vypnutí a opětovném zapnutí regulátoru zachovat naintegrovanou I-složku. V jazyce ST je samozřejmě možné napsat regulátor vlastní, třeba podle oblíbeného kódu, se kterým již máme zkušenost a na který jsme zvyklí. PI regulátor, který má místo šířky pásma jako parametr zesílení (vstup K), může v Domat IDE vypadat například takto:

NAMESPACE Lib NAMESPACE Core NAMESPACE V1_0
FUNCTION_BLOCK PI
      VAR
            tmp : REAL;                  
            e : REAL;
            EPrev : REAL;
            y : REAL;
            YPrev : REAL;
            Integral : REAL;
            IYes : BOOL;
      END_VAR
           
      VAR_INPUT
            In : REAL := 0; // x – měřená hodnota
            SetPoint : REAL := 0; // w – požadovaná hodnota
            IsDirect : BOOL := FALSE; // charakteristika „topení“
            Enabled  : BOOL := TRUE;
            Bp  : BOOL := FALSE;
            K  : REAL := 1; // zesílení
            Off : REAL := 0;
            Ti  : REAL := 120; // integrační konstanta, v s
            IMin : REAL := 0; // dolní mez
            IMax : REAL := 100; // horní mez
            Disval : REAL := 0; // výstupní hodnota při stavu „disabled“
      END_VAR
           
      VAR_OUTPUT
            Out : REAL;
            PFactor : REAL;
            IFactor : REAL;
      END_VAR

      INIT
            YPrev := 0;
            y := 0;
            Integral := 0;
            IYes := TRUE;
      END_INIT
      (*function block's body*)
      e := SetPoint - In;
      IF IsDirect THEN
            e := -e;
      END_IF;
      IF IMax < IMin + EPSILON THEN
            Out := IMax;
            EPrev := e;
            (* and quit; *)
      ELSE
            IF Ti <= 0.0 THEN
                  Integral := 0.0;
                  IYes := FALSE;
            END_IF;
            IF K <= 0.0 THEN
           
                  IF IsDirect THEN
                        IF In <= (SetPoint + Off) THEN
                              Out := IMin;
                        ELSE
                              Out := IMax;
                        END_IF;
                  ELSE (* if is reverse *)
                        IF In <= (SetPoint + Off) THEN
                              Out := IMax;
                        ELSE
                              Out := IMin;
                        END_IF;
                  END_IF;
                  EPrev := e;
                  (* and quit; *)
            ELSE
                  IF NOT Enabled THEN
                        Out := Disval;
                        Integral := 0.0; //nuluje I složku při zakázání
                        EPrev := e;
                        (* and quit; *)
                  ELSE
                        IF Bp THEN
                              IYes := FALSE;
                              Integral := 0.0;
                        END_IF;
                        IF IsDirect THEN
                              y := K * (e - Off);
                        ELSE
                              y := K * (e + Off);
                        END_IF;
                        IF y < IMin THEN y := IMin; END_IF;
                        IF y > IMax THEN y := IMax; END_IF;
                        PFactor := y;
                        IF IYes THEN
                              (* dy *)
                              tmp := time_to_real( GetDeltaTime() ) * (EPrev + e) * 0.5 / 1E07;
                              IF ( YPrev < IMin + EPSILON AND tmp > 0.0 ) OR
                                 ( YPrev >= IMax - EPSILON AND tmp < 0.0 ) OR
                                 ( YPrev > IMin + EPSILON AND YPrev < IMax - EPSILON )
                                 THEN
                                          Integral := Integral + (K / Ti * tmp );
                              END_IF;
                              IF y + Integral > IMax THEN
                                   Integral := IMax - y;
                              END_IF;
                              IF y + Integral < IMin THEN
                                   Integral := IMin - y;
                              END_IF;                           
                              y := y + Integral;
                        END_IF;                      
                        IF y < IMin THEN y := IMin; END_IF;
                        IF y > IMax THEN y := IMax; END_IF;
                        Out := y;
                       
                        YPrev := y;
                        EPrev := e;            
                  END_IF;
            END_IF;
      END_IF;
      Ifactor := Integral;
END_FUNCTION_BLOCK

END_NAMESPACE END_NAMESPACE END_NAMESPACE

Tento regulátor by se dal použít například tam, kde výstupní signál má stejnou fyzikální veličinu jako signály vstupní, například při regulaci výkonu FVE. (S nulovou I konstantou a výchozím zesílením 1 funguje v podstatě jako odečítací blok.) Funkční blok využívá některé standardní knihovní prvky, proto je součástí jmenného prostoru Lib.Core.V1_0, stejně jako standardní knihovní P/PI/PID regulátory.