github.com/archlabjp/eeslism-go@v0.0.0-20231109122333-4bb7bfcdf292/eeslism/mcomvav.go (about) 1 //This file is part of EESLISM. 2 // 3 //Foobar is free software : you can redistribute itand /or modify 4 //it under the terms of the GNU General Public License as published by 5 //the Free Software Foundation, either version 3 of the License, or 6 //(at your option) any later version. 7 // 8 //Foobar is distributed in the hope that it will be useful, 9 //but WITHOUT ANY WARRANTY; without even the implied warranty of 10 //MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the 11 //GNU General Public License for more details. 12 // 13 //You should have received a copy of the GNU General Public License 14 //along with Foobar.If not, see < https://www.gnu.org/licenses/>. 15 16 /* mcomvav.c */ 17 18 /* OM用変風量コントローラ */ 19 20 package eeslism 21 22 import ( 23 "fmt" 24 "math" 25 "strconv" 26 "strings" 27 ) 28 29 /* ------------------------------------------ */ 30 31 /* 機器仕様入力 */ 32 33 /*---- Satoh OMVAV 2010/12/16 ----*/ 34 func OMVAVdata(s string, OMvavca *OMVAVCA) int { 35 id := 0 36 37 st := strings.Split(s, "=") 38 if len(st) == 1 { 39 OMvavca.Name = s 40 OMvavca.Gmax = -999.0 41 OMvavca.Gmin = -999.0 42 } else { 43 switch st[0] { 44 case "Gmax": 45 dt, err := strconv.ParseFloat(st[1], 64) 46 if err != nil { 47 id = 1 48 break 49 } 50 OMvavca.Gmax = dt 51 case "Gmin": 52 dt, err := strconv.ParseFloat(st[1], 64) 53 if err != nil { 54 id = 1 55 break 56 } 57 OMvavca.Gmin = dt 58 default: 59 id = 1 60 } 61 } 62 63 return id 64 } 65 66 func CollTout(Tcin, G float64, Sd *RMSRF) float64 { 67 var Kc, ca float64 68 69 Wall := Sd.mw.wall 70 if Wall.chrRinput { 71 Kc = Sd.dblKc 72 } else { 73 Kc = Wall.Kc 74 } 75 76 return Sd.Tcole - (Sd.Tcole-Tcin)*math.Exp(-Kc*Sd.A/(ca*G)) 77 } 78 79 func OMflowcalc(OMvav *OMVAV, Wd *WDAT) float64 { 80 var Tcout float64 81 var CollTout func(Tcin, G float64, Sd *RMSRF) float64 82 var loop int 83 84 G := 0.0 85 //EPS := 0.00001 86 dGp := 0.01 87 LoopMax := 100 88 89 if OMvav.Plist.Control != OFF_SW { 90 omwall := OMvav.Omwall 91 //Wall := omwall.mw.wall 92 Tcin := Wd.T 93 Tcoutset := omwall.rpnl.Toset 94 G0 := OMvav.Cat.Gmin 95 //dG := OMvav.Cat.Gmin * 0.001 96 G2 := OMvav.Cat.Gmax 97 98 /********************************************************/ 99 // 棟温度の計算(最小風量の場合) 100 Tcin = Wd.T 101 for i := 0; i < OMvav.Nrdpnl; i++ { 102 Sd := OMvav.Rdpnl[i].sd[0] 103 Tcout := CollTout(Tcin, G0, Sd) 104 105 // 集熱器の入り口温度は上流集熱器の出口温度 106 Tcin = Tcout 107 } 108 Tcoutmin := Tcout 109 110 // 棟温度の計算(最大風量の場合) 111 Tcin = Wd.T 112 for i := 0; i < OMvav.Nrdpnl; i++ { 113 Sd := OMvav.Rdpnl[i].sd[0] 114 Tcout := CollTout(Tcin, G2, Sd) 115 116 // 集熱器の入り口温度は上流集熱器の出口温度 117 Tcin = Tcout 118 } 119 Tcoutmax := Tcout 120 121 //fmt.Printf("Tcoutmin=%.2f Tcoutmax=%.2f\n", Tcoutmin, Tcoutmax) 122 if Tcoutmin < Tcoutset { 123 G = G0 124 } else if Tcoutmax > Tcoutset { 125 G = G2 126 } else { 127 // ニュートンラプソン法のループ 128 for loop := 0; loop < LoopMax; loop++ { 129 Tcin := Wd.T 130 G := G0 + float64(loop)*dGp*(G2-G0) 131 for i := 0; i < OMvav.Nrdpnl; i++ { 132 Sd := OMvav.Rdpnl[i].sd[0] 133 Tcout := CollTout(Tcin, G, Sd) 134 135 // 集熱器の入り口温度は上流集熱器の出口温度 136 Tcin = Tcout 137 } 138 139 FG := Tcoutset - Tcout 140 141 if FG > 0.0 { 142 break 143 } 144 } 145 146 if loop == LoopMax { 147 fmt.Printf("%s 風量が収束しませんでした。 G=%f\n", OMvav.Name, G) 148 } 149 } 150 G = math.Min(math.Max(OMvav.Cat.Gmin, G), OMvav.Cat.Gmax) 151 } 152 153 OMvav.G = G 154 155 return G 156 } 157 158 func OMvavControl(OMvav *OMVAV, Compnt []*COMPNT) { 159 colname := strings.Split(OMvav.Cmp.Omparm, "-") 160 OMvav.Nrdpnl = len(colname) 161 162 for j, name := range colname { 163 for i := 0; i < len(Compnt); i++ { 164 if name == Compnt[i].Name { 165 OMvav.Rdpnl[j] = Compnt[i].Eqp.(*RDPNL) 166 break 167 } 168 } 169 } 170 } 171 172 func strCompcount(st string, key byte) int { 173 count := 0 174 175 for i := 0; i < len(st); i++ { 176 if st[i] == key { 177 count++ 178 } 179 } 180 181 return count 182 }