Logika jednostupňového vytěžovače
Napsal: pát pro 04, 2020 2:48 pm
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:
A věřím, že stále bude co vylepšovat .
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;