Verfasst am: 19.12.2014, 15:43
Titel: Ladezustand eines Batteriespeichers
Hallo zusammen,
folgendes im Prinzip banales Problem überfordert mich gerade mit meinen bescheidenen Matlab-Kenntnissen:
Ich möchte den Ladezustand eines Batteriespeichers berechnen. Im ersten Schritt soll er die Energie einspeichern, die von einer zugehörigen Photovoltaik-Anlage bereit gestellt wird und später durch den Eigenverbrauch des Hauses wieder entladen werden. Das war einfach zu lösen, indem ich den Leistungsfluss mit cumtrapz integriere.
Dabei passiert es aber, dass der Speicherinhalt ins Negative gehen kann beziehungsweise beliebig hoch ansteigen kann. Mit dem Code
Speicherladung(find(Speicherladung<0))=0
konnte ich zwar Grenzen einführen, allerdings wird dann der Speicherinhalt beim Laden nicht ab Null geladen, sondern ab dem ursprünglichen negativen Wert. Analog natürlich mit der oberen Grenze.
Wie kann ich das hinkriegen, dass die Integration immer abhängig vom Füllstand bei den gesetzten Grenzen anfängt?
Ich hoffe das war verständlich genug formuliert..
Danke für jede Hilfe
DaNi1988
DaNi1988
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 19.12.2014, 15:57
Titel: Nachtrag zum Batteriespeicher
Zur Veranschaulichung hier noch ein Bild wie es momentan aussieht:
In Rot die Begrenzungen bei Null und der Speicherkapazität. Zur Mitte des ersten Tages sollte die Füllung erstmal bei Null bleiben und dann auf ca. 3 kWh ansteigen anstatt von -1,5 bis 1,2. Analog dann für die folgenden Tage und für die obere Grenze.
Verfasst am: 27.12.2014, 16:36
Titel: Code zum Ladezustand eines Batteriespeichers
Hallo nochmal,
mittlerweile bin ich selbst auf eine Lösung gekommen die ich euch nicht vorenthalten will.
Vorher habe ich den Vektor des Leistungsflusses einfach aufintegriert. Jetzt habe ich geeignete Abfragen eingesetzt, es wird nur noch integriert, wenn genügend Platz im Energiespeicher zur Verfügung steht bzw. wenn er nicht ganz leer ist. Am Ende werden die einzelnen Bilder gespeichert und wieder geschlossen.
Ich hoffe ich habe das genügend allgemeingültig programmiert, so dass der nächste ohne groß umzuformen das übernehmen kann.
ymin = -PVmax; % Grenzen für das erste Bild
ymax = PVmax;
yminSpeicher = -3; % Grenzen für das zweite Bild
ymaxSpeicher = Speicherkap*1.2;
Schranke=GesChar; % Maximale Rückspeisung, oberhalb derer die Leistung vom Speicher abgehalten wird
Schranke((Schranke)<Rueckspeisebegrenzung) = Rueckspeisebegrenzung;
SpeicherkapGrenze = linspace(Speicherkap,Speicherkap, length(Zeit)); %Nur für den Plot relevant
NullGrenze = linspace(0,0,length(Zeit));
gruen=[0.20.60];
schraffiert = [0.8, 0.8, 1];,
idxSpeicherEntladen = Ausspeichern>0; % Index, wo der Speicher entladen wird
idxSpeicherLaden = Einspeichern<0; % Index, wo Rückspeisung den Grenzwert überschreitet, negativ weil Rückspeisung negativ gezählt wird
t = 1; %Laufvariable
EnSpeicher = linspace(Fuellstand_Speicher,Fuellstand_Speicher,length(Zeit))'; % Speichervektor definieren while(t<length(Zeit)) if idxSpeicherLaden(t) == 1 %wird der Speicher geladen?
if EnSpeicher(t-1)<=Speicherkap %Stellt sicher, dass der Speicher nur geladen wird wenn er noch nicht voll ist
EnSpeicher(t) = -Einspeichern(t) .* ZeitschrittStunden + EnSpeicher(t-1); % Dann integriere den aktuellen Wert und rechne ihn auf den vorherigen dazu elseif EnSpeicher(t-1)>Speicherkap % Ansonsten setze den Speicherstand auf den Maximalwert
EnSpeicher(t)=Speicherkap; % Dieser Fall sollte jetzt gar nicht mehr auftreten end
elseif idxSpeicherEntladen(t) == 1 %wird der Speicher entladen?
if EnSpeicher(t-1)>=0
EnSpeicher(t) = -Ausspeichern(t) .* ZeitschrittStunden + EnSpeicher(t-1); % Dann integriere den aktuellen Wert und rechne ihn auf den vorherigen dazu elseif EnSpeicher(t-1)<0% Ansonsten setze den Speicherstand auf Null
EnSpeicher(t)=0; % Dieser Fall sollte jetzt gar nicht mehr auftreten end
elseif idxSpeicherLaden(t)==0 && idxSpeicherEntladen(t) == 0 if t == 1
EnSpeicher(t) = EnSpeicher(t); % Es gibt kein Nulltes Element im Vektor else
EnSpeicher(t) = EnSpeicher(t-1);
end end
fill(Zeit, GesChar,schraffiert); hold on % negativ, also Rückspeisung fill(Zeit, Schranke,'w'); %Rückspeiseleistung noch nicht hoch genug, damit der Speicher abpuffern muss
fill(Zeit, Ausspeichern,schraffiert); % positiv, also Netzbezug grid on;
grid(gca, 'minor');
ylim([ymin, ymax]);
title(text);
legend('SLP','SLP und PV','Nur PV','eingespeicherte Energie', 'Location', 'South','Orientation','horizon');
xlabel('Wochentag');
ylabel('kW');
subplot(2,1,2),plot(Zeit, NullGrenze, 'r', Zeit, SpeicherkapGrenze, 'r', Zeit, EnSpeicher); grid on, hold on
grid(gca, 'minor');
ylim([-0.5, Speicherkap*1.2]);
title('Speicherladung');
xlabel('Wochentag');
ylabel('kWh');
print(figure(fig), '-dpng', text); %Speichert die einzelnen Bilder ab
close('figure', fig); % und schließt das Bild anschließend
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.