Imports Microsoft.VisualBasic Imports System.Xml Be06 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." Public Shared n_win_x As String = "38.0x." Public Shared e_win As String = "38.1." Public Shared e_win_x As String = "38.1x." Public Shared s_win As String = "38.2." Public Shared s_win_x As String = "38.2x." Public Shared w_win As String = "38.3." Public Shared w_win_x As String = "38.3x." Public Shared n_win_rf As String = "38.4." Public Shared s_win_rf As String = "38.5." Public Shared v_win_rf As String = "38.6." Public Shared improvement As String = ".01" ' Vindue, nord ' Vindue, nord ekstra ' Vindue, øst ' Vindue, øst ekstra ' Vindue, syd ' Vindue, syd ekstra ' Vindue, vest ' Vindue, vest ekstra ' Ovenlysvindue, nord ' Ovenlysvindue, syd ' Ovenlysvindue, øst/vest ' 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." Return ".F." Public Shared Function IsTrue(ByRef x As String) As Boolean If x.tolower = ".t." Then Return True Return False Side 1
Be06 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 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 Return "" Public Shared Function EditModel(ByRef XMLDoc As XmlDocument, ByVal section As String, ByVal id As String, ByVal value As String) As Boolean 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 Return False 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" Catch ex As Exception msg = ex.message End Try Return keyxml Public Shared Function ParceKeys(ByRef XMLDoc As XmlDocument, ByVal section As String, ByVal id As String) As String 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 Dim n1 As XmlNode = n0.childnodes(i) Side 2
Be06 If n1.haschildnodes Then Dim name As String = n1.item("id").innertext If name.startswith(id) Then Return n1.item("value").innertext Return "" 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)) ht -= sup If ht < 0 Then ht = 0.0 If ht0 < 0 Then ' ht0: opvarmningsform price = 0.0 If ht0 < 4 Then price = GetConsUnit(ht0, ht) * kr + el * el_price ' kr/m2 price = GetConsUnit(ht0, ht) * kr + el * el_price el0 = el Return ht + el ' kr/m2 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 price = 0.0 Return 0.0 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 ' cons0: energibehov, kwh/m2 Side 3
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 frac = reduction * saving_kr / (ucons * kr) If cons0 > 0 Then ' ingen reduktion frac = saving / cons0 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 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 ' 'Dim s3 As String = kr1 + " kr pr år (" + pctkr + "%)" Side 4
NBNBNB "%)" Return s0 el0 = 0.0 Return msg Be06 'Return s3 ' brugeren har ikke opgivet energipris If cons0 > 0.0 Then frac = saving / cons0 Dim saving_unit As Double = GetConsUnit(ht, area * saving) ' 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 + 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 End Select Return kwh ' El, kwh 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 End Select Return "" Return "kwh" ' El, kwh 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" Case 4, 6 unit = "kwh" ' Fjernvarme, GJ ' El, kwh Side 5
End Select cons = msg + unit eprice = kr + unit Be06 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 If heat = ".SUP_BOILER." Then Return 0 Return 2 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." 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 Return 0.0 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 Return 0.0 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 If Math.Abs(Std.vp_heat_table(i, 0) - eff) < Side 6
Be06 0.001 Then Return i + 1 Return 0 ' Ikke installeret 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) 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." cold.innertext = ".VP_U." n1.item("has_type_warm").innertext = ".VP_V." UpdateVpComp(n1, Std.vp_heat_table, type - 1) If rid = dhw Then Dim cold As XmlElement = n1.item("has_type_cold") If type > m0 Then cold.innertext = ".VP_J." cold.innertext = ".VP_U." UpdateVpComp(n1, Std.vp_dhw_table, type - 1) 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.") Side 7
Be06 Return 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.") Public Shared Sub UpdateVent(ByRef XMLDoc As XmlDocument, ByVal i0 As Integer) 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 Public Shared Sub UpdateDistHt(ByRef XMLDoc As XmlDocument, ByVal idx As Integer) 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 Public Shared Sub UpdateBoiler(ByRef XMLDoc As XmlDocument, ByRef table(,) As Double, _ ByVal idx As Integer, ByRef id0 As String) 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 Dim eff As XmlElement = n0.item("nom_eff") eff.innertext = table(idx, 0).ToString Side 8
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) Return 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 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 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 'Public Shared Function Pos(ByRef x As Double) As Double ' If x > 0.0 Then ' Return x ' ' Return 0.0 ' Public Shared Function Pos(ByRef x As Double) As String If x > 0.001 Then Return x.tostring Return "0" Side 9
End Class Be06 Side 10