You are on page 1of 22

Attribute VB_Name = "M dulo6"

Sub Curva_Max_pote_4pts()

Dim tipo As Integer


Dim GC1 As Double
Dim GC2 As Double
Dim GC3 As Double
Dim GC4 As Double
Dim T1 As Double
Dim T2 As Double
Dim T3 As Double
Dim T4 As Double
Dim TC1 As Double
Dim TC2 As Double
Dim TC3 As Double
Dim TC4 As Double
Dim Captura1 As Variant
Dim Captura2 As Variant
Dim Captura3 As Variant
Dim Captura4 As Variant
Dim curvas As Integer
Dim GCAdd As Double
Dim TAdd As Double
Dim TCAdd As Double
Dim CapturaAdd As Variant
Dim G(1 To 7) As Variant
Dim Parametros(1 To 2) As Variant
Dim T(1 To 7) As Variant
Dim CurvasIV(1 To 14900, 1 To 14) As Variant
Dim Isc(1 To 7) As Variant
Dim Extrapol As Variant
Dim CurvasOrdenadas As Variant
Dim LetraAsig(1 To 4) As Variant
Dim N_curva(1 To 2) As Variant
Dim CurvInter As Variant
Dim Voc As Variant
Dim potencia(1 To 14900, 1 To 7) As Variant
Dim Pmax(1 To 7) As Variant
Dim indPmax(1 To 7) As Variant
Dim Vmp(1 To 7) As Variant
Dim Imaxp(1 To 7) As Variant

If Sheets("HR").Range("E54") = 0 Then
MsgBox ("No se ha cargado ninguna curva")
Exit Sub
End If

If MsgBox("El proceso de interpolaci n demorar unos minutos. Desea continuar? ", vbYesNo, "Advertencia")
= vbYes Then
MsgBox "La interpolaci n iniciar , por favor espere, no cierre Excel ni apague el equipo. "
Else
Exit Sub 'Salida de la macro
End If
Sheets("IngresoDatos").Range("N8").ClearContents
Sheets("IngresoDatos").Range("B19:H23").ClearContents
Sheets("IngresoDatos").Range("A27:O14927").ClearContents
Sheets("HR").Range("L91") = "---"
Sheets("HR").Range("L92") = "---"
Sheets("HR").Range("L93") = "---"

curvas = Application.WorksheetFunction.CountIf(Sheets("IngresoDatos").Range("C9:C13"), ">10")


tipo = Sheets("IngresoDatos").Range("F16")

'Datos Curva1
GC1 = Sheets("IngresoDatos").Range("E9") 'Irradiancia 1
T1 = Sheets("IngresoDatos").Range("F9") 'T celda 1
GC1 = correccionIrra(GC1, tipo, T1)
TC1 = Sheets("IngresoDatos").Range("C9") 'T panel 1
Captura1 = Sheets("1").Range("A19:B15000") 'V,I 1
Captura1 = CorrIsc(Captura1)

If curvas = 1 Then

MsgBox ("Solo hay una curva cargada, se graficar y mostrar n los datos obtenidos, la temperatura e irradiancia p
ueden distar de los parametros objetivos")

For m = 1 To 2
For n = 1 To 14900
CurvasIV(n, m) = Captura1(n, m)
Next
Next

For n = 1 To 14900
potencia(n, 1) = CurvasIV(n, 1) * CurvasIV(n, 2)
Next

Voc = Vcorto(CurvasIV)

Pmax(1) = 0
indPmax(1) = 1

For n = 1 To 14900

If potencia(n, 1) > Pmax(1) Then


indPmax(1) = n
Pmax(1) = potencia(n, 1)
End If
Next
Vmp(1) = CurvasIV(indPmax(1), 1)
Imaxp(1) = CurvasIV(indPmax(1), 2)

For n = 1 To 14900

If potencia(n, 1) < 0 Then


CurvasIV(n, 1) = Empty
CurvasIV(n, 2) = Empty
potencia(n, 1) = Empty

End If

If potencia(n, 1) = 0 And CurvasIV(n, 2) <> 0 And CurvasIV(n, 1) <> 0 Then


potencia(n, 1) = Empty
End If

Next

For n = 1 To 14900

Sheets("IngresoDatos").Cells((26 + n), 13) = CurvasIV(n, 1)


Sheets("IngresoDatos").Cells((26 + n), 14) = CurvasIV(n, 2)

Sheets("IngresoDatos").Cells((26 + n), 15) = potencia(n, 1)


Next

Isc(1) = CurvasIV(1, 2)

Sheets("IngresoDatos").Cells(19, 8) = Isc(1)
Sheets("IngresoDatos").Cells(20, 8) = Voc(1)
Sheets("IngresoDatos").Cells(21, 8) = Pmax(1)
Sheets("IngresoDatos").Cells(22, 8) = Vmp(1)
Sheets("IngresoDatos").Cells(23, 8) = Imaxp(1)

Exit Sub
End If

If curvas > 1 Then


'Datos Curva2
GC2 = Sheets("IngresoDatos").Range("E10") 'Irradiancia 2
T2 = Sheets("IngresoDatos").Range("F10") 'T celda 2
GC2 = correccionIrra(GC2, tipo, T2)
TC2 = Sheets("IngresoDatos").Range("C10") 'T panel 2
Captura2 = Sheets("2").Range("A19:B15000") 'V,I 2
Captura2 = CorrIsc(Captura2)

If curvas > 2 Then


'Datos Curva3
GC3 = Sheets("IngresoDatos").Range("E11") 'Irradiancia 3
T3 = Sheets("IngresoDatos").Range("F11") 'T celda 3
GC3 = correccionIrra(GC3, tipo, T3)
TC3 = Sheets("IngresoDatos").Range("C11") 'T panel 3
Captura3 = Sheets("3").Range("A19:B15000") 'V,I 3
Captura3 = CorrIsc(Captura3)

If curvas > 3 Then


'Datos Curva4
GC4 = Sheets("IngresoDatos").Range("E12") 'Irradiancia 4
T4 = Sheets("IngresoDatos").Range("F12") 'T celda 4
GC4 = correccionIrra(GC4, tipo, T4)
TC4 = Sheets("IngresoDatos").Range("C12") 'T panel 4
Captura4 = Sheets("4").Range("A19:B15000") 'V,I 4
Captura4 = CorrIsc(Captura4)

End If
End If
End If

If curvas = 5 Then

UserForm1.Show

ReempCurve = Sheets("IngresoDatos").Range("N8")

If ReempCurve <> 5 Then


GCAdd = Sheets("IngresoDatos").Range("E13") 'Irradiancia 5
TAdd = Sheets("IngresoDatos").Range("F13") 'T celda 5
GCAdd = correccionIrra(GCAdd, tipo, TAdd)
TCAdd = Sheets("IngresoDatos").Range("C13") 'T panel 5
CapturaAdd = Sheets("5").Range("A19:B15000") 'V,I 5
CapturaAdd = CorrIsc(CapturaAdd)

Select Case ReempCurve


Case 1
GC1 = GCAdd
T1 = TAdd
TC1 = TCAdd
For I = 1 To UBound(Captura1, 1)
Captura1(I, 1) = CapturaAdd(I, 1)
Captura1(I, 2) = CapturaAdd(I, 2)
Next

Case 2
GC2 = GCAdd
T2 = TAdd
TC2 = TCAdd
For I = 1 To UBound(Captura2, 1)
Captura2(I, 1) = CapturaAdd(I, 1)
Captura2(I, 2) = CapturaAdd(I, 2)
Next

Case 3
GC3 = GCAdd
T3 = TAdd
TC3 = TCAdd
For I = 1 To UBound(Captura3, 1)
Captura3(I, 1) = CapturaAdd(I, 1)
Captura3(I, 2) = CapturaAdd(I, 2)
Next

Case 4
GC4 = GCAdd
T4 = TAdd
TC4 = TCAdd
For I = 1 To UBound(Captura4, 1)
Captura4(I, 1) = CapturaAdd(I, 1)
Captura4(I, 2) = CapturaAdd(I, 2)
Next
Case 5
Case Else
MsgBox ("No seleccion ninguna opci n, vuelva a iniciar la interpolaci n. El programa se cerrar .")
Exit Sub
End Select
End If

curvas = 4

End If

''Ac inicia el an lisis de datos


'' Organizaci n de curvas --------------------------------------------------

G(1) = GC1
G(2) = GC2
G(3) = GC3
G(4) = GC4

Parametros(1) = Sheets("IngresoDatos").Range("P1") 'Irradiancia objetivo


Parametros(2) = Sheets("IngresoDatos").Range("P2") 'Temperatura objetivo

T(1) = TC1
T(2) = TC2
T(3) = TC3
T(4) = TC4

For a = 1 To 14900
CurvasIV(a, 1) = Captura1(a, 1)
CurvasIV(a, 2) = Captura1(a, 2)

If curvas > 1 Then


CurvasIV(a, 3) = Captura2(a, 1)
CurvasIV(a, 4) = Captura2(a, 2)
If curvas > 2 Then
CurvasIV(a, 5) = Captura3(a, 1)
CurvasIV(a, 6) = Captura3(a, 2)
If curvas > 3 Then
CurvasIV(a, 7) = Captura4(a, 1)
CurvasIV(a, 8) = Captura4(a, 2)
End If
End If
End If
Next

Isc(1) = Captura1(1, 2)
If curvas > 1 Then
Isc(2) = Captura2(1, 2)
If curvas > 2 Then
Isc(3) = Captura3(1, 2)
If curvas > 3 Then
Isc(4) = Captura4(1, 2)
End If
End If
End If

CurvasOrdenadas = Array_curvasIV_G_Tdut_Isc(curvas, G, Parametros, T, CurvasIV, Isc)

For n = 1 To 14900
For m = 1 To 8
CurvasIV(n, m) = CurvasOrdenadas(n, m)
Next m
Next n

For n = 1 To 4
G(n) = CurvasOrdenadas(n, 9)
Isc(n) = CurvasOrdenadas(n, 10)
T(n) = CurvasOrdenadas(n, 11)
LetraAsig(n) = CurvasOrdenadas(n, 12)
Next
Extrapol = CurvasOrdenadas(5, 12)

If Extrapol = 10 Then
Exit Sub
End If

'--------------------------- Inicio de interpolaci n ------------------------------


'-----------------------Se interpola inicialmente la G, luego T--------------------

If curvas = 2 Then

N_curva(1) = 1
N_curva(2) = 2

a = (Parametros(1) - G(N_curva(1))) / (G(N_curva(2)) - G(N_curva(1)))


T(7) = T(N_curva(1)) + a * (T(N_curva(2)) - T(N_curva(1)))
G(7) = Parametros(1)
CurvInter = Interpol_G(N_curva, Parametros, G, T, Isc, CurvasIV, Extrapol)
'CurvInter = CorrIsc(CurvInter)

Isc(5) = Isc(1)
Isc(1) = Empty
Isc(6) = Isc(2)
Isc(2) = Empty

For n = 1 To 14900

CurvasIV(n, 9) = CurvasIV(n, 1)
CurvasIV(n, 1) = Empty
CurvasIV(n, 10) = CurvasIV(n, 2)
CurvasIV(n, 2) = Empty
CurvasIV(n, 11) = CurvasIV(n, 3)
CurvasIV(n, 3) = Empty
CurvasIV(n, 12) = CurvasIV(n, 4)
CurvasIV(n, 4) = Empty

CurvasIV(n, 13) = CurvInter(n, 1)


CurvasIV(n, 14) = CurvInter(n, 2)

Next

Isc(7) = CurvasIV(1, 14)

Sheets("HR").Range("L91") = "Curva1"
Sheets("HR").Range("L92") = "Curva2"
Sheets("HR").Range("L93") = "Interpolaci n Irradiancia"

ElseIf curvas = 3 Then

N_curva(1) = 1
N_curva(2) = 3

a = (Parametros(2) - T(N_curva(1))) / (T(N_curva(2)) - T(N_curva(1)))


G(5) = G(N_curva(1)) + a * (G(N_curva(2)) - G(N_curva(1)))
T(5) = Parametros(2)
CurvInter = Interpol_T(N_curva, Parametros, G, T, Isc, CurvasIV)
'CurvInter = CorrIsc(CurvInter)

For n = 1 To 14900
CurvasIV(n, 9) = CurvInter(n, 1)
CurvasIV(n, 10) = CurvInter(n, 2)
CurvasIV(n, 11) = CurvasIV(n, 3)
CurvasIV(n, 12) = CurvasIV(n, 4)
Next

Isc(5) = CurvasIV(1, 10)


Isc(6) = CurvasIV(1, 12)
T(6) = T(2)
G(6) = G(2)

If (G(5) < Parametros(1) And G(2) < Parametros(1)) Or (G(5) > Parametros(1) And G(2) > Parametros(1)) Then
Extrapol = 1
MsgBox ("Se present un error en la asignaci n de curvas. Se realizar n las correcciones mediante extrapolaci
n, se sugiere tener cuidado con los resultados")
End If

N_curva(1) = 5
N_curva(2) = 6

a = (Parametros(1) - G(N_curva(1))) / (G(N_curva(2)) - G(N_curva(1)))


T(7) = T(N_curva(1)) + a * (T(N_curva(2)) - T(N_curva(1)))

G(7) = Parametros(1)

CurvInter = Interpol_G(N_curva, Parametros, G, T, Isc, CurvasIV, Extrapol)

'CurvInter = CorrIsc(CurvInter)

For n = 1 To 14900
CurvasIV(n, (13)) = CurvInter(n, 1)
CurvasIV(n, (14)) = CurvInter(n, 2)
Next

Isc(7) = CurvasIV(1, 14)

Sheets("HR").Range("L91") = "Interpolaci n de Temperatura"


Sheets("HR").Range("L92") = "Curva a Temperatura Objetivo"
Sheets("HR").Range("L93") = "Interpolaci n Irradiancia"

ElseIf curvas = 4 Then

For h = 1 To 2
N_curva(1) = h
N_curva(2) = h + 2

a = (Parametros(1) - G(N_curva(1))) / (G(N_curva(2)) - G(N_curva(1)))


T(curvas + h) = T(N_curva(1)) + a * (T(N_curva(2)) - T(N_curva(1)))

G(curvas + h) = Parametros(1)

CurvInter = Interpol_G(N_curva, Parametros, G, T, Isc, CurvasIV, Extrapol)

'CurvInter = CorrIsc(CurvInter)

For n = 1 To 14900
CurvasIV(n, (2 * h + 7)) = CurvInter(n, 1)
CurvasIV(n, (2 * h + 8)) = CurvInter(n, 2)
Next

Isc(5) = CurvasIV(1, 10)


Isc(6) = CurvasIV(1, 12)

Next

N_curva(1) = 5
N_curva(2) = 6

a = (Parametros(2) - T(N_curva(1))) / (T(N_curva(2)) - T(N_curva(1)))


G(7) = G(N_curva(1)) + a * (G(N_curva(2)) - G(N_curva(1)))
T(7) = Parametros(2)
CurvInter = Interpol_T(N_curva, Parametros, G, T, Isc, CurvasIV)
'CurvInter = CorrIsc(CurvInter)

For n = 1 To 14900
CurvasIV(n, 13) = CurvInter(n, 1)
CurvasIV(n, 14) = CurvInter(n, 2)
Next

Isc(7) = CurvasIV(1, 14)

Sheets("HR").Range("L91") = "Interpolaci n Irradiancia a Alta Temperatura"


Sheets("HR").Range("L92") = "Interpolaci n Irradiancia a Baja Temperatura"
Sheets("HR").Range("L93") = "Interpolaci n Temperatura"

End If
For m = 1 To 7
For n = 1 To 14900
potencia(n, m) = CurvasIV(n, (2 * m - 1)) * CurvasIV(n, (2 * m))
Next
Next
Voc = Vcorto(CurvasIV)

For m = 1 To 7

Pmax(m) = 0
indPmax(m) = 1

For n = 1 To 14900

If potencia(n, m) > Pmax(m) Then


indPmax(m) = n
Pmax(m) = potencia(n, m)
End If
Next
Vmp(m) = CurvasIV(indPmax(m), (2 * m - 1))
Imaxp(m) = CurvasIV(indPmax(m), (2 * m))
Next

For n = 1 To 14900
For m = 1 To 7
If potencia(n, m) < 0 Then
CurvasIV(n, (2 * m - 1)) = Empty
CurvasIV(n, (2 * m)) = Empty
potencia(n, m) = Empty

End If

If potencia(n, m) = 0 And CurvasIV(n, (2 * m)) <> 0 And CurvasIV(n, (2 * m - 1)) <> 0 Then
potencia(n, m) = Empty
End If
Next
Next

For n = 1 To 14900
For m = 1 To 14

Sheets("IngresoDatos").Cells((26 + n), m) = CurvasIV(n, m)


Sheets("Resultados Interpolaci n").Cells((21 + n), m) = CurvasIV(n, m)
Next

Sheets("IngresoDatos").Cells((26 + n), 15) = potencia(n, 7)


Sheets("Resultados Interpolaci n").Cells((21 + n), 15) = potencia(n, 7)
Next

For n = 1 To 7
Sheets("IngresoDatos").Cells(19, (n + 1)) = Isc(n)
Sheets("IngresoDatos").Cells(20, (n + 1)) = Voc(n)
Sheets("IngresoDatos").Cells(21, (n + 1)) = Pmax(n)
Sheets("IngresoDatos").Cells(22, (n + 1)) = Vmp(n)
Sheets("IngresoDatos").Cells(23, (n + 1)) = Imaxp(n)
Next

End Sub

'_____________________________________________________________________________________________
___

Function Vcorto(indataF As Variant) As Variant


' Se calcula la regresi n lineal simple del dato 31 al 301 para la
' funci n (Se puede modificar entre 31 o 91 en funci n del transitorio inicial de la curva)
' I(V) Y=AX+B ---> [B;A]

Dim V(1 To 210) As Variant


Dim I(1 To 210) As Variant
Dim MinCuad As Variant
Dim indice_inicio(1 To 7) As Variant
Dim indice_final(1 To 7) As Variant
Dim Vopen(1 To 7) As Variant

For n = 1 To 7

For a = 1 To 14900
If indataF(a, (2 * n)) > 0.9 Then
indice_inicio(n) = a
End If
Next

For a = 1 To 14900
If indataF(a, (2 * n)) > 0 Then
indice_final(n) = a
End If
Next

Next

For n = 1 To 7
a=1

If indice_inicio(n) <> Empty Then


For intV = indice_inicio(n) To indice_final(n)
V(a) = indataF(intV, (2 * n - 1))
a=a+1
On Error Resume Next
Next

a=1
For intI = indice_inicio(n) To indice_final(n)
I(a) = indataF(intI, (2 * n))
a=a+1
Next

MinCuad = Application.LinEst(I, V)

Vopen(n) = -(MinCuad(2) / MinCuad(1))

End If
Next

Vcorto = Vopen
End Function

'_____________________________________________________________________________________________
___________________________________________________________________

Function Interpol_T(N_curva As Variant, Parametros As Variant, G As Variant, T As Variant, Isc As Variant, Curva
sIV As Variant) As Variant

'N_curva posici n en la matriz de datos en los que se ubicar n los resultados de esta funci n
Dim Curva1(1 To 14900, 1 To 2) As Variant
Dim Curva2(1 To 14900, 1 To 2) As Variant

deltaI = Abs(Isc(N_curva(2)) - Isc(N_curva(1)))


a = (Parametros(2) - T(N_curva(1))) / (T(N_curva(2)) - T(N_curva(1)))

For n = 1 To 14900
Curva1(n, 1) = CurvasIV(n, (2 * N_curva(1) - 1))
Curva1(n, 2) = CurvasIV(n, 2 * N_curva(1))

Curva2(n, 1) = CurvasIV(n, (2 * N_curva(2) - 1))


Curva2(n, 2) = CurvasIV(n, (2 * N_curva(2)))
Next

'If Extrapol = 0 Then

Interpol_T = Interpol(Curva1, Curva2, deltaI, a)


'Else
' Interpol_G = Extrapol(Curva1, Curva2, deltaI, a)
'End If
h=1

End Function

'_____________________________________________________________________________________________
_______________________________________________________________________________________

Function Interpol_G(N_curva As Variant, Parametros As Variant, G As Variant, T As Variant, Isc As Variant, Curv
asIV As Variant, Extrapol As Variant) As Variant
'N_curva posici n en la matriz de datos en los que se ubicar n los resultados de esta funci n
Dim Curva1(1 To 14900, 1 To 2) As Variant
Dim Curva2(1 To 14900, 1 To 2) As Variant

deltaI = Abs(Isc(N_curva(2)) - Isc(N_curva(1)))


a = (Parametros(1) - G(N_curva(1))) / (G(N_curva(2)) - G(N_curva(1)))

For n = 1 To 14900
Curva1(n, 1) = CurvasIV(n, (2 * N_curva(1) - 1))
Curva1(n, 2) = CurvasIV(n, 2 * N_curva(1))

Curva2(n, 1) = CurvasIV(n, (2 * N_curva(2) - 1))


Curva2(n, 2) = CurvasIV(n, (2 * N_curva(2)))
Next

If Extrapol = 0 Then

Interpol_G = Interpol(Curva1, Curva2, deltaI, a)


Else
Interpol_G = Extrapolar(Curva1, Curva2, deltaI, a)
End If

End Function

'_____________________________________________________________________________________________
_________________________________
Function Interpol(Curva1 As Variant, Curva2 As Variant, delta As Variant, a As Variant) As Variant

Dim Curva(1 To 14900, 1 To 2) As Variant

k=0
j=5
Z=0
n=0

For I = 1 To 14900
V1 = Curva1(I, 1)
I1 = Curva1(I, 2)

Z=0
j=1
While (Z = 0)

V2 = Curva2(j, 1)
I2 = Curva2(j, 2)
resta = Abs(I2 - I1)
j=j+1

If (V2 >= V1 - 2) And (V2 <= V1 + 2) Then


If (resta >= (delta - 0.09)) And (resta <= (delta + 0.09)) Then
k=k+1
V3 = V1 + a * (V2 - V1)
I3 = I1 + a * (I2 - I1)
Curva(k, 1) = V3
Curva(k, 2) = I3
Z=1
End If
End If

If (j = 14900) Then
Z=1
End If
Wend
Next
Interpol = Curva

End Function

'_____________________________________________________________________________________________
____________________

Function Extrapolar(Curva1 As Variant, Curva2 As Variant, delta As Variant, a As Variant) As Variant

Dim Curva3(1 To 14900, 1 To 2) As Variant


Dim Curva(1 To 14900, 1 To 2) As Variant
Dim CurvaFinal As Variant

tolerancia = 0.01 / 100


rango_i = 0.3

For I = 1 To 14900

Curva3(I, 1) = Curva1(I, 1) + a * (Curva2(I, 1) - Curva1(I, 1)) 'Tensi n


Curva3(I, 2) = Curva1(I, 2) + a * (Curva2(I, 2) - Curva1(I, 2)) 'Corriente

Next

n=1
For h = 1 To 14900

If Curva3(h, 1) <> Empty Then


Curva(n, 1) = Curva3(h, 1)
Curva(n, 2) = Curva3(h, 2)
n=n+1
End If
Next

CurvaFinal = CorrIsc(Curva)
Extrapolar = CurvaFinal
h=1

End Function
'_____________________________________________________________________________________________
_________________________________________________________________________

Function Array_curvasIV_G_Tdut_Isc(curvas As Integer, G_real As Variant, Parametros As Variant, Tdut As Varia


nt, CurvasIV As Variant, Isc As Variant) As Variant
' Se asigna una letra en funci n de la temperatura e irradiancia
' Alta temperatura, baja irradiancia: a
' Baja temperatura, baja irradiancia: b
' Alta temperatura, alta irradiancia: c
' Baja temperatura, alta irradiancia: d
' T C, baja irradiancia: l (interpolaci n de A y B)
' T C, alta irradiancia: m (interpolaci n de C y D)
' Curva interpolada final n (interpolaci n de L y M)
Dim G_o(1 To 4) As Variant
Dim T_o(1 To 4) As Variant
Dim CurvasIV_o(1 To 14900, 1 To 8) As Variant
Dim Isc_o(1 To 4) As Variant
Dim Extrapol As Variant
' Se crean variables para la asignaci n de curvas

a=0
B=0
C=0
D=0

' Se crea una variable para orden de c lculos con extrapolaci n


Extrapol = 0

If curvas = 4 Then
For I = 1 To (curvas)
If (G_real(I) < Parametros(1)) And (Tdut(I) > Parametros(2)) And a <> 1 Then

For n = 1 To 14900
CurvasIV_o(n, 1) = CurvasIV(n, ((2 * I) - 1)) 'V
CurvasIV_o(n, 2) = CurvasIV(n, (2 * I)) 'I
Next n

G_o(1) = G_real(I)
T_o(1) = Tdut(I)
Isc_o(1) = Isc(I)
a = 1 'Indica que la curva A fue asignada

ElseIf (G_real(I) < Parametros(1)) And (Tdut(I) < Parametros(2)) And B <> 1 Then
For n = 1 To 14900
CurvasIV_o(n, 3) = CurvasIV(n, ((2 * I) - 1)) 'V
CurvasIV_o(n, 4) = CurvasIV(n, (2 * I)) 'I
Next n

G_o(2) = G_real(I)
T_o(2) = Tdut(I)
Isc_o(2) = Isc(I)
B = 1 'Indica que la curva B fue asignada

ElseIf (G_real(I) > Parametros(1)) And (Tdut(I) > Parametros(2)) And C <> 1 Then
For n = 1 To 14900
CurvasIV_o(n, 5) = CurvasIV(n, ((2 * I) - 1)) 'V
CurvasIV_o(n, 6) = CurvasIV(n, (2 * I)) 'I
Next n

G_o(3) = G_real(I)
T_o(3) = Tdut(I)
Isc_o(3) = Isc(I)
C = 1 'Indica que la curva C fue asignada
ElseIf (G_real(I) > Parametros(1)) And (Tdut(I) < Parametros(2)) And D <> 1 Then
For n = 1 To 14900
CurvasIV_o(n, 7) = CurvasIV(n, ((2 * I) - 1)) 'V
CurvasIV_o(n, 8) = CurvasIV(n, (2 * I)) 'I
Next n

G_o(4) = G_real(I)
T_o(4) = Tdut(I)
Isc_o(4) = Isc(I)
D = 1 'Indica que la curva D fue asignada

Else
Extrapol = 1
MsgBox ("Se present un error en la asignaci n de curvas. Se realizar n las correcciones mediante extrap
olaci n, se sugiere tener cuidado con los resultados")
Exit For
End If
Next

If Extrapol = 1 Then
a=0
B=0
C=0
D=0
For I = 1 To curvas
If (G_real(I) < (Application.WorksheetFunction.Large(G_real, 2))) And (Tdut(I) >= (Application.Worksheet
Function.Large(Tdut, 2))) And a <> 1 Then

For n = 1 To 14900
CurvasIV_o(n, 1) = CurvasIV(n, ((2 * I) - 1)) 'V
CurvasIV_o(n, 2) = CurvasIV(n, (2 * I)) 'I
Next n

G_o(1) = G_real(I)
T_o(1) = Tdut(I)
Isc_o(1) = Isc(I)
a = 1 'Indica que la curva A fue asignada

ElseIf (G_real(I) < (Application.WorksheetFunction.Large(G_real, 2))) And (Tdut(I) < (Application.Worksh


eetFunction.Large(Tdut, 2))) And B <> 1 Then
For n = 1 To 14900
CurvasIV_o(n, 3) = CurvasIV(n, ((2 * I) - 1)) 'V
CurvasIV_o(n, 4) = CurvasIV(n, (2 * I)) 'I
Next n

G_o(2) = G_real(I)
T_o(2) = Tdut(I)
Isc_o(2) = Isc(I)
B = 1 'Indica que la curva B fue asignada
ElseIf (G_real(I) >= (Application.WorksheetFunction.Large(G_real, 2))) And (Tdut(I) >= (Application.Wor
ksheetFunction.Large(Tdut, 2))) And C <> 1 Then
For n = 1 To 14900
CurvasIV_o(n, 5) = CurvasIV(n, ((2 * I) - 1)) 'V
CurvasIV_o(n, 6) = CurvasIV(n, (2 * I)) 'I
Next n

G_o(3) = G_real(I)
T_o(3) = Tdut(I)
Isc_o(3) = Isc(I)
C = 1 'Indica que la curva C fue asignada
ElseIf (G_real(I) >= (Application.WorksheetFunction.Large(G_real, 2))) And (Tdut(I) < (Application.Works
heetFunction.Large(Tdut, 2))) And D <> 1 Then
For n = 1 To 14900
CurvasIV_o(n, 7) = CurvasIV(n, ((2 * I) - 1)) 'V
CurvasIV_o(n, 8) = CurvasIV(n, (2 * I)) 'I
Next n

G_o(4) = G_real(I)
T_o(4) = Tdut(I)
Isc_o(4) = Isc(I)
D = 1 'Indica que la curva D fue asignada

Else
MsgBox ("Se present un error en la asignaci n de curvas. Favor revise los datos.")
Extrapol = 10 'constante para finalizar codigo
On Error Resume Next
End If
Next

End If

ElseIf curvas = 3 Then

For I = 1 To (curvas)
If (Tdut(I) < Parametros(2)) And a <> 1 Then

For n = 1 To 14900
CurvasIV_o(n, 1) = CurvasIV(n, ((2 * I) - 1)) 'V
CurvasIV_o(n, 2) = CurvasIV(n, (2 * I)) 'I
Next n

G_o(1) = G_real(I)
T_o(1) = Tdut(I)
Isc_o(1) = Isc(I)
a = 1 'Indica que la curva A fue asignada
ElseIf (Tdut(I) = Parametros(2)) And B <> 1 Then
For n = 1 To 14900
CurvasIV_o(n, 3) = CurvasIV(n, ((2 * I) - 1)) 'V
CurvasIV_o(n, 4) = CurvasIV(n, (2 * I)) 'I
Next n

G_o(2) = G_real(I)
T_o(2) = Tdut(I)
Isc_o(2) = Isc(I)
B = 1 'Indica que la curva B fue asignada

ElseIf (Tdut(I) > Parametros(2)) And C <> 1 Then


For n = 1 To 14900
CurvasIV_o(n, 5) = CurvasIV(n, ((2 * I) - 1)) 'V
CurvasIV_o(n, 6) = CurvasIV(n, (2 * I)) 'I
Next n

G_o(3) = G_real(I)
T_o(3) = Tdut(I)
Isc_o(3) = Isc(I)
C = 1 'Indica que la curva C fue asignada
Else

MsgBox ("Se present un error en la asignaci n de curvas. Los parametros no son adecuados para llevar
a cabo una interpolaci n de 3 puntos, por favor corrija los datos de temperatura o agregue la curva faltante para lle
var a cabo una interpolaci n de 4 puntos ")
Extrapol = 10 'constante para finalizar codigo
On Error Resume Next

End If
Next

ElseIf curvas = 2 Then

For I = 1 To (curvas)
If (Tdut(I) = Parametros(2)) And a <> 1 Then

For n = 1 To 14900
CurvasIV_o(n, 1) = CurvasIV(n, ((2 * I) - 1)) 'V
CurvasIV_o(n, 2) = CurvasIV(n, (2 * I)) 'I
Next n

G_o(1) = G_real(I)
T_o(1) = Tdut(I)
Isc_o(1) = Isc(I)
a = 1 'Indica que la curva A fue asignada

ElseIf (Tdut(I) = Parametros(2)) And B <> 1 Then


For n = 1 To 14900
CurvasIV_o(n, 3) = CurvasIV(n, ((2 * I) - 1)) 'V
CurvasIV_o(n, 4) = CurvasIV(n, (2 * I)) 'I
Next n

G_o(2) = G_real(I)
T_o(2) = Tdut(I)
Isc_o(2) = Isc(I)
B = 1 'Indica que la curva B fue asignada
Else
MsgBox ("Se present un error en la asignaci n de curvas. Los parametros no son adecuados para llevar
a cabo una interpolaci n de 2 puntos, por favor corrija los datos de temperatura o agregue la curva faltante para lle
var a cabo una interpolaci n de 3 o 4 puntos ")
Extrapol = 10 'constante para finalizar codigo
Exit For
End If
Next

If ((G_o(1) > Parametros(1)) And (G_o(2) > Parametros(1))) Or ((G_o(1) < Parametros(1)) And (G_o(2) < Param
etros(1))) And Extrapol <> 10 Then
Extrapol = 1
MsgBox ("Se present un error en la asignaci n de curvas. Se realizar n las correcciones mediante extrapol
aci n, se sugiere tener cuidado con los resultados")
End If

End If

Dim matrizTotal(1 To 14900, 1 To 12) As Variant

For n = 1 To 4
matrizTotal(n, 9) = G_o(n)
matrizTotal(n, 10) = Isc_o(n)
matrizTotal(n, 11) = T_o(n)
Next

matrizTotal(1, 12) = a
matrizTotal(2, 12) = B
matrizTotal(3, 12) = C
matrizTotal(4, 12) = D
matrizTotal(5, 12) = Extrapol
For n = 1 To 14900
For m = 1 To 8
matrizTotal(n, m) = CurvasIV_o(n, m)
Next
Next

Array_curvasIV_G_Tdut_Isc = matrizTotal

End Function

'_____________________________________________________________________________________________
_________________________

Function CorrIsc(indataF As Variant) As Variant


' Se calcula la regresi n lineal simple del dato 31 al 301 para la
' funci n (Se puede modificar entre 31 o 91 en funci n del transitorio inicial de la curva)
' I(V) Y=AX+B ---> [B;A]

Dim x As Integer
x = 61
Dim V(1 To 210) As Variant
Dim I(1 To 210) As Variant
a=1

For intV = x To 301


V(a) = indataF(intV, 1)
a=a+1
On Error Resume Next
Next

a=1
For intI = x To 301
I(a) = indataF(intI, 2)
a=a+1
Next

Dim MinCuad As Variant


MinCuad = Application.LinEst(I, V)

' Se sustituyen los primeros 60 (Ver paso anterior x-1) datos por los resultados de las
' extrapolaciones lineales (Se obtiene Isc)

Dim indataedit(1 To 61, 1 To 2) As Variant

h = indataF(x, 1)

For a = 0 To (x - 1)
indataedit(a + 1, 1) = a * (h / (x - 1))
Next a

For a = 0 To (x - 1)
indataedit(a + 1, 2) = MinCuad(2) + (indataedit((a + 1), 1) * MinCuad(1))

Next a

For a = 1 To x
indataF(a, 1) = indataedit(a, 1)
indataF(a, 2) = indataedit(a, 2)
Next a

' Se realiza el mismo procedimiento para el final de la curva, esta vez el


' criterio ser los ltimos datos (cuando la corriente es menor a 0.9 A)
' Se incluyen datos con corrientes negativas con el objetivo de obtener
' los valores de corriente cero al realizar las interpolaciones
For a = 1 To 14900
If indataF(a, 2) > 0.9 Then
indice_inicio = a
End If
Next

For a = 1 To 14900
If indataF(a, 2) > 0 Then
indice_final = a
End If
Next

a=1

For intV = indice_inicio To indice_final


V(a) = indataF(intV, 1)
a=a+1
On Error Resume Next
Next

a=1
For intI = indice_inicio To indice_final
I(a) = indataF(intI, 2)
a=a+1
Next

Dim MinCuad1 As Variant


MinCuad1 = Application.LinEst(I, V)

' Se agregan los datos de Voc y valores negativos de I hasta -2 A


Dim j(1 To 100) As Variant
For a = 0 To 99
j(a + 1) = a * (-20 / 99)
Next a

For a = 1 To 100

indataF((indice_final + a), 1) = (j(a) - MinCuad1(2)) / MinCuad1(1) 'x=(y-b)/m


indataF((indice_final + a), 2) = j(a)

Next

CorrIsc = indataF

End Function

'_____________________________________________________________________________________________
_________________________

Function correccionIrra(Gr As Double, tipo As Integer, T As Double) As Double

'Revisar la norma IEC 60891 para ecuaci n de correcci n de irradiancia por temperatura de la celda
' PVKcal= constante de calibraci n de medida de irradiancia del equipo PV-KLA
' Vc= tensi n entregada por la celda de referenca (raw value)
' cal= constante de calibraci n de la celda de referencia
' alph= coeficiente de temperatura del modelo de la celda a un espectro 1.5 AM
'(revisar hoja de datos de la celda: anotaci n 3) de la tabla de incertidumbre en la medici n de irradiancia)

Dim PVKcal As Double


Dim Vc As Double
Dim cal As Double
Dim alph As Double
Dim Calib As Variant

Calib = Sheets("IngresoDatos").Range("M20:M23")

PVKcal = Calib(1, 1)
Vc = Gr / PVKcal 'mV
alph = Calib(2, 1) '[1/K] Desfase en medicion de temperatura celda de referencia

If tipo = 1 Then 'mono (cal)


cal = Calib(3, 1) '1=(Sin influencia de la calibraci n) 55.9 / 1000 '(mV)/(W/m^2)(actual)
Tcal = 25 ' C
Else
If tipo = 2 Then 'Poli (cal)
cal = Calib(4, 1) 'Sin influencia de la calibraci n 56.11 / 1000 '(mV)/(W/m^2)(actual)
Tcal = 25 ' C

End If
End If

correccionIrra = (Vc / cal) * (1 / (1 + (alph * (T - Tcal)))) ' Irradiancia corregida con ecuaci n de la norma IEC6089
1-2021

End Function

You might also like