Skip to content

Commit

Permalink
Add NIST validation and final paper status #1575
Browse files Browse the repository at this point in the history
  • Loading branch information
LauraMaier committed Aug 31, 2023
1 parent b29b8c5 commit 6e263f8
Show file tree
Hide file tree
Showing 16 changed files with 1,066,783 additions and 9 deletions.
68 changes: 68 additions & 0 deletions IBPSA/Electrical/DC/Sources/PVTwoDiodes.mo
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
within IBPSA.Electrical.DC.Sources;
model PVTwoDiodes
"Photovoltaic module(s) model based on two diodes approach"
extends IBPSA.Electrical.BaseClasses.PV.PartialPVSystem(
replaceable IBPSA.Electrical.Data.PV.TwoDiodesData data,
redeclare IBPSA.Electrical.BaseClasses.PV.PVOpticalAbsRat
PVOptical(
final alt=alt,
final til=til,
final groRef=groRef,
final glaExtCoe=glaExtCoe,
final glaThi=glaThi,
final refInd=refInd),
redeclare IBPSA.Electrical.BaseClasses.PV.PVElectricalTwoDiodesMPP
PVElectrical(redeclare IBPSA.Electrical.Data.PV.TwoDiodesData
data=data),
replaceable IBPSA.Electrical.BaseClasses.PV.BaseClasses.PartialPVThermalEmp
PVThermal(
redeclare IBPSA.Electrical.Data.PV.TwoDiodesData data=data));


equation
connect(PVElectrical.eta, PVThermal.eta) annotation (Line(
points={{-3.45455,-53},{40,-53},{40,-20},{-72,-20},{-72,-11.8},{-17.0909,
-11.8}},
color={0,0,127}));
connect(PVThermal.TCel, PVElectrical.TCel) annotation (Line(
points={{-4.54545,-10},{0,-10},{0,-14},{-58,-14},{-58,-47},{-16,-47}},
color={0,0,127}));
connect(PVElectrical.P, PDC) annotation (Line(points={{-3.45455,-47},{20,-47},
{20,-40},{60,-40},{60,0},{90,0}}, color={0,0,127}));
connect(PVOptical.absRadRat, PVElectrical.absRadRat)
annotation (Line(points={{-4.54545,30},{20,30},{20,-34},{-64,-34},{-64,-51.8},
{-16,-51.8}}, color={0,0,127}));
connect(HGloTil, PVElectrical.HGloTil) annotation (Line(points={{-100,-60},{-100,
-60},{-100,-54},{-68,-54},{-68,-54.2},{-16,-54.2}}, color={0,
0,127}));
connect(TDryBul, PVThermal.TDryBul) annotation (Line(points={{-100,0},{
-60,0},{-60,-4.6},{-17.0909,-4.6}},color={0,0,127}));
connect(HGloTil, PVThermal.HGloTil) annotation (Line(points={{-100,-60},
{-80,-60},{-80,6},{-40,6},{-40,-15.4},{-17.0909,-15.4}},
color={0,0,127}));
connect(vWinSpe, PVThermal.winVel) annotation (Line(points={{-100,30},{
-40,30},{-40,28},{-52,28},{-52,-8.2},{-17.0909,-8.2}},
color={0,0,127}));
connect(zenAngle, PVOptical.zenAng) annotation (Line(points={{-100,90},
{-44,90},{-44,34.2},{-17.0909,34.2}},
color={0,0,127}));
connect(incAngle, PVOptical.incAng) annotation (Line(points={{-100,60},
{-100,64},{-22,64},{-22,31.8},{-17.0909,31.8}}, color={0,0,127}));
connect(HDifHor, PVOptical.HDifHor) annotation (Line(points={{-100,-90},
{-100,70},{-72,70},{-72,27},{-17.0909,27}}, color={0,0,127}));

connect(HGloHor, PVOptical.HGloHor) annotation (Line(points={{-100,-30},
{-20,-30},{-20,29.4},{-17.0909,29.4}},color={0,0,127}));
annotation (Icon(coordinateSystem(preserveAspectRatio=false)), Diagram(
coordinateSystem(preserveAspectRatio=false)),
Documentation(info="<html>
<p>This is a photovoltaic generator model based on a two diodes approach with replaceable thermal models accounting for different mountings. </p>
</html>",revisions="<html>
<ul>
<li>
Dec 12, 2022, by Christoph Nytsch-Geusen:<br/>
First implementation.
</li>
</ul>
</html>"));
end PVTwoDiodes;
Original file line number Diff line number Diff line change
Expand Up @@ -45,10 +45,10 @@ partial model partialPVRooftopBuildingValidation
tableOnFile=true,
tableName="MeaDatHGloHor",
fileName=ModelicaServices.ExternalReferences.loadResource(
"modelica://IBPSA/Resources/Data/Electrical/DC/Sources/Validation/Solar_irradiation_PV.txt"),
"modelica://IBPSA/Resources/Data/Electrical/DC/Sources/Validation/Solar_irradiation_300.txt"),
columns={2},
smoothness=Modelica.Blocks.Types.Smoothness.ContinuousDerivative,
shiftTime=nDay - 450)
shiftTime=nDay - 150)
"This file contains the global horizontal irradiation. The PVSystem model is validaded with measurement data from Rooftop building: http://www.solar-rooftop.de."
annotation (Placement(transformation(extent={{-100,-100},{-80,-80}})));

Expand Down
196 changes: 196 additions & 0 deletions IBPSA/Electrical/DC/Sources/Validation/PVSingleDiodeNISTValidation.mo
Original file line number Diff line number Diff line change
@@ -0,0 +1,196 @@
within IBPSA.Electrical.DC.Sources.Validation;
model PVSingleDiodeNISTValidation
"Model validation based on NIST measurement data"
extends Modelica.Icons.Example;

parameter Modelica.Units.SI.Time timZon=-5*3600
"Time zone";

parameter Modelica.Units.SI.Angle lon=-77.2156*Modelica.Constants.pi/180
"Longitude";
parameter Modelica.Units.SI.Angle lat=39.1354*Modelica.Constants.pi/180
"Latitude";
parameter Modelica.Units.SI.Angle azi=0
"Surface azimuth. azi=-90 degree if surface outward unit normal points toward east; azi=0 if it points toward south";
parameter Modelica.Units.SI.Angle til=10*Modelica.Constants.pi/180
"Surface tilt. til=90 degree for walls; til=0 for ceilings; til=180 for roof";

parameter Modelica.Units.SI.Time nDay=(31+28+31+30+31+14)*24*3600 "Day at which simulation starts";


parameter Real alt(final unit="m")= 0.08 "Site altitude";

parameter Real rho=0.2 "Ground reflectance";

constant Real G_sc(
final quantity="Irradiance",
final unit = "W/m2") = 1376
"Solar constant";

Modelica.Units.SI.Irradiance HGloHor;
Modelica.Units.SI.Irradiance HGloHorDif;
Real k_t(final unit="1", start=0.5) "Clearness index";
Modelica.Units.SI.Angle solDec;
Modelica.Units.SI.Angle solHouAng;
Modelica.Units.SI.Time cloTim;

Modelica.Blocks.Sources.CombiTimeTable NISTdata(
tableOnFile=true,
tableName="Roof2016",
fileName=ModelicaServices.ExternalReferences.loadResource("modelica://IBPSA/Resources/Data/Electrical/DC/Sources/Validation/NIST_onemin_Roof_2016.txt"),
columns={3,5,2,4},
smoothness=Modelica.Blocks.Types.Smoothness.ContinuousDerivative)
"The PVSystem model is validaded with measurement data from: https://pvdata.nist.gov/ "
annotation (Placement(transformation(extent={{-96,-10},{-76,10}})));

PVSingleDiode pVSingleDiode(
redeclare IBPSA.Electrical.Data.PV.SingleDiodeShardNUU235F2 data,
PVTechType=IBPSA.Electrical.BaseClasses.PV.BaseClasses.PVOptical.PVType.MonoSI,
n_mod=312,
groRef=rho,
alt=alt,
til=til,
redeclare IBPSA.Electrical.BaseClasses.PV.PVThermalEmpMountCloseToGround
PVThermal)
annotation (Placement(transformation(extent={{64,0},{80,20}})));

Modelica.Blocks.Interfaces.RealOutput PDCSim "Simulated DC output power"
annotation (Placement(transformation(extent={{100,-10},{120,10}})));
BoundaryConditions.SolarGeometry.IncidenceAngle incAng(azi=azi, til=til)
annotation (Placement(transformation(extent={{-36,-58},{-20,-42}})));
Modelica.Blocks.Routing.RealPassThrough zen
annotation (Placement(transformation(extent={{0,-80},{20,-60}})));
BoundaryConditions.SolarIrradiation.GlobalPerezTiltedSurface HGloTil(
H(start=100),
til=til,
azi=azi,
rho=rho)
annotation (Placement(transformation(extent={{22,30},{42,50}})));
BoundaryConditions.WeatherData.ReaderTMY3 weaDat(
filNam=ModelicaServices.ExternalReferences.loadResource(
"modelica://IBPSA/Resources/weatherdata/USA_MD_Baltimore-Washington.Intl.AP.724060_TMY3.mos"),
computeWetBulbTemperature=false,
TDryBulSou=IBPSA.BoundaryConditions.Types.DataSource.Input,
winSpeSou=IBPSA.BoundaryConditions.Types.DataSource.Input,
HSou=IBPSA.BoundaryConditions.Types.RadiationDataSource.Input_HGloHor_HDifHor)
annotation (Placement(transformation(extent={{-40,-10},{-20,10}})));

Modelica.Blocks.Sources.Constant sounDay(k=nDay)
"Number of validation day (July 28th 2023) in seconds"
annotation (Placement(transformation(extent={{-96,54},{-80,70}})));
BoundaryConditions.WeatherData.Bus weaBus "Weather data bus"
annotation (Placement(transformation(extent={{-16,-10},{4,10}})));
Modelica.Blocks.Math.UnitConversions.From_degC from_degC
annotation (Placement(transformation(extent={{-62,-4},{-54,4}})));
Modelica.Blocks.Sources.RealExpression souGloHorDif(y=HGloHorDif)
annotation (Placement(transformation(extent={{-78,-40},{-58,-20}})));
Modelica.Blocks.Interfaces.RealOutput PDCMea "Measured DC output power"
annotation (Placement(transformation(extent={{100,-30},{120,-10}})));
Modelica.Blocks.Interfaces.RealOutput SolHouAng(final unit="rad") "Solar hour angle"
annotation (Placement(transformation(extent={{100,-62},{120,-42}})));
Modelica.Blocks.Interfaces.RealOutput SolDec(final unit="rad")
"Solar decimal angle"
annotation (Placement(transformation(extent={{100,-80},{120,-60}})));
Modelica.Blocks.Interfaces.RealOutput CloTim(final unit="s") "Clock time"
annotation (Placement(transformation(extent={{100,-100},{120,-80}})));
Modelica.Blocks.Math.Gain frokW_toW(k=1000)
"From Kilowatt to Watt transformation"
annotation (Placement(transformation(extent={{72,-26},{84,-14}})));
equation

//Approximation of diffuse horizontal irradiation still necessary because
//the validation data does not contain this information so far

HGloHor=NISTdata.y[3];
solDec=SolDec;
solHouAng=SolHouAng;
cloTim=CloTim;

k_t = if HGloHor <= 0.01 then 0 else min(1, max(0, (HGloHor/(G_sc*
(1+0.033*cos(360*(Modelica.Constants.pi/180)*cloTim/24/60/60/365)*
(cos(lat)*cos(SolDec)*cos(SolHouAng)+sin(lat)*sin(SolDec)))))));

// Erb´s diffuse fraction relation
HGloHorDif = if HGloHor <=0.01 then
0
elseif k_t <= 0.22 then
(HGloHor)*(1.0-0.09*k_t)
elseif k_t > 0.8 then
(HGloHor)*0.165
else
(HGloHor)*(0.9511-0.1604*k_t+4.388*k_t^2-16.638*k_t^3+12.336*k_t^4);
connect(pVSingleDiode.PDC, PDCSim)
annotation (Line(points={{81,10},{96,10},{96,0},{110,0}},
color={0,0,127}));
connect(zen.y, pVSingleDiode.zenAngle) annotation (Line(points={{21,-70},{54,-70},
{54,19},{62,19}}, color={0,0,127}));
connect(weaDat.weaBus, weaBus) annotation (Line(
points={{-20,0},{-6,0}},
color={255,204,51},
thickness=0.5));
connect(NISTdata.y[1], from_degC.u)
annotation (Line(points={{-75,0},{-62.8,0}}, color={0,0,127}));
connect(from_degC.y, weaDat.TDryBul_in) annotation (Line(points={{-53.6,0},{-46,
0},{-46,9},{-41,9}}, color={0,0,127}));
connect(NISTdata.y[2], weaDat.winSpe_in) annotation (Line(points={{-75,0},{-68,
0},{-68,-8},{-46,-8},{-46,-3.9},{-41,-3.9}}, color={0,0,127}));
connect(souGloHorDif.y, pVSingleDiode.HDifHor)
annotation (Line(points={{-57,-30},{62,-30},{62,1}}, color={0,0,127}));
connect(NISTdata.y[3], pVSingleDiode.HGloHor) annotation (Line(points={{-75,0},
{-68,0},{-68,-16},{32,-16},{32,7},{62,7}}, color={0,0,127}));
connect(HGloTil.H, pVSingleDiode.HGloTil)
annotation (Line(points={{43,40},{56,40},{56,4},{62,4}}, color={0,0,127}));
connect(weaBus, HGloTil.weaBus) annotation (Line(
points={{-6,0},{-8,0},{-8,40},{22,40}},
color={255,204,51},
thickness=0.5));
connect(incAng.y, pVSingleDiode.incAngle) annotation (Line(points={{-19.2,-50},
{-12,-50},{-12,-14},{30,-14},{30,16},{62,16}}, color={0,0,127}));
connect(NISTdata.y[2], pVSingleDiode.vWinSpe) annotation (Line(points={{-75,0},
{-68,0},{-68,-8},{-44,-8},{-44,-16},{32,-16},{32,6},{52,6},{52,13},{62,
13}}, color={0,0,127}));
connect(weaBus, incAng.weaBus) annotation (Line(
points={{-6,0},{-6,-24},{-46,-24},{-46,-50},{-36,-50}},
color={255,204,51},
thickness=0.5));
connect(weaBus.solZen, zen.u) annotation (Line(
points={{-6,0},{-6,-54},{-12,-54},{-12,-70},{-2,-70}},
color={255,204,51},
thickness=0.5));
connect(weaBus.solHouAng,SolHouAng) annotation (Line(
points={{-6,0},{-6,-52},{110,-52}},
color={255,204,51},
thickness=0.5));
connect(weaBus.solDec,SolDec) annotation (Line(
points={{-6,0},{-6,-70},{110,-70}},
color={255,204,51},
thickness=0.5));
connect(weaBus.cloTim,CloTim) annotation (Line(
points={{-6,0},{-6,-90},{110,-90}},
color={255,204,51},
thickness=0.5));
connect(from_degC.y, pVSingleDiode.TDryBul)
annotation (Line(points={{-53.6,0},{62,0},{62,10}}, color={0,0,127}));
connect(souGloHorDif.y, weaDat.HDifHor_in) annotation (Line(points={{-57,-30},
{-48,-30},{-48,-18},{-41,-18},{-41,-9.5}}, color={0,0,127}));
connect(NISTdata.y[3], weaDat.HGloHor_in) annotation (Line(points={{-75,0},{-68,
0},{-68,-13},{-41,-13}}, color={0,0,127}));
connect(frokW_toW.y, PDCMea)
annotation (Line(points={{84.6,-20},{110,-20}}, color={0,0,127}));
connect(NISTdata.y[4], frokW_toW.u) annotation (Line(points={{-75,0},{-68,0},
{-68,-16},{64,-16},{64,-20},{70.8,-20}}, color={0,0,127}));
annotation (Icon(coordinateSystem(preserveAspectRatio=false)), Diagram(
coordinateSystem(preserveAspectRatio=false), graphics={Text(
extent={{-94,46},{-36,12}},
lineColor={28,108,200},
horizontalAlignment=TextAlignment.Left,
textString="1 - Air temperature in °C
2 - Wind speed in m/s
3 - Global horizontal irradiance in W/m2
4 - Ouput power in kW")}),
experiment(
StopTime=86400,
Interval=300,
__Dymola_Algorithm="Dassl"),
__Dymola_experimentSetupOutput(events=false));
end PVSingleDiodeNISTValidation;
Original file line number Diff line number Diff line change
@@ -1,19 +1,17 @@
within IBPSA.Electrical.DC.Sources.Validation;
model PVSingleDiodeRooftopBuildingValidation
"Validation with empirical data from a rooftop PV system with CIGS modules at UdK, Berlin"
"Validation of the single-diode model with empirical data from a rooftop PV system with CIGS modules at UdK, Berlin"
extends
IBPSA.Electrical.DC.Sources.Validation.BaseClasses.partialPVRooftopBuildingValidation(
HGloTil(H(start=100)),
MeaDatWinAngSpe(fileName=ModelicaServices.ExternalReferences.loadResource("modelica://IBPSA/Resources/Data/Electrical/DC/Sources/Validation/Wind_angle_speed_PV.txt"),
extrapolation=Modelica.Blocks.Types.Extrapolation.LastTwoPoints));
HGloTil(H(start=100)));
extends Modelica.Icons.Example;

IBPSA.Electrical.DC.Sources.PVSingleDiode pVSystemSingleDiode(
PVTechType=IBPSA.Electrical.BaseClasses.PV.BaseClasses.PVOptical.PVType.ThinFilmSI,
use_Til_in=false,
til(displayUnit="rad") = til,
n_mod=3,
redeclare IBPSA.Electrical.Data.PV.SingleDiodeSolibroSL2CIGS120 data,
redeclare IBPSA.Electrical.Data.PV.SingleDiodeSolibroSL2CIGS110 data,
groRef=rho,
alt=0.08,
redeclare IBPSA.Electrical.BaseClasses.PV.PVThermalEmpMountCloseToGround
Expand All @@ -25,7 +23,7 @@ model PVSingleDiodeRooftopBuildingValidation
use_Til_in=false,
til(displayUnit="rad") = til,
n_mod=3,
redeclare IBPSA.Electrical.Data.PV.SingleDiodeSolibroSL2CIGS115 data,
redeclare IBPSA.Electrical.Data.PV.SingleDiodeSolibroSL2CIGS110 data,
groRef=rho,
alt=0.08,
redeclare IBPSA.Electrical.BaseClasses.PV.PVThermalEmpMountCloseToGround
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
within IBPSA.Electrical.DC.Sources.Validation;
model PVTwoDiodesRooftopBuildingValidation
"Validation of the two-diodes PV model with empirical data from a rooftop PV system with CIGS modules at UdK, Berlin"
extends Modelica.Icons.Example;
extends
IBPSA.Electrical.DC.Sources.Validation.BaseClasses.partialPVRooftopBuildingValidation;
IBPSA.Electrical.DC.Sources.PVTwoDiodes pVSystemTwoDiodes(
PVTechType=IBPSA.Electrical.BaseClasses.PV.BaseClasses.PVOptical.PVType.ThinFilmSI,
til=til,
n_mod=6,
redeclare IBPSA.Electrical.Data.PV.TwoDiodesSolibroSL2CIGS110 data,
groRef=rho,
alt=0.08,
redeclare IBPSA.Electrical.BaseClasses.PV.PVThermalEmpMountCloseToGround
PVThermal)
annotation (Placement(transformation(extent={{64,0},{84,20}})));

equation

connect(pVSystemTwoDiodes.PDC, PDCSim) annotation (Line(points={{85.25,10},{96,
10},{96,40},{110,40}}, color={0,0,127}));
connect(zen.y, pVSystemTwoDiodes.zenAngle) annotation (Line(points={{41,-50},{
52,-50},{52,19},{61.5,19}}, color={0,0,127}));
connect(incAng.y, pVSystemTwoDiodes.incAngle) annotation (Line(points={{38.8,-10},
{54,-10},{54,16},{61.5,16}}, color={0,0,127}));
connect(MeaDatWinAngSpe.y[2], pVSystemTwoDiodes.vWinSpe) annotation (Line(
points={{-79,10},{-46,10},{-46,24},{48,24},{48,13},{61.5,13}}, color={0,
0,127}));
connect(MeaDatHGloHor.y[1], pVSystemTwoDiodes.HGloHor) annotation (Line(
points={{-79,-90},{-60,-90},{-60,-80},{-20,-80},{-20,-24},{14,-24},{14,7},
{61.5,7}}, color={0,0,127}));
connect(souGloHorDif.y, pVSystemTwoDiodes.HDifHor) annotation (Line(points={{-79,
-24},{-16,-24},{-16,-22},{61.5,-22},{61.5,1}}, color={0,0,127}));
connect(HGloTil.H, pVSystemTwoDiodes.HGloTil) annotation (Line(points={{41,50},
{52,50},{52,20},{54,20},{54,4},{61.5,4}}, color={0,0,127}));
connect(from_degC.y, pVSystemTwoDiodes.TDryBul) annotation (Line(points={{-41.2,
-50},{-41.2,-6},{-44,-6},{-44,22},{46,22},{46,10},{61.5,10}}, color={0,
0,127}));
annotation (
Icon(coordinateSystem(preserveAspectRatio=false, extent={{-120,-100},{100,
100}})),
Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-120,-100},{
100,100}})),
experiment(
StartTime=12182400,
StopTime=13046400,
Interval=900,
Tolerance=1e-06,
__Dymola_Algorithm="Dassl"),
__Dymola_Commands(file=
"modelica://IBPSA/Resources/Scripts/Dymola/Electrical/DC/Sources/Validation/PVTwoDiodesRooftopBuildingValidation.mos"
"Simulate and plot"),
Documentation(info="<html>
<p>The PVSystem 2 diode model is validaded with empirical data from the Rooftop solar builidng of UdK Berlin: <a href=\"http://www.solar-rooftop.de/\">http://www.solar-rooftop.de/</a> </p>
<p>The date 18.04.2023 was chosen as an example for the PVSystem model. </p>
</html>",revisions="<html>
<ul>
<li>
March 30, 2023, by Christoph Nytsch-Geusen:<br/>
First implementation.
</li>
</ul>
</html>"));
end PVTwoDiodesRooftopBuildingValidation;
2 changes: 2 additions & 0 deletions IBPSA/Electrical/DC/Sources/Validation/package.order
Original file line number Diff line number Diff line change
@@ -1,2 +1,4 @@
PVSingleDiodeRooftopBuildingValidation
PVSingleDiodeNISTValidation
PVTwoDiodesRooftopBuildingValidation
BaseClasses
3 changes: 2 additions & 1 deletion IBPSA/Electrical/DC/Sources/package.order
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
ConstantVoltage
PVSingleDiode
PVTwoDiodes
VoltageSource
Examples
Validation
Examples
BaseClasses
Loading

0 comments on commit 6e263f8

Please sign in to comment.