Logika jednostupňového vytěžovače

Home Assistant, Arduino, SDS, Raspberry, Linux, vzdálený dohled, automatizace, měření, opensource, closedsource, hotová řešení, DIY, stavebnice, komponenty, software, postupy, návody, schémata, rady, zkušenosti ...
Uživatelský avatar
marsal64
Příspěvky: 1203
Registrován: sob čer 16, 2018 1:45 pm
Lokalita: Velké Popovice
Systémové napětí: 48V
Výkon panelů [Wp]: 9,3
Kapacita baterie [kWh]: 30
Chci prodávat energii: NE
Chci/Mám dotaci: NE
Bydliště: Velké Popovice

Logika jednostupňového vytěžovače

Příspěvek od marsal64 »

Snad může být téma užitečné pro někoho ve vyhrazeném vlákně.

Stále průběžně vylepšuji to, co jsem již opakovaně zmiňoval jinde (předešlé vylepšení díky inspiraci vlkazajac: viewtopic.php?t=4854&p=135160&hilit=log ... ho#p135160, nejnovější vylepšení: proporcionální konstanty P jsou nyní odlišné pro „standardní“ a „emergency“ vytěžování, podrobněji viz níže).

Poznámky k aktuální verzi:
- Vytěžování probíhá z měniče, který obsluhuje i běžnou AC spotřebu (-> potřebna ohlídat celkový výkon měniče)
- Vytěžování nyní míří do bojleru, někdy do přímotopu, někdy do obojího zapojeného paralelně
- Vytěžuje se pomocí fázově řízeného SSR (po diskuzích a zvažování volba ze dvou zel mezi flickeringem a rušením, viz např. viewtopic.php?t=3620&p=111744#p111723) napětím 0-10V (v ilustračním programu níže pomocí proměnné PhaseVoltage)

- Měřené veličiny:
o Celkový okamžitý proud z/do baterie (mer[29].v), kladná hodnota znamená proud do baterie (nabíjení)
(Pozn. - v mém případě jde měření ze shuntu, díky brumu beru klouzavý průměr z 50 hodnot, tj. “okamžitá” je takové relativní tvrzení)
o Celkový okamžitý výkon AC měniče (mer[49].v)
o Aktuální SOC v procentech, průměr za sekundu (mer[51].v_lsec)

- Logika vytěžování:
o Pokud je do měniče připojen spotřebič, jehož příkon v souhrnu s vytěžováním jde za hranu přípustného výkonu měniče (tj. přesahuje nastavenou hodnotu PhaseDDPwLim), pak se rychle vytěžování sníží. V praxi, pokud je měnič alespoň krátce přetížitelný, toto zabrání výpadku měniče.
o Pod zvolenou hranici SOC (PhaseDDFromAbovePercSOCVyt) se vytěžováním pouze omezuje nabíjecí proud do baterií, pokud tento proud přesáhne stanovenou mez (TargetEmergencyCurrent) – říkám tomu “emergency vytěžování”
o Nad nastavenou hranicí SOC se vytěžuje tak, aby se udržoval nastavený dobíjecí proud do baterie (TargetCurrent). Říkám tomu “standardní vytěžování”.
o Finální hodnota napětí na SSR se omezí mezi nulou a hodnotou PhaseDDTemperaturePhasePercVyt, která se nastaví ručně podle max. výkonu měniče a příkonu zapojené vytěžovací zátěže.
o Napětí SSR se proporcionálně zvyšuje nebo snižuje s využitím časové konstanty (TargS). Její hodnoty jsem postupně ručně optimalizoval pozorováním, na základě “setrvačnosti” celého systému a jsou pochopitelně závislé na délce cyklu PLC (v mém případě 10 až 20 ms). Lze využít i nějaký hotový PID funkční blok. Pokud byly konstanty příliš nízké, pozoroval jsem cyklování baterie mezi + a – proudy, což není žádoucí. Pro emergency vytěžování je nastaveno rychlejší zvyšování vytěžování a pomalejší snižování, pro standardní vytěžování naopak. Program PLC Foxtrot pro ilustraci:

Kód: Vybrat vše

// Stávající hodnota do pracovní proměnné
  CurDDVoltage := PhaseVoltage;

  // bylo dosaženo limitu měniče?
  IF REAL_TO_UINT(mer[49].v) > PhaseDDPwLim
    THEN CurDDVoltage := CurDDVoltage - 0.5;  // rychlé snížení výkonu
  ELSE
    // rozhodování podle SOC - pokud je SOC pod rozhodovací hranicí, pak jen emergency vytěžování, pokud nad ní, standardní vytěžování
    IF round(mer[51].v_lsec) >= PhaseDDFromAbovePercSOCVyt THEN

      // Hodnoty pro standardní vytěžování
      TargC := TargetCurrent;
      IF mer[29].v > TargC
        THEN TargS := 0.001; // pomaleji zvyšovat standardní vytěžování
        ELSE TargS := 0.01; // rychleji snižovat standardní vytěžování
      END_IF;

    ELSE

      // Hodnoty pro emergency vytěžování
      TargC := TargetEmergencyCurrent;
      IF mer[29].v > TargC
        THEN TargS := 0.01; // rychleji zvyšovat emergency vytěžování
        ELSE TargS := 0.001; // pomaleji snižovat emergency vytěžování
      END_IF;

    END_IF;

    // P regulace
    CurDDVoltage := CurDDVoltage + (mer[29].v - TargC) * TargS;

  END_IF;

  // Limituj hodnoty pro regulaci na 0..maximální nastavená hodnota
  CurDDVoltage := MIN(PhaseDDTemperaturePhasePercVyt / 10, CurDDVoltage);
  CurDDVoltage := MAX(0, CurDDVoltage);

  // Přenos hodnoty pracovní proměnné na výstup
  PhaseVoltage := CurDDVoltage;

A věřím, že stále bude co vylepšovat :| .
Přílohy
Vytěžování.jpg
Uživatelský avatar
kybos
Příspěvky: 2783
Registrován: sob zář 08, 2012 10:40 pm
Lokalita: Šternberk
Systémové napětí: 48V
Výkon panelů [Wp]: 15000
Kapacita baterie [kWh]: 40
Bydliště: v údolí mezi kopci

Re: Logika jednostupňového vytěžovače

Příspěvek od kybos »

To je hezká hračka. Ale jako člověk pracující posledních 30 let v IT bohužel musím říci, že v každém zařízení, ve kterém je alespoň pár byte software je určitá nenulová pravděpodobnost jeho selhání. Ta je tím větší, čím větší je ta část SW, kterou nemáme pod kontrolou, která je dodávána jako černá skříňka s chráněným obsahem (například operační systém, uživatelské rozhraní, ovladače jednotlivých HW modulů a další SW komponenty). A přesto, že tu svou uživatelsky modifikovatelnou část SW napíšeme jako zcela bezpečnou a spolehlivou, není možné totéž tvrdit o zbytku SW, který bývá často poměrně rozsáhlý a komplikovaný. Proto by HW část takového zařízení měla obsahovat prvky, které zabrání zničení systému při selhání SW. Ve výsledku může nastat stav, kdy takové zabezpečovací obvody budou složitější, než kdyby se dané zařízení řešilo pouze prostřednictvím HW.
Sporadické chyby SW, které mají nízkou pravděpodobnost výskytu (třeba jednou za kvartál) se velmi těžko odstraňují, zejména když není k dispozici zdrojový kód. Bohužel se nyní až příliš často s takovými chybami zařízení setkávám (nedostatečně odladěný SW) a často mají fatální následky.
15 kWp JJZ + 3x Tristar MPPT60 + Victron 150/100 + 48V LiFePO 850 Ah + UPS 8kW (MPP-Solar 8048 LC) + 4 x nabíječka 1,2 kW (DELTA) Start: 2012
Uživatelský avatar
vlkazajac
R.I.P.
Příspěvky: 3481
Registrován: úte čer 11, 2013 10:40 pm

Re: Logika jednostupňového vytěžovače

Příspěvek od vlkazajac »

Pokiaľ regulátory a istenie v systéme fungujú - čoho by som sa bál ? Ak nadstavbový SW ( vyťažovanie ( HW ) považujem už za štandardný prvok systému ) vylepšuje systém, je to fajn. A keď poskytuje také riešenie, kde sa znižuje cyklovanie aj exponovanie nabíjacím a vybíjacím prúdom, tak :yes: :yes: :yes:

Uvedomujem si, akú voľnosť poskytuje lítium oproti olovu. Tak si ho treba aj trocha hýčkať, mršku jednu ....
750 Wp, LS3024B, 18650 - 198P8S 30,4 V, Multiplus C 800 nonstop / všetky slabé spotrebiče
1950 Wp, 2 x LS3024B, VS2024N, olovo - 330 Ah / 24 V, Carspa 3000 sin deň / silné spotrebiče a ohrev TUV
5995 kWh za meničmi za posledné 2 roky.
dumi
Příspěvky: 2037
Registrován: stř zář 05, 2018 8:38 pm

Re: Logika jednostupňového vytěžovače

Příspěvek od dumi »

Tyhle automaty Tecomat foxtrot, jsou velmi spolehlive, interni FW dobre odladeny. Mam jich v provozu pres 2500ks a poruchovost je opravdu minimalni.

Navic jdou zapojit i redundantne, cimz se spolehlivost zvysuje.

pokud jsou navic regulatory spravne nastavene na rozumne nabijeci napeti a vytezovace jen drzi nizsi tak.je to velmi bezpecne.

Ja to mam tak ze vytezuju na 3,4V a regulator omezuje na 3,5V.
tzn pri selhani vytezovace (napriklad rozepnuti stykace bojleru) se jen baterky vice nabijou.
Dumiho ostruvek: 4,7kWp, 13,3kWh, 2400W inverter
Uživatelský avatar
kybos
Příspěvky: 2783
Registrován: sob zář 08, 2012 10:40 pm
Lokalita: Šternberk
Systémové napětí: 48V
Výkon panelů [Wp]: 15000
Kapacita baterie [kWh]: 40
Bydliště: v údolí mezi kopci

Re: Logika jednostupňového vytěžovače

Příspěvek od kybos »

vlkazajac píše:
Pokiaľ regulátory a istenie v systéme fungujú - čoho by som sa bál
Uvedu třeba hypotetický příklad. Regulační smyčka vytěžovače se někde zacyklí zrovna v okamžiku, kdy běží zátěž naplno. Jištění funguje, nadproud se nevyskytuje. Až se baterie vybijí na spodní přípustné napětí, tak protože jištění je dokonalé, odpojí akumulátor od zbytku systému. Protože i střídač má dokonalé jištění, dojde po snížení napětí na spodní přípustné napětí střídače (které je zákonitě nižší než spodní limit akumulátoru aby střídač odolával zátěžovým špičkám) k odstavení střídače. Protože ale ještě svítí slunce a DC sběrnice střídače zůstala fyzicky připojena (odstavilo se pouze buzení výkonových prvků), nabíjecí regulátory zareagují překmitem na DC sběrnici, která nemá nyní žádnou zátěž a prorazí se nejprve spínací prvky v nabíječi a následně dojde i k překročení přípustného napětí spínacích prvků ve střídači. Jediné, co zůstane zachráněno je odpojený a zcela vybitý akumulátor. Pokud není vypínací mez BMS nastavena dostatečně vysoko a strojník systému dostatečně blízko, pak napřímo připojená BMS dokončí dílo zkázy svou vlastní spotřebou.
15 kWp JJZ + 3x Tristar MPPT60 + Victron 150/100 + 48V LiFePO 850 Ah + UPS 8kW (MPP-Solar 8048 LC) + 4 x nabíječka 1,2 kW (DELTA) Start: 2012
dumi
Příspěvky: 2037
Registrován: stř zář 05, 2018 8:38 pm

Re: Logika jednostupňového vytěžovače

Příspěvek od dumi »

Tak tohle mam reseno tak, ze aku se odpojuje az hkuboko pod vypinanim menice. A vytezovaci rele je jeste pripojeno pres stykac, ktery se vypina kdyz se nevytezuje a v pripade napriklad prorazeni SSR umi odpojit vytezovani v pripade nutnosti. Je to hlidano jak prepnuti menice na DS tak napetovou hladinou baterie.

Staci na to obyc externi napetove rele.
Dumiho ostruvek: 4,7kWp, 13,3kWh, 2400W inverter
Uživatelský avatar
marsal64
Příspěvky: 1203
Registrován: sob čer 16, 2018 1:45 pm
Lokalita: Velké Popovice
Systémové napětí: 48V
Výkon panelů [Wp]: 9,3
Kapacita baterie [kWh]: 30
Chci prodávat energii: NE
Chci/Mám dotaci: NE
Bydliště: Velké Popovice

Re: Logika jednostupňového vytěžovače

Příspěvek od marsal64 »

dumi píše:
Tak tohle mam reseno tak, ze aku se odpojuje az hkuboko pod vypinanim menice. A vytezovaci rele je jeste pripojeno pres stykac, ktery se vypina kdyz se nevytezuje a v pripade napriklad prorazeni SSR umi odpojit vytezovani v pripade nutnosti. Je to hlidano jak prepnuti menice na DS tak napetovou hladinou baterie.

Staci na to obyc externi napetove rele.
Ano, BMS aku vypíná pod min. napětím měniče. "Zacyklení" vytěžovače se ale tuším neliší od "běžné" vysoké spotřeby?
Uživatelský avatar
vlkazajac
R.I.P.
Příspěvky: 3481
Registrován: úte čer 11, 2013 10:40 pm

Re: Logika jednostupňového vytěžovače

Příspěvek od vlkazajac »

Kybosi, ak pre mňa v tejto chvíli dosť záhadné zacyklenie v smyčke vyťažovača vedie AŽ k podbitiu batérie, tak je niečo nesprávne v logike vyťažovania. Isteže nerozumiem všetkému, ale tento stav je pre mňa neprípustný.

( A som povinný pridať zlomyselnú poznámku či otázku - aj pwm regulátor reaguje prekmitom na DC zbernici ? Tu som jasný laik. )
750 Wp, LS3024B, 18650 - 198P8S 30,4 V, Multiplus C 800 nonstop / všetky slabé spotrebiče
1950 Wp, 2 x LS3024B, VS2024N, olovo - 330 Ah / 24 V, Carspa 3000 sin deň / silné spotrebiče a ohrev TUV
5995 kWh za meničmi za posledné 2 roky.
Uživatelský avatar
kybos
Příspěvky: 2783
Registrován: sob zář 08, 2012 10:40 pm
Lokalita: Šternberk
Systémové napětí: 48V
Výkon panelů [Wp]: 15000
Kapacita baterie [kWh]: 40
Bydliště: v údolí mezi kopci

Re: Logika jednostupňového vytěžovače

Příspěvek od kybos »

Nemám až tolik praktických zkušeností s PWM regulátory nabíjení (používám totiž převážně MPPT nabíječe). Předpokládám ale, že pokud PWM regulátory neobsahují tlumivku, neměl by být k překmitu napětí při odlehčení zásadní důvod.

P.S: Ten příklad byl jen hypotetický a předpokládal použití MPPT regulátoru s tlumivkou.
15 kWp JJZ + 3x Tristar MPPT60 + Victron 150/100 + 48V LiFePO 850 Ah + UPS 8kW (MPP-Solar 8048 LC) + 4 x nabíječka 1,2 kW (DELTA) Start: 2012
Martin P
Příspěvky: 632
Registrován: ned úno 25, 2018 5:04 pm
Lokalita: Havlíčkův Brod
Systémové napětí: 48V
Výkon panelů [Wp]: 19845
Kapacita baterie [kWh]: 66
Chci prodávat energii: NE
Chci/Mám dotaci: NE
Bydliště: Havlíčkův Brod

Re: Logika jednostupňového vytěžovače

Příspěvek od Martin P »

Havarijní odpojení lifepo4 baterie a ochranu reglů jsem pořešil olověnou baterií připojenou jen přes pojistku přímo na DC sběrnici.
Vytěžuji přes měnič a pokud by se spekl stykač bojleru tak se baterie vybijí na 47V a měnič se vypne (a s ním i bojler). Restart měniče je na 51V.
Vloni jsem testoval chování baterií při vybití k spodní úrovni napětí ( do úrovně cca 47,5V a pak jsem hned zahájil nabíjení). Zjistil jsem, že při úrovni cca 51V se pokles napětí baterií zpomalí, zřejmě většinu zátěže přebere olovo a články na lifepo4 se drží celkem srovnané (rozdíl do 0,1V) až do konce testu. Odpojovací napětí článků mám na ochranné jednotce od výrobce na 2,1V a do strojovny chodím na kontrolu každý den, tak by se mi snad lifepo4 nesežralo navzájem.

Plné *batt* přeji a jsem s pozdravem. Martin P.
S-UPS.
20kWp v panelech rozdělených mezi východ, jih a západ. Do osmi stringů.
Baterie
Staré LiFePo4 o kapacitách 12, 24 kWh
Nové LiFePo4 o kapacitách 14, 14 kWh (od listopadu 2022), 14kWh (srpen 2024).
Rezerva Pb vrla 200Ah.
Systémové napětí 48V
Hlavní měnič Victron 5000VA.
Pomocné měniče 2x REVO VM 5000
Regulátory PCM60X
Systém je modulární s možností dalšího rozšíření (kdyby bylo kam) řešený tak, aby při výpadku kteréhokoliv jednoho modulu mohly ostatní fungovat dál bez omezení.
Uživatelský avatar
marsal64
Příspěvky: 1203
Registrován: sob čer 16, 2018 1:45 pm
Lokalita: Velké Popovice
Systémové napětí: 48V
Výkon panelů [Wp]: 9,3
Kapacita baterie [kWh]: 30
Chci prodávat energii: NE
Chci/Mám dotaci: NE
Bydliště: Velké Popovice

Re: Logika jednostupňového vytěžovače

Příspěvek od marsal64 »

Ještě jednu úpravu přinesl život - zjistil jsem, že (a) v mém případě SOC neměřím příliš spolehlivě a (b) starší baterky začínají být měkké - rychle nastupují k cílovému napětí a tím do floatu od regulátorů. Takže původní verzi viewtopic.php?t=6694&p=138363&hilit=log ... ho#p138331
jsem upravil tak, že hranice mezi standardním a "emergency" vytěžováním není určena pomocí SOC, ale jednoduše podle napětí baterie. Řízení vytěžování pomocí proudu (nikoli podle napětí) zůstává.
Přílohy
RozhDleNapětí.jpg
JiTr
Příspěvky: 83
Registrován: ned kvě 20, 2018 5:00 pm
Lokalita: Uprostřed republiky

Re: Logika jednostupňového vytěžovače

Příspěvek od JiTr »

> marsal64: Mel bych dotaz k regulacnimu cyklu tveho vytezovace. Jak dlouho cyklus v realu trva = jak rychle je schopen vytezovac reagovat -menit vystupni napeti pro SSR?
Uživatelský avatar
marsal64
Příspěvky: 1203
Registrován: sob čer 16, 2018 1:45 pm
Lokalita: Velké Popovice
Systémové napětí: 48V
Výkon panelů [Wp]: 9,3
Kapacita baterie [kWh]: 30
Chci prodávat energii: NE
Chci/Mám dotaci: NE
Bydliště: Velké Popovice

Re: Logika jednostupňového vytěžovače

Příspěvek od marsal64 »

JiTr píše:
> marsal64: Mel bych dotaz k regulacnimu cyklu tveho vytezovace. Jak dlouho cyklus v realu trva = jak rychle je schopen vytezovac reagovat -menit vystupni napeti pro SSR?
U mne cyklus PLC trvá obvykle mezi 10 - 20 ms, semtam (1x za hodinu např. při agregacích atp.) i výrazněji déle.

Ale to není úplně kritické, protože časové konstanty určující setrvačnost je dobré příliš nezkracovat a poladit podle mé zkušenosti spíše experimentálně (setrvačnost systému - můj původní Axpert nebo stávající Victron se mi v tom mimochodem jevily víceméně stejně). Hlavním cílem je zabránit "makrocyklování" á la rekuperace v automobilech, kdy se střídavě za sebou relativně rychle baterie nabíjí a vybíjí, což nechceme (jen zopakuji, že proto jsem před časem přešel od regulace podle rozdílu napětí k regulaci podle proudu).

Naposledy jsem mimochodem změnu časových parametrů dělal po změně hlídání hranice mezi "emergency" a standardním vytěžováním podle napětí, nyní to u mne vypadá takto:

Kód: Vybrat vše

      IF mer[29].v > TargC
        THEN TargS := 0.01; // proud je větší než cílový - zvyšovat standardní vytěžování
        ELSE TargS := 0.005; // proud je menší než cílový - snižovat standardní vytěžování
      END_IF;
Časové konstanty v původní variantě v prvním příspěvku vlákna (bylo tam rychlejší ubírání než přidávání vytěžovací intenzity) nevyhovovaly, protože to vedlo k "plíživému" stavu, kdy se nevyužíval okamžitý výkon, který byl k dispozici.

Při nastavení hranice mezi standardním a emergency vytěžováním podle napětí baterie by se zdálo, že je vhodné uplatnění hystereze (při zahájení vytěžování může snadno poklesnout napětí baterie pod nastavenou hranici), ale v praxi chybějící hystereze vlastně ničemu nevadí - vytěžování sice v mezích nastavených časových parametrů kolem hranice napěťové hranice pro rozhodování může chodit "nahoru a dolů", ale vždy se ureguluje nikoli pod nastavené proudy, takže "makrocyklování" nenastane.

Jinak se mi už zdá, že s touto poslední úpravou to vyhovuje - než přijdu na něco nového ;-).
JiTr
Příspěvky: 83
Registrován: ned kvě 20, 2018 5:00 pm
Lokalita: Uprostřed republiky

Re: Logika jednostupňového vytěžovače

Příspěvek od JiTr »

> marsal64: Diky. Ja jsem z toho pochopil,ze s periodou cca 20ms ma tvuj algoritmus moznost menit prikon vytezovace a to tak, ze jsi se snazil casovymi konstantami (klouzavy prumer z namerenych hodnot produ za 1s + dalsi konstanty, ktere ovlivnuji strmost vytezovani) docilit toho, aby byla baterie pri dostatku energie z panelu rozumne dobijena a nedochazelo k castym kratko-/dlouho-dobym zmenam toku proudu z / do baterie dle odberu domu a vytezovani ...
Zkusim to taky tak ... ridit dle produ do baterie, SOC a pak vyjit z max. napeti clanku baterie - pokud zacne balancovani, zacnu vytezovat razantneji, aby to balancer zvladl ... ale vse ukaze realita a chovani clanku Lifepo4 baterie ...
Uživatelský avatar
marsal64
Příspěvky: 1203
Registrován: sob čer 16, 2018 1:45 pm
Lokalita: Velké Popovice
Systémové napětí: 48V
Výkon panelů [Wp]: 9,3
Kapacita baterie [kWh]: 30
Chci prodávat energii: NE
Chci/Mám dotaci: NE
Bydliště: Velké Popovice

Re: Logika jednostupňového vytěžovače

Příspěvek od marsal64 »

Nevím, jestli to tady ještě někoho baví ;-), ale níže je další vylepšení algoritmu na základě pozorování provozu v praxi.

Nyní se požadavek na zvyžování vytěžování děje nejen podle rozdílu proudu (to vedlo v minulé verzi zbytečně k nevytěžování, i když bylo možné), ale i rozdílu napětí. Požadavek na snižování vytěžování zůstává zajisté podle proudu.

Význam proměnných viz první příspěvek vlákna.

Kód: Vybrat vše

     // Stávající hodnota do pracovní proměnné
      CurDDVoltage := PhaseVoltage;

      // bylo dosaženo limitu měniče?
      IF REAL_TO_UINT(mer[49] .v) > PhaseDDPwLim THEN
        CurDDVoltage := CurDDVoltage - 0.05; // rychlé snížení výkonu
      ELSE

        IF mer[11] .v_lsec < BatVFromAboveVyt THEN
        // emergency vytěžování

          IF mer[29].v > TargetEmergencyCurrent
          THEN
            // rychleji zvyšuj emergency vytěžování
            CurDDVoltage := CurDDVoltage + 0.01 *(mer[29].v - TargetEmergencyCurrent);
          ELSE
            // pomaleji snižuj emergency vytěžování
            CurDDVoltage := CurDDVoltage - 0.005 *(TargetEmergencyCurrent - mer[29].v);
          END_IF;

        ELSE
        // standardní vytěžování

          IF mer[29].v > TargetCurrent THEN
          // proud je vyšší než žádoucí, zvyš vytěžování, P podle rozdílu napětí + rozdílu proudu
            CurDDVoltage := CurDDVoltage + 0.002 *(mer[11].v_lsec - BatVFromAboveVyt) + 0.001 *(mer[29].v - TargetCurrent);
          ELSE
          // proud je nižší než žádoucí, sniž vytěžování, P podle rozdílu proudu
            CurDDVoltage := CurDDVoltage - 0.005 *(TargetCurrent - mer[29].v);
          END_IF;
        END_IF;
      END_IF;

      // Omez hodnoty pro regulaci na 0..maximální nastavená hodnota
      CurDDVoltage := LIMIT(0, CurDDVoltage, PhaseDDTemperaturePhasePercVyt / 10);

      // Přenos hodnoty pracovní proměnné na výstup
      PhaseVoltage := CurDDVoltage;
Uživatelský avatar
marsal64
Příspěvky: 1203
Registrován: sob čer 16, 2018 1:45 pm
Lokalita: Velké Popovice
Systémové napětí: 48V
Výkon panelů [Wp]: 9,3
Kapacita baterie [kWh]: 30
Chci prodávat energii: NE
Chci/Mám dotaci: NE
Bydliště: Velké Popovice

Re: Logika jednostupňového vytěžovače

Příspěvek od marsal64 »

Jak tak postupně měknou baterky, musel jsem tam nakonec hysterezi přidat, aby vytěžování příliš často nepřepínalo mezi "emergency" a "standardním".

Pro potěšení jsem tam navíc přidal "LED" indikaci probíhajícího standardního a "emergency" vytěžování.

Vysvětlivky k proměnným apod. viz výše ;-)

Kód: Vybrat vše


VAR_GLOBAL
  PhaseDDType : INT := 1;  // default na vytěžovač
  
  // PhaseType = 0 - pevné
  PhaseDDValPerc : REAL := 0;

  // PhaseType = 1 - vytěžování
  TargetCurrent : REAL := 2;           // cílový regulační proud do baterií
  TargetEmergencyCurrent : REAL := 50; // ochranný regulační proud do baterií, nad který proběhné "ochranné" vytěžování
  CurDDVoltage : REAL := 0;            // aktuální hodnota napětí pro SSR
  BatVFromAboveVyt: REAL := 26.9;      // minimální napětí baterie pro standardní vytěžování
  PhaseDDTemperaturePhasePercVyt : REAL := 60; // maximální výkon při režimu vytěžovače
  PhaseDDPwLim : UINT := 1600;     // Celkový výkon, nad který se omezuje vytěžovač

  DDis_0 : BOOL := False;
  DDis_1 : BOOL := True;

  is_emergency : BOOL := True; // help variable for emergency / nonemergency switch
  led_emergency : BOOL := False;  // LED indicator for emergency SSR load
  led_standard  : BOOL := False;  // LED indicator for standard SSR load

END_VAR

...
  CASE PhaseDDType OF
    0 :  //Fixní vytěžování
      PhaseVoltage := MAX(0, MIN(PhaseDDValPerc / 10, 10)); // 0 - 10V
      DDis_0 := True;
      DDis_1 := False;
      LED_emergency := False;
      LED_standard := False;

    1 : // Dynamické vytěžování
      // Stávající hodnota do pracovní proměnné
      CurDDVoltage := PhaseVoltage;
      // bylo dosaženo limitu měniče?
      IF REAL_TO_UINT(mer[49] .v) > PhaseDDPwLim THEN
        CurDDVoltage := CurDDVoltage - 0.5; // rychlé snížení výkonu
      ELSE
        // Decide on emergency or standard
        IF mer[11] .v_lsec < BatVFromAboveVyt - hysteresis THEN
          is_emergency := True;
        END_IF;
        IF mer[11] .v_lsec >= BatVFromAboveVyt THEN
          is_emergency := False;
        END_IF;
        IF is_emergency THEN
          // emergency vytěžování
          // napětí baterie je menší než limitní napětí pro vytěžování
          IF mer[29] .v > TargetEmergencyCurrent
          // rozdílné P hodnoty podle směru proudu
          THEN
            // rychleji zvyšuj emergency vytěžování
            CurDDVoltage := CurDDVoltage + 0.01 *(mer[29] .v - TargetEmergencyCurrent);
          ELSE
            // pomaleji snižuj emergency vytěžování
            CurDDVoltage := CurDDVoltage - 0.005 *(TargetEmergencyCurrent - mer[29] .v);
          END_IF;
        ELSE
          // standardní vytěžování
          IF mer[29] .v > TargetCurrent THEN
            // proud je vyšší než žádoucí, zvyš vytěžování, P podle rozdílu napětí + rozdílu proudu
            CurDDVoltage := CurDDVoltage + 0.001 *(mer[11] .v_lsec - BatVFromAboveVyt + hysteresis) + 0.001 *(mer[29] .v - TargetCurrent);
          ELSE
            // proud je nižší než žádoucí, sniž vytěžování, P podle rozdílu proudu
            CurDDVoltage := CurDDVoltage - 0.01 *(TargetCurrent - mer[29] .v);
          END_IF;
        END_IF;
      END_IF;
      // Omez hodnoty pro regulaci na 0..maximální nastavená hodnota
      CurDDVoltage := LIMIT(0, CurDDVoltage, PhaseDDTemperaturePhasePercVyt / 10);

      // Obsluha zobrazovacích proměnných
      IF is_emergency THEN
        IF curDDVoltage > 0 THEN
          LED_emergency := True;
        ELSE
          LED_emergency := False;
        END_IF;
        LED_standard := False;
      ELSE //standard
        IF curDDVoltage > 0 THEN
          LED_standard := True;
        ELSE
          LED_standard := False;
        END_IF;
        LED_emergency := False;
      END_IF;

      // Přenos hodnoty pracovní proměnné na výstup
      PhaseVoltage := CurDDVoltage;
      DDis_0 := False;
      DDis_1 := True;
  END_CASE;
Přílohy
VytěžováníLED.jpg
VytěžováníLED.jpg (24.07 KiB) Zobrazeno 3881 x
kodl69
Příspěvky: 7688
Registrován: sob črc 19, 2014 8:56 pm
Lokalita: severně od Brna
Systémové napětí: 48V
Výkon panelů [Wp]: 8kWp
Kapacita baterie [kWh]: 12kWh
Chci prodávat energii: NE
Chci/Mám dotaci: NE

Re: Logika jednostupňového vytěžovače

Příspěvek od kodl69 »

co je "emergency vytěžování"?
ostrov skoro 8kWp neustále ve stádiu zrodu: smartshunt(ex WBJR), MPPT150/45, MPPT 250/100(ex midnitesolar 150 clasic lite), 16S a různě P cca 340Ah Winston, MP II 5000,( ex Powerjack 8kW, ex samodomo cca 4kW). 48V DC rozvody a spotřebiče.
Uživatelský avatar
marsal64
Příspěvky: 1203
Registrován: sob čer 16, 2018 1:45 pm
Lokalita: Velké Popovice
Systémové napětí: 48V
Výkon panelů [Wp]: 9,3
Kapacita baterie [kWh]: 30
Chci prodávat energii: NE
Chci/Mám dotaci: NE
Bydliště: Velké Popovice

Re: Logika jednostupňového vytěžovače

Příspěvek od marsal64 »

kodl69 píše:
co je "emergency vytěžování"?
"Emergency" vytěžování omezuje nabíjecí proud do baterií, ač je jejich napětí ještě pod úrovní, kdy se zapíná standardní vytěžování. (c) nápadu vlkazajac.
Uživatelský avatar
marsal64
Příspěvky: 1203
Registrován: sob čer 16, 2018 1:45 pm
Lokalita: Velké Popovice
Systémové napětí: 48V
Výkon panelů [Wp]: 9,3
Kapacita baterie [kWh]: 30
Chci prodávat energii: NE
Chci/Mám dotaci: NE
Bydliště: Velké Popovice

Re: Logika jednostupňového vytěžovače

Příspěvek od marsal64 »

Zajímavé, jak i po delším čase člověk přijde na další a dost podstatné vylepšení.

Konkrétně díky programování adaptivního wallboxu (https://solarforum.cz/viewtopic.php?p=14711#p14711).

Princip regulace podle proudu do baterie zůstává, ale změna je v tom, že si měním, jaký ten proud do baterií má zrovna být. U wallboxu používám SOC, pro vytěžování v poustevně zůstávám u napětí baterie. Měření mám sice už nové (s INA229) a čekám jen to nejlepší, ale je to v provozu tři dny...

Pokud je tedy napětí baterie na úrovni odpojovacího napětí, nastavuji, "cílový regulační proud do baterií" na požadované maximum, řekněme 60A (tím omezuji maximální nabíjení baterií a šetřím je). Pokud je napětí baterie maximální, odpovídající napětí, na které je nastaven limit regulátorů, cilový regulační proud je 0, což znamená že veškerá výroba se vytěžuje, pokud je kam. Pokud je napětí baterie něco mezi, hodnota "cílového regulačního proudu" se počítá lineární interpolací mezi dvěma krajními hodnotami. Fantazii se meze nekladou, lze případně vyzkoušet nelineární průběh interpolace.

Kromě limitních hodnot pak zadávám právě jen mezní hodnoty "cílového regulačního proudu" (tj. zrušil jsem dokonce mez, od které se má vytěžovat ;-)):
Vytěžování.jpg
Vytěžování.jpg (18.45 KiB) Zobrazeno 2493 x

Kód: Vybrat vše


// Fázové řízení
VAR_GLOBAL
  PhaseDDType : INT := 1; // default na vytěžovač
  // PhaseType = 0 - pevné
  PhaseDDValPerc : REAL := 0;
  // PhaseType = 1 - vytěžování
  //
  TargetCurrent_minV : REAL := 60; // cílový regulační proud do baterií při minimálním napětí baterie UAKUMIN
  // UAKUMIN 24.1V
  UAKUMAX : REAL:= 27.1;
  TargetCurrent_maxV : REAL := 0; // cílový regulační proud do baterií při odepínacím napětí baterie UAKUMAX
  TargetCurrent_now : REAL; // aktuální hodnota cílového regulačního proudu
  CurDDVoltage : REAL := 0; // aktuální hodnota napětí pro SSR
  PhaseDDTemperaturePhasePercVyt : REAL := 60; // maximální výkon při režimu vytěžovače
  PhaseDDPwLim : real := 1600; // Celkový výkon, nad který se omezuje vytěžovač
  DDis_0 : BOOL := False;
  DDis_1 : BOOL := True;
  led_standard : BOOL := False; // LED indicator for standard SSR load
END_VAR

.................................


// Phase manage

PROGRAM PhaseD
  VAR
    A : REAL; // helper var.
    REGULATION_SPEED : REAL := 0.001; // regulation speed
  END_VAR

  // Nastav zobrazování podle typu řízení
  CASE PhaseDDType OF
    0 : //Fixní vytěžování
      PhaseVoltage := MAX(0, MIN(PhaseDDValPerc / 10, 10)); // 0 - 10V
      DDis_0 := True;
      DDis_1 := False;
      LED_standard := False;
    1 : // Dynamické vytěžování
      // Stávající hodnota do pracovní proměnné
      CurDDVoltage := PhaseVoltage;
      // bylo dosaženo limitu měniče?
      IF lreal_to_real(msoc32data[3].Power) > PhaseDDPwLim THEN
        CurDDVoltage := CurDDVoltage - 0.5; // rychlé snížení výkonu
      ELSE
        // standardní vytěžování
        //
        // propočti cílový proud
        A :=(TargetCurrent_minV - TargetCurrent_maxV) /(UAKUMAX - UAKUMIN);
        TargetCurrent_now :=(BatteryCurrent - TargetCurrent_maxV) + A *(UAKU - UAKUMIN);
        // limit
        TargetCurrent_now := LIMIT(TargetCurrent_maxV, TargetCurrent_now, TargetCurrent_minV);
        // regulate
        CurDDVoltage := CurDDVoltage -(TargetCurrent_now - BatteryCurrent) * REGULATION_SPEED;
      END_IF;
      // Omez hodnoty pro regulaci na 0..maximální nastavená hodnota
      CurDDVoltage := LIMIT(0, CurDDVoltage, PhaseDDTemperaturePhasePercVyt / 10);
      IF curDDVoltage > 0 THEN
        LED_standard := True;
      ELSE
        LED_standard := False;
      END_IF;
      // Přenos hodnoty pracovní proměnné na výstup
      PhaseVoltage := CurDDVoltage;
      DDis_0 := False;
      DDis_1 := True;
  END_CASE;
END_PROGRAM
Uživatelský avatar
marsal64
Příspěvky: 1203
Registrován: sob čer 16, 2018 1:45 pm
Lokalita: Velké Popovice
Systémové napětí: 48V
Výkon panelů [Wp]: 9,3
Kapacita baterie [kWh]: 30
Chci prodávat energii: NE
Chci/Mám dotaci: NE
Bydliště: Velké Popovice

Re: Logika jednostupňového vytěžovače

Příspěvek od marsal64 »

Dodal jsem nakonec nastavení napěťových úrovní, zkusím tedy shrnout jakousi "finální provozní verzi" s charakteristikami:

- vytěžování probíhá podle hodnoty proudu do baterií. Vytěžování se snaží udržet "cílový proud do baterií"
- hodnota cílového proudu do baterií se mění s napětím baterie. Pokud je napětí baterie menší než nastavená hodnota TargetDDVoltage_1, je udržován maximální cílový nabíjecí proud - vytěžování nastává pouze tehdy, když je proud překročen; cílem je tu ochrana baterií před příliš velkým nabíjecím proudem
- počínaje hodnotou TargetDDVoltage_1 cílový proud do baterií lineárně klesá až k okamžiku, kdy baterie dosáhne napětí TargetDDVoltage_2 odpovídající plně nabitým bateriím. Cílový proud při TargetDDVoltage_2 je typicky nula, v tom případě může být vytěžování maximální
- je možné jistě místo napětí použít i SOC, ale napětí se jeví jako spolehlivější
- pokud se zůstane u nastavení cílového proudu do baterie podle napětí, pak závislost nemusí být jistě lineární, může případně více kopírovat křivku napětí baterie podle SOC

Hodnota cílového proudu do baterií může vypadat tedy takto (příklad pro 24V systém):
TargetCurrent.jpg
Vlastní vytěžování už je jednoduché - jde o proporcionální regulátor, který přidává nebo ubírá na intenzitě vytěžování tak, aby cílový proud do baterií zůstal co nejvíce zachován. Vlastní rychlost regulace je podle mých zkušeností dobré spíše vyzkoušet (viz parametr REGULATION_SPEED v příkladu kódu níže) - měniče i regulátory mají setrvačnost a příliš rychlá regulace není účelná.

Možné HW řešení - SSR řízené fázově napětím 0..10V (tak to předpokládá příklad kódu níže).

Ovládání v GUI může vypadat takto:
VytěžováníAdapt.jpg
VytěžováníAdapt.jpg (21.36 KiB) Zobrazeno 2346 x
Ještě tedy příklad kódu (Teco Foxtrot ST), lze to naprogramovat jednoduše, nejsou potřebné žádné hystereze (jak tomu bylo u předchozích verzí) a podobně. V kódu je ještě ošetření maxima výkonu měniče, nastavení pevné hodnoty vytěžování a nějaké grafické pomůcky:

Kód: Vybrat vše

// Řízení SSR
//
// SSR řízeno napětím 0..10V  (v programu napevno)
// SSR napojeno na stejný měnič, ze kterého jde celková AC spotřeba
//
// Některé proměnné:
// AC_Power - výkon 230V měřený na výstupu měniče.
// PhaseVoltage - proměnná PLC,

//  PhaseDDType : INT := 1; // default na vytěžovač
//  // PhaseDDType = 0 - pevné
//  PhaseDDValPerc : REAL := 0;
//  // PhaseDDType = 1 - vytěžování
//  TargetDDVoltage_1 : REAL := 25.5; // napětí, pro který se reguluje proud baterie na TargetDDCurrent_1
//  TargetDDVoltage_2 : REAL := 27.1; // napětí, pro které se reguluje proud baterie na TargetDDCurrent_2
//  TargetDDCurrent_1 : REAL := 60; // cílový regulační proud do baterií při TargetVoltage_1
//  TargetDDCurrent_2 : REAL := 0; // cílový regulační proud do baterií při TargetVoltage_2
//  TargetDDCurrent_now : REAL; // cílový regulační proud do baterií při TargetVoltage_2
//  CurDDVoltage : REAL := 0; // aktuální hodnota napětí pro SSR
//  PhaseDDMaxPercVyt : REAL := 100; // maximální výkon při režimu vytěžovače
//  PhaseDDPwLim : real := 2100; // Celkový výkon AC, nad který se omezuje vytěžování "panicky"
//  DDis_0 : BOOL := False;  // proměnná pro web grafiku
//  DDis_1 : BOOL := True;   // proměnná pro web grafiku

PROGRAM PhaseD
  VAR
    A : REAL; // helper
    REGULATION_SPEED : REAL := 0.001; // rychlost regulace
    FAST_STEP_DOWN : REAL := 0.1; // krok pro "panické" snížení výkonu při překročení nastaveného maximálního AC výkonu
  END_VAR

  // Nastav zobrazování podle typu řízení
  CASE PhaseDDType OF
    0 : //Fixní vytěžování
      PhaseVoltage := LIMIT(0, PhaseDDValPerc / 10, 10); // 0 - 10V
      // grafika
      DDis_0 := True;
      DDis_1 := False;
    1 : // Dynamické vytěžování
      // Stávající hodnota do pracovní proměnné
      CurDDVoltage := PhaseVoltage;
      // bylo dosaženo limitu výkonu?
      IF AC_Power > PhaseDDPwLim THEN
        CurDDVoltage := CurDDVoltage - FAST_STEP_DOWN; // rychlé snížení výkonu
      ELSE
        //
        // propočti cílový proud
        A :=(TargetDDCurrent_2 - TargetDDCurrent_1) /(TargetDDVoltage_2 - TargetDDVoltage_1);
        TargetDDCurrent_now := TargetDDCurrent_1 + A *(UAku - TargetDDVoltage_1);
        // limits
        IF UAku > TargetDDVoltage_2 THEN
          TargetDDCurrent_now := TargetDDCurrent_2;
        ELSIF UAku < TargetDDVoltage_1 THEN
          TargetDDCurrent_now := TargetDDCurrent_1;
        END_IF;
        //
        // Reguluj s využitím P regulace a podle REGULATION_SPEED
        CurDDVoltage := CurDDVoltage -(TargetDDCurrent_now - BatteryCurrent) * REGULATION_SPEED;
      END_IF;
      // Omez hodnoty pro regulaci na 0..maximální nastavená hodnota
      CurDDVoltage := LIMIT(0, CurDDVoltage, PhaseDDMaxPercVyt / 10);
      // Přenos hodnoty pracovní proměnné na výstup
      PhaseVoltage := CurDDVoltage;
      // grafika
      DDis_0 := False;
      DDis_1 := True;
  END_CASE;
END_PROGRAM


  • Podobná témata
    Odpovědi
    Zobrazení
    Poslední příspěvek