Mais conteúdo relacionado
Semelhante a 09 mikoski pv-mismatch_pvpmc-8_20170509_r5 (20)
Mais de Sandia National Laboratories: Energy & Climate: Renewables (20)
09 mikoski pv-mismatch_pvpmc-8_20170509_r5
- 1. Copyright | © 2017 SunPower Corporation
PVMismatch Free Open Source Software
8th PV PMC Workshop, Albuquerque, NM
Bennet E. Meyers and Mark A. Mikofski | May 9th, 2017
- 2. 2Copyright | © 2017 SunPower Corporation |
Agenda
• Description
• Simple usage
• Benefits
• Advanced usage
• Links to source,
documentation and
installation
• Future work
• Questions
- 3. 3Copyright | © 2017 SunPower Corporation |
Description
• PVMismatch is …
– A free open source software Python
package
– for modeling both forward and
reverse bias current – voltage
(I-V) curves
– at system, string, module and cell
level
– using a 2-diode analog.
• Future versions will use a backend
plugin to allow other cell models like
CEC, PVSyst, etc. to be used instead of
the default 2-diode model.
– Cell, module, string and system
constraints are all independent and
variable
- 4. 4Copyright | © 2017 SunPower Corporation |
Simple Usage: Rooftop shading
Create PV
system
Set
irradiance
for entire
2nd string
Set
irradiance
on
individual
modules in
shaded
regions of
3rd , 4th, 8th
9th and
10th
modules
- 5. 5Confidential | © 2014 SunPower Corporation |
Case Study: Current margin for string with a degraded cell
• Determine the current margin for a string
of modules with a single degraded cell as a
function of the length of the string and the
amount of degradation causing the cell to
reverse bias.
• Given a string of perfectly matched
modules, and a single cell degraded by Y
proportional to Isc, find the point at which
Imp = YIsc, and any increase in Y will cause
the degraded cell to go into reverse bias.
This is the point at which there are 2 max
powers. Repeat for 72, 96 and 128 cell
modules in strings with N modules, and
plot Y* = 1-Y vs. N.
def findY(Y, num_mods, num_cells, return_pvsys=False):
pvsys = pvsystem.PVsystem(
numberStrs=1, numberMods=num_mods, numberCells=num_cells,
pvconst=PVCONST)
pvsys.setSuns({0: {0: {'cells': 0, 'Ee': Y}}})
retv = (Y * pvsys.Isc - pvsys.Imp) ** 2
if return_pvsys:
retv = (retv, pvsys)
return retv
- 6. 6Copyright | © 2017 SunPower Corporation |
PVMismatch harnesses benefits of Python-based research
• Easily organize complex simulations through use of classes
– Intuitive access to system, module, and cell-level models
– Subclassing to create technology-specific simulations (e.g. SPWRPVsystem)
• Effortless expansion of functionality through use with extensive Python scientific computing modules
– Pandas: organization and statistical analysis of large datasets
– Matplotlib/Seaborn: data visualization and exploration
– Shapely: geometric approach to shade pattern design
• Simple integration with Python’s multiprocessing module for painless parallelization
• Perhaps most importantly, it is incredibly easy to model non-uniform irradiance and shade effects at the cell level
– Most previous work/research in this area has only modeled the system down to the module level, assuming uniform behavior
within each module, ignoring cell-level mismatch and the impact of bypass diodes and other module-level circuit designs
– See Bennet’s talk at PVSC 44 this June!
- 7. 7Copyright | © 2017 SunPower Corporation |
Advanced Usage Example: Shade design with Shapely
• We can use Shapely, an open source
Python package for manipulation
and analysis of 2-D geometric
objects, to model shade as polygons
intersecting with PV system objects.
– Bold rectangles are PV modules. Groups of
the same color are series-connected
strings. Small squares are PV cells.
– A Shapely polygon representing the shade
from a pipe is overlaid.
• Shapely finds the intersections
between the shade polygon and the
individual cells in the system, from
which calculate the irradiance on
each cell and use PVMismatch to get
the system IV and PV curves.
- 8. 8Copyright | © 2017 SunPower Corporation |
Advanced Case Study: P-Series Shade Performance Model
• 219,200 unique shade scenarios, defined
programatically
• Automatic batching and autosaving of results
• ~30 hours of processing time across 24 processors on
an OpenStack Linux cluster
• Results:
– Deep exploration of domain space of system shade response,
modeled as a cell level.
– Small step-sizes allow for good characterization of highly-
nonlinear response regions
– Dataset is dense enough to allow for non-linear statistical learning
• For more information on background/methodology,
see
“A Fast Parameterized Model for Predicting PV System Performance under Partial Shade Conditions,”
2016 IEEE 43nd Photovolt. Spec. Conf. PVSC 2016, no. 1, pp. 3173–3178, 2016
Statistical learning from PVMismatch simulation data. Plot of
power loss modeled by PVMismatch versus power loss from a
non-linear model based on three variables.
- 9. 9Copyright | © 2017 SunPower Corporation |
Links, Source Code, Installation
• Documentation: http://sunpower.github.io/PVMismatch/
• Source Code: https://github.com/SunPower/PVMismatch/
– This is a public Git repository hosted by GitHub. Please feel free to fork it and collaborate!
• Build status: https://travis-ci.org/SunPower/PVMismatch
– Every tagged build is tested by Travis CI and deployed automatically to PyPI and GitHub releases
• Issues: https://github.com/SunPower/PVMismatch/issues
• Wiki: https://github.com/SunPower/PVMismatch/wiki
– Roadmap discussion and user curated content such as tips and tricks.
• Installation: https://pypi.python.org/pypi/pvmismatch
– You can use pip or conda with SunPower channel.
• Bugs reports and contributions are welcome!
- 10. 10Copyright | © 2017 SunPower Corporation |
Future Work
• #39 Make cell model a backend “plugin” with documented API so that any continuous IV
curve model such as CEC or PVSyst can be used. This makes PVLIB integration possible.
– https://github.com/SunPower/PVMismatch/issues/39
– EG: in pvcontstants.py add new attribute like PVcontstants.pvcell_backend = default # any
backend plugin
• #48 Make a generic “update” method to set any cell, module, string or system attribute, not
just temperature and irradiance. This makes calculations faster, and is better “DRY” code.
– https://github.com/SunPower/PVMismatch/issues/48
– delay calculation of cell IV curve so multiple cell attributes can be updated simultaneously
– EG: if pvcsys = pvsystem.PVsystem() then to change cells in module #1, string #1 …
>>> pvsys.update({0: {0: {'cells': (11, 12, 13), 'Ee': (0.7, 0.5, 0.5),
'Tc': (45, 41, 40.3) , 'Rsh': (9.9, 7, 7.6)}}})
would replace …
>>> pvsys.setSuns(({0: {0: {'cells': (11, 12, 13), 'Ee': (0.7, 0.5, 0.5)}}})
>>> pvsys.setTcell(({0: {0: {'cells': (11, 12, 13), 'Tc': (45, 41, 40.3)}}})
and also change shunt resistance – other update structures too can be used for flexibility
- 12. 12Copyright | © 2017 SunPower Corporation |
Description: 2-diode cell analog
• Photogenerated current is directly proportional to
effective irradiance, E and short circuit current, Isc.
• Short circuit current is linearly proportional to cell
temperature.
• The saturation current of the 1st diode, Isat1, has a
cubic dependence on temperature.
• Bypass diodes are modeled as perfect conductors if
substring voltage is less than a “trigger” voltage.
• Reverse bias uses a quadratic avalanche breakdown
to control the “softness” of the breakdown.
• The full I-V curve is solved explicitly using the method
described by J.W. Bishop in Solar Cells 25 (1988) pp.
73-89
• Memory optimization allows fast calculation of large
systems where the majority of cells are identical.
- 13. 13Copyright | © 2017 SunPower Corporation |
Deep Dive: Bishop’s Solar 25 1988 explicit method
1. Select a range of Vdiode values, .e.g. -5.5[V] to 0.8[V] with log spacing around breakdown
bend and max power point bends
2. Evaluate corresponding cell currents at given diode voltages
3. Evaluate corresponding cell voltages at given cell currents, Vcell = Vdiode - IcellRs .
4. Evaluate cell power from currents and voltages, P = IcellVcell, and find maximum, requires
sufficient resolution. Interpolate to find Isc and Voc.
5. Rescale currents for series objects and add voltages, rescale voltages for parallel objects
and add currents, to get system attributes.
• Explicit calculations are faster than iterating non-linear because “vectorized” operations are
optimized automatically
• Bishop’s method returns more information about the full IV curve than non-linear
interpolation or W-Lambert
- 14. 14Copyright | © 2017 SunPower Corporation |
PVMismatch memory management
PVsystem
PVstring_1
PVmod_1_1
PVcell
1_1_1
PVmod_1_1 PVmod_1_M
PVcell
1_1_2
PVcell
1_1_N
…
…
PVstring_L
PVmod_L_1
PVcell
L_M_1
PVmod_L_2 PVmod_L_M
PVcell
L_M_2
PVcell
L_M_N
…
…
PVstring_2 …
<pvmismatch.PVsystem object at 0x11115f610>
<pvmismatch.PVstring object at 0x11115fb90>
<pvmismatch.PVmodule object at 0x11115ffd0>
<pvmismatch.PVcell object at 0x11115ff90>
• At instantiation of a new
system model, PVMismatch
creates three unique
objects in memory.
• All components of a type
point to the same object,
e.g. there are 𝐿 × 𝑀 × 𝑁 PV
cells in the system, but only
a single pvmismatch.PVcell
object in memory
• Copying of objects is done
“on demand”
• For instance, say I want to
set a new irradiance to cells
1_1_1 and 1_1_2. A new
pvmismatch.PVcell object will
be created that shares all
the same parameters of
the existing Pvcell …
- 15. 15Copyright | © 2017 SunPower Corporation |
PVMismatch memory management
PVsystem
PVstring_1
PVmod_1_1
PVcell
1_1_1
PVmod_1_1 PVmod_1_M
PVcell
1_1_2
PVcell
1_1_N
…
…
PVstring_L
PVmod_L_1
PVcell
L_M_1
PVmod_L_2 PVmod_L_M
PVcell
L_M_2
PVcell
L_M_N
…
…
PVstring_2 …
<pvmismatch.PVsystem object at 0x11115f610>
<pvmismatch.PVstring object at 0x11115fb90>
<pvmismatch.PVmodule object at 0x11115ffd0>
<pvmismatch.PVcell object at 0x11115ff90>
• Set a the irradiance on cells
1_1_1 and 1_1_2 to 0.1 suns.
• A new PVcell object is created to
store the new state variable
• In addition a new PVmodule
object and a new PVstring
object are created because
these objects now have IV
curves that differ from the rest
of the elements in the system
• The memory complexity for a
single “large” system (20 strings,
20 modules per string, 500 cells
per module) would be >10GB if
every element was a unique
object in memory
• This method keeps the
expected memory complexity
for most simulations well under
1MB
<pvmismatch.PVstring object at 0x111136910>
<pvmismatch.PVmodule object at 0x111136690>
<pvmismatch.PVcell object at 0x111136090>