‘ Módudo 1 - Modelo 'Variáveis do painél Public Ppv As Single ' potência do painel Public Ipv As Single ' corrente nominal do painel Public Vpv As Single ' tensão nominal do painel Public voc As Single ' tensão circuito aberto do painel Public Isc As Single ' corrente de curto-circuito Public Lpv1 As Single ' Dimensão 1 do painel Public Lpv2 As Single ' Dimensão 2 do painel Public KI As Single ' coeficiente de correcção da temperatura para a corrente Public KV As Single ' coeficiente de correcção da temperatura para a tensão 'Variávies do Inversor Public Pinv As Single ' potência nominal do inversor Public Vinvmax As Single ' Tensão máxima admissível do inversor Public Vmppt As Single ' Tensão minima do MPPT do inversor Public desv_v As Single ' Desvio da tensão dado pelas características do inversor Public Param1 As Single ' Parâmetro da curva do rendimento do inversor Public Param2 As Single ' Parâmetro da curva do rendimento do inversor Public Param3 As Single ' Parâmetro da curva do rendimento do inversor 'Variáveis do local Public DIM1 As Single ' Dimensão 1 do Local Public DIM2 As Single ' Dimensão 2 do Local ' Vectores Public Im_dist(1 To 8760) As Single ' Vector com valores da corrente para cada painél de uma string segundo uma distribuição de prob. Public Vm_dist(1 To 8760) As Single ' Vector com valores da tensão para cada inversor segundo uma distribuição de prob. Public y(100) ' vector com número total de painéis para cada alternativa Public Ns(100) ' vector número de painéis em série para cada alternativa Public Nst(100) ' vector número de strings para cada alternativa Public Im(1 To 24, 1 To 12) As Single ' Matriz com valores corrigidos de Im para cada hora do dia e para cada dia do ano Public Vm(1 To 24, 1 To 12) As Single ' Matriz com valores corrigidos de vm para cada hora do dia e para cada dia do ano Public tc(1 To 24, 1 To 12) As Single ' Matriz com valores de Tc para cada hora do dia e para cada dia do ano Public mes_rad(1 To 24, 1 To 12) As Single ' Matriz com valores da irradiação para cada hora do dia e para cada dia do ano Public mes_temp(1 To 24, 1 To 12) As Single Public tamanho_mes(1 To 12) As Single ' Matriz com valores da temperatura ambiente para cada hora do dia e para cada dia do ano ' Vector com as horas de um dia típico de um determinado mês Public dias_mes(1 To 31) As Single ' Vector com o número de dias de cada mês Public E_hora(1 To 8760) As Single ' Vector com energia produzida em cada hora pelo sistema Public E_mes(1 To 12) As Single ' Vector com energia produzida em cada mes pelo sistema Public E_ano(1 To 100) As Single ' Vector com energia produzida por ano pelo sistema para cada alternativa Public Rend_inv(1 To 8760) As Single Public E1(1 To 8760) As Single ' Vector com o rendimento do inversor ' Vector com a energia produzida pelo conjunto de inversores 1 Public E2(1 To 8760) As Single ' Vector com a energia produzida pelo conjunto de inversores 2 Public P1_st(1 To 8760) As Single ' Vector com a potência de cada string (conjunto de inversores 1) Public P1_inv(1 To 8760) As Single ' Vector com a potência associada a cada inversor (conjunto de inversores 1) Public P2_st(1 To 8760) As Single ' Vector com a potência de cada string (conjunto de inversores 2) Public P2_inv(1 To 8760) As Single ' Vector com a potência associada a cada inversor (conjunto de inversores 2) Public Ims(1 To 8760) As Single ' Vector com a corrente mínima para cada string 'Constantes Public Nstring As Integer ' Número de strings Public Nsmax As Integer ' Número máximo de painéis em série Public Nsmin As Integer ' Número mínimo de painéis em série Public N1 As Integer ' Número total de painéis Public alt As Integer ' Operador para contar número de alternativas possíveis Public j As Integer ' operador para correr vectores Public Npmax As Single ' Número máximo adimissível de strings em paralelo no inversor Public Ndc As Single ' Número de inversores necessários Public Ndc1 As Single ' Número de inversores com x strings Public Ndc2 As Single ' Número de inversores com y strings Public x As Single ' Operador auxiliar Public i As Integer ' Operador auxiliar Public k As Integer ' Operador auxiliar Public m As Integer ' Operador auxiliar Public n As Integer ' Operador auxiliar Public q As Integer ' Operador auxiliar Public Np1 As Single ' Número de strings do inversor 1 Public Np2 As Single ' Número de strings do inversor 2 Public desv_I As Single ' Parâmetro da distribuição da corrente Public N2 As Single ' Número de fileiras de painéis sobrepostas Public coef As Single ' Coeficiente de correcção do distânciamento entre fileiras Public Fy As Single ' Distânca entre filerias Public Nsl As Single ' Número de painéis em série fisicamente Public Nf As Single ' Número de fileiras Public inclinacao As Single ' inclinação dos painéis Public fac_c As Single Public delta_v As Single 'factor de correcção de temperatura 'queda de tensão admissível Public resistividade As Single Public rend As Single Public Perdas_string Public Perdas_1 As Single Public Perdas_2 As Single Public Sminstr As Single Public Smin1 As Single Public Smin2 As Single Public L1 As Single Public L2 As Single Public L3 As Single Sub Modelo_final() DIM1 = Folha2.Cells(24, 2) DIM2 = Folha2.Cells(25, 2) Lpv1 = Folha2.Cells(17, 2) Lpv2 = Folha2.Cells(18, 2) Pinv = Folha2.Cells(2, 5) Ppv = Folha2.Cells(4, 2) Ipv = Folha2.Cells(6, 2) Vpv = Folha2.Cells(5, 2) Vinvmax = Folha2.Cells(4, 5) desv_v = Folha2.Cells(15, 5) desv_I = Folha2.Cells(17, 5) Param1 = Folha2.Cells(8, 5) Param2 = Folha2.Cells(9, 5) Param3 = Folha2.Cells(10, 5) KI = Folha2.Cells(14, 2) KV = Folha2.Cells(13, 2) voc = Folha2.Cells(7, 2) Isc = Folha2.Cells(8, 2) Vmppt = Folha2.Cells(3, 5) inclinacao = Folha2.Cells(19, 2) N2 = Folha2.Cells(26, 2) coef = Folha2.Cells(27, 2) Fy = N2 * Lpv2 * Sin(inclinacao) * coef rend = Folha2.Cells(11, 5) resistividade = Folha2.Cells(24, 5) delta_v = Folha2.Cells(22, 5) L1 = Folha2.Cells(27, 5) L2 = Folha2.Cells(28, 5) L3 = Folha2.Cells(29, 5) Call Dim_syst Call Vm_Im Call modelo_com_dist Call Modelo_sem_Dist Call Modelo_sem_dist_e_Rend_fixo End Sub ‘ Módulo 2 – Dimensionamento do sistema Sub Dim_syst() ' (1)- Dimensionamento fisico do sistema If DIM1 > DIM2 Then Nsl = Application.WorksheetFunction.RoundDown(DIM1 / Lpv1, 0) Nf = Application.WorksheetFunction.RoundDown(DIM2 / (Lpv2 + Fy), 0) Else Nsl = Application.WorksheetFunction.RoundDown(DIM1 / Lpv2, 0) Nf = Application.WorksheetFunction.RoundDown(DIM2 / (Lpv1 + Fy), 0) End If N1 = N2 * Nsl * Nf Folha2.Cells(4, 9) = N1 ' Fim de (1) Nsmax = Application.WorksheetFunction.RoundDown(Vinvmax / (voc + Folha2.Cells(13, 2) * (-10 - 25)), 0) Nsmin = Application.WorksheetFunction.RoundDown(Vmppt / (Folha2.Cells(5, 2) + Folha2.Cells(13, 2) * (70 - 25)), 0) Folha2.Cells(3, 9) = Nsmin Folha2.Cells(2, 9) = Nsmax Nstring = Application.WorksheetFunction.RoundDown(N1 / Nsmax, 0) Folha2.Cells(1, 9) = Nstring If Folha2.Cells(2, 14) > 0 Then N1 = Application.WorksheetFunction.RoundDown(Folha2.Cells(2, 14) * 1000 / Ppv, 0) Folha2.Cells(4, 9) = N1 Nstring = Application.WorksheetFunction.RoundDown(N1 / Nsmax, 0) Folha2.Cells(1, 9) = Nstring End If ' (2) - Cálculo do número de alternativas possíveis Nstring = Folha2.Cells(1, 9) N1 = Folha2.Cells(4, 9) alt = 1 Nst(alt) = Nstring Ns(alt) = Nsmax y(alt) = Nstring * Nsmax If y(alt) < N1 Then Do alt = alt + 1 Nst(alt) = Nst(alt - 1) Ns(alt) = Ns(alt - 1) - 1 y(alt) = Ns(alt) * Nst(alt) If y(alt) < N1 Then Do Nst(alt) = Nst(alt) + 1 y(alt) = Ns(alt) * Nst(alt) Loop While y(alt) <= N1 Nst(alt) = Nst(alt) - 1 y(alt) = Ns(alt) * Nst(alt) End If Loop While Ns(alt) > Nsmin End If j=1 Do Folha2.Cells(j + 6, 7) = j Folha2.Cells(j + 6, 8) = Ns(j) Folha2.Cells(j + 6, 9) = Nst(j) Folha2.Cells(j + 6, 10) = y(j) j=j+1 Loop While j <= alt ' Fim de (2) ' (3) - Cálculo do número de inversores necessários como a distribuição das strings por eles For j = 1 To alt Ndc2 = 1 Ndc1 = 1 Ndc = (Nst(j) * Ns(j) * Ppv) / Pinv Ndc = Application.WorksheetFunction.RoundUp(Ndc, 0) If Nst(j) >= Ndc Then Np1 = Application.WorksheetFunction.RoundDown(Nst(j) / Ndc, 0) If Nst(j) = Ndc Then Ndc1 = Ndc Ndc2 = 0 Np2 = 0 Else Np2 = Application.WorksheetFunction.RoundUp(Nst(j) / Ndc, 0) If Ndc > 1 Then If Np1 = Np2 Then Ndc1 = Ndc / 2 Ndc2 = Ndc / 2 Else Ndc1 = (Np2 * Ndc - Nst(j)) / (Np2 - Np1) Ndc2 = Ndc - Ndc1 End If Else Ndc2 = 0 Np2 = 0 End If End If Else Ndc1 = 0 Ndc2 = 0 Np1 = 0 Np2 = 0 End If Folha2.Cells(j + 6, 11) = Ndc Folha2.Cells(j + 6, 13) = Ndc1 Folha2.Cells(j + 6, 12) = Np1 Folha2.Cells(j + 6, 15) = Ndc2 Folha2.Cells(j + 6, 14) = Np2 Next j ' Fim de (3) End Sub ‘ Módulo 3 – Vectores Vm e Im Sub Vm_Im() ' (4) - Construção dos vectores da Irradiação e Temperatura k=1 For j = 1 To 23 i=1 Do While Not IsEmpty(Folha1.Cells(i + 3, j).Value) mes_rad(i, k) = Folha1.Cells(i + 3, j) * Folha1.Cells(i + 26, j) mes_temp(i, k) = Folha1.Cells(i + 3, j + 1) i=i+1 Loop i=i-1 tamanho_mes(k) = i dias_mes(k) = Folha1.Cells(2, j) k=k+1 j=j+1 Next j ' Fim de (4) ' (5) - Construção e correcção dos vectores Im(G,Temp), Vm(Temp) e Tc(temp) For j = 1 To 12 For i = 1 To tamanho_mes(j) tc(i, j) = mes_temp(i, j) + mes_rad(i, j) * ((Folha2.Cells(12, 2) - 20) / 800) Im(i, j) = (Folha2.Cells(6, 2) + Folha2.Cells(14, 2) * (tc(i, j) - 25)) * (mes_rad(i, j) / 1000) Vm(i, j) = Folha2.Cells(5, 2) + Folha2.Cells(13, 2) * (tc(i, j) - 25) Next i Next j ' Fim de (5) End Sub ‘ Módulo 4 – Modelo com distribuição Sub modelo_com_dist() '- Cálculo da Energia do sistema para cada alternativa k=1 Do While Not IsEmpty(Folha2.Cells(k + 6, 7).Value) Ndc1 = Folha2.Cells(k + 6, 13) Np1 = Folha2.Cells(k + 6, 12) Ndc2 = Folha2.Cells(k + 6, 15) Np2 = Folha2.Cells(k + 6, 14) Ns(k) = Folha2.Cells(k + 6, 8) If Ndc1 > 0 Or Ndc2 > 0 Then For j = 1 To 12 For i = 1 To tamanho_mes(j) For m = 1 To Ndc1 Vm_dist(m) = Application.WorksheetFunction.NormInv(Rnd(), Vm(i, j) * Ns(k), desv_v) For n = 1 To Np1 Ims(n) = Im(i, j) For q = 1 To Ns(k) Im_dist(q) = Application.WorksheetFunction.NormInv(Rnd(), Im(i, j), desv_I) If Im_dist(q) < Ims(n) Then Ims(n) = Im_dist(q) End If Next q P1_st(n) = Ims(n) * Vm_dist(m) Next n P1_inv(m) = Application.WorksheetFunction.Sum(P1_st) Erase P1_st Rend_inv(m) = (Param1 + Param2 * P1_inv(m) / Pinv + Param3 * Pinv / P1_inv(m)) / 100 E1(m) = Rend_inv(m) * P1_inv(m) Next m For m = 1 To Ndc2 Vm_dist(m) = Application.WorksheetFunction.NormInv(Rnd(), Vm(i, j) * Ns(k), desv_v) For n = 1 To Np2 Ims(n) = Im(i, j) For q = 1 To Ns(k) Im_dist(q) = Application.WorksheetFunction.NormInv(Rnd(), Im(i, j), desv_I) If Im_dist(q) < Ims(n) Then Ims(n) = Im_dist(q) End If Next q P2_st(n) = Ims(n) * Vm_dist(m) Next n P2_inv(m) = Application.WorksheetFunction.Sum(P2_st) Erase P2_st Rend_inv(m) = (Param1 + Param2 * P2_inv(m) / Pinv + Param3 * Pinv / P2_inv(m)) / 100 E2(m) = Rend_inv(m) * P2_inv(m) Next m E_hora(i) = Application.WorksheetFunction.Sum(E1) + Application.WorksheetFunction.Sum(E2) Erase E1 Erase E2 Next i E_mes(j) = Application.WorksheetFunction.Sum(E_hora) * dias_mes(j) Erase E_hora Next j E_ano(k) = Application.WorksheetFunction.Sum(E_mes) Folha2.Cells(k + 6, 16) = E_ano(k) / 1000000 Erase E_mes End If k=k+1 Loop End Sub ‘ Módulo 5 – Modelo sem distribuição Sub Modelo_sem_Dist() ' - Cálculo da Energia do sistema para cada alternativa k=1 Do While Not IsEmpty(Folha2.Cells(k + 6, 7).Value) Ndc1 = Folha2.Cells(k + 6, 13) Np1 = Folha2.Cells(k + 6, 12) Ndc2 = Folha2.Cells(k + 6, 15) Np2 = Folha2.Cells(k + 6, 14) Ns(k) = Folha2.Cells(k + 6, 8) If Ndc1 > 0 Or Ndc2 > 0 Then For j = 1 To 12 For i = 1 To tamanho_mes(j) For m = 1 To Ndc1 For n = 1 To Np1 P1_st(n) = Im(i, j) * Vm(i, j) * Ns(k) Next n P1_inv(m) = Application.WorksheetFunction.Sum(P1_st) Erase P1_st Rend_inv(m) = (Param1 + Param2 * P1_inv(m) / Pinv + Param3 * Pinv / P1_inv(m)) / 100 E1(m) = Rend_inv(m) * P1_inv(m) Next m For m = 1 To Ndc2 For n = 1 To Np2 P2_st(n) = Im(i, j) * Vm(i, j) * Ns(k) Next n P2_inv(m) = Application.WorksheetFunction.Sum(P2_st) Erase P2_st Rend_inv(m) = (Param1 + Param2 * P2_inv(m) / Pinv + Param3 * Pinv / P2_inv(m)) / 100 E2(m) = Rend_inv(m) * P2_inv(m) Next m E_hora(i) = Application.WorksheetFunction.Sum(E1) + Application.WorksheetFunction.Sum(E2) Erase E1 Erase E2 Next i E_mes(j) = Application.WorksheetFunction.Sum(E_hora) * dias_mes(j) Erase E_hora Next j E_ano(k) = Application.WorksheetFunction.Sum(E_mes) Folha2.Cells(k + 6, 17) = E_ano(k) / 1000000 Erase E_mes End If k=k+1 Loop ' Fim de (6) End Sub ‘ Módulo 6 – Modelo sem distribuição e rendimento fixo Sub Modelo_sem_dist_e_Rend_fixo() ' - Cálculo da Energia do sistema para cada alternativa Do While Not IsEmpty(Folha2.Cells(k + 6, 7).Value) Ndc1 = Folha2.Cells(k + 6, 13) Np1 = Folha2.Cells(k + 6, 12) Ndc2 = Folha2.Cells(k + 6, 15) Np2 = Folha2.Cells(k + 6, 14) Ns(k) = Folha2.Cells(k + 6, 8) If Ndc1 > 0 Or Ndc2 > 0 Then For j = 1 To 12 For i = 1 To tamanho_mes(j) For m = 1 To Ndc1 For n = 1 To Np1 P1_st(n) = Im(i, j) * Vm(i, j) * Ns(k) Next n P1_inv(m) = Application.WorksheetFunction.Sum(P1_st) Erase P1_st E1(m) = rend * P1_inv(m) Next m For m = 1 To Ndc2 For n = 1 To Np2 P2_st(n) = Im(i, j) * Vm(i, j) * Ns(k) Next n P2_inv(m) = Application.WorksheetFunction.Sum(P2_st) Erase P2_st E2(m) = rend * P2_inv(m) Next m E_hora(i) = Application.WorksheetFunction.Sum(E1) + Application.WorksheetFunction.Sum(E2) Erase E1 Erase E2 Next i E_mes(j) = Application.WorksheetFunction.Sum(E_hora) * dias_mes(j) Erase E_hora Next j E_ano(k) = Application.WorksheetFunction.Sum(E_mes) Folha2.Cells(k + 6, 18) = E_ano(k) / 1000000 Erase E_mes End If k=k+1 Loop End Sub ‘ Módulo 7 – Determinação da secção dos cabos DC Sub seccao_dc() Dim seccao_cabo(1 To 100, 2) As Single Dim seccao_eco(1, 2) As Single Dim smin As Single Dim Np As Single Dim Nserie As Single Dim L As Single Dim energia As Single Dim energia_eco As Single Isc = Folha2.Cells(8, 2) Vpv = Folha2.Cells(5, 2) resistividade = Folha2.Cells(24, 5) delta_v = Folha2.Cells(22, 5) L = Folha2.Cells(38, 8) Np = Folha2.Cells(39, 8) Nserie = Folha2.Cells(40, 8) i=1 Do While Folha3.Cells(i, 1) <> "Cabos DC" i=i+1 Loop i=i+2 j=1 Do While Not IsEmpty(Folha3.Cells(i, 1).Value) seccao_cabo(j, 1) = Folha3.Cells(i, 1) seccao_cabo(j, 2) = Folha3.Cells(i, 2) * 2 * L j=j+1 i=i+1 Loop smin = (2 * L * Isc * Np * resistividade) / (delta_v * Nserie * Vpv) i=1 Do Until seccao_cabo(i, 1) > smin i=i+1 Loop smin = seccao_cabo(i, 1) seccao_eco(1, 1) = smin seccao_eco(1, 2) = seccao_cabo(i, 2) Folha2.Cells(37, 8) = smin energia_eco = 0 If Im(1, 1) = 0 Then Msgbox "Corra 1º o modelo!", vbExclamation, "Erro" Exit Sub End If k=1 For j = 1 To 12 For i = 1 To tamanho_mes(j) energia_eco = energia_eco + ((2 * L * resistividade / smin) * ((Im(i, j) * Np) ^ 2) * dias_mes(j)) Next i Next j seccao_eco(1, 2) = seccao_eco(1, 2) + energia_eco * Folha2.Cells(26, 5) * Folha2.Cells(25, 5) / 1000 n=1 Do While seccao_cabo(n, 1) <> smin n=n+1 Loop n=n+1 Do While seccao_cabo(n, 1) > 0 For j = 1 To 12 For i = 1 To tamanho_mes(j) energia = energia + ((2 * L * resistividade / seccao_cabo(n, 1)) * ((Im(i, j) * Np) ^ 2) * dias_mes(j)) Next i Next j preço = seccao_cabo(n, 2) + energia * Folha2.Cells(26, 5) * Folha2.Cells(25, 5) / 1000 If preço < seccao_eco(1, 2) Then seccao_eco(1, 1) = seccao_cabo(n, 1) seccao_eco(1, 2) = preço Folha2.Cells(38, 11) = energia / 1000 End If energia = 0 n=n+1 Loop Folha2.Cells(37, 11) = seccao_eco(1, 1) Folha2.Cells(39, 11) = seccao_eco(1, 2) End Sub