Close
Jak zamodelować instalację fotowoltaiczną korzystając z biblioteki pvlib-python?

Jak zamodelować instalację fotowoltaiczną korzystając z biblioteki pvlib-python?

Na wstępie parę słów o samej bibliotece jako narzędziu, które pozwoli nam przeprowadzić modelowanie instalacji fotowoltaicznej. Biblioteka pvlib-python jest narzędziem open-source, szeroko wspieranym i rozwijanym przez społeczność. O tym można się przekonać na podstawie wątku grupy na githubgoogle groups lub przeglądając publikacje, w których autorzy z biblioteki pvlib-python chętnie korzystają. Aktualną wersją biblioteki jest ta z 15 września 2022 r. (v0.9.3)

Biblioteka pvlib-python dostarcza szeroki zestaw klas i metod służących modelowaniu parametrów systemów fotowoltaicznych w warunkach rzeczywistych, i jako taka utworzona została na podstawie narzędzi pvlib-matlab opracowanego w Sandia National Laboratories. Sposób instalacji biblioteki jest dobrze opisany w dokumentacji, także przejdę od razu do meritum wpisu, czyli interesuje mnie modelowanie instalacji fotowoltaicznej za pomocą dobrze przetestowanego kodu proceduralnego, w którym zaimplementowano szeroką gamę modeli systemów fotowoltaicznych.

Oczywiście to co przedstawię poniżej to tylko niewielki wycinek możliwości tej biblioteki Mam nadzieję, że będzie to jedynie drogowskaz do dalszej pracy dla tych co modelowaniem instalacji fotowoltaicznej chcą się zająć.

5 kroków w modelowaniu

Modelowanie instalacji fotowoltaicznej to realizacja pięciu podstawowych kroków, które można opisać następująco:

  1. Określenie warunków pogodowych miejsca lokalizacji, określenie projektu (konfiguracji) instalacji fotowoltaicznej
  2. Badanie wpływu temperatury modułu, efektywnego promieniowania słonecznego na charakterystykę prądowo-napięciową modułu w danym miejscu lokalizacji
  3. Badanie strat instalacji fotowoltaicznej przy uwzględnieniu komponentów instalacji po stronie stałoprądowej (DC)
  4. Badanie sprawności konwersji prądu stałego na prąd zmienny (DC -> AC)
  5. Badanie strat energii po stronie falownika (AC)

Z wykorzystaniem klas i metod biblioteki pvlib-python możemy to zrobić na wiele sposobów, przejść wszystkie kroki, lub znacząco przyśpieszyć proces modelowania korzystając z klasy o nazwie ModelChain, której celem jest zautomatyzowanie dużej części procesu modelowania przy jednoczesnym zapewnieniu elastyczności i możliwości dalszej rozbudowy. Dla demonstracji w poniższym przykładzie wykorzystam właśnię tę klasę obiektów. Zdefiniuję kroki w tym podejściu, i je opiszę. Na końcu wpisu będzie można znaleźć cały kod.

Klasa ModelChain

Klasa ModelChain zapewnia standardowy, wysokopoziomowy interfejs dla wszystkich kroków modelowania niezbędnych do obliczenia mocy instalacji fotowoltaicznej z szeregu czasowego danych pogodowych. Jej nazwa informuje, że tworzy ona łańcuch modeli. I tak rzeczywiście jest o czym za chwilę się przekonamy. Najpierw przyjrzymy się definicji klasy ModelChain:

    def __init__(self, system, location,

                 clearsky_model=’ineichen’,

                 transposition_model=’haydavies’,

                 solar_position_method=’nrel_numpy’,

                 airmass_model=’kastenyoung1989′,

                 dc_model=None, ac_model=None, aoi_model=None,

                 spectral_model=None, temperature_model=None,

                 dc_ohmic_model=’no_loss’,

                 losses_model=’no_loss’, name=None)

Zauważmy, że dwoma niezbędnymi parametrami, które należy podać konstruktorowi wywołania instancji obiektu ModelChain jest system oraz location. Pierwszy z nich jest obiektem klasy PVSystem, który definiuje standardowy zestaw atrybutów systemu fotowoltaicznego i funkcji modelowania opisując interakcje komponentów systemu PV. Z kolei parametr location  jest obiektem klasy Location i reprezentuje fizyczną lokalizację instalacji fotowoltaicznej. Trzeba je zatem przygotować.

Klasa Location

Definicja klasy jest następująca:

def __init__(self, latitude, longitude, tz=’UTC’, altitude=0, name=None):

Potrzebujemy zatem określić szerokość i długość geograficzną, strefę czasową i wysokość nad poziomem morza określonego miejsca. Do obiektu lokalizacji można również przypisać nazwę.

Skąd pozyskać te dane. Oczywiście możliwości jest kilka. Jedną z nich jest skorzystanie z Google Earth lub Google Maps. Z tej drugiej jednak nie pozyskamy informacji o wysokości nad poziomem morza. Obie aplikacje można otworzyć z dowolnej przeglądarki.

Przykładowe zdjęcie ( 😉 – a jakże, z czym bowiem powszechnie kojarzy się Częstochowa)

.

Na pasku statusu znajdziemy potrzebne informacje, nawet usytuowanie względem stron świata. O tym jak dokładnie je wyznaczyć pisałem tutaj.

Listę stref czasowych możemy znaleźć na stronie:

https://en.wikipedia.org/wiki/List_of_tz_database_time_zones

Klasa PVSystem

Klasa ta zdefiniowana jest następująco:

    def __init__(self,

                 arrays=None,

                 surface_tilt=0, surface_azimuth=180,

                 albedo=None, surface_type=None,

                 module=None, module_type=None,

                 module_parameters=None,

                 temperature_model_parameters=None,

                 modules_per_string=1, strings_per_inverter=1,

                 inverter=None, inverter_parameters=None,

                 racking_model=None, losses_parameters=None, name=None):

i umożliwia analizowanie instalacji utworzonej w jednej z następujących topologii:

  • N modułów połączonych szeregowo (modules_per_string=N, strings_per_inverter=1).
  • M modułów połączonych równolegle (modules_per_string=1, strings_per_inverter=M).
  • NxM modułów tworzących matrycę ułożonych w M ciągach po N modułów każdy (modules_per_string=N, strings_per_inverter=M).

W definicji jest kilka elementów na które musimy zwrócić uwagę, pierwszy to właśnie topologia instalacji, jeżeli mamy instalację zbudowaną z tych samych modułów z zwróconą w jedną stronę świata to parametr arrays możemy zignorować. Jeżeli nie, to przeciwnie parametr arrays będzie dla nas bardzo ważny, a pozostałe parametry konstruktora aż do parametru inwerter można ominąć, gdyż obiekt arrays przejmie ich rolę.

Dla uproszczenia przyjmiemy wariant z instalacją zwróconą w jedną stronę świata. Zatem niektóre parametry będziemy musieli podać wprost. Są to:

surface_tilt – nachylenie modułu względem powierzchni, przyjmiemy 35°

surface_azimuth – położenie względem strony świata, wartość 180 oznacza skierowanie instalacji na południe

Potrzebne będą jeszcze do określenia:

module_parameters, temperature_model_parameters, inverter_parameters.

I tu się chwilę musimy zatrzymać.

Jak widać potrzebujemy na tym etapie znać parametry modułu, jego charakterystykę temperaturową oraz parametry zastosowanego falownika. Czyli musimy mieć wybrany model modułu fotowoltaicznego jak i model falownika. Biblioteka pvlib-python przychodzi z całkiem pokaźną bazą danych modułów i falowników. Można się z nią zapoznać przeglądając pliki ze strony https://github.com/NREL/SAM/tree/develop/deploy/libraries lub co może być łatwiejsze, wyszukać określony model on-line na https://pvfree.herokuapp.com/.

Filozofii nie ma, z menu wybieramy bazę inwerterów lub modułów. Odszukujemy potrzebny nam model i klikając w jego nazwę mamy dostęp do wszystkich parametrów. Korzystając z opisanego API na stronie parametry te w odpowiednim formacie możemy pozyskać. Oczywiście pozyskać je możemy bezpośrednio z bazy bliblioteki pvlib-python. Robimy to za pomocą funkcji pvlib.pvsystem.retrieve_sam(name) gdzie parametrem name jest nazwa bazy danych. Dostępne są praktycznie trzy: CECInverter, CECMod, SandiaMod.

Z kolei parametry temperaturowe modułu pozyskamy ze słownika parametrów temperatury. Dostępne są cztery rodzaje:

’open_rack_glass_glass’,
’close_mount_glass_glass’,
’open_rack_glass_polymer’,
’insulated_back_glass_polymer’

Najpowszechniej stosowane moduły mają konstrukcję typu: 'open_rack_glass_polymer’.

Biorąc pod uwagę podane wyżej elementy nasz dotychczasowy kod będzie się przedstawił następująco:

Tak przy okazji, jak juz utworzyliśmy instancję obiektu ModelChain możemy zerknąć do jego środka, i zobaczyć jakie modele będą stosowane na poszczególnych etapach modelowania. Mamy:

ModelChain pvlib

Uruchomienie modelu

Każdy z wymienionych modeli możemy odpowiednio parametryzować. I wówczas będzie miało miejsce zagłębianie się w model, do którego to zachęcałem na początku wpisu 😉.

W obecnym przykładzie zestawione modele pozostawimy z wartościami domyślnymi lub sprecyzowanymi na podstawie parametrów elementów instalacji. Zatem uruchomimy proces modelowania naszej instalacji poprzez obiekt mc.

Dodam tylko, że klasa ModelChain dostarcza trzy metody uruchomienia tego łańcucha modeli. A to ze względu na różne dane wejściowe, które możemy posiadać. Są to:

  • run_model(), gdy dane pogodowe, o których za chwilę powiemy, zawierają globalne poziome, bezpośrednie i rozproszone poziome napromieniowanie (’ghi’, 'dni’ i 'dhi’).
  • run_model_from_poa(), gdy dane pogodowe zawierają bezpośrednie, rozproszone i całkowite napromienienie w płaszczyźnie modułu (’poa_global’, 'poa_direct’, 'poa_diffuse’).
  • run_model_from_effective_irradiance(), gdy dane pogodowe zawierają widmowo i odbiciowo skorygowane całkowite napromienienie w płaszczyźnie modułu (’effective_irradiance’).

Obecnie skorzystam z metody run_model. Parametrem wejściowym do niej są dane pogodowe, które muszą obowiązkowo zawierać informacje o globalnym poziomym, bezpośrednim i rozproszonym poziomym napromieniowaniu. Natomiast opcjonalnymi parametrami są: temperatura otoczenia, prędkość wiatru, temperatura modułu, temperatura ogniwa czy albedo. Ok zatem skąd pozyskać te dane. Jest kilka miejsc.

Aha, jeszcze jedno, muszę wspomnieć o tzw. typowym roku meteorologicznym (TMY ang. typical meteorological year). Jest to koncepcja poradzenia sobie ze zmiennymi corocznymi warunkami pogodowymi. Stąd typowy meteorologiczny rok zawiera dane godzinowe warunków pogodowych, które najlepiej reprezentują średnie warunki pogodowe w okresie wieloletnim. Czyli aby wyznaczyć TMY, analizuje się wieloletni zestaw danych i wybiera się z niego 12 miesięcy, które najlepiej reprezentują medianę warunków. Na przykład, TMY opracowany na podstawie zestawu danych z lat 1998-2005 może wykorzystywać dane z 2000 roku dla stycznia, 2003 roku dla lutego, 1999 roku dla marca itd. I ta mediana to też pewne przybliżenie bo metody stosowane do obliczania TMY uwzględniają wiele czynników wykraczających poza proste obliczenie wartości mediany, w tym dane dotyczące zasobów słonecznych oraz dane pogodowe, takie jak prędkość wiatru i temperatura otoczenia. 

Po tym wyjasnieniu możemy wrócić do miejsc skąd te dane pozyskać. Najprościej korzystając z Narodowej Bazy Danych o Promieniowaniu Słonecznym (https://nsrdb.nrel.gov/data-viewer).

Aby pozyskać dane pogodowe wybieramy bazę, potem określamy miejsce lub obszar, który nas interesuje i podajemy adres email, na który wysyłany jest plik z danymi pogodowymi TMY. Jeżeli adresu email nie chcemy podawać to dane pogodowe możemy pobrać ze strony

Climate.OneBuilding.Org

choć w tym przypadku musimy się liczyć z tym, że nie będą to dokładnie dane miejsca lokalizacji instalacji, a na przykąłd wybranego miasta. Np. w przypadku województwa śląskiego są to: Bielsko-Biała, Częstochowa, Katowice, Racibórz.

\climatewebsite\WMO_Region_6_Europe\POL_Poland (onebuilding.org)

Teraz nic nie stoi na przeszkodzie, by nasz model uruchomić.

Wynik modelowania instalacji zapisywany jest do atrybutu o nazwie results , który jest instancją klasy ModelChainResults. Z niej możemy pozyskać wiele informacji zgodnie z poniższą tabelą:

acmoc po stronie zmiennoprądowej AC [W]
airmassmasa powietrza jako miara długości drogi promieniowania słonecznego przebytej przez atmosferę, mierzona w atmosferach.
albedoalbedo (stosunek ilości promieniowania odbitego do padającego)
aoikąt padania promieniowania
aoi_modifiermodyfikator kąta padania (bez jednostek) obliczony przez ModelChain.aoi_model, który redukuje bezpośrednie napromieniowanie dla odbić;
cell_temperaturetemperatura ogniwa (C).
dcmoc instalacji po stronie stałoprądowej DC (W) wyznaczane przez ModelChain.dc_model.
dc_ohmic_lossesstraty na rezystancji po stronie DC (W) wyznaczane przez ModelChain.dc_ohmic_model.
diode_params5 parametrów modelu SDM (Single Diode Model) (’I_L’, 'I_o’, 'R_s’, 'R_sh’, 'nNsVth’)
effective_irradianceefektywne natężenie napromienienia (W/m2), które jest całkowitym natężeniem napromienienia w płaszczyźnie panelu fotowoltaicznego, skorygowanym o odbicia i zawartość widma.
lossesstraty prądu stałego jako ułamek całkowitej mocy prądu stałego, obliczony przez ModelChain.losses_model.
solar_positionpozycjonowanie słoneczne zawierające kolumny 'apparent_zenith’, 'zenith’, 'apparent_elevation’, 'elevation’, 'azimuth’ (wszystkie w stopniach)
spectral_modifiermodyfikator widmowy (bez jednostek) obliczony przez ModelChain.spectral_model, który dostosowuje szerokopasmowe napromienienie w płaszczyźnie panelu do zawartości widma.
timesindeks czasowy danych pogodowych
total_irradnatężenie promieniowania w płaszczyźnie modułu z podziałem na 'poa_global’, 'poa_direct’ 'poa_diffuse’, poa_sky_diffuse’, 'poa_ground_diffuse’ (W/m2)
trackingorientacja modułów na trackerze jednoosiowym
weatherkopia wejściowych danych pogodowych.

Przykładowe wyniki analizy

Poniżej zademonstrowano dwa przykładowe wyniki z przeprowadzonego modelowania, pierwszy wykres przedstawia różnicę w mocach po stronie staloprądowej i zmiennoproądowej. Drugi różnicę pomiędzy globalnym poziomym napromieniowaniem, a całkowitym napromienieniem w płaszczyźnie modułu dla poszczególnych miesięcy TMY. I wnioski można już wyciągać 🙂 .

Oczywiście to tylko przykład, a wyobraźnia podpowiada inne możliwe do uzyskania ciekawe zależności. Także niech pracuje. Jak będziecie się nimi chcieli podzielić to zapraszam w komentarzach.

Różnice w mocach
Różnica pomiędzy globalnym poziomym napromieniowaniem\n a całkowitym napromienieniem w płaszczyźnie modułu dla poszczególnych miesięcy TMY

Kod

Jurand Bień

dr hab. inż., prof. Politechniki Częstochowskiej; zainteresowania: aspekty środowiskowe, gospodarowanie odpadami (praktyczne), danologia (hobbystycznie)

dr hab. inż., prof. Politechniki Częstochowskiej; zainteresowania: aspekty środowiskowe, gospodarowanie odpadami (praktyczne), danologia (hobbystycznie)

2 thoughts on “Jak zamodelować instalację fotowoltaiczną korzystając z biblioteki pvlib-python?

  1. Dzień dobry.
    Czy korzystając z tej biblioteki jest możliwość rozmieszczenia modułów PV na dostępnej powierzchni? Brakuje mi czegoś takiego pomiędzy wyborem lokalizacji, a wyborem modułów/falownika. Trzeba założyć liczbę modułów/stringów, a mi zależy na automatycznym liczeniu, po wpisaniu wymiarów powierzchni.

Leave a Reply

Your email address will not be published. Required fields are marked *

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.