Be06 Imports Microsoft.VisualBasic
Imports System.Xml Public Class Be06
Declare Function Be06Keys Lib "d:\Be06WebSite\Bin\Be10Eng.dll" Alias "Be06Keys" (ByVal model As String, ByVal mem As String, ByRef max As Integer, ByVal lang As Integer) As String
'Declare Function Be06Keys Lib "d:\Be06WebSite\Bin\Be06Eng.dll" Alias "Be06Keys" (ByVal model As String, ByVal mem As String, ByRef max As Integer, ByVal lang As Integer) As String
'Declare Function WebBe06Keys Lib
"d:\Inetpub\wwwroot\be06test\Bin\Be06Eng.dll" Alias "Be06Keys" (ByVal model As String, ByVal mem As String, ByRef max As Integer, ByVal lang As Integer) As String
'Declare Function WebBe06Keys Lib
"d:\Inetpub\servers\be06_web_app\Bin\Be10Eng.dll" Alias "Be06Keys" (ByVal model As String, ByVal mem As String, ByRef max As Integer, ByVal lang As Integer) As String
Declare Function WebBe06Keys Lib
"d:\Inetpub\servers\test_be06_web_app\Bin\Be10Eng.dll" Alias "Be06Keys" (ByVal model As String, ByVal mem As String, ByRef max As Integer, ByVal lang As Integer) As String
Public Shared wall As String = "21." ' Ydervæg
Public Shared wall_x As String = "21x." ' Ydervæg ekstra Public Shared wall_y As String = "21y." ' Ydervæg ekstra nr 2 Public Shared floor As String = "23." ' Gulv i stue
Public Shared floor_x As String = "23x." ' Gulv i stue ekstra Public Shared roof As String = "27." ' Loft
Public Shared roof_x As String = "27x." ' Loft ekstra Public Shared wall_45 As String = "31." ' Skråvæg
Public Shared wall_sk As String = "32." ' Skunkvæg Public Shared floor_sk As String = "33." ' Skunkgulv Public Shared roof_re As String = "37." ' Tagrem
Public Shared n_win As String = "38.0." ' Vindue, nord Public Shared n_win_x As String = "38.0x." ' Vindue, nord ekstra Public Shared e_win As String = "38.1." ' Vindue, øst
Public Shared e_win_x As String = "38.1x." ' Vindue, øst ekstra Public Shared s_win As String = "38.2." ' Vindue, syd Public Shared s_win_x As String = "38.2x." ' Vindue, syd ekstra Public Shared w_win As String = "38.3." ' Vindue, vest Public Shared w_win_x As String = "38.3x." ' Vindue, vest ekstra Public Shared n_win_rf As String = "38.4." ' Ovenlysvindue, nord Public Shared s_win_rf As String = "38.5." ' Ovenlysvindue, syd Public Shared v_win_rf As String = "38.6." ' Ovenlysvindue, øst/vest Public Shared improvement As String = ".01" ' Forbedring
Public Shared model_id As String = "Be06WebSite"
Public Shared saving_txt As String = "Total besparelse i varmeforbrug " Public Shared imp_txt As String = ", Forbedret til " ' Forbedring i udskrift
Public Shared canceled As String = "Den eksisterende bygning er ændret, forbedringer er annuleret"
Public Shared Function GetBool(ByVal val As Boolean) As String If (val) Then Return ".T." Else Return ".F." End If End Function
Public Shared Function IsTrue(ByRef x As String) As Boolean If x.ToLower = ".t." Then
Return True Else
Be06 End If
End Function
Public Shared Function GetElement(ByRef XMLDoc As XmlDocument, ByVal section As String, ByVal id As String) As String
If Not XMLDoc Is Nothing Then Dim n0 As XmlNode
Dim Elements As XmlNodeList = XMLDoc.GetElementsByTagName(section) For Each n0 In Elements
Dim item As XmlElement = n0.Item(id) If Not item Is Nothing Then
Return item.InnerText End If Next End If Return "" End Function
Public Shared Function EditModel(ByRef XMLDoc As XmlDocument, ByVal section As String, ByVal id As String, ByVal value As String) As Boolean
Dim n0 As XmlNode
Dim Elements As XmlNodeList = XMLDoc.GetElementsByTagName(section) For Each n0 In Elements
Dim item As XmlElement = n0.Item(id) If Not item Is Nothing Then
item.InnerText = value Return True End If Next Return False End Function
Public Shared Function GetKeys(ByRef model As String, ByRef msg As String) As String
Dim maxkey As Integer = 2500 Dim max As Integer = maxkey Dim key0 As String = ""
Dim keys As String = key0.PadRight(maxkey) Dim keyxml As String = ""
Dim try_again As Boolean = False Try
keyxml = WebBe06Keys(model, keys, max, 0) msg = "ok" Catch ex As Exception try_again = True msg = "Error" End Try Try If (try_again) Then
keyxml = Be06Keys(model, keys, max, 0) msg = "ok" End If Catch ex As Exception msg = ex.Message End Try Return keyxml End Function
Public Shared Function ParceKeys(ByRef XMLDoc As XmlDocument, ByVal section As String, ByVal id As String) As String
Dim n0 As XmlNode
Dim Elem_n0 As XmlNodeList = XMLDoc.GetElementsByTagName("table") For Each n0 In Elem_n0
Dim id0 As String = n0.Attributes("head").InnerText If n0.HasChildNodes Then
If id0.StartsWith(section) Then
Dim n As Integer = n0.ChildNodes.Count - 1 For i = 0 To n
Be06
If n1.HasChildNodes Then
Dim name As String = n1.Item("id").InnerText If name.StartsWith(id) Then Return n1.Item("value").InnerText End If End If Next End If End If Next Return "" End Function
Public Shared Function GetHeatDem(ByRef keyxml As String, ByVal loss As Double, ByVal sup As Double, _
ByVal ht0 As Integer, ByVal kr As Double, ByRef el_price As Double, _
ByRef price As Double, ByRef el0 As Double) As Double Dim XMLDoc As New XmlDocument
XMLDoc.LoadXml(keyxml)
Dim ht As Double = ParceKeys(XMLDoc, "Bidrag", "Varme") Dim el As Double = ParceKeys(XMLDoc, "Bidrag", "El") Dim htn As Double = ParceKeys(XMLDoc, "Netto", "Rum") ht -= (0.1 * htn) If loss > 0.0 Then ht *= (90.0 / (100.0 - loss)) End If ht -= sup If ht < 0 Then ht = 0.0 End If If ht0 < 0 Then ' ht0: opvarmningsform price = 0.0 ElseIf ht0 < 4 Then
price = GetConsUnit(ht0, ht) * kr + el * el_price ' kr/m2 Else
price = GetConsUnit(ht0, ht) * kr + el * el_price ' kr/m2 End If
el0 = el
Return ht + el End Function
Public Shared Function GetDemand(ByRef xml As XmlDocument, ByVal kr As Double, _
ByRef el_price As Double, ByRef price As Double, ByRef el0 As Double) As Double
If (xml.HasChildNodes) Then Dim msg As String = ""
Dim keyxml As String = GetKeys(xml.OuterXml.Replace(",", "."), msg) ' parse doc as string
If Not keyxml = Nothing Then
Dim ht As Integer = GetElement(xml, "USAGE", "id") ' opvarmningsform
Dim dem0 As Double = GetHeatDem(keyxml, BoilerLoss(xml), ConsumpSup(xml), ht, kr, el_price, price, el0)
Return dem0 End If End If price = 0.0 Return 0.0 End Function
Public Shared Function GetSaving(ByRef xml As XmlDocument, _
ByVal cons0 As Double, ByVal el0 As Double, ByVal kr0 As Double, _ ByVal ucons As Double, ByVal kr As Double, _
ByVal el_price As Double, ByRef el2 As Double, _
ByRef kwh0 As Double, ByRef price0 As Double, ByRef std_cons As Double, ByVal pos As Boolean) As String
Be06 ' el0: el-behov, kWh/m2
' kr0: pris, kr/m2
' el_price: el-pris, kr/m2
' ucons: opgivet varmeforbrug, enhed afhængig af valgt opvarmning ' kr: opgivet energipris, enhed afhængig af valgt opvarmningsform ' kwh0: sidste forbrug, kwh/m2
' price0: sidste pris, kr/m2 Dim msg As String = ""
If (xml.HasChildNodes) Then
Dim keyxml As String = GetKeys(xml.OuterXml.Replace(",", "."), msg) ' parse doc as string
If Not keyxml = Nothing Then
Dim last_price0 As Double = price0
Dim ht As Integer = Be06.GetElement(xml, "USAGE", "id") ' opvarmningsform
Dim sup0 As Double = ConsumpSup(xml) ' supplement kWh
Dim dem0 As Double = GetHeatDem(keyxml, BoilerLoss(xml), sup0, ht, kr, el_price, price0, el2)
Dim saving As Double = cons0 - dem0 ' besparelse i forhold til udgangspunktet cons0, kwh/m2
Dim last_kwh0 = kwh0 - dem0 kwh0 = dem0
Dim frac As Double = 0.0
Dim area As Double = Be06.GetElement(xml, "BUILDING", "ae").Replace(".", ",") ' etageareal, m2
If kr > 0.0 Then
' brugeren har opgivet energipris
'Dim std_cons = GetConsUnit(ht, area * (cons0 - el0)) ' forbrug i valgte enhed
Dim std_cons0 = std_cons * area ' forbrug i valgte enhed Dim saving_kr As Double = (kr0 - price0) * area '
besparelse i kr
Dim reduction As Double = 1.0
If ucons > 0.0 Then ' brugeren har opgivet et varmeforbrug i valgte enhed
If ucons < std_cons0 Then ' opgivet forbrug < end beregnet => reduktion
reduction = ucons / std_cons0 End If
frac = reduction * saving_kr / (ucons * kr) ElseIf cons0 > 0 Then ' ingen reduktion frac = saving / cons0
End If
Dim kr2 As Double = reduction * saving_kr
Dim kr1 As String = Math.Round(kr2, 0) ' afrunding til 0 decimaler
Dim pctkr As String = Math.Round(100.0 * frac, 1) If kr2 < 0.0 And pos Then
Dim s2 As String = "er negativ, og sidste tiltag kan ikke anbefales"
Return s2 End If
Dim saving_last_kwh = reduction * last_kwh0 * area ' seneste besparelse i kWh
Dim saving_last As Double = reduction * (last_price0 - price0) * area ' seneste besparelse
'If pos Then
Dim save_kwh As String = Math.Round(saving_last_kwh, 0) Dim last As String = Math.Round(saving_last, 0)
'Dim s1 As String = kr1 + " kr pr år (ændring af energibehov " + pctkr + "%). Seneste tiltag " _
' + last + " kr pr år"
Dim kwh As String = Math.Round(reduction * saving * area, 0) Dim s1 As String = kwh + " kWh, " + kr1 + " kr. " _
+ "(Seneste tiltag " + save_kwh + " kWh, " + last + " kr pr år)"
Return s1 'End If
Be06 'Return s3
End If
' brugeren har ikke opgivet energipris If cons0 > 0.0 Then
frac = saving / cons0 End If
Dim saving_unit As Double = GetConsUnit(ht, area * saving) ' NBNBNB
Dim unit0 As String = Math.Round(saving_unit, 0) Dim pct0 As String = Math.Round(100.0 * frac, 1)
Dim s0 As String = unit0 + " " + Unit(ht) + " pr år (" + pct0 + "%)" Return s0 End If End If el0 = 0.0 Return msg End Function
Public Shared Function GetConsUnit(ByVal ht As Integer, ByVal kwh As Double) As Double Select Case ht Case 0 Return kwh / 1000.0 ' Fjernvarme, MWh Case 1 Return kwh / 40.6 ' Fjernvarme, m³ Case 2 Return kwh * 0.1 ' Naturgas, m³ Case 3
Return kwh * 0.1125 ' Fyringsolie, liter Case 5 Return kwh * 0.0036 ' Fjernvarme, GJ (1 kWh = 3.6 MJ) Case 4, 6 Return kwh ' El, kWh End Select End Function
Public Shared Function Unit(ByVal ht As Integer) As String Select Case ht
Case 0
Return "MWh" ' Fjernvarme, MWh Case 1, 2
Return "m³" ' Fjernvarme, m³ / Naturgas, m³ Case 3
Return "liter olie" ' Fyringsolie, liter Case 5 Return "GJ" ' Fjernvarme, GJ Case 4, 6 Return "kWh" ' El, kWh End Select Return "" End Function
Public Shared Sub ShowCons(ByVal ht As Integer, ByRef cons As String, ByRef eprice As String)
Dim msg As String = "Varmeforbrug pr år, " Dim kr As String = "Energipris, kr/"
Dim unit As String = "" Select Case ht
Case 0
unit = "MWh" ' Fjernvarme, MWh Case 1, 2
unit = "m³" ' Fjernvarme, m³ / Naturgas, m³ Case 3
unit = "liter olie" ' Fyringsolie, liter Case 5
unit = "GJ" ' Fjernvarme, GJ Case 4, 6
Be06 End Select
cons = msg + unit eprice = kr + unit End Sub
Public Shared Function GetHeatType(ByRef xml As XmlDocument) As Integer Dim heat As String = Be06.GetElement(xml, "BUILDING",
"basic_heat_supply")
heat = heat.ToUpper
If heat = ".SUP_DISTRICT." Then Return 1
ElseIf heat = ".SUP_BOILER." Then Return 0
Else
Return 2 End If
End Function
Public Shared Function FuelOil(ByRef xml As XmlDocument) As Boolean Dim fuel As String = Be06.GetElement(xml, "BOILER", "has_fuel") Return fuel.ToUpper = ".FU_OIL."
End Function
Public Shared Function BoilerLoss(ByRef xml As XmlDocument) As Double If Be06.GetHeatType(xml) = 0 And Be06.FuelOil(xml) Then
Dim id As String = Be06.GetElement(xml, "COOLING", "id") ' røggastab
If id.Length > 0 Then
Dim loss As Double = id.Replace(".", ",") Return loss
End If End If Return 0.0 End Function
Public Shared Function ConsumpSup(ByRef xml As XmlDocument) As Double Dim c0 As String = Be06.GetElement(xml, "DESCRIPT", "bbr")
If c0.Length > 0 Then
Dim cons As Double = CType(c0, Double)
Dim area As Double = GetElement(xml, "BUILDING", "ae").Replace(".", ",") ' etageareal, m2
If cons > 0.0 And area > 0.0 Then
Dim n As Integer = Be06.GetElement(xml, "DESCRIPT", "addr3") Dim fu As Integer = n >> 4
Dim ht As Integer = n - 16 * fu
Return cons * Std.SupFuelKwh(fu) * Std.SupHeatNy(ht) / area End If
End If Return 0.0 End Function
Public Shared Function GetHeatPump(ByRef xml As XmlDocument) As Integer ' type = 0: Ikke installeret, type = 1-3: Udeluft/Centralvarme, type = 4-6: Jordslange/Centralvarme
If IsTrue(Be06.GetElement(xml, "BUILDING", "heatpump")) Then
Dim Elements As XmlNodeList = xml.GetElementsByTagName("HEAT_PUMP") For Each n0 As XmlNode In Elements
Dim id As XmlElement = n0.Item("room_heating") Dim ht As String = id.InnerText
Dim vp_comp As XmlNodeList = xml.GetElementsByTagName("VP_COMP") For Each n1 As XmlNode In vp_comp
Dim a1 As XmlAttributeCollection = n1.Attributes() For Each m1 As XmlAttribute In a1
Dim rid = m1.Value If rid = ht Then
Dim eff As Double = n1.Item("nom_eff").InnerText Dim n As Integer = Std.vp_heat_table.Length / 7 For i As Integer = 0 To n - 1
Be06 0.001 Then Return i + 1 End If Next End If Next Next Next End If
Return 0 ' Ikke installeret End Function
Protected Shared Sub UpdateVpComp(ByRef n0 As XmlNode, ByRef table(,) As Double, ByRef i0 As Integer)
n0.Item("nom_eff").InnerText = table(i0, 0) n0.Item("nom_cop").InnerText = table(i0, 1) n0.Item("rel_cop50").InnerText = table(i0, 2) n0.Item("temp_cold").InnerText = table(i0, 3) n0.Item("temp_warm").InnerText = table(i0, 4) n0.Item("equip").InnerText = table(i0, 5) n0.Item("auto_stb").InnerText = table(i0, 6) End Sub
Public Shared Sub UpdateHeatPump(ByRef xml As XmlDocument, ByRef type As Integer)
' type = 0: Ikke installeret, type = 1-3: Udeluft/Centralvarme, type = 4-6: Jordslange/Centralvarme
Be06.EditModel(xml, "BUILDING", "heatpump", GetBool(type > 0)) If type > 0 Then
Dim name As String = Std.VpType(type)
Dim m0 As Integer = (Std.VpType.Length - 1) / 2
Dim Elements As XmlNodeList = xml.GetElementsByTagName("HEAT_PUMP") For Each n0 As XmlNode In Elements
' n0.Item("id").InnerText = name n0.Item("id").InnerText = type
Dim ht As String = n0.Item("room_heating").InnerText Dim dhw As String = n0.Item("dhw").InnerText
n0.Item("has_type").InnerText = ".VP_COMB."
Dim vp_comp As XmlNodeList = xml.GetElementsByTagName("VP_COMP") For Each n1 As XmlNode In vp_comp
Dim a1 As XmlAttributeCollection = n1.Attributes() For Each m1 As XmlAttribute In a1
Dim rid = m1.Value If rid = ht Then
Dim cold As XmlElement = n1.Item("has_type_cold") If type > m0 Then cold.InnerText = ".VP_J." Else cold.InnerText = ".VP_U." End If n1.Item("has_type_warm").InnerText = ".VP_V." UpdateVpComp(n1, Std.vp_heat_table, type - 1) ElseIf rid = dhw Then
Dim cold As XmlElement = n1.Item("has_type_cold") If type > m0 Then
cold.InnerText = ".VP_J." Else
cold.InnerText = ".VP_U." End If
UpdateVpComp(n1, Std.vp_dhw_table, type - 1) End If
Next Next Next
Be06.EditModel(xml, "DHW_TANK", "vol", Std.dhw_table(type - 1, 0)) Be06.EditModel(xml, "DHW_TANK", "heat_loss", Std.dhw_table(type - 1, 1))
Be06.EditModel(xml, "DHW_TANK", "has_el_heat", ".DHW_S.") Be06.EditModel(xml, "DHW_TANK", "solar_heat", ".T.")
Be06 Return
End If
Be06.EditModel(xml, "DHW_TANK", "vol", "60")
Be06.EditModel(xml, "DHW_TANK", "heat_loss", "0.9")
Be06.EditModel(xml, "DHW_TANK", "has_el_heat", ".DHW_N.") Be06.EditModel(xml, "DHW_TANK", "solar_heat", ".F.") End Sub
Public Shared Sub UpdateVent(ByRef XMLDoc As XmlDocument, ByVal i0 As Integer)
Dim n0 As XmlNode
Dim Elements As XmlNodeList = XMLDoc.GetElementsByTagName("VENTILATION") For Each n0 In Elements
n0.Item("id").InnerText = Std.ventType(i0) Dim part As XmlElement = n0.Item("part")
part.InnerText = Std.GetSel(i0, Std.GetImp(part.InnerText)) Dim qm As XmlElement = n0.Item("qvm")
qm.InnerText = Std.vent_table(i0, 0).ToString Dim nvgv As XmlElement = n0.Item("nvgv")
nvgv.InnerText = Std.vent_table(i0, 1).ToString Dim ti As XmlElement = n0.Item("tin")
ti.InnerText = Std.vent_table(i0, 2).ToString Dim elvf As XmlElement = n0.Item("el_vf")
elvf.InnerText = Be06.GetBool(Std.vent_table(i0, 3) > 0.0) Dim qn As XmlElement = n0.Item("qid")
qn.InnerText = Std.vent_table(i0, 4).ToString Dim qin As XmlElement = n0.Item("qis")
qin.InnerText = Std.vent_table(i0, 5).ToString Dim sel As XmlElement = n0.Item("sel")
sel.InnerText = Std.vent_table(i0, 6).ToString Dim qms As XmlElement = n0.Item("qvm_day") qms.InnerText = Std.vent_table(i0, 7).ToString Dim qns As XmlElement = n0.Item("qid_day") qns.InnerText = Std.vent_table(i0, 8).ToString Dim qmn As XmlElement = n0.Item("qvm_night") qmn.InnerText = Std.vent_table(i0, 9).ToString Dim qnn As XmlElement = n0.Item("qis_night") qnn.InnerText = Std.vent_table(i0, 10).ToString Return
Next End Sub
Public Shared Sub UpdateDistHt(ByRef XMLDoc As XmlDocument, ByVal idx As Integer)
Dim n0 As XmlNode
Dim Elements As XmlNodeList = XMLDoc.GetElementsByTagName("D_H_EXCH") For Each n0 In Elements
Dim id As XmlElement = n0.Item("id") id.InnerText = Std.DistHt(idx)
Dim loss As XmlElement = n0.Item("heat_loss") Dim stb As XmlElement = n0.Item("auto_stb") loss.InnerText = Std.dist_ht_table(idx, 0) stb.InnerText = Std.dist_ht_table(idx, 1) Return
Next End Sub
Public Shared Sub UpdateBoiler(ByRef XMLDoc As XmlDocument, ByRef table(,) As Double, _
ByVal idx As Integer, ByRef id0 As String) Dim n0 As XmlNode
Dim Elements As XmlNodeList = XMLDoc.GetElementsByTagName("BOILER") For Each n0 In Elements
If id0.Length > 0 Then
Dim id As XmlElement = n0.Item("id") id.InnerText = id0
End If
Dim eff As XmlElement = n0.Item("nom_eff") eff.InnerText = table(idx, 0).ToString
Be06
Dim fngn As XmlElement = n0.Item("full_ngn") fngn.InnerText = table(idx, 1).ToString
Dim fcor As XmlElement = n0.Item("full_fcor") fcor.InnerText = table(idx, 2).ToString
Dim pngn As XmlElement = n0.Item("part_ngn") pngn.InnerText = table(idx, 3).ToString
Dim pcor As XmlElement = n0.Item("part_fcor") pcor.InnerText = table(idx, 4).ToString
Dim frac As XmlElement = n0.Item("stb_frac") frac.InnerText = table(idx, 5).ToString Dim rgn As XmlElement = n0.Item("stb_rgn") rgn.InnerText = table(idx, 6).ToString Dim tgn As XmlElement = n0.Item("part_tgn") tgn.InnerText = table(idx, 7).ToString
If Not IsTrue(Be06.GetElement(XMLDoc, "BUILDING", "heatpump")) And _ Not IsTrue(Be06.GetElement(XMLDoc, "BUILDING", "solarpanel")) Then Be06.EditModel(XMLDoc, "DHW_TANK", "heat_loss", table(idx, 8).ToString)
Be06.EditModel(XMLDoc, "DHW_PIPE", "tube_psi", table(idx, 9).ToString)
End If Return Next
End Sub
Public Shared Function IsNum(ByRef s As String) As Boolean Dim ok As Boolean = True
Try Dim x As Double = s Catch ex As Exception ok = False End Try Return ok End Function
Public Shared Function IsInt(ByRef s As String) As Boolean Dim ok As Boolean = True
Try Dim x As Integer = s Catch ex As Exception ok = False End Try Return ok End Function
Public Shared Function GetNum(ByRef s As String) As Double Dim res As Double = 0.0
Try Dim x As Double = s res = x Catch ex As Exception res = 0.0 End Try Return res End Function
'Public Shared Function Pos(ByRef x As Double) As Double ' If x > 0.0 Then
' Return x ' End If
' Return 0.0 'End Function
Public Shared Function Pos(ByRef x As Double) As String If x > 0.001 Then
Return x.ToString End If
Return "0" End Function
Be06 End Class