Logika korekce SOC
Napsal: čtv zář 01, 2022 2:58 pm
Zabýval se tady někdo logikou korekce načteného SOC nebo měl by na tom někdo chuť participovat?
Základem je samozřejmě velmi přesný charge metr, který měří aktuální stav nabití v Ah. A do něčeho horšího než INA228/229 už bych asi nešel (viewtopic.php?p=16769#p16769).
Nyní jde o to, jak načtenou hodnotu zkorigovat při mezních situacích, aby ve výsledku to bylo lepší než jakýkoli SOC metr na trhu...
Zatím uvažuji takto:
- autokorekční podmínka pro 100% : 10 minut je proud do baterií větší než 0 a současně nižší než 2A a napětí baterií je větší než 27.1V (tj. napětí, při kterém se vypíná nabíjení). V tom případě se SOC nastavuje na 100%
- pokud je SOC > 100%, zkoriguj na 100%
- pokud je SOC <=0 (a systém stále funguje ), pak je zřejmě podceněna nastavená hodnota kapacity baterií a lze jí programově zvednout.
Blíže viz první verze programu (TECO Foxtrot ST) níže, kódem je asi první nápad vysvětlen nejjasněji...
Jsou tam popsány i externí proměnné, které se používají.
Konkrétni zkušenosti nebo odkazy (moc jsem zatím nehledal) uvítám.
Díky!
Základem je samozřejmě velmi přesný charge metr, který měří aktuální stav nabití v Ah. A do něčeho horšího než INA228/229 už bych asi nešel (viewtopic.php?p=16769#p16769).
Nyní jde o to, jak načtenou hodnotu zkorigovat při mezních situacích, aby ve výsledku to bylo lepší než jakýkoli SOC metr na trhu...
Zatím uvažuji takto:
- autokorekční podmínka pro 100% : 10 minut je proud do baterií větší než 0 a současně nižší než 2A a napětí baterií je větší než 27.1V (tj. napětí, při kterém se vypíná nabíjení). V tom případě se SOC nastavuje na 100%
- pokud je SOC > 100%, zkoriguj na 100%
- pokud je SOC <=0 (a systém stále funguje ), pak je zřejmě podceněna nastavená hodnota kapacity baterií a lze jí programově zvednout.
Blíže viz první verze programu (TECO Foxtrot ST) níže, kódem je asi první nápad vysvětlen nejjasněji...
Jsou tam popsány i externí proměnné, které se používají.
Konkrétni zkušenosti nebo odkazy (moc jsem zatím nehledal) uvítám.
Díky!
Kód: Vybrat vše
//// Výpočet SOC
//
// externí (globální) proměnné:
// Uaku: aktuální napětí baterií
// msoc32data[1].Charge: aktuální "charge" z přesného měřiče SOC
// MaxAh: kapacita baterií v Ah
// BatteryCurrent - proud do baterií (+ znamená "nabíjí se")
// SOCAh_corr : korekční hodnota SOCAh, kterou lze změnit i ručně ve web rozhraní
PROGRAM SOC_calculation
VAR
GUESS_SOC_RESTART : real := 200; // just guess SOC after cold restart
SOC_HIGH_VOLTAGE : real := 27.1; // voltage for SOC correction to 100
SOC_HIGH_CURRENT : real := 2; // current for SOC correction to 100
//
soc_high_suspect_condition : bool; // helper ver
soc_high_verify : TON; // time interval during which the soc condition is evaluated
SOC_HIGH_CONDITION_HOW_LONG : TIME := T#10m;
//
charge_ah_read : real; // work value of charge read from msoc32
END_VAR
// read actual value of charge (+-Ah state)
charge_ah_read := lreal_to_real(msoc32data[1].Charge);
//
//
// patch - after cold restart only
IF is_init3.Q THEN // interval of 3 seconds after PLC restart?
IF SOCPerc = 0 THEN
SOCAh_corr := - charge_ah_read + GUESS_SOC_RESTART; // Guess only here
END_IF;
END_IF;
//
//
// evaluate the condition for potential 100% SOC and adapt
soc_high_suspect_condition := Uaku >= SOC_HIGH_VOLTAGE and BatteryCurrent > 0 and BatteryCurrent <= SOC_HIGH_CURRENT;
// verify if the condition valid for the requested interval
soc_high_verify(in := soc_high_suspect_condition, pt := SOC_HIGH_CONDITION_HOW_LONG);
// should adapt SOC to 100%?
IF soc_high_verify.Q THEN
SOCAh_corr := MaxAh - SOCAh;
END_IF;
//
//
// now calculate appropriate SOCAh
SOCAh := charge_ah_read + SOCAh_corr;
//
//
// SOCAh > MaxAh? If yes, then recalculate SOCAh_corr
IF SOCAh > MaxAh THEN
SOCAh_corr := MaxAh - SOCAh;
SocAh := MaxAh;
END_IF;
//
// SOCAh < 0 ? If yes, then raise MaxAh
IF SOCAh < 0 THEN
MaxAh := MaxAh - SOCAh;
SocAh := 0;
END_IF;
//
// SOC % calculation
SOCPerc := SOCAh / MaxAh * 100;
//
// SOC kWh estimation (averagize current and minimu Battery voltage)
SockWh := SOCAh *(Uaku + UAKUMIN) / 2 / 1000;
//
// SOC color for graphics only
batSOCAh_color := 200 * 256; // green (-BGR)
IF SOCPerc < 50 THEN
batSOCAh_color := 255 + 256 * 128 + 64 * 256 * 256;
END_IF; //orange
IF SOCPerc < 20 THEN
batSOCAh_color := 200;
END_IF; // red
END_PROGRAM