Sie sind auf Seite 1von 10

function [ heizenergie, jahresverlauf_wp, jahresverlauf_wp_blind ] = Waermepumpe

( handles, jahresverlauf, modus )


%Waermepumpe Summary of this function goes here
% Detailed explanation goes here

%% Parameter
flaeche=handles.wohnflaeche;
spez_heizenergie=80; % kWh je m Wohnflche und Jahr
ww_jahresverbrauch=[500 1000]; % [Wert_EFH(in kWh/Person)
/Wohneinheit]
gebaeudeart='EFH';
wp_art='Luft/Wasser';
%
wp_art='Sole/Wasser';
wp_wirkleistung=2.5; % elektrische Leistung in Watt
cosphi_wp=0.8;
phi=acos(cosphi_wp);
tanphi=tan(phi);

Wert_MFH(in kWh

kap_haus=15;
% thermische Speicherkapazitt der Gebude in kWh/K
volumen_ww_speicher=200; % in Liter
volumen_heiz_speicher=1000; % in Liter
%
%

handles.ausstattung.waerme=ones(handles.anzahl_haushalt,1);
handles.ausstattung.puffer=ones(handles.anzahl_haushalt,1);

%% Initialisierung
jahresverlauf_wp=zeros(35040,handles.anzahl_haushalt);
temperatur_haus=zeros(35040,handles.anzahl_haushalt);
temperatur_puffer=zeros(35040,handles.anzahl_haushalt);
temperatur_ww=zeros(35040,handles.anzahl_haushalt);
temperatur_haus(1:35040,1:handles.anzahl_haushalt)=20;
temperatur_puffer(1:35040,1:handles.anzahl_haushalt)=25;
temperatur_ww(1:35040,1:handles.anzahl_haushalt)=45;
heizenergie(1:35040,1:handles.anzahl_haushalt)=0;
% Anfangstemperatur in Speichern bestimmen (01. Januar, 00:00)
temperatur_haus(1,:)=20+randi(100,1,handles.anzahl_haushalt)/100; % ergibt
Werte zwischen 20 und 21 Celsius
temperatur_puffer(1,:)=35+randi(2000,1,handles.anzahl_haushalt)/100; % ergi
bt Werte zwischen 35 und 55 Celsius
temperatur_ww(1,:)=45+randi(1000,1,handles.anzahl_haushalt)/100; % ergibt W
erte zwischen 45 und 55 Celsius
%
temperatur_puffer(1,:)=28; % ergibt Werte zwischen 35 und 55 Celsius % lsc
hen
%
temperatur_haus(1,:)=20.2; % ergibt Werte zwischen 20 und 21 Celsius % ls
chen
%
temperatur_ww(1,:)=55; % ergibt Werte zwischen 45 und 55 Celsius % lschen
% Wrmebedarf fr alle Haushalte fr das ganze Jahr berechnen
[raumwaermebedarf, warmwasserverteilung, temperaturverlauf] = Waermebedarf (
flaeche, spez_heizenergie); % Raumwrmebedarf in kWh je 15-Minuten-Intervall; Warm
wasser: Anteil am Jahresbedarf
for i=1:handles.anzahl_haushalt
if strcmp(gebaeudeart,'EFH')
if handles.bewohneranzahl(i)==2
warmwasserbedarf(:,i)=warmwasserverteilung*ww_jahresverbrauch(1)

*(2+round(randi(100)/100));
elseif handles.bewohneranzahl(i)==1 || handles.bewohneranzahl(i)==4
warmwasserbedarf(:,i)=warmwasserverteilung*ww_jahresverbrauch(1)
*handles.bewohneranzahl(i);
else
'Fehler Bewohnerzahl'
end
elseif strcmp(gebaeudeart,'MFH')
warmwasserbedarf(:,i)=warmwasserverteilung*ww_jahresverbrauch(2);
else
'Fehler Gebudeart'
end
end
% Temperaturbereich der Speicher bestimmen
% puffer_min=273+35;
% in Kelvin; konstante Vorlauftemperatur
% Anmerkung: Der Pufferspeicher muss mindestens die Temperatur des Heizungsv
orlaufs haben!
puffer_min=28.893-(0.3945*temperaturverlauf); % variable Vorlauftemperatur
: --> "Potentiale der WP..." S. 77
puffer_max=55;
ww_min=45;
ww_max=60;
haus_min=20;
haus_max=21;
% Kapazitten der Speicher bestimmen
kap_wasser=4.182;
% spezifische Wrmekapazitt Wasser in kJ pro Kelvin
und Liter
kap_wasser=kap_wasser/3600; % spezifische Wrmekapazitt Wasser in kWh pro Kelvi
n und Liter
kap_puffer=kap_wasser*volumen_heiz_speicher; % Wrmekapazitt d. Heizungsspeiche
rs in kWh/K
kap_ww=kap_wasser*volumen_ww_speicher; % Wrmekapazitt d. Warmwasserspeichers i
n kWh/K
% Temperaturnderung in K pro kWh
erwaermung_haus=1/kap_haus;
erwaermung_puffer=1/kap_puffer;
erwaermung_ww=1/kap_ww;
% Verluste der Speicher in kWh je 24 Stunden bei 45 K Temperaturdifferenz
verlust_puffer=4.7;
verlust_ww=2.1;
% Verlust in Grad je 15-min-Intervall und je Kelvin Temperaturdifferenz
verlust_puffer=verlust_puffer/(96*45*kap_puffer);
verlust_ww=verlust_ww/(96*45*kap_ww);
% Quellentemperatur fr das ganze Jahr bestimmen
if strcmp(wp_art,'Luft/Wasser')
temp_quelle=temperaturverlauf;
elseif strcmp(wp_art,'Sole/Wasser') % --> "Potentiale der WP...", S. 77
temp_bereich(1:2)=[6 4]; % 1. Januar bis 30. April
temp_96=1:(1/11519):2;
temp_sole=interp1(1:2, temp_bereich, temp_96, 'pchip');
temp_bereich(1:2)=[4 8]; % 1. Mai bis 14. September
temp_96=1:(1/13151):2;
temp_sole=[temp_sole interp1(1:2, temp_bereich, temp_96, 'pchip')];
temp_bereich(1:2)=[8 6]; % 15. September bis 31. Dezember
temp_96=1:(1/10367):2;
temp_sole=[temp_sole interp1(1:2, temp_bereich, temp_96, 'pchip')];
temp_quelle=temp_sole;
else

msgbox('Falsche Wrmepumpenart');
end
if modus==3
% Resultierenden Lastgang fr das ganze Netz
% berechnen
if handles.anzahl_haushalt==1
sum_jahresverlauf=jahresverlauf;
else
sum_jahresverlauf=sum(jahresverlauf,2);
end
sum_jahresverlauf_0=sum_jahresverlauf;
end
% Nachttarif festlegen (im Programm wird Nachttarif wie bei der
% PV-Anlage realisiert, wobei in den Nachttarifzeiten quasi eine
% PV-Einspeisung stattfindet)
tag=zeros(1,96);
% Freigabezeiten hier: 22:00 Uhr bis 06:00 Uhr
tag(1:24)=-wp_wirkleistung*1000;
tag(88:96)=-wp_wirkleistung*1000;
nachttarif=[];
for n=1:365
nachttarif=[nachttarif tag];
end

%-------------------------------------------------------------------------%% Lastgangermittlung
hh_wait=waitbar(0,'Haushalte');
time_wait=waitbar(0,'Zeit');
for i=1:handles.anzahl_haushalt
beginn=clock;
heizmatrix=zeros(35040,1); %
waitbar(i/handles.anzahl_haushalt,hh_wait);
if handles.ausstattung.waerme(i)==1
% Beginn rollierende Planung: 36 Stunden planen, dann die 6 Stunden
vorspringen und erneut 36 Stunden planen
for t=1:24:35040
%
t=t
waitbar(t./35040,time_wait);
heizmatrix(t:end)=0;
fertig=false;
y=1;
count=1;
while fertig==false
%

y=y+1;
keyboard;
next_min=0;

%% ------------------------------------------------------%% Achtung: Mit dem folgenden Wert kann die Qualitt und die Geschwindigkeit der
Rechnung eingestellt werden. Je hher der Wert, desto optimaler die Puffernutzung
die Simulation. Bei kleinen Werten (ca. <14) wird die Schleife nicht oft genug d
urchlaufen, sodass es zu Fehlern kommt.

%% ------------------------------------------------------if y-count==50 % "50" liefert gute Ergebnisse, dauert aber


lange. "12" eignet sich zum Testen.
break
end
%% [Achtung Ende]
%% ------------------------------------------------------% Suche nchste Temperaturunterschreitung
temperatur_haus_test(1:35040,i)=temperatur_haus(1:35040,i);
temperatur_puffer_test(1:35040,i)=temperatur_puffer(1:35040,
i);
temperatur_ww_test(1:35040,i)=temperatur_ww(1:35040,i);
%

for z=t:min([t+143 35040])


z=t+count-1;
while z<min([t+143 35040])
heizmenge_ww=0;
heizmenge_puffer=0;

% Ggf. Pufferspeicher heizen


if heizmatrix(z)==1
heizmenge_puffer=COP_Berechnen(temp_quelle(z),temper
atur_puffer_test(z,i)+5 )*wp_wirkleistung/4;
% Ggf. Warmwasser heizen
elseif heizmatrix(z)==2
heizmenge_ww=COP_Berechnen(temp_quelle(z), 60)*wp_wi
rkleistung/4;
end
temperatur_puffer_test(z,i)=temperatur_puffer_test(z,i)+
heizmenge_puffer*erwaermung_puffer;
waermemenge=max(0 , min((temperatur_puffer_test(z,i)-puf
fer_min(z+1))*kap_puffer , ...
(haus_max-temperatur_haus_test(z,i))*kap_haus+raumwa
ermebedarf(z))); % Ergibt kWh
temperatur_haus_test(z+1,i)=temperatur_haus_test(z,i)+(w
aermemenge-raumwaermebedarf(z))*erwaermung_haus;
temperatur_puffer_test(z+1,i)=temperatur_puffer_test(z,i
)-waermemenge*erwaermung_puffer-max(0,(temperatur_puffer_test(z,i)-15))*verlust_
puffer;
temperatur_ww_test(z+1,i)=temperatur_ww_test(z,i)+(heizm
enge_ww-warmwasserbedarf(z,i))*erwaermung_ww-max(0,(temperatur_ww_test(z,i)-15))
*verlust_ww;
%
n

z_temp=[z temperatur_haus_test(z+1,i) haus_min] % lsche


if temperatur_ww_test(z+1,i)<ww_min % Warmwasser hat Vo

rrang
heizart=2; % Warmwasser
next_min=z;
if ~heizmatrix(z)==0
next_min=z;
count=count+1;
end
break;
elseif temperatur_haus_test(z+1,i)<haus_min
heizart=1; %Puffer
next_min=z;

if ~heizmatrix(z)==0
next_min=z;
count=count+1;
end
break;
elseif next_min==0 && z==min([t+143 35040])
'Fertig'
fertig=true;
break
end
z=z+1;
end
if fertig==true
break;
end
if modus==1
% Sortiere nach Hhe der Einspeisung, bevorzuge sptere
% Zeitpunkte wenn PV > Leistung WP oder wenn keine Einsp

eisung
[verlauf, prioritaet]=sort(nachttarif(t:next_min));
prioritaet(find(verlauf==-wp_wirkleistung*1000))=priorit
aet(sort(find(verlauf==-wp_wirkleistung*1000),'descend'));
prioritaet(find(verlauf==0))=prioritaet(sort(find(verlau
f==0),'descend'));
end
if modus==2
if handles.matrix_solar(i)==1
jahresverlauf_cap=jahresverlauf(:,i);
jahresverlauf_cap(find(jahresverlauf_cap>0))=0;
%
Wenn keine Einspeisung (sondern Last)
jahresverlauf_cap(find(jahresverlauf_cap<-wp_wirklei
stung*1000))=-wp_wirkleistung*1000; % Wenn Leistung der WP die PV-Einspeisung b
ersteigt
% Sortiere nach Hhe der Einspeisung, bevorzuge sptere
% Zeitpunkte wenn PV > Leistung WP oder wenn keine E
inspeisung
[verlauf, prioritaet]=sort(jahresverlauf_cap(t:next_
min));
prioritaet(find(verlauf==-wp_wirkleistung*1000))=pri
oritaet(sort(find(verlauf==-wp_wirkleistung*1000),'descend'));
prioritaet(find(verlauf==0))=prioritaet(sort(find(ve
rlauf==0),'descend'));
else
% Sortiere sodass Nachttarif bevorzugt wird
[verlauf, prioritaet]=sort(nachttarif(t:next_min));
prioritaet(find(verlauf==-wp_wirkleistung*1000))=pri
oritaet(sort(find(verlauf==-wp_wirkleistung*1000),'descend'));
prioritaet(find(verlauf==0))=prioritaet(sort(find(ve
rlauf==0),'descend'));
end
end
if modus==3
% Sortiere nach Hhe der Einspeisung, bevorzuge sptere

% Zeitpunkte wenn PV > Leistung WP


[verlauf, prioritaet]=sort(sum_jahresverlauf(t:next_min)
);
prioritaet(find(verlauf==-wp_wirkleistung*1000))=priorit
aet(sort(find(verlauf==-wp_wirkleistung*1000),'descend'));
prioritaet(find(verlauf==0))=prioritaet(sort(find(verlau
f==0),'descend'));
end
for p=1:numel(prioritaet)
% Um die Rechenzeit zu verringern, knnen mit dem Wert X i
n "min(t+prioritaet(p) +X ,35040))" die nchsten X Zeitpunkte nach dem letzten
WW-Heizen bersprungen werden. Dies ist gerechtfertigt, da (je nach Temperaturgre
nzen und Verbrauch) es beim Heizen in zu kurzen Abstnden zur berschreitung der Max
imaltemperatur kommt.
if heizart==2
testmatrix=heizmatrix(t+prioritaet(p)-1:min(t+priori
taet(p) +10 ,35040));
if max(testmatrix==2)
continue;
end
end
if heizmatrix(t+prioritaet(p)-1)==0
heizmatrix(t+prioritaet(p)-1)=heizart;
% Temperaturverlufe unter Bercksichtigung der
% bisherigen Heizzeitpunkte erstellen
for z=t:min([next_min+1 35040])
% Wrmeverluste betrachten: Verluste werden je zu
r Hlfte mit alter (vor Heizvorgang) und mit neuer Temperatur (nach Heizvorgang) b
erechnet
%
waermemenge=max(0 , min((temperatur_puffe
r(z,i)-puffer_min(z+1))*kap_puffer , ...
%
(haus_max-temperatur_haus(z))*kap_haus
+raumwaermebedarf(z))); % Ergibt kWh
temperatur_haus(z+1,i)=temperatur_haus(z,i)-raum
waermebedarf(z)*erwaermung_haus;
temperatur_puffer(z+1,i)=temperatur_puffer(z,i)max(0,(temperatur_puffer(z,i)-15))*verlust_puffer/2;
temperatur_ww(z+1,i)=temperatur_ww(z,i)-warmwass
erbedarf(z,i)*erwaermung_ww-max(0,(temperatur_ww(z,i)-15))*verlust_ww/2;
% Ggf. Pufferspeicher heizen
if heizmatrix(z)==1
heizmenge=COP_Berechnen(temp_quelle(z),tempe
ratur_puffer(z,i)+5 )*wp_wirkleistung/4;
temperatur_puffer(z+1,i)=temperatur_puffer(z
+1,i)+heizmenge*erwaermung_puffer;
% Ggf. Warmwasser heizen
elseif heizmatrix(z)==2
heizmenge=COP_Berechnen(temp_quelle(z), 60)*
wp_wirkleistung/4;
temperatur_ww(z+1,i)=temperatur_ww(z+1,i)+he
izmenge*erwaermung_ww;
end

% Ggf. Wrme vom Pufferspeicher an das Haus bertr

agen
waermemenge=max(0 , min((temperatur_puffer(z+1,i
)-puffer_min(min(z+1,35040)))*kap_puffer , ...
(haus_max-temperatur_haus(z,i))*kap_haus+rau
mwaermebedarf(z))); % Ergibt kWh
temperatur_haus(z+1,i)=temperatur_haus(z+1,i)+wa
ermemenge*erwaermung_haus;
temperatur_puffer(z+1,i)=temperatur_puffer(z+1,i
)-waermemenge*erwaermung_puffer;
temperatur_puffer(z+1,i)=temperatur_puffer(z+1,i
)-max(0,(temperatur_puffer(z+1,i)-15))*verlust_puffer/2;
temperatur_ww(z+1,i)=temperatur_ww(z+1,i)-max(0,
(temperatur_ww(z+1,i)-15))*verlust_ww/2;
if max(temperatur_puffer(t:min([t+144 35040]),i)
)>puffer_max
%
%

keyboard;
'zu hoch'
index_heiz=t+prioritaet(p)-1;
heizmatrix(t+prioritaet(p)-1)=0;
max_temp=max(temperatur_puffer(t:min([t+14

%
4 35040]),i))

break;
end
if max(temperatur_ww(t:min([t+144 35040]),i))>ww
_max
%
%

keyboard;
'zu hoch'
heizmatrix(t+prioritaet(p)-1)=0;
break;
end
end
% Prfe, ob es zu Verletzung der Temperaturgrenzen kom

mt
if max(temperatur_ww(t:min([t+144 35040]),i))>ww_max
| max(temperatur_puffer(t:min([t+144 35040]),i))>puffer_max
%
ausgabe=strcat ('Heizen verhindert bei: ',pv_i
ndex(p),' Heizart: ',heizmatrix(pv_index(p))) % lschen
heizmatrix(t+prioritaet(p)-1)=0;
temperatur_ww(t+1:min([t+144 35040]),i)=0;
temperatur_puffer(t+1:min([t+144 35040]),i)=0;
else
heizenergie(t+prioritaet(p)-1,i)=heizmenge;
break; % while-Schleife beenden, da Temperatur
unterschreitung behoben --> Weiter mit nchster Temperaturunterschreitung
end

end
end
end

end
jahresverlauf_wp(:,i)=heizmatrix;
jahresverlauf_wp(find(jahresverlauf_wp(:,i)==1),i)=wp_wirkleistung*1
000;
jahresverlauf_wp(find(jahresverlauf_wp(:,i)==2),i)=wp_wirkleistung*1
000;
%
jahresverlauf_wp(find(jahresverlauf_wp(:,i)==1),i)=wp_wirkleistung
*250; % Aktivieren, um zu sehen, wann welcher Puffer geheizt wird
%
jahresverlauf_wp(find(jahresverlauf_wp(:,i)==2),i)=wp_wirkleistung
*1000; % Aktivieren, um zu sehen, wann welcher Puffer geheizt wird
jahresverlauf_wp_blind=jahresverlauf_wp*tanphi;
if modus==3
sum_jahresverlauf=sum_jahresverlauf+jahresverlauf_wp(:,i);
end
end
if modus==3
if i==1
sum_jahresverlauf_1=sum_jahresverlauf;
end
end
ende=clock;
dauer=ende(6)-beginn(6)+(ende(5)-beginn(5))*60+(ende(4)-beginn(4))*3600+
(ende(3)-beginn(3))*86400;
end
% ------------------------------------------------------------------------%
for i=1:handles.anzahl_haushalt
%
%% Ergebnis grafisch darstellen (2,5 Tage)
%
h=figure();
%
subplot(2,1,1);
%
hold on;
%
grid on;
%
%
%
% Grenzen
%
konstante(1:35040)=haus_min;
%
plot(konstante(1:219),'y');
%
konstante(1:35040)=haus_max;
%
plot(konstante(1:219),'y');
%
plot(puffer_min(1:219),'k');
%
konstante(1:35040)=puffer_max;
%
plot(konstante(1:219),'y');
%
konstante(1:35040)=ww_min;
%
plot(konstante(1:219),'c');
%
konstante(1:35040)=ww_max;
%
plot(konstante(1:219),'c');
%
%
% Temperaturverlufe
%
plot(temperatur_haus(1:219,i),'g');
%
plot(temperatur_puffer(1:219,i),'m');
%
plot(temperatur_ww(1:219,i),'b');
%
%
subplot(2,1,2);
%
%
hold on;
% %
% Jahresverlauf
%
if modus==1

%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%

plot(jahresverlauf(1:219,i),'g');
plot(nachttarif(1:219),'r');
plot(jahresverlauf_wp(1:219,i),'b');
end
if modus==2
plot(jahresverlauf(1:219,i),'g');
plot(jahresverlauf_cap(1:219),'r');
plot(jahresverlauf_wp(1:219,i),'b');
end
if modus==3
plot(sum_jahresverlauf(1:219),'r');
plot(sum_jahresverlauf_1(1:219),'g');
plot(sum_jahresverlauf_0(1:219),'k');
plot(jahresverlauf_wp(1:219,i),'b');
end
grid on;

%% Ergebnis grafisch darstellen (Ganzes Jahr)


h=figure();
subplot(2,1,1);
hold on;
grid on;
% Grenzen
konstante(1:35040)=haus_min;
plot(konstante,'y');
konstante(1:35040)=haus_max;
plot(konstante,'y');
plot(puffer_min,'k');
konstante(1:35040)=puffer_max;
plot(konstante,'k');
konstante(1:35040)=ww_min;
plot(konstante,'c');
konstante(1:35040)=ww_max;
plot(konstante,'c');
% Temperaturverlufe
plot(temperatur_haus(:,i),'g');
plot(temperatur_puffer(:,i),'m');
plot(temperatur_ww(:,i),'b');
subplot(2,1,2);
hold on;
grid on;
% Jahresverlauf
if modus==1
plot(jahresverlauf(:,i),'g');
plot(nachttarif(:),'r');
plot(jahresverlauf_wp(:,i),'b');
end
if modus==2
plot(jahresverlauf(:,i),'g');
plot(jahresverlauf_cap(:),'r');
plot(jahresverlauf_wp(:,i),'b');
end
if modus==3

%
%
%
%
%

plot(sum_jahresverlauf(:),'r');
plot(sum_jahresverlauf_0(:),'k');
plot(jahresverlauf_wp(:,i),'b');
end
end
delete (hh_wait);
delete (time_wait);

end
%-------------------------------------------------------------------------function [ cop ] = COP_Berechnen ( temperatur_quelle, temperatur_vorlauf )
emperaturen in Grad Celsius

% T

a=0.48; % a und b sind Parameter zur Berechnung des COP (s. BMWI: "Potential
e der Wrmepumpe...", S. 76 f.)
b=10;
vorlauf_kelvin=temperatur_vorlauf+273;
quelle_kelvin=temperatur_quelle+273;
cop=a*(vorlauf_kelvin./(vorlauf_kelvin-quelle_kelvin+b)+1);
% Unrealistische hohe Werte fr COP eliminieren UND:
% Bei etwa 27,9 Auen-Temperatur kommt es zu hohen negativen Werten
if cop<0 || cop>5
cop=5;
end
end