Files
ECO2/ArinWarev1/Calculator/CRenewable.vb
2025-07-29 21:26:38 +09:00

1060 lines
61 KiB
VB.net

Public Class CRenewable
Private Result As CResult
Private DSET As DS
Public Sub New(ByRef pds As DS, ByRef presult As CResult)
DSET = pds
Result = presult
'ByVal dr존 As DS.tbl_zoneRow,
End Sub
' Public Overridable Sub Calc_ThermalSolarSystem_EN(ByVal i_system_ts As Integer, ByVal i_count_ts As Integer, ByVal i_ts_month As Integer, ByVal i_ts_d_mth As Integer, ByVal Q_H_sol_us_m as decimal, ByVal Q_W_sol_us_m as decimal, ByRef Q_W_sol_out_m as decimal, ByRef Q_H_sol_out_m as decimal, ByRef W_sol_aux_m as decimal)
Public Overridable Sub Calc_ThermalSolarSystem_EN(ByVal i_system_ts As Integer, ByVal DR_code As String, ByVal i_ts_month As Integer, ByVal i_ts_d_mth As Integer, ByVal Q_H_sol_us_m As Decimal, ByVal Q_W_sol_us_m As Decimal, _
ByRef Q_W_sol_out_m As Decimal, ByRef Q_H_sol_out_m As Decimal, ByRef W_sol_aux_m As Decimal)
pLog.Add(String.Format(">>Calc_ThermalSolarSystem_EN 진입 : i_system_ts={0}, DR_code={1}, i_ts_month={2}, i_ts_d_mth={3}, Q_H_sol_us_m={4}, Q_W_sol_us_m={5}, Q_W_sol_out_m={6}, Q_H_sol_out_m={7}, W_sol_aux_m={8}", _
i_system_ts, DR_code, i_ts_month, i_ts_d_mth, Q_H_sol_us_m, Q_W_sol_us_m, Q_W_sol_out_m, Q_H_sol_out_m, W_sol_aux_m))
Dim theta_ref As Decimal, theta_w As Decimal, theta_cw As Decimal, U_loop_p As Decimal, U_loop As Decimal, Delta_T As Decimal
Dim A_ As Decimal, a As Decimal, b As Decimal, c As Decimal, d As Decimal, e As Decimal, f As Decimal, eta_loop As Decimal, IAM As Decimal, eta_0 As Decimal
Dim a_1 As Decimal, a_2 As Decimal, P_H As Decimal, P_W As Decimal, V_ref As Decimal, V_sol As Decimal, t_m As Decimal, I_m As Decimal, P_aux_nom As Decimal
'Dim i_ts_location As Integer, i_count_ts_location As Integer
' Dim i_count_month As Integer
Dim i_direction As Integer
Dim t_aux_m As Decimal, l_tot As Decimal, f_st As Decimal, U_st As Decimal
Dim theta_setpoint As Decimal, theta_a_avg As Decimal, theta_e_avg As Decimal
Dim Q_sol_ls_rbl_m As Decimal, Q_sol_aux_rbl_m As Decimal, Q_sol_st_ls_rbl_m As Decimal, Q_bu_dis_ls_rbl_m As Decimal, Q_bu_dis_ls_m As Decimal, Q_sol_ls_m As Decimal
Dim Q_W_bu_dis_ls_m As Decimal, Q_H_bu_dis_ls_m As Decimal, Q_W_sol_st_ls_m As Decimal, Q_H_sol_st_ls_m As Decimal
Dim A_H As Decimal, A_W As Decimal, X As Decimal, Y As Decimal
Dim Q_W_sol_out_net As Decimal, Q_H_sol_out_net As Decimal, H_W_ratio As Decimal
Q_W_sol_out_net = 0
Q_H_sol_out_net = 0
'Dim Dr기상데이터 As DS.tbl_weatherRow
'For i_count_ts_location = 1 To DSET.tbl_weather.Rows.Count ' Range("건물위치").Columns.Count
' Dr기상데이터 = DSET.tbl_weather(i_count_ts_location - 1)
' If dr존.지역 = Dr기상데이터.건물위치 Then '//이상하다 1버번쨰 존의 지역값만 계속쓴다 -_-;; 지역은 즉 존에할당된게아니고 1개만 존재하는듯하다
' i_ts_location = i_count_ts_location '//기상데이터에서 현재지정된 존.지역의 기상데이터의 지역의 열번호(엑셀에서만)를 기억한다 (나중에 이번호로 데이터 참조하려고)
' Exit For
' End If
' '//지역찾을떄그냥 DR지역을 사용하도록한다.
' 'If Worksheets("입력존").Range("지역1").Offset(0, 0) = Worksheets("기상데이타").Range("건물위치1").Offset(0, i_count_ts_location - 1) Then
' ' i_ts_location = i_count_ts_location
' ' Exit For
' 'End If
'Next
l_tot = 0
Dim Dr신재생 As DS.tbl_newRow = CType(DSET.tbl_new.Select("code='" & DR_code & "' and code <> '0'", "code")(0), DS.tbl_newRow) '//신재생의 태양열시스템
Select Case Dr신재생.집열판방위.Trim ' Worksheets("신재생기기").Range("태양열시스템종류1").Offset(3, i_count_ts - 1)
Case "" '동"
i_direction = 12
Case "남동" '남동"
i_direction = 10
Case "" '남"
i_direction = 9
Case "남서" '남서"
i_direction = 11
Case "" '서"
i_direction = 13
Case "수평" '수평" '//월별평균일사 수평면을 사용 나머지것들은 45도짜리를 사용한다. 45도짜리 코드값을 해당코드+1000이다. 해당코드+1000으로 미리 셋팅햇다(변경불가)
i_direction = 0
Case Else
MsgBox("신재생에너지-태양열의 집열판 방위값이 올바르지않습니다", MsgBoxStyle.Critical, "확인")
End Select
'//집열판방위에따른 월별평균일사의 총합을 가져온다
'//weather_ilsa 의 p코드에는 지역코드값이 들어가고 코드값은 집열판방위+1000 의값이 해당 각도의 방향에대한 데이터가된다.
'///만약값이 서울 방향이 남 이엇을경우에는 해당 일사데이터를 찾는게 목적이에요. 여기서 서울의 코드값은 찾을수잇어요
'//그담이 방향 남에 맞는 일사데이터를 찾아야하는데.. 일사데이터 코드로는 못찾으니깐. 이름으로 찾아요.
'//이름 45도를 앞에 붙이기 200915
Dim 일사이름 As String = "45도" & Dr신재생.집열판방위 & "" '//이렇게되면 남(45) 라는 최종이름이 되겟죠?
If Dr신재생.집열판방위 = "수평" Then 일사이름 = "수평면"
Dim Drow평균일사() As DS.weather_ilsaRow = CType(DSET.weather_ilsa.Select("pcode='" & Calc.Pub.기상데이터.code & _
"' and 설명='" & 일사이름 & "'"), DS.weather_ilsaRow())
'//그렇게해서 서울의 코드에 해당하는 pcode 와 이름이 남(45)로 되어잇는 일사데이터테이블에서 데이터를 검색하게되겟죠?
'//즉 데이터가 나오면 해당 데이터가 맞는거에요 ..이건 데이터베이스 이름을 남(45) 식으로 모두 고쳐주세요
If Drow평균일사.GetUpperBound(0) = -1 Then
MsgBox("지역코드=" + Calc.Pub.기상데이터.code + vbCrLf + "집열판방위코드=" + Dr신재생.집열판방위 + _
vbCrLf + "예상일사코드=" + 일사이름 + _
vbCrLf + "에 해당하는 평균일사데이터가 없습니다. 1개의 행이 반환되어야 합니다", MsgBoxStyle.Critical, "계산실패")
I_m = 0
' Return
Else
l_tot += TOSG(Drow평균일사(0).m01) + TOSG(Drow평균일사(0).m02) + TOSG(Drow평균일사(0).m03) + TOSG(Drow평균일사(0).m04) + _
TOSG(Drow평균일사(0).m05) + TOSG(Drow평균일사(0).m06) + TOSG(Drow평균일사(0).m07) + TOSG(Drow평균일사(0).m08) + _
TOSG(Drow평균일사(0).m09) + TOSG(Drow평균일사(0).m10) + TOSG(Drow평균일사(0).m11) + TOSG(Drow평균일사(0).m12)
I_m = TOSG(Drow평균일사(0)("m" & i_ts_month.ToString("00"))) '//이줄로 위의 케이스문을 대체햇다 오류나면 케이스문으로 일단 사용할예정
End If
t_aux_m = I_m / l_tot * 2000
'//월별외기평균온도(i_ts_month << 파라미터)
theta_e_avg = TOSG(Calc.Pub.기상데이터("m" & i_ts_month.ToString("00")))
'theta_e_avg = Worksheets("기상데이타").Range("최소외기온도1").Offset(2 + i_ts_month, i_ts_location - 1) '//월별외기평균온도 tbl_weather에 존재
Select Case Dr신재생.축열탱크설치장소.Trim ' Worksheets("신재생기기").Range("태양열축열탱크1").Offset(2, i_count_ts - 1)
Case "난방공간" '난방공간"
theta_a_avg = 20
Case "비난방공간" '비난방공간"
theta_a_avg = theta_e_avg + (20 - theta_e_avg) / 2
Case "외부공간" '외부공간"
theta_a_avg = theta_e_avg
End Select
theta_w = 40
theta_cw = 15
a_2 = 0
eta_loop = 0.8
eta_0 = 0.6
t_m = i_ts_d_mth * 24
a = 1.029
b = -0.065
c = -0.245
d = 0.0018
e = 0.0215
f = 0
Select Case Dr신재생.집열기유형.Trim 'Worksheets("신재생기기").Range("태양열시스템종류1").Offset(1, i_count_ts - 1)
Case "평판형" '평판형"
a_1 = 6
IAM = 0.94
Case "진공관형" '진공관형"
a_1 = 3
IAM = 1
End Select
If Dr신재생.태양열시스템의성능 = "성능치" Then ' Worksheets("신재생기기").Range("태양열시스템종류1").Offset(5, i_count_ts - 1) = "성능치" Then
eta_0 = TOSG(Dr신재생.무손실효율계수) 'Worksheets("신재생기기").Range("태양열시스템종류1").Offset(6, i_count_ts - 1)
a_1 = TOSG(Dr신재생.열손실계수1차) 'Worksheets("신재생기기").Range("태양열시스템종류1").Offset(7, i_count_ts - 1)
a_2 = TOSG(Dr신재생.열손실계수2차) 'Worksheets("신재생기기").Range("태양열시스템종류1").Offset(8, i_count_ts - 1)
End If
Select Case Dr신재생.태양열종류.Trim ' Worksheets("신재생기기").Range("태양열시스템종류1").Offset(0, i_count_ts - 1)
Case "급탕" '급탕"
A_ = TOSG(Dr신재생.집열판면적) ' Worksheets("신재생기기").Range("태양열시스템종류1").Offset(2, i_count_ts - 1)
U_loop_p = TOSG(5 + 0.5 * A_) '(B.3)
U_loop = a_1 + a_2 * 40 + U_loop_p / A_ '(13)
theta_ref = TOSG(11.6 + 1.18 * theta_w + 3.86 * theta_cw - 1.32 * theta_e_avg) '(B.8) 급탕시스템인 경우 theta_w는 40도, theta_cw 시수온도는15도 가정
Delta_T = theta_ref - theta_e_avg '(14)
V_ref = A_ * 75
V_sol = TOSG(Dr신재생.축열탱크체적급탕) ' Worksheets("신재생기기").Range("태양열축열탱크1").Offset(0, i_count_ts - 1)
f_st = TOSG((V_ref / V_sol) ^ 0.25) '(B.5)
If Q_W_sol_us_m <> 0 Then
X = A_ * U_loop * eta_loop * Delta_T * f_st * t_m / (Q_W_sol_us_m * 1000) '(12)
Y = A_ * IAM * eta_0 * eta_loop * I_m * t_m / (Q_W_sol_us_m * 1000) '(15)
Q_W_sol_out_m = (a * Y + b * X + c * Y * Y + d * X * X + e * Y * Y * Y + f * X * X * X) * Q_W_sol_us_m '(11)
Else
Q_W_sol_out_m = 0
End If
If Q_W_sol_out_m < 0 Then Q_W_sol_out_m = 0
If Q_W_sol_out_m > Q_W_sol_us_m Then Q_W_sol_out_m = Q_W_sol_us_m
'태양열시스템 열손실
U_st = TOSG(0.16 * V_sol ^ 0.5) '(B.9)
theta_setpoint = 60
If Q_W_sol_us_m <> 0 Then
Q_W_sol_st_ls_m = U_st * (theta_setpoint - theta_a_avg) * (Q_W_sol_out_m / Q_W_sol_us_m) * t_m / 1000 '(17)
Q_bu_dis_ls_m = TOSG(0.02 * Q_W_sol_us_m * (Q_W_sol_out_m / Q_W_sol_us_m))
Else
Q_W_sol_st_ls_m = 0
Q_bu_dis_ls_m = 0
End If
If i_system_ts = 1 Then '=====================================================2010.04.02 추가
'난방 부분
theta_ref = TOSG(11.6 + 1.18 * theta_w + 3.86 * theta_cw - 1.32 * theta_e_avg) '(B.8) 급탕시스템인 경우 theta_w는 40도, theta_cw 시수온도는15도 가정
Delta_T = theta_ref - theta_e_avg '(14)
V_ref = A_H * 75
V_sol = TOSG(Dr신재생.축열탱크체적난방) ' Worksheets("신재생기기").Range("태양열축열탱크1").Offset(1, i_count_ts - 1)
f_st = TOSG((V_ref / V_sol) ^ 0.25) '(B.5)
If Q_H_sol_us_m <> 0 Then
X = A_H * U_loop * eta_loop * Delta_T * f_st * t_m / (Q_H_sol_us_m * 1000) '(12)
Y = A_H * IAM * eta_0 * eta_loop * I_m * t_m / (Q_H_sol_us_m * 1000) '(15)
Q_H_sol_out_m = (a * Y + b * X + c * Y * Y + d * X * X + e * Y * Y * Y + f * X * X * X) * Q_H_sol_us_m '(11)
Else
Q_H_sol_out_m = 0
End If
If Q_H_sol_out_m < 0 Then Q_H_sol_out_m = 0
If Q_H_sol_out_m > Q_H_sol_us_m Then Q_H_sol_out_m = Q_H_sol_us_m
'태양열시스템 열손실
U_st = TOSG(0.16 * V_sol ^ 0.5) '(B.9)
theta_setpoint = 40
If Q_H_sol_us_m <> 0 Then
Q_H_sol_st_ls_m = U_st * (theta_setpoint - theta_a_avg) * (Q_H_sol_out_m / Q_H_sol_us_m) * t_m / 1000 '(17)
Q_H_bu_dis_ls_m = TOSG(0.02 * Q_H_sol_us_m * (Q_H_sol_out_m / Q_H_sol_us_m))
Else
Q_H_sol_st_ls_m = 0
Q_H_bu_dis_ls_m = 0
End If
Q_sol_ls_m = Q_H_sol_st_ls_m + Q_H_bu_dis_ls_m + Q_W_sol_st_ls_m + Q_W_bu_dis_ls_m
End If '=====================================================2010.04.02 추가
' Q_sol_ls_m = Q_W_sol_st_ls_m + Q_bu_dis_ls_m
' 보조에너지
P_aux_nom = TOSG(Dr신재생.솔라펌프의정격출력) ' Worksheets("신재생기기").Range("태양열시스템종류1").Offset(4, i_count_ts - 1)
W_sol_aux_m = P_aux_nom * t_aux_m / 1000
Q_sol_aux_rbl_m = TOSG(W_sol_aux_m * 0.5)
Select Case Dr신재생.축열탱크설치장소.Trim 'Worksheets("신재생기기").Range("태양열축열탱크1").Offset(2, i_count_ts - 1)
Case "난방공간" '난방공간"
Q_sol_st_ls_rbl_m = Q_W_sol_st_ls_m
Q_bu_dis_ls_rbl_m = Q_bu_dis_ls_m
Case "비난방공간" '비난방공간"
Q_sol_st_ls_rbl_m = TOSG(Q_W_sol_st_ls_m * 0.5)
Q_bu_dis_ls_rbl_m = TOSG(Q_bu_dis_ls_m * 0.5)
Case "외부공간" '외부공간"
Q_sol_st_ls_rbl_m = 0
Q_bu_dis_ls_rbl_m = 0
End Select
Q_sol_ls_rbl_m = Q_sol_aux_rbl_m + Q_sol_st_ls_rbl_m + Q_bu_dis_ls_rbl_m '(20)
Case "난방+급탕" '난방+급탕"
P_H = Q_H_sol_us_m / (Q_H_sol_us_m + Q_W_sol_us_m) '(9)
P_W = Q_W_sol_us_m / (Q_H_sol_us_m + Q_W_sol_us_m) '(10)
A_ = TOSG(Dr신재생.집열판면적) ' Worksheets("신재생기기").Range("태양열시스템종류1").Offset(2, i_count_ts - 1)
A_H = P_H * A_
A_W = P_W * A_
'급탕 부분
U_loop_p = 5 + 0.5 * A_W '(B.3) '===========================2010.04.24 추가
If A_W <> 0 Then
U_loop = a_1 + a_2 * 40 + U_loop_p / A_W '(13) '===============2010.04.24 추가
theta_ref = TOSG(11.6 + 1.18 * theta_w + 3.86 * theta_cw - 1.32 * theta_e_avg) '(B.8) 급탕시스템인 경우 theta_w는 40도, theta_cw 시수온도는15도 가정
Delta_T = theta_ref - theta_e_avg '(14)
V_ref = A_W * 75
V_sol = TOSG(Dr신재생.축열탱크체적급탕) ' Worksheets("신재생기기").Range("태양열축열탱크1").Offset(0, i_count_ts - 1)
f_st = TOSG((V_ref / V_sol) ^ 0.25) '(B.5)
End If
If Q_W_sol_us_m <> 0 Then
X = A_W * U_loop * eta_loop * Delta_T * f_st * t_m / (Q_W_sol_us_m * 1000) '(12)
Y = A_W * IAM * eta_0 * eta_loop * I_m * t_m / (Q_W_sol_us_m * 1000) '(15)
Q_W_sol_out_m = (a * Y + b * X + c * Y * Y + d * X * X + e * Y * Y * Y + f * X * X * X) * Q_W_sol_us_m '(11)
Else
Q_W_sol_out_m = 0
End If
If Q_W_sol_out_m < 0 Then Q_W_sol_out_m = 0
If Q_W_sol_out_m > Q_W_sol_us_m Then Q_W_sol_out_m = Q_W_sol_us_m
'태양열시스템 열손실
U_st = TOSG(0.16 * V_sol ^ 0.5) '(B.9)
theta_setpoint = 60
If Q_W_sol_us_m <> 0 Then
Q_W_sol_st_ls_m = U_st * (theta_setpoint - theta_a_avg) * (Q_W_sol_out_m / Q_W_sol_us_m) * t_m / 1000 '(17)
Q_W_bu_dis_ls_m = TOSG(0.02 * Q_W_sol_us_m * (Q_W_sol_out_m / Q_W_sol_us_m))
Else
Q_W_sol_st_ls_m = 0
Q_W_bu_dis_ls_m = 0
End If
'난방 부분
U_loop_p = 5 + 0.5 * A_H '(B.3) '===========================2010.04.24 추가
U_loop = a_1 + a_2 * 40 + U_loop_p / A_H '(13) '===============2010.04.24 추가
theta_ref = TOSG(11.6 + 1.18 * theta_w + 3.86 * theta_cw - 1.32 * theta_e_avg) '(B.8) 급탕시스템인 경우 theta_w는 40도, theta_cw 시수온도는15도 가정
Delta_T = theta_ref - theta_e_avg '(14)
V_ref = A_H * 75
V_sol = TOSG(Dr신재생.축열탱크체적난방) ' Worksheets("신재생기기").Range("태양열축열탱크1").Offset(1, i_count_ts - 1)
f_st = TOSG((V_ref / V_sol) ^ 0.25) '(B.5)
If Q_H_sol_us_m <> 0 Then
X = A_H * U_loop * eta_loop * Delta_T * f_st * t_m / (Q_H_sol_us_m * 1000) '(12)
Y = A_H * IAM * eta_0 * eta_loop * I_m * t_m / (Q_H_sol_us_m * 1000) '(15)
Q_H_sol_out_m = (a * Y + b * X + c * Y * Y + d * X * X + e * Y * Y * Y + f * X * X * X) * Q_H_sol_us_m '(11)
Else
Q_H_sol_out_m = 0
End If
If Q_H_sol_out_m < 0 Then Q_H_sol_out_m = 0
If Q_H_sol_out_m > Q_H_sol_us_m Then Q_H_sol_out_m = Q_H_sol_us_m
'태양열시스템 열손실
U_st = TOSG(0.16 * V_sol ^ 0.5) '(B.9)
theta_setpoint = 40
If Q_H_sol_us_m <> 0 Then
Q_H_sol_st_ls_m = U_st * (theta_setpoint - theta_a_avg) * (Q_H_sol_out_m / Q_H_sol_us_m) * t_m / 1000 '(17)
Q_H_bu_dis_ls_m = TOSG(0.02 * Q_H_sol_us_m * (Q_H_sol_out_m / Q_H_sol_us_m))
Else
Q_H_sol_st_ls_m = 0
Q_H_bu_dis_ls_m = 0
End If
Q_sol_ls_m = Q_H_sol_st_ls_m + Q_H_bu_dis_ls_m + Q_W_sol_st_ls_m + Q_W_bu_dis_ls_m
' 보조에너지
P_aux_nom = TOSG(Dr신재생.솔라펌프의정격출력) ' Worksheets("신재생기기").Range("태양열시스템종류1").Offset(4, i_count_ts - 1)
W_sol_aux_m = P_aux_nom * t_aux_m / 1000
Q_sol_aux_rbl_m = TOSG(W_sol_aux_m * 0.5)
Select Case Dr신재생.축열탱크설치장소.Trim ' Worksheets("신재생기기").Range("태양열축열탱크1").Offset(2, i_count_ts - 1)
Case "난방공간" '난방공간"
Q_sol_ls_rbl_m = Q_sol_aux_rbl_m + Q_sol_ls_m
Case "비난방공간" '비난방공간"
Q_sol_ls_rbl_m = TOSG(Q_sol_aux_rbl_m + Q_sol_ls_m * 0.5)
Case "외부공간" '외부공간"
Q_sol_ls_rbl_m = Q_sol_aux_rbl_m
End Select
End Select
''보조에너지
''f_sol_m = Q_sol_out_m / Q_sol_us_m '(21)
''W_bu_aux_m = W_bu_nom_m * (1 - f_sol_m) '(22)
''P_aux_nom = 50 + 5 * A_ '(B.4)
'// 신재생에너지 자립률 추가(2017.01.20)
If (Q_H_sol_out_m + Q_W_sol_out_m) = 0 Then
H_W_ratio = 0 ' Q_H_sol_out_m / (Q_H_sol_out_m + Q_W_sol_out_m)
Else
H_W_ratio = Q_H_sol_out_m / (Q_H_sol_out_m + Q_W_sol_out_m)
End If
' Q_H_sol_out_net = Q_H_sol_out_m + H_W_ratio * W_sol_aux_m * 2.75
Q_W_sol_out_net = Q_W_sol_out_m + (1 - H_W_ratio) * W_sol_aux_m * 2.75
'// 신재생에너지 자립률 추가
'//열에너지생산량-태양열
Result.생산E(i_ts_month).태양열생산량 += Q_W_sol_out_net + Q_H_sol_out_net '// 20170120 추가
'//Result.생산E(i_ts_month).태양열생산량 += Q_W_sol_out_m + Q_H_sol_out_m '20170120 삭제
'DSETR.TReqUse.Rows(CEnum.ResultRow.생산_열생산량_태양열)(CStr("M" & Format(i_ts_month, "00"))) = CSng(DSETR.TReqUse.Rows(CEnum.ResultRow.생산_열생산량_태양열)(CStr("M" & Format(i_ts_month, "00")))) + Q_W_sol_out_m + Q_H_sol_out_m 'Sheets("계산결과").Cells(97, 7 + i_ts_month) = Q_W_sol_out_m + Q_H_sol_out_m
'Dim TDR As DSR.TReqUseRow = CType(DSETR.TReqUse.Rows(CEnum.ResultRow.생산_단위면적당생산량_태양열), DSR.TReqUseRow)
Select Case i_system_ts '//이것도 프로시져 파라미터이다.
Case 1 '//난방?급탕 혼합형태?
If Q_W_sol_out_m <> 0 Then
Result.생산E(i_ts_month).면적당생산량태양열 += (Q_W_sol_out_net / Result.사용면적.W) '// 20170120 추가
Result.생산E(i_ts_month).면적당생산량태양열_급탕 += (Q_W_sol_out_net / Result.사용면적.W) '// 20170120 추가
'Result.생산E(i_ts_month).면적당생산량태양열 += (Q_W_sol_out_m / Result.사용면적.W) 삭제
Else
Result.생산E(i_ts_month).면적당생산량태양열 += (Q_H_sol_out_net / Result.사용면적.H) '// 20170120 추가
Result.생산E(i_ts_month).면적당생산량태양열_난방 += (Q_H_sol_out_net / Result.사용면적.H) '// 20170120 추가
'Result.생산E(i_ts_month).면적당생산량태양열 += (Q_H_sol_out_m / Result.사용면적.H)
End If
Case 2 '//냉방?
Result.생산E(i_ts_month).면적당생산량태양열 += (Q_H_sol_out_net / Result.사용면적.C) '// 20170120 추가
Result.생산E(i_ts_month).면적당생산량태양열_냉방 += (Q_H_sol_out_net / Result.사용면적.C) '// 20170120 추가
'Result.생산E(i_ts_month).면적당생산량태양열 += (Q_H_sol_out_m / Result.사용면적.C)
Case 3 '//급탕
Result.생산E(i_ts_month).면적당생산량태양열 += (Q_W_sol_out_net / Result.사용면적.W) '// 20170120 추가
Result.생산E(i_ts_month).면적당생산량태양열_급탕 += (Q_W_sol_out_net / Result.사용면적.W) '// 20170120 추가
'Result.생산E(i_ts_month).면적당생산량태양열 += (Q_W_sol_out_m / Result.사용면적.W)
Case Else
MsgBox("단위면적당생산량 누적시 i_syste_ts 가 알수없음", MsgBoxStyle.Critical, "확인")
End Select
pLog.Add(String.Format(">>Calc_ThermalSolarSystem_EN 진입 : 태양열생산량={0}, 면적당생산량태양열={1}, Q_W_sol_out_m={2}, Q_H_sol_out_m={3}", _
Result.생산E(i_ts_month).태양열생산량, Result.생산E(i_ts_month).면적당생산량태양열, Q_W_sol_out_net, Q_H_sol_out_net)) '// 20170120 수정
'pLog.Add(String.Format(">>Calc_ThermalSolarSystem_EN 진입 : 태양열생산량={0}, 면적당생산량태양열={1}, Q_W_sol_out_m={2}, Q_H_sol_out_m={3}", _
' Result.생산E(i_ts_month).태양열생산량, Result.생산E(i_ts_month).면적당생산량태양열, Q_W_sol_out_m, Q_H_sol_out_m))
End Sub
Public Overridable Sub Calc_PhotovoltaicSystem_EN(ByVal i_count_pv_month As Integer, ByVal i_pv_d_mth As Integer)
pLog.Add(String.Format(">>Calc_PhotovoltaicSystem_EN 진입 : i_count_pv_month={0}, i_pv_d_mth={1}", _
i_count_pv_month, i_pv_d_mth))
Dim E_el_pv_out As Decimal, P_pk As Decimal, f_perf As Decimal, E_sol As Decimal
Dim a As Decimal, K_pk As Decimal
Dim E_el_pv_out_offsite As Decimal = 0
'Dim i_count_pv As Integer, i_count_pv_location As Integer, i_pv_location As Integer
E_el_pv_out = 0
E_el_pv_out_offsite = 0
'If DSET.tbl_new.Rows.Count > 0 Then ' Worksheets("신재생기기").Range("신재생생산기기1").Offset(0, 0) <> "" Then '//신재생기기 처음칸에 뭐가 잇다? 즉 데이터가잇느냐
For Each Dr신재생 As DS.tbl_newRow In DSET.tbl_new.Select("code <> '0'", "code")
If Dr신재생.기기종류 = "태양광" Then
a = TOSG(Dr신재생.태양광모듈면적) ' Worksheets("신재생기기").Range("태양광모듈1").Offset(0, i_count_pv - 1)
Select Case Dr신재생.태양광모듈적용타입.Trim ' Worksheets("신재생기기").Range("태양광모듈1").Offset(4, i_count_pv - 1)
Case "밀착형" '밀착형"
f_perf = 0.7
Case "후면통풍형" '후면통풍형"
f_perf = 0.75
Case "기계환기형" '기계환기형"
f_perf = 0.8
End Select
'If a <> 0 Then '//태양광모듈면적이있을경우에만 작동하도록한다.
Dim Dr일사 As DS.weather_ilsaRow
Select Case Dr신재생.태양광모듈기울기.Trim ' Worksheets("신재생기기").Range("태양광모듈1").Offset(1, i_count_pv - 1)
Case "수평" '수평"
'//수평면에해당하는 월별평균일사 값을 가져온다.수평면 0001은 고정값이된다.
Dr일사 = CType(DSET.weather_ilsa.Select("pcode='" & Calc.Pub.기상데이터.code & "' and code='0001'")(0), DS.weather_ilsaRow)
E_sol = TOSG(Dr일사("M" & Format(i_count_pv_month, "00"))) * i_pv_d_mth * 24 / 1000
Case "45도" '45도"
Select Case Dr신재생.태양광모듈방위.Trim ' Worksheets("신재생기기").Range("태양광모듈1").Offset(2, i_count_pv - 1)
Case "" '"남"
'//45도 남에대한건 기본 수평면하고 +9를 하면 나온다 나머지도 순서이므로 +1을 게속해주면된다.
Dr일사 = CType(DSET.weather_ilsa.Select("pcode='" & Calc.Pub.기상데이터.code & "' and code='" & Format(1 + 9, "0000") & "'")(0), DS.weather_ilsaRow)
E_sol = TOSG(Dr일사("M" & Format(i_count_pv_month, "00"))) * i_pv_d_mth * 24 / 1000
Case "남동" '"남동"
Dr일사 = CType(DSET.weather_ilsa.Select("pcode='" & Calc.Pub.기상데이터.code & "' and code='" & Format(1 + 10, "0000") & "'")(0), DS.weather_ilsaRow)
E_sol = TOSG(Dr일사("M" & Format(i_count_pv_month, "00"))) * i_pv_d_mth * 24 / 1000
Case "남서" '"남서"
Dr일사 = CType(DSET.weather_ilsa.Select("pcode='" & Calc.Pub.기상데이터.code & "' and code='" & Format(1 + 11, "0000") & "'")(0), DS.weather_ilsaRow)
E_sol = TOSG(Dr일사("M" & Format(i_count_pv_month, "00"))) * i_pv_d_mth * 24 / 1000
Case "" '"동"
Dr일사 = CType(DSET.weather_ilsa.Select("pcode='" & Calc.Pub.기상데이터.code & "' and code='" & Format(1 + 12, "0000") & "'")(0), DS.weather_ilsaRow)
E_sol = TOSG(Dr일사("M" & Format(i_count_pv_month, "00"))) * i_pv_d_mth * 24 / 1000
Case "" '"서"
Dr일사 = CType(DSET.weather_ilsa.Select("pcode='" & Calc.Pub.기상데이터.code & "' and code='" & Format(1 + 13, "0000") & "'")(0), DS.weather_ilsaRow)
E_sol = TOSG(Dr일사("M" & Format(i_count_pv_month, "00"))) * i_pv_d_mth * 24 / 1000
End Select
Case "수직" '수직"
Select Case Dr신재생.태양광모듈방위.Trim 'Worksheets("신재생기기").Range("태양광모듈1").Offset(2, i_count_pv - 1)
Case "" '"남"
Dr일사 = CType(DSET.weather_ilsa.Select("pcode='" & Calc.Pub.기상데이터.code & "' and code='" & Format(1 + 1, "0000") & "'")(0), DS.weather_ilsaRow)
E_sol = TOSG(Dr일사("M" & Format(i_count_pv_month, "00"))) * i_pv_d_mth * 24 / 1000
Case "남동" '"남동"
Dr일사 = CType(DSET.weather_ilsa.Select("pcode='" & Calc.Pub.기상데이터.code & "' and code='" & Format(1 + 2, "0000") & "'")(0), DS.weather_ilsaRow)
E_sol = TOSG(Dr일사("M" & Format(i_count_pv_month, "00"))) * i_pv_d_mth * 24 / 1000
Case "남서" '"남서"
Dr일사 = CType(DSET.weather_ilsa.Select("pcode='" & Calc.Pub.기상데이터.code & "' and code='" & Format(1 + 3, "0000") & "'")(0), DS.weather_ilsaRow)
E_sol = TOSG(Dr일사("M" & Format(i_count_pv_month, "00"))) * i_pv_d_mth * 24 / 1000
Case "" '"동"
Dr일사 = CType(DSET.weather_ilsa.Select("pcode='" & Calc.Pub.기상데이터.code & "' and code='" & Format(1 + 4, "0000") & "'")(0), DS.weather_ilsaRow)
E_sol = TOSG(Dr일사("M" & Format(i_count_pv_month, "00"))) * i_pv_d_mth * 24 / 1000
Case "" '"서"
Dr일사 = CType(DSET.weather_ilsa.Select("pcode='" & Calc.Pub.기상데이터.code & "' and code='" & Format(1 + 5, "0000") & "'")(0), DS.weather_ilsaRow)
E_sol = TOSG(Dr일사("M" & Format(i_count_pv_month, "00"))) * i_pv_d_mth * 24 / 1000
End Select
End Select
'E_sol = E_sol_hor * f_tlt 수평면일사에 계수를 곱하지 않고 직접 기상데이타 적용
Select Case Dr신재생.태양광모듈종류.Trim ' Worksheets("신재생기기").Range("태양광모듈1").Offset(3, i_count_pv - 1)
Case "단결정" '단결정"
K_pk = 0.12
Case "다결정" '다결정"
K_pk = 0.1
Case "비정질박막형" '비정질박막형"
K_pk = 0.04
Case "기타박막형" '기타박막형"
K_pk = 0.035
Case "CIS박막형" 'CIS박막형"
K_pk = 0.105
Case "CdTe박막형" 'CdTe박막형"
K_pk = 0.095
Case "성능치 입력"
Try
K_pk = TOSG(Dr신재생.태양광모듈효율)
Catch ex As Exception
MsgBox("태양광모듈효율을 알 수 없습니다.", MsgBoxStyle.Critical, "값=" & Dr신재생.태양광모듈효율)
K_pk = 0
End Try
Case Else
MsgBox("알수없는 태양광모듈종류입니다.", MsgBoxStyle.Critical, "값=" & Dr신재생.태양광모듈종류)
End Select
P_pk = K_pk * a
If Dr신재생.대지외설치여부 Then
E_el_pv_out_offsite = E_el_pv_out_offsite + E_sol * P_pk * f_perf
Else
E_el_pv_out += E_sol * P_pk * f_perf
End If
'End If
End If
Next
'If Sheets("계산결과").Cells(104, 7 + i_count_pv_month) = "" Then
' Sheets("계산결과").Cells(104, 7 + i_count_pv_month) = E_el_pv_out
'Else
' Sheets("계산결과").Cells(104, 7 + i_count_pv_month) = Sheets("계산결과").Cells(104, 7 + i_count_pv_month) + E_el_pv_out
'End If
'Dim importrows() As DS.tbl_importdataRow = DSET1.tbl_importdata.Select("mon='M" + i_count_pv_month.ToString("00") + "'")
'If importrows.Length = 1 Then
' Dim 외부전기도입량 As Decimal = importrows(0).외부전기도입량
'End If
Result.생산E(i_count_pv_month).태양광전력생산량 += E_el_pv_out
Result.생산E(i_count_pv_month).태양광전력생산량_offsite += E_el_pv_out_offsite
pLog.Add(String.Format(">>Calc_PhotovoltaicSystem_EN 진입 : E_el_pv_out={0}, 태양광전력생산량={1}", _
E_el_pv_out, Result.생산E(i_count_pv_month).태양광전력생산량))
'DSETR.TReqUse.Rows(CEnum.ResultRow.생산_전기_태양광)("M" & Format(i_count_pv_month, "00")) = CSng(DSETR.TReqUse.Rows(CEnum.ResultRow.생산_전기_태양광)("M" & Format(i_count_pv_month, "00"))) + E_el_pv_out ' Sheets("계산결과").Cells(95, 7 + i_count_pv_month)
End Sub
Public Overridable Sub Calc_ImportData(ByVal i_count_pv_month As Integer, ByVal i_pv_d_mth As Integer)
pLog.Add(String.Format(">>Calc_ImportData 진입 : i_count_pv_month={0}, i_pv_d_mth={1}", _
i_count_pv_month, i_pv_d_mth))
Dim 외부전기도입량 As Decimal = 0
Dim importrows() As DS.tbl_importdataRow = DSET1.tbl_importdata.Select("mon='M" + i_count_pv_month.ToString("00") + "'")
If importrows.Length = 1 Then
외부전기도입량 = importrows(0).외부전기도입량
Result.생산E(i_count_pv_month).연료전지전력생산량_offsite += 외부전기도입량
End If
pLog.Add(String.Format(">>Calc_ImportData 진입 : E_el_pv_out={0}, 외부전기도입량={1}", _
외부전기도입량, Result.생산E(i_count_pv_month).연료전지전력생산량_offsite))
'DSETR.TReqUse.Rows(CEnum.ResultRow.생산_전기_태양광)("M" & Format(i_count_pv_month, "00")) = CSng(DSETR.TReqUse.Rows(CEnum.ResultRow.생산_전기_태양광)("M" & Format(i_count_pv_month, "00"))) + E_el_pv_out ' Sheets("계산결과").Cells(95, 7 + i_count_pv_month)
End Sub
Public Overridable Sub Calc_HeatpumpSystem(ByVal i_system_hp As Integer, ByVal i_HeatCool As Integer, ByVal Dr신재생 As DS.tbl_newRow, ByVal Q_hp_outg As Decimal, ByVal i_hp_month As Integer, _
ByVal d_h_mth As Integer, ByVal t_hp As Integer, ByVal theta_VA As Decimal, ByVal theta_i As Decimal, ByRef Q_h_outg As Decimal, ByRef Q_h_f_hp As Decimal, ByRef Q_h_g_aux As Decimal)
pLog.Add(String.Format(">>Calc_HeatpumpSystem 진입 : i_system_hp={0}, i_HeatCool={1},dr신재생={2},Q_hp_outg={3},i_hp_month={4},d_h_mth={5},t_hp={6},theta_VA={7},theta_i={8},Q_h_outg={9},Q_h_f_hp={10},Q_h_g_aux={11}", _
i_system_hp, i_HeatCool, Dr신재생.code, Q_hp_outg, i_hp_month, d_h_mth, t_hp, theta_VA, theta_i, Q_h_outg, Q_h_f_hp, Q_h_g_aux))
Dim f_Verwindung As Decimal, V As Decimal, q_B_S As Decimal, Phi_g As Decimal
Dim Q_h_g As Decimal, Q_h_g_s As Decimal, Q_h_g_WP As Decimal
Dim P_rd_mot As Decimal
'Dim Q_h_f_hp as decimal 'DIN 에서는 Q_h_f로 표기
'Dim Delta_p_prim as decimal, Delta_p_sek as decimal
Dim Phi_prim_aux As Decimal, Phi_sek_aux As Decimal, t_ON_aux As Decimal
Dim theta_h_s As Decimal
Dim COP As Decimal
Dim Q_h_outg_net As Decimal
Q_h_g_s = 0
Q_h_g_WP = 0 '전기히트펌프인 경우 0 가스히트펌프는 ?
P_rd_mot = 0
Q_h_f_hp = 0
Q_h_outg_net = 0
'eta_aux = 0.3
'Delta_p_prim = 40 'kPa 1차측
'Delta_p_sek = 10 'kPa 2차측
'MsgBox(i_count_hp)
'i_count_hp = 0 '//신재생 줄번호는 무조건 0이된다. 20100127 '//연습용데이터 문제있음
' Dim Dr신재생 As DS.tbl_newRow = CType(DSET.tbl_new.Rows(0), DS.tbl_newRow)
Phi_g = TOSG(Dr신재생.지열히트펌프용량) ' Worksheets("신재생기기").Range("지열히트펌프용량1").Offset(0, i_count_hp - 1)
If Dr신재생.가동연료 <> "전기" And i_HeatCool = 1 And Dr신재생.열교환기설치여부 = "" Then ' Worksheets("신재생기기").Range("지열히트펌프용량1").Offset(5, i_count_hp - 1) = "예" Then
P_rd_mot = 0.4
End If
If Q_hp_outg < (Phi_g * t_hp) * (1 + P_rd_mot) Then
Q_h_outg = Q_hp_outg
Else
Q_h_outg = Phi_g * t_hp * (1 + P_rd_mot)
End If
If i_HeatCool = 1 Or i_HeatCool = 3 Then '난방 1 , 냉방 2, 급탕 3
'난방, 급탕
If Dr신재생.팽창탱크설치여부 = "" Then ' Worksheets("신재생기기").Range("지열히트펌프용량1").Offset(6, i_count_hp - 1) = "예" Then
f_Verwindung = 1.2
V = TOSG(Dr신재생.팽창탱크체적) ' Worksheets("신재생기기").Range("지열히트펌프용량1").Offset(7, i_count_hp - 1)
q_B_S = TOSG(0.4 + 0.14 * V ^ 0.45) '(51)
theta_h_s = theta_VA '급수온도로 적용
Q_h_g_s = f_Verwindung * (theta_h_s - theta_i) / 45 * d_h_mth * q_B_S '(49) 외부완충(팽창탱크 유무)
End If
Q_h_g = Q_h_g_s + Q_h_g_WP
COP = TOSG(Dr신재생.열성능비난방) ' Worksheets("신재생기기").Range("지열히트펌프용량1").Offset(1, i_count_hp - 1)
Else
'냉방
COP = TOSG(Dr신재생.열성능비냉방) ' Worksheets("신재생기기").Range("지열히트펌프용량1").Offset(2, i_count_hp - 1)
End If
If Dr신재생.가동연료 = "전기" Then ' Worksheets("신재생기기").Range("신재생및열병합기기종류1").Offset(1, i_count_hp - 1) = "전기" Then
Q_h_f_hp = (Q_h_outg + Q_h_g) / COP
' Q_h_in = Q_h_outg + Q_h_g - Q_h_f_hp '월간 전기히트펌프(재생에너지유입량)
Else
Q_h_f_hp = Q_h_outg / COP
' If i_HeatCool = 1 And Worksheets("신재생기기").Range("지열히트펌프용량1").Offset(5, i_count_hp - 1) = "예" Then
' P_rd_mot = 0.4
' End If
' Q_h_in = Q_h_outg + Q_h_g - Q_h_f_hp * (1 + P_rd_mot) '월간 가스히트펌프(재생에너지유입량)
End If
'Q_h_f = Q_h_outg + Q_h_g - k_rd_g * Q_h_g_aux - Q_h_in '월간(A.1) 전기히트펌프(난방요구량 충당)
'Q_h_f = (Q_h_outg + Q_h_g - k_rd_g * Q_h_g_aux - Q_h_in) / (1 + P_rd_mot) '월간(A.2) 가스히트펌프(난방요구량 충당)
'보조에너지
'Phi_prim_aux = Delta_p_prim * V_dot / (eta_aux * 3600) '(89) 사용자 입력항목이므로 확인 요망
'Phi_sek_aux = Delta_p_sek * V_dot / (eta_aux * 3600) '(89) 사용자 입력항목이므로 확인 요망
t_ON_aux = Q_h_outg / (Phi_g) '(81)
Phi_prim_aux = TOSG(Dr신재생.펌프용량1차) ' Worksheets("신재생기기").Range("지열히트펌프용량1").Offset(3, i_count_hp - 1)
Phi_sek_aux = TOSG(Dr신재생.펌프용량2차) ' Worksheets("신재생기기").Range("지열히트펌프용량1").Offset(4, i_count_hp - 1)
Q_h_g_aux = TOSG((Phi_prim_aux + Phi_sek_aux) * 0.001 * t_ON_aux) '(88)
'// 신재생에너지 자립률 추가(2017.01.20)
If Dr신재생.가동연료 = "전기" Then
Q_h_outg_net = Q_h_outg - ((Q_h_f_hp + Q_h_g_aux) * 2.75) '전기 1차에너지계수 적용
If Q_h_outg_net < 0 Then Q_h_outg_net = 0
Else
Q_h_outg_net = Q_h_outg - (Q_h_f_hp * 1.1 + Q_h_g_aux * 2.75) '가스 1차에너지계수 적용
If Q_h_outg_net < 0 Then Q_h_outg_net = 0
End If
'// 신재생에너지 자립률 추가
'//열에너지생산량 (지열)
Result.생산E(i_hp_month).지열생산량 += Q_h_outg_net '//20170120 추가
'// Result.생산E(i_hp_month).지열생산량 += Q_h_f_hp '20170120 지열생산량을 수정
'DSETR.TReqUse.Rows(79)("M" & Format(i_hp_month, "00")) = CSng(DSETR.TReqUse.Rows(79)("M" & Format(i_hp_month, "00"))) + Q_h_f_hp 'DrT생산.열생산량지열 += Q_h_f_hp
pLog.Add(String.Format(">>Calc_HeatpumpSystem 결과0 Q_h_f_hp={0},t_ON_aux={1},Q_h_g_aux={2}", _
Q_h_f_hp, t_ON_aux, Q_h_g_aux))
pLog.Add(String.Format(">>Calc_HeatpumpSystem 결과1 지열생산량={0}", _
Result.생산E(i_hp_month).지열생산량))
'100 : Total >> DrT생산.단위면적당생산량지열
Select Case i_system_hp
Case 1
Result.생산E(i_hp_month).면적당생산량지열 += (Q_h_outg_net / Result.사용면적.H) '//20170120 추가
Result.생산E(i_hp_month).면적당생산량지열_난방 += (Q_h_outg_net / Result.사용면적.H) '//20170120 추가
'//Result.생산E(i_hp_month).면적당생산량지열 += (Q_h_f_hp / Result.사용면적.H) '20170120 지열생산량을 수정
'DSETR.TReqUse.Rows(100)("M00") = CSng(DSETR.TReqUse.Rows(100)("M00")) + Q_h_f_hp / CSng(DSETR.TReqUse.Rows(10)("M00")) ' DrT요구량.난방사용면적 ' Sheets("계산결과").Cells(15, 7)
Case 2
Result.생산E(i_hp_month).면적당생산량지열 += (Q_h_outg_net / Result.사용면적.C) '//20170120 추가
Result.생산E(i_hp_month).면적당생산량지열_냉방 += (Q_h_outg_net / Result.사용면적.C) '//20170120 추가
'//Result.생산E(i_hp_month).면적당생산량지열 += (Q_h_f_hp / Result.사용면적.C) '20170120 지열생산량을 수정
'DSETR.TReqUse.Rows(100)("M00") = CSng(DSETR.TReqUse.Rows(100)("M00")) + Q_h_f_hp / CSng(DSETR.TReqUse.Rows(15)("M00")) 'DrT요구량.냉방사용면적 '("계산결과").Cells(20, 7)
Case 3
Result.생산E(i_hp_month).면적당생산량지열 += (Q_h_outg_net / Result.사용면적.W) '//20170120 추가
Result.생산E(i_hp_month).면적당생산량지열_급탕 += (Q_h_outg_net / Result.사용면적.W) '//20170120 추가
'//Result.생산E(i_hp_month).면적당생산량지열 += (Q_h_f_hp / Result.사용면적.W) '20170120 지열생산량을 수정
End Select
pLog.Add(String.Format(">>Calc_HeatpumpSystem 결과2 면적당생산량지열={0}", _
Result.생산E(i_hp_month).면적당생산량지열))
End Sub
Public Overridable Sub Calc_HydroHeatpumpSystem(ByVal i_system_hp As Integer, ByVal i_HeatCool As Integer, ByVal Dr신재생 As DS.tbl_newRow, ByVal Q_hp_outg As Decimal, ByVal i_hp_month As Integer, _
ByVal d_h_mth As Integer, ByVal t_hp As Integer, ByVal theta_VA As Decimal, ByVal theta_i As Decimal, ByRef Q_h_outg As Decimal, ByRef Q_h_f_hp As Decimal, ByRef Q_h_g_aux As Decimal)
pLog.Add(String.Format(">>HydroCalc_HeatpumpSystem 진입 : i_system_hp={0}, i_HeatCool={1},dr신재생={2},Q_hp_outg={3},i_hp_month={4},d_h_mth={5},t_hp={6},theta_VA={7},theta_i={8},Q_h_outg={9},Q_h_f_hp={10},Q_h_g_aux={11}", _
i_system_hp, i_HeatCool, Dr신재생.code, Q_hp_outg, i_hp_month, d_h_mth, t_hp, theta_VA, theta_i, Q_h_outg, Q_h_f_hp, Q_h_g_aux))
Dim f_Verwindung As Decimal, V As Decimal, q_B_S As Decimal, Phi_g As Decimal
Dim Q_h_g As Decimal, Q_h_g_s As Decimal, Q_h_g_WP As Decimal
Dim P_rd_mot As Decimal
'Dim Q_h_f_hp as decimal 'DIN 에서는 Q_h_f로 표기
'Dim Delta_p_prim as decimal, Delta_p_sek as decimal
Dim Phi_prim_aux As Decimal, Phi_sek_aux As Decimal, t_ON_aux As Decimal
Dim theta_h_s As Decimal
Dim COP, COP_L, COP_H, COP_b As Decimal
Dim Q_h_outg_net As Decimal
Q_h_g_s = 0
Q_h_g_WP = 0 '전기히트펌프인 경우 0 가스히트펌프는 ?
P_rd_mot = 0
Q_h_f_hp = 0
Q_h_outg_net = 0
Dim water_temp As Single = 0.0F ' i_hp_month
If Dr신재생.수열_수열원 = "하천수" Then
Dim Dr수온 As DS.weather_riverRow = CType(DSET.weather_river.Select("pcode='" & Calc.Pub.기상데이터.code + "'")(0), DS.weather_riverRow)
water_temp = TOSG(Dr수온("M" + i_hp_month.ToString("00")))
Else
Dim Dr수온 As DS.weather_waterRow = CType(DSET.weather_water.Rows(0), DS.weather_waterRow)
water_temp = TOSG(Dr수온("M" + i_hp_month.ToString("00")))
End If
'eta_aux = 0.3
'Delta_p_prim = 40 'kPa 1차측
'Delta_p_sek = 10 'kPa 2차측
'MsgBox(i_count_hp)
'i_count_hp = 0 '//신재생 줄번호는 무조건 0이된다. 20100127 '//연습용데이터 문제있음
' Dim Dr신재생 As DS.tbl_newRow = CType(DSET.tbl_new.Rows(0), DS.tbl_newRow)
Phi_g = TOSG(Dr신재생.수열_수열히트펌프용량) ' Worksheets("신재생기기").Range("지열히트펌프용량1").Offset(0, i_count_hp - 1)
If Dr신재생.가동연료 <> "전기" And i_HeatCool = 1 And Dr신재생.수열_열교환기설치여부 = "" Then ' Worksheets("신재생기기").Range("지열히트펌프용량1").Offset(5, i_count_hp - 1) = "예" Then
P_rd_mot = 0.4
End If
If Q_hp_outg < (Phi_g * t_hp) * (1 + P_rd_mot) Then
Q_h_outg = Q_hp_outg
Else
Q_h_outg = Phi_g * t_hp * (1 + P_rd_mot)
End If
If i_HeatCool = 1 Or i_HeatCool = 3 Then '난방 1 , 냉방 2, 급탕 3
'난방, 급탕
If Dr신재생.수열_수열팽창탱크설치여부 = "" Then ' Worksheets("신재생기기").Range("지열히트펌프용량1").Offset(6, i_count_hp - 1) = "예" Then
f_Verwindung = 1.2
V = TOSG(Dr신재생.수열_수열팽창탱크체적) ' Worksheets("신재생기기").Range("지열히트펌프용량1").Offset(7, i_count_hp - 1)
q_B_S = TOSG(0.4 + 0.14 * V ^ 0.45) '(51)
theta_h_s = theta_VA '급수온도로 적용
Q_h_g_s = f_Verwindung * (theta_h_s - theta_i) / 45 * d_h_mth * q_B_S '(49) 외부완충(팽창탱크 유무)
End If
Q_h_g = Q_h_g_s + Q_h_g_WP
COP_L = TOSG(Dr신재생.수열_열성능비_난방5도) ' Worksheets("신재생기기").Range("지열히트펌프용량1").Offset(1, i_count_hp - 1)
COP_H = TOSG(Dr신재생.수열_열성능비_난방15도) ' Worksheets("신재생기기").Range("지열히트펌프용량1").Offset(1, i_count_hp - 1)
COP_b = COP_L - ((COP_H - COP_L) / 10 * 5)
COP = (COP_H - COP_L) / 10 * (water_temp - 5) + COP_b '// 최저 최고 수열온도는 평균온도 대비 +- 5도로 변동되며, 지열과 형평성을 맞추기 위하여 보수적으로 5도 낮춤
Else
'냉방
COP_L = TOSG(Dr신재생.수열_열성능비_냉방25도) ' Worksheets("신재생기기").Range("지열히트펌프용량1").Offset(1, i_count_hp - 1)
COP_H = TOSG(Dr신재생.수열_열성능비_냉방35도) ' Worksheets("신재생기기").Range("지열히트펌프용량1").Offset(1, i_count_hp - 1)
COP_b = COP_L - ((COP_H - COP_L) / 10 * 25)
COP = (COP_H - COP_L) / 10 * (water_temp + 5) + COP_b '// 최저 최고 수열온도는 평균온도 대비 +- 5도로 변동되며, 지열과 형평성을 맞추기 위하여 보수적으로 5도 높임
End If
If Dr신재생.가동연료 = "전기" Then ' Worksheets("신재생기기").Range("신재생및열병합기기종류1").Offset(1, i_count_hp - 1) = "전기" Then
Q_h_f_hp = (Q_h_outg + Q_h_g) / COP
' Q_h_in = Q_h_outg + Q_h_g - Q_h_f_hp '월간 전기히트펌프(재생에너지유입량)
Else
Q_h_f_hp = Q_h_outg / COP
' If i_HeatCool = 1 And Worksheets("신재생기기").Range("지열히트펌프용량1").Offset(5, i_count_hp - 1) = "예" Then
' P_rd_mot = 0.4
' End If
' Q_h_in = Q_h_outg + Q_h_g - Q_h_f_hp * (1 + P_rd_mot) '월간 가스히트펌프(재생에너지유입량)
End If
'Q_h_f = Q_h_outg + Q_h_g - k_rd_g * Q_h_g_aux - Q_h_in '월간(A.1) 전기히트펌프(난방요구량 충당)
'Q_h_f = (Q_h_outg + Q_h_g - k_rd_g * Q_h_g_aux - Q_h_in) / (1 + P_rd_mot) '월간(A.2) 가스히트펌프(난방요구량 충당)
'보조에너지
'Phi_prim_aux = Delta_p_prim * V_dot / (eta_aux * 3600) '(89) 사용자 입력항목이므로 확인 요망
'Phi_sek_aux = Delta_p_sek * V_dot / (eta_aux * 3600) '(89) 사용자 입력항목이므로 확인 요망
t_ON_aux = Q_h_outg / (Phi_g) '(81)
Phi_prim_aux = TOSG(Dr신재생.수열_1차펌프동력) ' Worksheets("신재생기기").Range("지열히트펌프용량1").Offset(3, i_count_hp - 1)
Phi_sek_aux = TOSG(Dr신재생.수열_2차펌프동력) ' Worksheets("신재생기기").Range("지열히트펌프용량1").Offset(4, i_count_hp - 1)
Q_h_g_aux = TOSG((Phi_prim_aux + Phi_sek_aux) * 0.001 * t_ON_aux) '(88)
'// 신재생에너지 자립률 추가(2017.01.20)
If Dr신재생.가동연료 = "전기" Then
Q_h_outg_net = Q_h_outg - ((Q_h_f_hp + Q_h_g_aux) * 2.75) '전기 1차에너지계수 적용
If Q_h_outg_net < 0 Then Q_h_outg_net = 0
Else
Q_h_outg_net = Q_h_outg - (Q_h_f_hp * 1.1 + Q_h_g_aux * 2.75) '가스 1차에너지계수 적용
If Q_h_outg_net < 0 Then Q_h_outg_net = 0
End If
'// 신재생에너지 자립률 추가
'//열에너지생산량 (수열)
Result.생산E(i_hp_month).수열생산량 += Q_h_outg_net '//20170120 추가
'// Result.생산E(i_hp_month).지열생산량 += Q_h_f_hp '20170120 지열생산량을 수정
'DSETR.TReqUse.Rows(79)("M" & Format(i_hp_month, "00")) = CSng(DSETR.TReqUse.Rows(79)("M" & Format(i_hp_month, "00"))) + Q_h_f_hp 'DrT생산.열생산량지열 += Q_h_f_hp
pLog.Add(String.Format(">>Calc_HydroHeatpumpSystem 결과0 Q_h_f_hp={0},t_ON_aux={1},Q_h_g_aux={2}", _
Q_h_f_hp, t_ON_aux, Q_h_g_aux))
pLog.Add(String.Format(">>Calc_HydroHeatpumpSystem 결과1 수열생산량={0}", _
Result.생산E(i_hp_month).수열생산량))
'100 : Total >> DrT생산.단위면적당생산량지열
Select Case i_system_hp
Case 1
Result.생산E(i_hp_month).면적당생산량수열 += (Q_h_outg_net / Result.사용면적.H) '//20170120 추가
Result.생산E(i_hp_month).면적당생산량수열_난방 += (Q_h_outg_net / Result.사용면적.H) '//20170120 추가
'//Result.생산E(i_hp_month).면적당생산량지열 += (Q_h_f_hp / Result.사용면적.H) '20170120 지열생산량을 수정
'DSETR.TReqUse.Rows(100)("M00") = CSng(DSETR.TReqUse.Rows(100)("M00")) + Q_h_f_hp / CSng(DSETR.TReqUse.Rows(10)("M00")) ' DrT요구량.난방사용면적 ' Sheets("계산결과").Cells(15, 7)
Case 2
Result.생산E(i_hp_month).면적당생산량수열 += (Q_h_outg_net / Result.사용면적.C) '//20170120 추가
Result.생산E(i_hp_month).면적당생산량수열_냉방 += (Q_h_outg_net / Result.사용면적.C) '//20170120 추가
'//Result.생산E(i_hp_month).면적당생산량지열 += (Q_h_f_hp / Result.사용면적.C) '20170120 지열생산량을 수정
'DSETR.TReqUse.Rows(100)("M00") = CSng(DSETR.TReqUse.Rows(100)("M00")) + Q_h_f_hp / CSng(DSETR.TReqUse.Rows(15)("M00")) 'DrT요구량.냉방사용면적 '("계산결과").Cells(20, 7)
Case 3
Result.생산E(i_hp_month).면적당생산량수열 += (Q_h_outg_net / Result.사용면적.W) '//20170120 추가
Result.생산E(i_hp_month).면적당생산량수열_급탕 += (Q_h_outg_net / Result.사용면적.W) '//20170120 추가
'//Result.생산E(i_hp_month).면적당생산량지열 += (Q_h_f_hp / Result.사용면적.W) '20170120 지열생산량을 수정
End Select
pLog.Add(String.Format(">>Calc_HydroHeatpumpSystem 결과2 면적당생산량수열={0}", _
Result.생산E(i_hp_month).면적당생산량수열))
End Sub
Public Overridable Sub Calc_CogenerationSystemEN(ByVal Dr신재생 As DS.tbl_newRow, i_system_chp As Integer, ByVal i_chp_month As Integer, ByVal Q_h_outg As Decimal, ByVal t_chp As Integer, _
ByRef Q_chp_gen_out As Decimal, ByRef E_chp_gen_in As Decimal)
pLog.Add(String.Format(">>Calc_CogenerationSystemEN 진입 : Dr신재생={0}, i_system_chp={1},i_chp_month={2},Q_h_outg={3},t_chp={4},Q_chp_gen_out={5},E_chp_gen_in={6}", _
Dr신재생.code, i_system_chp, i_chp_month, Q_h_outg, t_chp, Q_chp_gen_out, E_chp_gen_in))
'EN15316-4-4_2007 5.6.2에서 시작
'Dim Wmsg As New System.Text.StringBuilder
'Wmsg.AppendLine("Calc_CogenerationSystemEN 이 함수의경우")
'Wmsg.AppendLine("i_count_chp 에따라서 열을 할당해야한다.... 지만..아직 이 파라미터값을 모르게삳")
'Wmsg.AppendLine("사용하는곳의 참조확인을해서 저곳이 신재생기기 코드값이 바로오는건지 다른값인지 확인해봐야겠다")
'MsgBox(Wmsg.ToString)
Dim Q_dot_T_chp As Decimal
Dim eta_T_chp_an As Decimal, eta_el_chp_an As Decimal
Dim E_el_chp_out As Decimal
Dim Q_chp_gen_out_net As Decimal, E_el_chp_out_net As Decimal, Q_E_ratio As Decimal, net_ratio As Decimal
Q_chp_gen_out_net = 0
E_el_chp_out_net = 0
Q_E_ratio = 0
net_ratio = 0
' Dim Dr신재생 As DS.tbl_newRow = CType(DSET.tbl_new.Rows(0), DS.tbl_newRow)
Q_dot_T_chp = TOSG(Dr신재생.열생산능력) ' Worksheets("신재생기기").Range("열병합열생산능력1").Offset(0, i_count_chp - 1)
eta_T_chp_an = TOSG(Dr신재생.열생산효율) ' Worksheets("신재생기기").Range("열병합열생산능력1").Offset(1, i_count_chp - 1)
eta_el_chp_an = TOSG(Dr신재생.발전효율) ' Worksheets("신재생기기").Range("열병합열생산능력1").Offset(2, i_count_chp - 1)
If Q_h_outg > (Q_dot_T_chp * t_chp) Then
Q_chp_gen_out = Q_dot_T_chp * t_chp
Else
Q_chp_gen_out = Q_h_outg
End If
E_chp_gen_in = Q_chp_gen_out / (eta_T_chp_an / 100)
E_el_chp_out = E_chp_gen_in * eta_el_chp_an / 100
Result.생산E(i_chp_month).열병합전력생산량 += E_el_chp_out
'//전기생산량 열병합
If Dr신재생.열병합신재생여부 Then
'// 신재생에너지 자립률 추가(2017.01.20)
net_ratio = (Q_chp_gen_out + E_el_chp_out * 2.75) / (E_chp_gen_in * 1.1)
Q_E_ratio = Q_chp_gen_out / (Q_chp_gen_out + E_el_chp_out * 2.75)
Q_chp_gen_out_net = Q_chp_gen_out * (net_ratio - 1) * Q_E_ratio
E_el_chp_out_net = (E_el_chp_out * 2.75 * (net_ratio - 1) * (1 - Q_E_ratio)) / 2.75
If Q_chp_gen_out_net < 0 Then Q_chp_gen_out_net = 0
If E_el_chp_out_net < 0 Then E_el_chp_out_net = 0
Dim perc As Single = 0
If Single.TryParse(Dr신재생.외부공급비율, perc) = False Then
perc = 0
End If
Dim exportvalue As Decimal = E_el_chp_out_net * (perc / 100.0)
If exportvalue <> 0 Then
Dim drows() As DS.tbl_exportdataRow = DSET1.tbl_exportdata.Select("mon='" + i_chp_month.ToString("00") + "'")
Dim dr As DS.tbl_exportdataRow = Nothing
If drows.Length = 0 Then
dr = DSET1.tbl_exportdata.Newtbl_exportdataRow()
dr.mon = "M" + i_chp_month.ToString("00")
dr.외부전기생산량 = exportvalue
Else
dr = drows(0)
dr.외부전기생산량 += exportvalue
End If
dr.EndEdit()
If dr.RowState = DataRowState.Detached Then
DSET1.tbl_exportdata.Addtbl_exportdataRow(dr)
End If
E_el_chp_out_net -= exportvalue
End If
'//전력
Result.생산E(i_chp_month).신재생열병합전력생산량 += (E_el_chp_out_net) '//20170120 추가
Result.생산E(i_chp_month).신재생열병합열생산량 += (Q_chp_gen_out_net) '//20170120 추가
'Result.생산E(i_chp_month).신재생열병합전력생산량 += (E_el_chp_out)
pLog.Add(String.Format("Calc_CogenerationSystemEN 결과2 신재생열병합전력생산량={0}", Result.생산E(i_chp_month).신재생열병합전력생산량))
'//면적당열병합 (신재생면적당열생산량)
Select Case i_system_chp
Case 1
Result.생산E(i_chp_month).신재생면적당열생산량 += (Q_chp_gen_out_net / Result.사용면적.H) '// 20170120 추가
Result.생산E(i_chp_month).신재생면적당열생산량_난방 += (Q_chp_gen_out_net / Result.사용면적.H) '// 20170120 추가
'Result.생산E(i_chp_month).신재생면적당열생산량 += (Q_chp_gen_out / Result.사용면적.H)
Case 2
Result.생산E(i_chp_month).신재생면적당열생산량 += (Q_chp_gen_out_net / Result.사용면적.C) '// 20170120 추가
Result.생산E(i_chp_month).신재생면적당열생산량_냉방 += (Q_chp_gen_out_net / Result.사용면적.C) '// 20170120 추가
'Result.생산E(i_chp_month).신재생면적당열생산량 += (Q_chp_gen_out / Result.사용면적.C)
Case 3
Result.생산E(i_chp_month).신재생면적당열생산량 += (Q_chp_gen_out_net / Result.사용면적.W) '// 20170120 추가
Result.생산E(i_chp_month).신재생면적당열생산량_급탕 += (Q_chp_gen_out_net / Result.사용면적.W) '// 20170120 추가
'Result.생산E(i_chp_month).신재생면적당열생산량 += (Q_chp_gen_out / Result.사용면적.W)
End Select
pLog.Add(String.Format("Calc_CogenerationSystemEN 결과3 신재생면적당열생산량={0}", Result.생산E(i_chp_month).신재생면적당열생산량))
'Else
' Result.생산E(i_chp_month).열병합전력생산량 += E_el_chp_out '// 20241229 추가
' pLog.Add(String.Format("Calc_CogenerationSystemEN 결과0 E_chp_gen_in={0},E_el_chp_out={1}", E_chp_gen_in, E_el_chp_out))
' pLog.Add(String.Format("Calc_CogenerationSystemEN 결과1 열병합전력생산량={0}", Result.생산E(i_chp_month).열병합전력생산량))
End If
'DSETR.TReqUse.Rows(77)("M" & Format(i_chp_month, "00")) = CSng(DSETR.TReqUse.Rows(77)("M" & Format(i_chp_month, "00"))) + E_el_chp_out ' Sheets("계산결과").Cells(96, 7 + i_chp_month) = E_el_chp_out
End Sub
Public Overridable Sub Calc_WindPowerGenerationSystem(ByVal i_count_wp_month As Integer, ByVal i_wp_d_mth As Integer)
pLog.Add(String.Format(">>Calc_WindPowerGenerationSystem 진입 : i_count_wp_month={0}, i_wp_d_mth={1}", _
i_count_wp_month, i_wp_d_mth))
Dim f_v_WK, P_WEA_WK, P_Wind_WK, t_WK, A, A_Rotor, v_1, v_2, h_1, h_2 As Decimal
Dim alpha, Q_f_prod_WEA, rho As Decimal
Dim k As Integer
Dim Q_f_prod_out, Q_f_prod_out_offsite As Decimal
k = 2
alpha = 0.14 '표준조건
Q_f_prod_WEA = 0
Q_f_prod_out = 0
Q_f_prod_out_offsite = 0
rho = 1.225
h_1 = 10
For Each Dr신재생 As DS.tbl_newRow In DSET.tbl_new.Select("code <> '0'", "code")
If Dr신재생.기기종류 = "풍력" Then
Dim Drow풍속 As DS.weather_windRow = CType(DSET.weather_wind.Select("pcode='" & Calc.Pub.기상데이터.code & "'")(0), DS.weather_windRow)
A_Rotor = TOSG(Dr신재생.풍력로우터회전면적)
h_2 = TOSG(Dr신재생.풍력허브높이)
v_1 = TOSG(Drow풍속("M" + i_count_wp_month.ToString("00"))) ' 값을 정의하기 위해서 해당 지역 월 평균 풍속 데이터 필요
v_2 = v_1 * Math.Pow((h_2 / h_1), alpha)
A = 2 * v_2 / Math.Sqrt(Math.PI)
For v_WK As Integer = 4 To 16
f_v_WK = k / A * Math.Pow((v_WK - 0.5) / A, k - 1) * Math.Exp(-Math.Pow(((v_WK - 0.5) / A), k))
t_WK = 24 * i_wp_d_mth * f_v_WK
P_Wind_WK = 1 / 2 * rho * A_Rotor * Math.Pow(v_WK, 3)
P_WEA_WK = 0.2 * P_Wind_WK
Q_f_prod_WEA += (P_WEA_WK * t_WK) / 1000
Next
If Dr신재생.대지외설치여부_풍력 Then
Q_f_prod_out_offsite += Q_f_prod_WEA
Else
Q_f_prod_out += Q_f_prod_WEA
End If
End If
Next
Result.생산E(i_count_wp_month).풍력전력생산량 += Q_f_prod_out
Result.생산E(i_count_wp_month).풍력전력생산량_offsite += Q_f_prod_out_offsite
pLog.Add(String.Format(">>Calc_WindPowerGenerationSystem 진입 : Q_f+prod_out={0}, 풍력전력생산량={1}", _
Q_f_prod_out, Result.생산E(i_count_wp_month).풍력전력생산량))
End Sub
End Class