Problem 9.15#
Fundamentals of Solar Cells and Photovoltaic Systems Engineering
Solutions Manual - Chapter 9
Problem 9.15
Consider a PV generator composed of PV modules TrinaTSM240PA05 which will be installed on a rooftop with 24\(^{\circ}\) tilt angle and south oriented in Los Angeles, California (34.052\(^{\circ}\)N, 118.243\(^{\circ}\)W)
The capacity of the PV generator will be chosen to match, on average, the current electricity consumption of the dwelling, which is 3,000 kWh per year.
(a) Assuming a performance ratio PR=80%, estimate the number of PV modules required for the PV generator.
(b) Selecting the inverter ‘ABB__PVI_3_0_OUTD_S_US__208V_’ from the SAM database, configure the PV generator by connecting the PV modules in series and parallel to ensure compatibility with the inverter. For the cell temperature estimation, assume that the PV module is glass-glass and is mounted on an open rack.
We will use the packages pvlib, pandas and matplotlib.pyplot to plot the results. We will also use the package pytz to determine the time zone of Los Angeles.
import pvlib
import pandas as pd
import matplotlib.pyplot as plt
import pytz
import math
We start by defining the location, date, and time.
# Los Angeles, California
lat, lon = 34.052, -118.243
tz = pytz.country_timezones('US')[20]
# location
location = pvlib.location.Location(lat, lon, tz=tz)
We retrieve typical meteorological year (TMY) data from PVGIS.
tmy, _, _, _ = pvlib.iotools.get_pvgis_tmy(latitude=lat, longitude=lon, map_variables=True)
tmy.index = tmy.index.tz_convert(tz) #use local time
We retrieve the PV modules specifications from the database at the NREL SAM (System Advisory Monitoring).
sandia_modules = pvlib.pvsystem.retrieve_sam('SandiaMod')
module = sandia_modules['Trina_TSM_240PA05__2013_']
module_pmp=module['Impo']*module['Vmpo']
print("Module power = " + str(round(module_pmp,1)) + " W")
Module power = 241.1 W
module
Vintage 2013
Area 1.63
Material mc-Si
Cells_in_Series 60
Parallel_Strings 1
Isco 8.8449
Voco 36.8926
Impo 8.2955
Vmpo 29.066
Aisc 0.0004
Aimp -0.0003
C0 1.0116
C1 -0.0116
Bvoco -0.137
Mbvoc 0
Bvmpo -0.1441
Mbvmp 0
N 1.2073
C2 -0.07993
C3 -7.276241
A0 0.9645
A1 0.02753
A2 -0.002848
A3 -0.000144
A4 0.000022
B0 1
B1 -0.00261
B2 0.000328
B3 -0.000015
B4 0.0
B5 -0.0
DTC 3.03
FD 1
A -3.5924
B -0.1319
C4 NaN
C5 NaN
IXO NaN
IXXO NaN
C6 NaN
C7 NaN
Notes Source: CFV Solar Test Lab. Tested 2013. Mo...
Name: Trina_TSM_240PA05__2013_, dtype: object
We calculate the Sun’s coordinates and calculate the irradiance on the plane of array (POA)
# calculate Sun's coordinates
solar_position = location.get_solarposition(times=tmy.index)
tilt = 24
orientation = 180 # pvlib sets orientation origin at North -> South=0
# calculate irradiante at the plane of the array (poa)
poa_irradiance = pvlib.irradiance.get_total_irradiance(surface_tilt=tilt,
surface_azimuth=orientation,
dni=tmy['dni'],
ghi=tmy['ghi'],
dhi=tmy['dhi'],
solar_zenith=solar_position['apparent_zenith'],
solar_azimuth=solar_position['azimuth'])
#save annual irradiation on the plane of array (POA) in kWh
annual_irradiation = 0.001*poa_irradiance['poa_global'].sum()
Assuming a PR of 80%, the number of PV modules to produce 3,000 kWh can be calculated as
PR=0.8
annual_energy_yield_per_module = module_pmp*(annual_irradiation/1000)*PR
N_modules = math.ceil(3000/annual_energy_yield_per_module)
generator_capacity = N_modules*module_pmp
print("Number of modules = " + str(N_modules))
print("PV generator nominal capacity = " + str(round(generator_capacity))+' W')
Number of modules = 7
PV generator nominal capacity = 1688 W
We retrieve the inverter data from the SAM database.
sapm_inverters = pvlib.pvsystem.retrieve_sam('cecinverter')
inverter = sapm_inverters['ABB__PVI_3_0_OUTD_S_US__208V_']
inverter
Vac 208
Pso 18.166279
Paco 3000.0
Pdco 3142.30127
Vdco 310.0
C0 -0.000008
C1 -0.000011
C2 0.000999
C3 -0.000287
Pnt 0.1
Vdcmax 480.0
Idcmax 10.136456
Mppt_low 100.0
Mppt_high 480.0
CEC_Date NaN
CEC_Type Utility Interactive
Name: ABB__PVI_3_0_OUTD_S_US__208V_, dtype: object
For the temperature parameters, we assume an open rack glass-glass configuration. The maximum and minimum cell temperature can be calculated as
temperature_model_parameters = pvlib.temperature.TEMPERATURE_MODEL_PARAMETERS['sapm']['open_rack_glass_glass']
# calculate the solar cell temperature
cell_temperature = pvlib.temperature.sapm_cell(poa_irradiance['poa_global'],
tmy["temp_air"],
tmy["wind_speed"],
**temperature_model_parameters,)
T_c_max=max(cell_temperature)
T_c_min=min(cell_temperature)
print("Maximum cell temperature = " + str(round(T_c_max,1)) + " C")
print("Minimum cell temperature = " + str(round(T_c_min,1)) + " C")
Maximum cell temperature = 69.6 C
Minimum cell temperature = -0.2 C
To evaluate the number of PV modules connected in series, we need to calculate the maximum open-circuit voltage, as well as the maximum and minimum values for the voltage at the maximum power point.
Voc_max=module['Voco']*(1+module['Bvoco']/100*(T_c_min-20))
Vmp_max=module['Vmpo']*(1+module['Bvmpo']/100*(T_c_min-20))
Vmp_min=module['Vmpo']*(1+module['Bvmpo']/100*(T_c_max-20))
The maximum inverter input voltage determines the maximum number of PV modules that can be conected in series.
max_modules_in_series = inverter['Vdcmax']/Voc_max
math.floor(max_modules_in_series)
12
The MPPT input range determines the maximum and minimum number of PV modules that can be connected in series.
max_modules_in_series = inverter['Mppt_high']/Vmp_max
math.floor(max_modules_in_series)
16
min_modules_in_series = inverter['Mppt_low']/Vmp_min
math.ceil(min_modules_in_series)
4
Since, we need to use 8 modules, we can connect all of them in a series-connected string. The current of the string will be determined by the short-circuit current of one module. We can check that this is below the inverter maximum input current.
module['Isco']
8.8449
inverter['Idcmax']
10.136456