PID regulátor

Odpovědět
peetr1
Příspěvky: 6
Registrován: 02 dub 2021, 17:26

PID regulátor

Příspěvek od peetr1 »

Zdravím všechny na tomto fóru,
řeším programování PID regulátoru, kterým chci ovládat regulační ventil páry na primární straně výměníku pára/voda a udržovat žádanou teplotu na sekundární straně vody výměníku tepla. Ventil je ovládaný analogovým výstupem 0-10V. Může se otevírat, zavírat. Pracuje v obou směrech.

Řeším v první řadě vlastní program, vytvářím v ŘS IDEC Microsmart. Následně bude alchymie v samotném nastavení parametrů P.I.D regulátoru. Nevím jestli jsem tuto regulaci správně pochopil, takže zkusím popsat mé postřehy. Budu rád, když se mě někdo zkušený k dané problematice vyjádří.

Můj uvažovaný postup:
1. Naprogramuji parametr: "čas zásahu serva t". Pod tím si představuji čas jednoho cyklu "t", ve kterém sečtu U_P + U_I + U_D = U, a tento sečtený akční zásah "U" pošlu na výstup serva. Pokud bude akční zásah U záporný, servo se o tuto hodnotu zavře, pokud bude akční zásah U kladný, servo se o tuto hodnotu otevře. U_P je proporcionální akční veličina, U_I je integrační akční veličina, U_D je derivační akční veličina. Nevím jestli je tato úvaha správná. Variantně se nabízí myšlenka naprogramovat tři nezávislé a různé časy, ve kterých servo bude zasahovat (individuální čas pro U_P, individuální čas pro U_I , individuální čas pro U_D). Nevím jak se to prakticky řeší. Mám to programovat tak, aby si každý akční zásah žil vlastním životem? Přijatelnější se mi jeví jednotná nastavitelná frekvence (např 2s, 3s,4s,5s, xs), ve které budu posílat výsledný sečtený zásah "U" na výstup serva. Jednotlivé sčítance popisuji v následných bodech 2 až 4.

2. Proporcionální akční zásah U_P. V mém případě je regulační odchylka rovna rozdílu teplot "e = žádaná teplota - skutečná teplota". Akční zásah je potom U_P=r_p* e. Kde "r_p" je koeficient. Pokud bude skutečná teplota vyšší než požadovaná, U_P bude záporné = požadavek na zavírání serva, pokud bude skutečná teplota nižší než požadovaná, U_P bude kladné = požadavek na otevírání serva.

3. Integrační akční zásah U_I. Integrace funkce je plocha pod křivkou. V reálném prostředí je integrace nahrazena sumací. Integrační zásah bude U_I(n) = U_I * (n-1) + r_I * e. Kde "r_I" je koeficient. A teď nevím úplně přesně jak tu plochu vytvářet. Kolikrát to mám v jednom časovém kroku (dle bodu 1) provést? Jenom jednou? Nebo stokrát? Má to vliv na kvalitu regulace? Kvalitativněji bude plocha křivky přesnější, kdybych tu operaci prováděl cca 1 krát za 10 ms, než 1 krát za 3 s. Nevím jak to praktikovat. Pokud nastavím "čas zásahu serva t" v bodě 1. například t=3s, tak se mě jeví přijatelnější provést výpočet podle vzorce pouze jedenkrát než stokrát. Pokud bude odchylka "e" záporná, připočte se k sumě záporný člen. Pokud bude odchylka "e" kladná, připočte se k sumě kladný člen. Požadavek na otevírání/zavírání serva bude záležet na hodnotě celé sumy U_I(n). Kladná hodnota U_I(n) = požadavek na otevírání serva, záporná hodnota U_I(n) = požadavek na zavírání serva.

4. Derivační akční zásah U_D. Derivace je směrnice tečny. V reálném prostředí je derivace nahrazena diferencí. Derivační zásah bude: U_D = r_D * (e- e_předcházející). Kde "r_D" je koeficiet. Mám to namyšlené tak, že pokud bude čas zásahu serva (dle bodu 1) např. 3s, tak "e_předcházející" odečtu hned na začátku cyklu cca v 10 ms, "e" odečtu na konci cyklu cca 2950 ms. Pokud bude rozdíl "(e- e_předcházející)" záporný, U_D bude záporné = požadavek na zavírání serva, pokud bude rozdíl "(e- e_předcházející)" kladný, U_D bude kladné = požadavek na otevírání serva.

Děkuji že jste příspěvek dočetli až do konce a budu se těšit na Vaše postřehy.
MartinL
Příspěvky: 206
Registrován: 24 úno 2013, 14:13
Kontaktovat uživatele:

Re: PID regulátor

Příspěvek od MartinL »

peetr1 píše: 02 dub 2021, 20:19 řeším programování PID regulátoru, kterým chci ovládat regulační ventil páry na primární straně výměníku pára/voda a udržovat žádanou teplotu na sekundární straně vody výměníku tepla. Ventil je ovládaný analogovým výstupem 0-10V. Může se otevírat, zavírat. Pracuje v obou směrech.
Nejprve bych si ujasnil, jak ten ventil opravdu funguje. Dle výše uvedeného tvrzení bych chápal, že to řídicí napětí 0-10V odpovídá přímo otevření ventilu 0-100% (tj. pak potřebuji polohový tvar PID). V bodě 1. je však popisováno, že se servo O HODNOTU otevře/zavře (to by odpovídalo přírustkovému řízení).
peetr1 píše: 02 dub 2021, 20:19 Můj uvažovaný postup:
1. Naprogramuji parametr: "čas zásahu serva t". Pod tím si představuji čas jednoho cyklu "t", ve kterém sečtu U_P + U_I + U_D = U, a tento sečtený akční zásah "U" pošlu na výstup serva. Pokud bude akční zásah U záporný, servo se o tuto hodnotu zavře, pokud bude akční zásah U kladný, servo se o tuto hodnotu otevře. U_P je proporcionální akční veličina, U_I je integrační akční veličina, U_D je derivační akční veličina. Nevím jestli je tato úvaha správná. Variantně se nabízí myšlenka naprogramovat tři nezávislé a různé časy, ve kterých servo bude zasahovat (individuální čas pro U_P, individuální čas pro U_I , individuální čas pro U_D). Nevím jak se to prakticky řeší. Mám to programovat tak, aby si každý akční zásah žil vlastním životem? Přijatelnější se mi jeví jednotná nastavitelná frekvence (např 2s, 3s,4s,5s, xs), ve které budu posílat výsledný sečtený zásah "U" na výstup serva. Jednotlivé sčítance popisuji v následných bodech 2 až 4.
Pokud používám PID regulátor, tak není důvod to nějak dělit (nikdy jsem to neviděl). Vždy se spočítají jednotlivé složky (nebo se dokonce počítají společně, když se ten výpočet chce optimalizovat) a provede se celý zásah. Pozor je nutné zajistit, aby vypočtená hodnota zůstávala v rozsahu akčního členu (otevření ventilu 0-100%). Což se provádí omezením vypočtené hodnoty do požadovaného rozsahu a hlavně zastavením integrace při překročení rozsahu (tzv. antiwindup).
Tak jak je výpočet jednotlivých složek uveden dále, tak to odpovídá polohovému tvaru PID. Tj. Není to změna polohy serva, ale přímo poloha (viz. poznámka výše).

Literatury ohledně PID regulace je dostatek, stačí se trochu porozhlédnout. Bohužel mnohem větší problém je nastavení parametrů toho regulátoru (periody výpočtu, r_p, r_I, r_D). Ještě poznámka k výpočtu té integrační složky, zde není nutné řešit nějakou přesnost, standardně se to počítá jako obdélníková (maximálně lichoběžníková) náhrada integrálu pro celou periodu výpočtu (tj. 1 za periodu).
peetr1
Příspěvky: 6
Registrován: 02 dub 2021, 17:26

Re: PID regulátor

Příspěvek od peetr1 »

Děkuji za reakci.
Servo není řízeno tříbodově, ale má analogový výstup. To znamená, že na výstup 0-100% posílám číslo 0-10000. Toto číslo se přes převodník převede na napětí 0 až 10 V. Pokud tedy pošlu na výstup číslo 3300, na výstupu převodník vygeneruje napětí 3,3 V a servo se nastaví na 33%. Tuto hodnotu výstupu mám někde v datové buňce uloženou. Beru to tak, že pokud mě vyjde například celkový akční zásah "U" kladný (třeba číslo 120), sečtu tuto hodnotu se skutečnou polohou serva 3300+120 = 3420 a přenastavím servo na 34,2% (otvírám). Pokud by vyšel celkový akční zásah "U" záporný (třeba číslo -90), odečtu tuto hodnotu od skutečné polohy serva 3300-90 = 3210 a přenastavím servo na 32,1% (zavírám). Proporcionalitu U_P jsem včera naprogramoval, obrázek tady vkládám jako přílohu. Udělal jsem ji uživatelsky nastavitelnou v pěti parametrech (červeně podbrvené buňky).

Děkuji za věcnou poznámku ve věci jednotlivých složek PID a vysvětlení, že celý zásah probíhá najednou. To omezení rozsahu na výstupu serva je mi jasné. Můžu zde posílat jenom číslo 0 až 10 000, které odpovídá výstupnímu napětí 0 až 10V, respektivě poloze serva 0 až 100%.

Děkuji za poznámku k výpočtu integrační složky. Tím pádem se to celé zjednoduší. Naprogramuji to zřejmě jako obdelníkovou náhradu integrálu. Ta lichoběžníková by fungovala pouze za předpokladu, že by v jedné periodě byly odchylky "e", ze kterých bych ten obsah počítal, obě kladné, nebo obě záporné. Vzal bych zřejmě odchylku na začátku a na konci periody. Pokud by byla jedna z odchylek kladná a jedna záporná, musel bych počítat ty obsahy z trojůhelníků.

Ještě o tom popřemýšlím. Děkuji za nasměrování.
Přílohy
Příklad proporcionalita
Příklad proporcionalita
Proporcionalni.jpg (47.44 KiB) Zobrazeno 1241 x
Naposledy upravil(a) peetr1 dne 03 dub 2021, 11:44, celkem upraveno 1 x.
Uživatelský avatar
gilhad
Příspěvky: 215
Registrován: 29 kvě 2015, 00:36
Kontaktovat uživatele:

Re: PID regulátor

Příspěvek od gilhad »

U te derivacni metody nemusi merit v case 10 ms, a pak na konci cyklu cca 2950 ms, staci si zapamatovat hodnoru z konce posledniho cyklu a merit jen na konci.

U lichobezniku IMHO nemusis resit dva trojuhelniky, ale staci to pocitat s tim, ze jedna hodnota je proste zaporna a vyjde to numericky stejne (cili vubec nemusis resit, co je zaporne a co kladne a proste to dosadis do vzorce a ono to vyjde)

Intuitivne, kdybys k tomu na zacatku pricetl dost vysoky obdelnik, tak ti vyjde klasicky lichobeznik, ktery snadno spoctes a kdyz pak zase ten samy obdelnik odectes, musi to vyjit stejne. Pricemz pricteni obdelniku na zacatku a jeho odecteni na konci se ti vyrusi.
peetr1
Příspěvky: 6
Registrován: 02 dub 2021, 17:26

Re: PID regulátor

Příspěvek od peetr1 »

@ Gilhad, děkuji za reakci,
měřit regulační odchylku u derivačního zásahu jenom jednou v periodě je dobrý nápad, můžu použít pro výpočet tu z předcházejícího cyklu. Díky za tip.

U té integrace to s tím lichoběžníkem moc dobře nechápu = přikládám obrázek jaké jsou moje představy jak tu plochu sčítat lichoběžníkem/respektive dvěma trojuhelníky v jednom cyklu. Cyklus jsem zvolil konkrétní 3s. Chci ten čas samozřejmě naprogramovat jako volitelný parametr. Zeleně je vyznačena plocha s obsahem kladné odchylky "e", červeně je vyznačena plocha s obsahem záporné odchylky "e".

Aha, tak jsem ještě mrknul na wikipedii: https://cs.wikipedia.org/wiki/Lichob%C4 ... %A1_metoda
Jestli tomu dobře rozumím, tak ten obsah v jednom kroku vytvořím takto: (e+e předcházející)*čas_cyklu/2
Znaménka u odchylek "e" mohou být kladné i záporné. Čas_cyklu jsou pro mě v mém názorném ilustračním příkladě 3s.
Přílohy
Plocha.jpg
MartinL
Příspěvky: 206
Registrován: 24 úno 2013, 14:13
Kontaktovat uživatele:

Re: PID regulátor

Příspěvek od MartinL »

peetr1 píše: 03 dub 2021, 11:30 Servo není řízeno tříbodově, ale má analogový výstup. To znamená, že na výstup 0-100% posílám číslo 0-10000. Toto číslo se přes převodník převede na napětí 0 až 10 V. Pokud tedy pošlu na výstup číslo 3300, na výstupu převodník vygeneruje napětí 3,3 V a servo se nastaví na 33%. Tuto hodnotu výstupu mám někde v datové buňce uloženou. Beru to tak, že pokud mě vyjde například celkový akční zásah "U" kladný (třeba číslo 120), sečtu tuto hodnotu se skutečnou polohou serva 3300+120 = 3420 a přenastavím servo na 34,2% (otvírám). Pokud by vyšel celkový akční zásah "U" záporný (třeba číslo -90), odečtu tuto hodnotu od skutečné polohy serva 3300-90 = 3210 a přenastavím servo na 32,1% (zavírám). Proporcionalitu U_P jsem včera naprogramoval, obrázek tady vkládám jako přílohu. Udělal jsem ji uživatelsky nastavitelnou v pěti parametrech (červeně podbrvené buňky).
V tom případě je to tedy opravdu polohový akční člen. A to co spočítáš tam přímo nastavíš. Žádné přičítání nebo odečítání (to bys z toho vytvořil PII^2 regulátor, tj. přidal integraci na tom servu). Pokud ti tedy vyjde akční zásah 120, nastavíš 120. Pokud ti vyjde záporný, tak nastavíš 0 (to je to omezení).
peetr1 píše: 03 dub 2021, 11:30 Děkuji za poznámku k výpočtu integrační složky. Tím pádem se to celé zjednoduší. Naprogramuji to zřejmě jako obdelníkovou náhradu integrálu. Ta lichoběžníková by fungovala pouze za předpokladu, že by v jedné periodě byly odchylky "e", ze kterých bych ten obsah počítal, obě kladné, nebo obě záporné. Vzal bych zřejmě odchylku na začátku a na konci periody. Pokud by byla jedna z odchylek kladná a jedna záporná, musel bych počítat ty obsahy z trojůhelníků.
Prostě to neřeš. Plocha lichoběžníka je (e(i-1) + e(i))/2 * dT, nezáleží na tom, zda jsou odchylky kladné, či záporné.
peetr1
Příspěvky: 6
Registrován: 02 dub 2021, 17:26

Re: PID regulátor

Příspěvek od peetr1 »

MartinL píše: 03 dub 2021, 20:06 V tom případě je to tedy opravdu polohový akční člen. A to co spočítáš tam přímo nastavíš. Žádné přičítání nebo odečítání (to bys z toho vytvořil PII^2 regulátor, tj. přidal integraci na tom servu). Pokud ti tedy vyjde akční zásah 120, nastavíš 120. Pokud ti vyjde záporný, tak nastavíš 0 (to je to omezení).
No nevím Martine, díval ses na ten graf, který jsem přiložil na proporcionální akční člen? Integraci z toho nedělám. Vezmu velikost odchylky "e" a tu zesílím. Čím větší odchylka, tím větší zesílení, větší zásah, nebo-li výkon serva. Pokud je odchylka nulová výkon je nulový. Pokud je odchylka malá, je zesílení a tím i zásah malý. Navíc ten vypočtený akční zásah používám jenom pro jeden krok, pak tu informaci zahodím. Integrační zásah daného kroku se přičítá k celkové sumě. Jasně že přičítám, odčítám hodnoty. Neznamená to ale, že každé sčítání, odčítání je integrace :lol: Já ty hodnoty přičítám, odčítám z toho důvodu, abych změnil polohu serva. Aktuální polohu si ukládám, abych věděl kde se servo nachází. Pokud bych reguloval tříbodovým servem (není polohový akční člen) a neznal bych aktuální polohu ve kterém se nachází, tak bych reguloval přece úplně stejně. Zjistil bych odchylku a podle její velikosti bych udělal zásah. Čím větší odchylka, tím větší zásah. Pokud by byla odchylka kladná, servo bych otevíral. Pokud by byla záporná, servo bych zavíral. Je to přesná analogie této tříbodové regulace. :D

Docela by mě zajímalo, jak jsi to myslel. Zkus to lépe popsat, nebo možná vložit inspirativní obrázek. Nevím zda jsi měl představu takovou, že na ose "y" měla být poloha serva 0 až 100 % ? A požadované teplotě přiřadit jednu polohu serva? Taková představ je naivní, protože by to znamenalo, že požadované teplotě bude odpovídat právě jedna poloha serva. Jenomže výkon výměníku je při stejné požadované teplotě proměnlivý. Změnu výkonu výměníku musí vykrýt množství páry, které servem prochází. Při malém výkonu výměníku je poloha serva třeba 10 %, při velkém výkonu výměníku třeba 80 % při stejné požadované teplotě. Těch 70% mám dohánět integrací? Navíc při ustáleném malém výkonu výměníku změna polohy serva o 10 % přehřeje požadovanou teplotu klidně i o 30 °C. U větších výkonů výměníku to takto citlivé není. Dnes jsem tu proporcionalitu do ŘS nahrál a servo krásně osciluje kolem požadované teploty při všech výkonech výměníku. Jenom pokud se změní ten výkon v krátkém čase, tak se to docela rozkmitá. :x
Tak nevím, možná to vyřeší jenom derivační akční člen, PD regulátor.
MartinL píše: 03 dub 2021, 20:06 Prostě to neřeš. Plocha lichoběžníka je (e(i-1) + e(i))/2 * dT, nezáleží na tom, zda jsou odchylky kladné, či záporné.
Snažím se věci chápat. Zjistil jsem, že lichoběžníková, nebo obdelníková metoda je naprosto identická do předcházejícího kroku. Pouze v aktuálním kroku jsou členy sumy rozdílné. :D
Přílohy
Metody.jpg
Lichobeznikova.jpg
MartinL
Příspěvky: 206
Registrován: 24 úno 2013, 14:13
Kontaktovat uživatele:

Re: PID regulátor

Příspěvek od MartinL »

peetr1 píše: 03 dub 2021, 22:09 No nevím Martine, díval ses na ten graf, který jsem přiložil na proporcionální akční člen? Integraci z toho nedělám. Vezmu velikost odchylky "e" a tu zesílím. Čím větší odchylka, tím větší zesílení, větší zásah, nebo-li výkon serva. Pokud je odchylka nulová výkon je nulový. Pokud je odchylka malá, je zesílení a tím i zásah malý. Navíc ten vypočtený akční zásah používám jenom pro jeden krok, pak tu informaci zahodím. Integrační zásah daného kroku se přičítá k celkové sumě. Jasně že přičítám, odčítám hodnoty. Neznamená to ale, že každé sčítání, odčítání je integrace :lol: Já ty hodnoty přičítám, odčítám z toho důvodu, abych změnil polohu serva. Aktuální polohu si ukládám, abych věděl kde se servo nachází. Pokud bych reguloval tříbodovým servem (není polohový akční člen) a neznal bych aktuální polohu ve kterém se nachází, tak bych reguloval přece úplně stejně. Zjistil bych odchylku a podle její velikosti bych udělal zásah. Čím větší odchylka, tím větší zásah. Pokud by byla odchylka kladná, servo bych otevíral. Pokud by byla záporná, servo bych zavíral. Je to přesná analogie této tříbodové regulace. :D
Problém není ten výpočet, ten je zcela korektní. Problém je v tom přičítání polohy serva. Pokud vypočtenou hodnotu vždy k poloze přičtu/odečtu, pak v tomto kroku provádím další integraci (přesněji sumaci). Pokud se omezíme pouze na proporcionální regulátor, tak by se to chovalo tak, že pokud by byla nějaká odchylka tak by to stále přidávalo a přidávalo, až by byl ventil zcela otevřený. Ovšem proporcionální regulátor říká, že akční zásah (tj. poloha ventilu) je přímo úměrná velikosti regulační odchylky (ne požadované hodnoty).
To kmitání je právě způsobeno tím, že i když jsi počítal proporcionální regulátor tak jsi z něho udělal integrační. A samotný integrační regulátor je velmi nestabilní. Správně realizovaná regulace (PID) nemá kmitat (maximálně může několikrát zakmitnout a pak se ustálit, záleží na nastavení parametrů).
peetr1
Příspěvky: 6
Registrován: 02 dub 2021, 17:26

Re: PID regulátor

Příspěvek od peetr1 »

Martine, možná si jenom nerozumíme, nevím. Ještě dávám pro ilustraci jeden obrázek.
Na ose x se mi v čase mění skutečná teplota. Dejme tomu, že v nějakém kroku je skutečná teplota Ts nižší než žádaná = ta vlevo od žádané. Vezmu kladnou regulační odchylku zelenou e+ = Tžádaná-Tskutečná a ventilu dám přímo úměrný kladný akční zásah Up (zvýrazněný zeleně) vyjádřený v % o kolik se má ventil otevřít. Velikost tohoto akčního zásahu se zobrazuje na ose y.
Dejme tomu, že v nějakém jiném časovém kroku je skutečná teplota Ts vyšší než žádaná = ta vpravo od žádané. Vezmu zápornou regulační odchylku oranžovou e- = Tžádaná-Tskutečná a ventilu dám přímo úměrný záporný akční zásah Up vyjádřený v % o kolik se má zavřít. Tak přece funguje i tříbodová regulace, potud je to zcela analogické. Nebo je to jinak?
To, že následně něco sčítám a odčítám, to už má vliv jenom na to, abych věděl, v jaké poloze mám ventil. U tříbodové regulace to neprovádím, protože mě ta informace k ničemu není.

Píšeš, že akční zásah je poloha ventilu a ta má být přímo úměrná velikosti regulační odchylky. Neumím si to totiš představit. Jak jsem psal, když bude regulační odchylka třeba 5 °C = Tž-Ts, tak jednou bude poloha ventilu na 10 %, podruhé na 80%. To bude záviset na tom, na jaký výkon výměník pojede.
Není to ale tak, že akční zásah je pouze změna polohy ventilu (o kolik % se má otevřít,zavřít) v závislosti na velikosti regulační odchylky?
Přílohy
Akce.jpg
peetr1
Příspěvky: 6
Registrován: 02 dub 2021, 17:26

Re: PID regulátor

Příspěvek od peetr1 »

No ještě jsem to zkusil rozepsat na konkrétním příkladu. Spouštím regulaci se všemi třemi složkami PID. Akční zásah je co 3s, popisuji prvních šest kroků, vše je samozřejmě smyšlené. Rozepsal jsem to na jednotlivé akční zásahy. Můžete to prosím zkontrolovat a říct zda je ta úvaha správná?
Přílohy
Priklad.jpg
Ui.jpg
Up.jpg
Ud.jpg
Odpovědět