‘ 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
Download

código VBA