Snad to někomu tady bude k užitku.
Základní popis:
Vytěžování probíhá v dané verzi pomocí stejného měniče, který obsluhuje další AC spotřebu. Součástí vytěžování je proto omezení, pokud celkový výkon měniče dosáhne určitého limitu (rezerva výkonu měniče).
Vytěžování probíhá pomocí SSR relé řízeného fázově. Lze omezit maximální úhel spínání SSR (max. procento výkonu).
Vytěžuje se tak, že se snažím dodržet proud, který má téct do/z baterie. Co "zbude", lze pouštět do vytěžování. Cílový proud do baterie ale není vždy stejný: při nízkém napěti chci, aby vytěžování bylo žádné nebo minimální, aby se baterie nabíjela, při limitním vysokém napětí baterie může být proud do baterie již nulový a veškerý výkon generovaný panely/větrem/... může být vytěžován.
Pokud je tedy napětí baterie menší než stanovené mezní (TargetDDVoltage_1), nastavuji cílový proud do baterie na výchozí hodnotu (TargetDDCurrent_1). Tato hodnota slouží i jako ochrana baterií před nabíjením příliš velkým proudem. Horní napětí baterie a druhý příslušný cílový proud se nastavuje pomocí proměnných TargetDDVoltage_2 a TargetDDCurrent_2.
Samozřejmě lze místo napětí baterie použít i SOC, mé zkušenosti ovšem říkají, že napětí baterie je jistější kvůli potížím s výpočtem SOC v situacích, kdy proudy se potácejí dlouhodoběji v nízkých hodnotách.
Pro regulaci si tedy vypočtu cílový proud do baterie, jehož křivka vypadá takto:
Cílový regulační proud do baterie mezi dvěma mezními hodnotami se nyní počítá lineárně, lze uvažovat i nelineární průběh. Jen pro pořádek ještě uvádím, že meze cílového proudu mohou být nastaveny i jako záporné, pokud striktně netrvám na tom, aby se vytěžovalo jen při nabíjení.
Pro regulaci potřebuji měřit:
- Aktuální proud baterie (BatteryCurrent)
- Aktuální napětí baterie (Uaku).
- Aktuální AC výkon (AC_Power, pokud chci limitovat vytěžování i podle aktuálního výkonu měniče)
Jednoduchou proporcionální regulací se pak nastavuje napětí SSR, které je v dané verzi pevně v rozmení 0 .. 10V (PhaseVoltage)
Další podrobnosti už je myslím nejlepší dokumentovat kódem (TECO Foxtrot, ST):
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 TargetCurrent_1
// TargetDDVoltage_2 : REAL := 27.1; // napětí, pro které se reguluje proud baterie na TargetCurrent_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