Logika korekce SOC

Odpovědět
Uživatelský avatar
marsal
Příspěvky: 615
Registrován: pát dub 09, 2021 11:10 am

Logika korekce SOC

Příspěvek od marsal »

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!

SOC.jpg
SOC.jpg (9.61 KiB) Zobrazeno 2417 x

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

Uživatelský avatar
marsal
Příspěvky: 615
Registrován: pát dub 09, 2021 11:10 am

Re: Logika korekce SOC

Příspěvek od marsal »

První bugfix :oops: .

Kód: Vybrat vše


//// Výpočet SOC
//
// 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")

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 3 seconds after PLC restart?
    IF SOCPerc = 0 THEN
      SOCAh_corr := GUESS_SOC_RESTART - charge_ah_read; // Guess only here, may amend manually in GUI or wait for autocorrection
    END_IF;
    RETURN;
  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 - charge_ah_read;
  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 - charge_ah_read;
    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
Uživatelský avatar
redcrown
Příspěvky: 859
Registrován: čtv dub 08, 2021 6:07 pm
Bydliště: Jizerky
Výkon panelů v FVE [Wp]: 19550
Kapacita baterie [kWh]: 36

Re: Logika korekce SOC

Příspěvek od redcrown »

Zdar,
já přidám jen pár postřehů, které mě potkaly s používáním Batria.
Batrium používá poměrně přesné měření, takže se mě SOC počítadlo rozchází o cca. 10% měsíčně nahoru. To je podle mě ten lepší případ, protože se to při stavu plného nabití nechá snadno resetovat na 100%. Ovšem pozor!, doporučuji nechat uživatelskou proměnnou při jaké hodnotě se má resetovat. U Studeru je totiž trochu nepraktické, že při resetu SOC pošle nějakou zprávu "Battery alarm arrives (GENERAL)". To zní děsivě, přestože se vlastně nic moc nestalo. Připadalo by mě nepraktické, kdyby u o 10% rozhozené baterky chodil takový alarm při každém 1% SOC resetu.
Pak je samozřejmě asi vhodné vymyslet reset SOC při dolní hranici. Batrium ho jako takové myslím nemá, ale mě to naštěstí nepálí. Myslím ale, že by se při podmínce ukončení vybíjení mohlo nastavit požadovaná hodnota SOC, např. 0%. Nejhorší stav je samozřejmě takový, kdy se dlouho baterka nenabije do plna nebo nevybije do prázdna.
Zatím to nemám přesně vysledované, ale skoro se mě zdá, že se dala vymyslet nějaká hrubá konstanta, která by dělala autokorekci SOC mezi 0% a 100%. Např. když přečerpáš xx Ah, tak uprav SOC o xx%. Funkce by to nebyla složitá a mohla by výrazně zpřesnit zimní provoz, kdy se dlouho nedosahuje krajních stavů. Chtělo by to ale víc sledovat.
Kdyby ale SOC ujíždělo dolů, tak by to pro mě byl dost problém. To by se celé léto nedal aplikovat docela praktický algoritmus resetu SOC při plně nabité baterce. Pak by ale mohl pomoct výše zmíněný korekční součinitel, který by to celé mohl obrátit.
Snad si ještě na něco vzpomenu, tak někdy příště....
Ostrov s nabíjením z DS, 19,5kWp, 4x XTM4000-48, VT40-80, 30kWh LFP 14P16S + 36kWh Winston 230Ah 3P16S Batrium
2x Skútr E-Max120L
vata
Příspěvky: 67
Registrován: pon úno 07, 2022 9:58 pm

Re: Logika korekce SOC

Příspěvek od vata »

Já ve svém systému ošetřila obě krajní situace: reset na SOC 100% spoléhá na nabíjecí křivku regulátorů - můj program číhá na opad napětí z absorpce na float. Na proudy nespoléhám, protože bych se nemusela dočkat, typicky se právě při dokončené absorpci baterka chvilku vybíjí, než si sedne na float, na kterém ji pak regulátor drží.
Nulování SOC řeším velmi jednoduše opadem na nějaké krajní napětí, při kterém už baterii považuji za vybitou. Jenže protože používám SOC rezervu, tak tahle situace v praxi ještě nenastala, leda při chybové situaci při údržbě.
Při obou typech resetu se zapíše naměřený náboj a kapacita baterky se tak zkoriguje.
Po letech provozu na tomhle řešení nemám co měnit, tím spíš, že je jisté, že ona přesná znalost SOC není vůbec nic důležitého, alespoň pro rozumně velkou baterku. Pak taky proto, že přesnost měření není dostatečná, nastavuju to tak, aby to fandilo vyššímu vybíjení a SOC to podceňovalo - je to v zimě bezpečnější (větší SOC rezerva), v létě pak mám v programu funkci override, která, pokud je systém ve stavu odpojení nějaké kategorie zátěže kvůli SOC, hlídá napětí baterie, a pokud přeleze nastavenou hodnotu, prostě to zátěž připojí, takže se nic neděje. U zdravé baterie to funguje dobře.
Kdyby byl čas, mohla bych napsat program, koukající se na U/I charakteristiku baterie, a SOC autokorigovat průběžně nebo on demand. Dat mám za 10 let provozu pěkných pár mega minutových vzorků.
Uživatelský avatar
marsal
Příspěvky: 615
Registrován: pát dub 09, 2021 11:10 am

Re: Logika korekce SOC

Příspěvek od marsal »

Díky, vata, budu přemýšlet :-).
Odpovědět

Zpět na „Automatizace, řízení“