Fotovoltaico: Approccio Python per Serie, Parallelo e Regolatori di Carica

Fotovoltaico: Approccio Python per Serie, Parallelo e Regolatori di Carica

1920 1280 Nicola Montemurro

Un esercizio di stile

Essendo interessato alla materia, mi diletto a dimensionare il mio “ipotetico” impianto fotovoltaico, off grid, utilizzando l’inseguitore solare astronomico, ma non amando particolarmente i fogli di calcolo e anche per fare un esercizio di stile (uso della logica nel calcolo di serie e parallelo) ho codificato questo script.

Può essere uno strumento interessante per appassionati e curiosi del mondo fotovoltaico off grid, che desiderano esplorare su come ottimizzare le configurazioni dei moduli solari e ricavare, di conseguenza, il regolatore di carica più adatto.

Ecco una guida dettagliata su come utilizzarlo.

1. Preparazione dell'Ambiente

Assicurati di avere Python installato sul tuo computer. Puoi utilizzare strumenti come Anaconda, PyCharm, Pyscripter o semplicemente un terminale con Python. È consigliabile avere una versione aggiornata di Python.

2. Creazione del file JSON con l'elenco dei regolatori di carica

Prima di eseguire il codice, crea un file chiamato regolatori.json. Questo file conterrà le informazioni sui regolatori di carica. La struttura del file dovrebbe essere simile a questa:

[
    {
        "model": "Regolatore1",
        "voltage_max": 300,
        "current_max": 60
    },
    {
        "model": "Regolatore2",
        "voltage_max": 250,
        "current_max": 50
    }
]

Assicurati che il file JSON sia ben formato e salvato nella stessa cartella del tuo script Python.

3. Modifica dei parametri di input

Nel codice, troverai una sezione in cui sono definiti alcuni parametri chiave. Puoi personalizzare i seguenti valori:

num_modules: Numero di moduli fotovoltaici disponibili.
voc: Tensione a circuito aperto (in Volt) di ciascun modulo.
isc: Corrente a corto circuito (in Ampere) di ciascun modulo.
max_voltage: Tensione massima consentita per il sistema (in Volt).
max_current: Corrente massima consentita per il sistema (in Ampere).

Ecco un esempio di come modificare i parametri:

#
# Begin input parameters

num_modules = 24
voc = 45.59
isc = 13.96
max_voltage = 250
max_current = 50

# End input parameters

4. Esecuzione dello script

Una volta configurati i parametri e preparato il file JSON, sei pronto per eseguire lo script. Puoi farlo in vari modi:

  • Da terminale: Spostati nella cartella dove si trova il tuo file Python e utilizza il comando:

    • python nome_del_file.py
  • Da un IDE: Apri il file nel tuo ambiente di sviluppo preferito e avvia l’esecuzione del codice.

5. Interpretazione dei risultati

voc (Open Circuit Voltage): 45.59
isc (Short Circuit Current): 13.96
Voltaggio massimo: 250
Corrente massima: 50
Moduli in serie: 4
Numero di serie: 6
Corrente: 41.88
Migliore configurazione trovata:
Modello del regolatore: Regolatore2
Numero di moduli per serie: 4
Numero di serie realizzate: 6
Numeri di serie per parallelo: 3
Numeri di paralleli realizzati: 2
Tensione totale: 182.36 V
Corrente totale: 41.88 A
Regolatori necessari: 2

6. Sperimentazione e iterazioni

Puoi modificare i parametri di input per vedere come cambiano i risultati. Questo ti permetterà di comprendere meglio come diversi valori influenzano le configurazioni dei moduli fotovoltaici. Ogni volta che apporti modifiche ai valori, puoi rieseguire il codice ed ottenerne nuovi risultati.

7. Troubleshooting

Se incontri problemi, verifica quanto segue:

  • Assicurati che il file regolatori.json sia nella stessa directory del tuo script.
  • Controlla che il file JSON sia correttamente formattato e privo di errori di sintassi.
  • Assicurati che i parametri di input siano valori numerici validi.

Codice completo

#
# L'uso dei questo software avviene a rischio dell'utente. Non si garantisce che il codice sia esente da errori o difetti,
# né si forniscono garanzie riguardo alla sua idoneità per scopi specifici.
#
# L'autore non è responsabile per eventuali danni, perdite o conseguenze derivanti dall'uso o dall'impossibilità di utilizzo del software.
#

import json

# Input parameters
num_modules = 24
voc = 45.59
isc = 13.96
max_voltage = 250
max_current = 50

print(f"voc (Open Circuit Voltage): {voc}")
print(f"isc (Short Circuit Current): {isc}")
print(f"Voltaggio massimo: {max_voltage}")
print(f"Corrente massima: {max_current}")

def load_regulators(filename):
    try:
        with open(filename, 'r') as file:
            return json.load(file)
    except FileNotFoundError:
        print(f"Errore: Il file '{filename}' non è stato trovato.")
        return []
    except json.JSONDecodeError:
        print(f"Errore: Il file '{filename}' non è un JSON valido.")
        return []

def search_dividers(n):
    if n < 1:
        raise ValueError("Il numero deve essere un intero positivo.")
    return [i for i in range(1, n + 1) if n % i == 0]

def calculate_series_config(num_modules, voc, max_voltage):
    dividers = search_dividers(num_modules)

    # Prioritize higher number of modules in series
    for count in reversed(dividers):
        voltage = voc * count
        if voltage < max_voltage:
            modules_per_series_count = count
            series_count = num_modules // modules_per_series_count
            series_max_voltage = voc * modules_per_series_count
            return modules_per_series_count, series_count, series_max_voltage
    return None, None, None

def calculate_parallel_config(num_modules, isc, series_count, max_current):
    dividers = search_dividers(series_count)

    # Track the best configuration
    best_parallel_count = None
    best_series_per_parallel_count = None
    best_total_current = None

    for count in dividers:
        current = isc * count
        if current <= max_current:
            # Calculate how many strings can be connected in parallel
            series_per_parallel_count = count
            parallels_count = num_modules // (series_per_parallel_count * (num_modules // series_count))

            # Store the best configuration if it results in fewer regulators
            if best_parallel_count is None or parallels_count < best_parallel_count:
                best_parallel_count = parallels_count
                best_series_per_parallel_count = series_per_parallel_count
                best_total_current = current

    return best_series_per_parallel_count, best_parallel_count, best_total_current


def search_best_config(par_count, voltage_per_series, current_per_parallel, regulators):
    for regulator in regulators:
        if (voltage_per_series <= regulator['voltage_max']) and (current_per_parallel <= regulator['current_max']):
            return {
                'regulator': regulator['model'],
                'parallel_count': par_count,
                'total_voltage': voltage_per_series,
                'total_current': current_per_parallel,
                'total_strings': par_count
            }
    return None

def print_best_configuration(best_config, best_regulator):
    if best_config and best_regulator:
        print("Migliore configurazione trovata:")
        print(f"Modello del regolatore: {best_regulator['regulator']}")
        print(f"Numero di moduli per serie: {best_config['modules_per_series_count']}")
        print(f"Numero di serie realizzate: {best_config['series_count']}")
        print(f"Numeri di serie per parallelo: {best_config['series_per_parallel_count']}")
        print(f"Numeri di paralleli realizzati: {best_config['parallels_count']}")
        print(f"Tensione totale: {best_config['total_voltage']:.2f} V")
        print(f"Corrente totale: {best_config['total_current']:.2f} A")
        print(f"Regolatori necessari: {best_config['parallel_count']}")
    else:
        print("Nessuna configurazione valida trovata.")

def calculate_combinations(num_modules, voc, isc, max_voltage, max_current, regulators):
    modules_per_series_count, series_count, series_max_voltage = calculate_series_config(num_modules, voc, max_voltage)

    if modules_per_series_count is None:
        print("Nessuna configurazione valida per le serie.")
        return

    print(f"Moduli in serie: {modules_per_series_count}")
    print(f"Numero di serie: {series_count}")

    series_per_parallel_count, parallels_count, total_current = calculate_parallel_config(num_modules, isc, series_count, max_current)

    if series_per_parallel_count is None:
        print("Nessuna configurazione valida per i paralleli.")
        return

    print(f"Corrente: {total_current:.2f}")

    best_config = {
        'modules_per_series_count': modules_per_series_count,
        'series_count': series_count,
        'series_per_parallel_count': series_per_parallel_count,
        'parallels_count': parallels_count,
        'total_voltage': series_max_voltage,
        'total_current': total_current,
        'parallel_count': parallels_count  # Ensure this is included
    }

    best_regulator = search_best_config(parallels_count, series_max_voltage, total_current, regulators)

    print_best_configuration(best_config, best_regulator)


def main():
    regulators = load_regulators('regolatori.json')

    if not regulators:
        print("Nessun regolatore caricato. Terminazione del programma.")
        return

    calculate_combinations(num_modules, voc, isc, max_voltage, max_current, regulators)

if __name__ == '__main__':
    main()

regolatori.json (regolatori di carica Victron)

Lascio anche il mio file relativo ai regolatori di carica per fotovoltaico off grid, per coloro interessati a marchio Victron.

[
    {
        "model": "SmartSolar MPPT 75/10 o BlueSolar MPPT 75/10",
        "voltage_max": 75,
        "current_max": 10
    },
    {
        "model": "SmartSolar MPPT 75/15 o BlueSolar MPPT 75/15",
        "voltage_max": 75,
        "current_max": 15
    },
    {
        "model": "SmartSolar MPPT 100/15 o BlueSolar MPPT 100/15",
        "voltage_max": 100,
        "current_max": 15
    },
    {
        "model": "SmartSolar MPPT 100/20 o BlueSolar MPPT 100/20",
        "voltage_max": 100,
        "current_max": 20
    },
    {
        "model": "SmartSolar MPPT 100/30",
        "voltage_max": 100,
        "current_max": 30
    },
    {
        "model": "SmartSolar MPPT 100/50",
        "voltage_max": 100,
        "current_max": 50
    },
    {
        "model": "SmartSolar MPPT 150/35",
        "voltage_max": 150,
        "current_max": 35
    },
    {
        "model": "SmartSolar MPPT 150/45",
        "voltage_max": 150,
        "current_max": 45
    },
    {
        "model": "SmartSolar MPPT 150/60 fino a 250/70",
        "voltage_max": 150,
        "current_max": 60
    },
    {
        "model": "SmartSolar MPPT 150/70 fino a 250/100 VE.Can",
        "voltage_max": 150,
        "current_max": 70
    },
    {
        "model": "SmartSolar MPPT 250/60",
        "voltage_max": 250,
        "current_max": 60
    },
    {
        "model": "SmartSolar MPPT 150/60 fino a 250/70",
        "voltage_max": 250,
        "current_max": 70
    },
    {
        "model": "SmartSolar MPPT 250/100",
        "voltage_max": 250,
        "current_max": 100
    },
    {
        "model": "MPPT RS SmartSolar 450/100",
        "voltage_max": 450,
        "current_max": 100
    },
    {
        "model": "MPPT RS SmartSolar 450/200",
        "voltage_max": 450,
        "current_max": 200
    }
]

Consapevolezza sull'uso

Il codice software pubblicato è fornito esclusivamente a scopo didattico e viene messo a disposizione “così com’è”. L’uso del software avviene a rischio dell’utente. Non si garantisce che il codice sia esente da errori o difetti, né si forniscono garanzie riguardo alla sua idoneità per scopi specifici.

L’autore non è responsabile per eventuali danni, perdite o conseguenze derivanti dall’uso o dall’impossibilità di utilizzo del software.

Data: La data di pubblicazione del presente articolo.
Pubblicato su: blog.nicolamontemurro.com

Considerazioni finali

Questo codice Python offre un modo interessante per esplorare le varie configurazioni dei moduli fotovoltaici e trovare le soluzioni più adatte, ma è da intendersi ad uso didattico; Non può in alcun modo, sostituire il computo effettuato da un professionista.

    Preferenze Privacy

    Quando visiti il nostro sito web, possono essere memorizzate alcune informazioni, di servizi specifici, tramite il tuo browser, di solito sotto forma di cookie. Qui puoi modificare le tue preferenze sulla privacy. Il blocco di alcuni cookie può influire sulla tua esperienza sul nostro sito Web e sui servizi che offriamo.

    Click to enable/disable Google Analytics tracking code.
    Click to enable/disable Google Fonts.
    Click to enable/disable Google Maps.
    Click to enable/disable video embeds.
    Il nostro sito web utilizza cookie, principalmente di terze parti. Personalizza le preferenze sulla privacy e/o acconsenti all'utilizzo dei cookie.