github.com/archlabjp/eeslism-go@v0.0.0-20231109122333-4bb7bfcdf292/eeslism/mchcload.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 /* hcload.c */ 17 18 /* 空調負荷仮想機器 */ 19 20 package eeslism 21 22 import ( 23 "errors" 24 "fmt" 25 "io" 26 "math" 27 "strconv" 28 "strings" 29 "unicode" 30 ) 31 32 /* ------------------------------------------ */ 33 34 /* コイル出口空気温湿度に関する変数割当 */ 35 36 func Hclelm(Hcload []*HCLOAD) { 37 for _, hc := range Hcload { 38 // 湿りコイルの場合 39 if hc.Wet { 40 // 空気温度出口の計算式 41 eo := hc.Cmp.Elouts[0] 42 // elo:空気湿度出口の計算式 43 elo := hc.Cmp.Elouts[1] 44 // elini:空気湿度出口の要素方程式の2つ目の変数 45 elini := elo.Elins[1] 46 // 空気絶対湿度の要素方程式の2つ目の変数にupo、upvに空気出口をつなげる 47 elini.Upo = eo 48 elini.Upv = eo 49 } 50 51 if hc.Type == 'W' { 52 eo := hc.Cmp.Elouts[0] 53 elo := hc.Cmp.Elouts[2] 54 elini := elo.Elins[1] 55 elin := elo.Elins[3] 56 57 elini.Upo = eo.Elins[0].Upo 58 elini.Upv = eo.Elins[0].Upo 59 elin.Upo = eo 60 elin.Upv = eo 61 62 eo = hc.Cmp.Elouts[1] 63 elini = elo.Elins[2] 64 elin = elo.Elins[4] 65 66 elini.Upo = eo.Elins[0].Upo 67 elini.Upv = eo.Elins[0].Upo 68 elin.Upo = eo 69 elin.Upv = eo 70 } 71 } 72 } 73 74 /* -------------------------------------------------- */ 75 76 /* ルームエアコン(事業主基準モデル)機器仕様の入力処理 */ 77 78 func rmacdat(Hcld *HCLOAD) { 79 const ( 80 ERRFMT = "%s (rmacdat)" 81 SCHAR = 256 82 ) 83 ss := Hcld.Cmp.Tparm 84 85 Hcld.Qhmax = -999.0 86 Hcld.Qh = -999.0 87 Hcld.COPc = -999.0 88 Hcld.COPh = -999.0 89 Hcld.Qcmax = 999.0 90 Hcld.Qc = 999.0 91 92 parseFloat := func(value string) (float64, error) { 93 return strconv.ParseFloat(value, 64) 94 } 95 96 for { 97 var s string 98 _, err := fmt.Sscanf(ss, "%s", &s) 99 if err != nil || strings.Contains(string(s), "*") { 100 break 101 } 102 103 ss = ss[len(s):] 104 ss = strings.TrimLeftFunc(ss, unicode.IsSpace) 105 106 keyValue := strings.SplitN(string(s), "=", 2) 107 if len(keyValue) != 2 { 108 Eprint("<rmacdat>", string(s)) 109 continue 110 } 111 112 key, value := keyValue[0], keyValue[1] 113 switch key { 114 case "Qc": 115 if Hcld.Qc, err = parseFloat(value); err != nil { 116 panic(err) 117 } 118 case "Qcmax": 119 if Hcld.Qcmax, err = parseFloat(value); err != nil { 120 panic(err) 121 } 122 case "Qh": 123 if Hcld.Qh, err = parseFloat(value); err != nil { 124 panic(err) 125 } 126 case "Qhmax": 127 if Hcld.Qhmax, err = parseFloat(value); err != nil { 128 panic(err) 129 } 130 case "COPc": 131 if Hcld.COPc, err = parseFloat(value); err != nil { 132 panic(err) 133 } 134 case "COPh": 135 if Hcld.COPh, err = parseFloat(value); err != nil { 136 panic(err) 137 } 138 default: 139 Eprint("<rmacdat>", key) 140 } 141 } 142 143 if Hcld.Qc < 0.0 { 144 Hcld.rc = Hcld.Qcmax / Hcld.Qc 145 Hcld.Ec = -Hcld.Qc / Hcld.COPc 146 } 147 if Hcld.Qh > 0.0 { 148 Hcld.rh = Hcld.Qhmax / Hcld.Qh 149 Hcld.Eh = Hcld.Qh / Hcld.COPh 150 } 151 } 152 153 /* ルームエアコン(電中研モデル)機器仕様の入力処理 */ 154 155 func rmacddat(Hcld *HCLOAD) { 156 //Err := fmt.Sprintf(ERRFMT, "(rmacddat)") 157 158 ss := Hcld.Cmp.Tparm 159 Hcld.Qcmax, Hcld.Qc, Hcld.Qcmin = 999.0, 999.0, 999.0 160 Hcld.Ecmax, Hcld.Ec, Hcld.Ecmin, Hcld.Qh, Hcld.Qhmax, Hcld.Qhmin, Hcld.Ehmax, Hcld.Eh, Hcld.Ehmin = -999.0, -999.0, -999.0, -999.0, -999.0, -999.0, -999.0, -999.0, -999.0 161 Hcld.Gi, Hcld.Go = -999.0, -999.0 162 163 for { 164 var s string 165 _, err := fmt.Sscanf(ss, "%s", &s) 166 if err != nil { 167 break 168 } 169 ss = ss[len(s):] 170 for len(ss) > 0 && unicode.IsSpace(rune(ss[0])) { 171 ss = ss[1:] 172 } 173 174 if st := strings.IndexByte(s, '='); st != -1 { 175 key := s[:st] 176 value := s[st+1:] 177 178 switch key { 179 case "Qc": 180 Hcld.Qc, _ = strconv.ParseFloat(value, 64) 181 case "Qcmax": 182 Hcld.Qcmax, _ = strconv.ParseFloat(value, 64) 183 case "Qcmin": 184 Hcld.Qcmin, _ = strconv.ParseFloat(value, 64) 185 case "Ec": 186 Hcld.Ec, _ = strconv.ParseFloat(value, 64) 187 case "Ecmax": 188 Hcld.Ecmax, _ = strconv.ParseFloat(value, 64) 189 case "Ecmin": 190 Hcld.Ecmin, _ = strconv.ParseFloat(value, 64) 191 case "Qh": 192 Hcld.Qh, _ = strconv.ParseFloat(value, 64) 193 case "Qhmax": 194 Hcld.Qhmax, _ = strconv.ParseFloat(value, 64) 195 case "Qhmin": 196 Hcld.Qhmin, _ = strconv.ParseFloat(value, 64) 197 case "Eh": 198 Hcld.Eh, _ = strconv.ParseFloat(value, 64) 199 case "Ehmax": 200 Hcld.Ehmax, _ = strconv.ParseFloat(value, 64) 201 case "Ehmin": 202 Hcld.Ehmin, _ = strconv.ParseFloat(value, 64) 203 case "Gi": 204 Hcld.Gi, _ = strconv.ParseFloat(value, 64) 205 case "Go": 206 Hcld.Go, _ = strconv.ParseFloat(value, 64) 207 default: 208 Eprint("<rmacddat>", key) 209 } 210 } else { 211 Eprint("<rmacddat>", s) 212 } 213 } 214 215 // 機器固有値の計算 216 if Hcld.Qc < 0.0 { 217 Hcld.COPc = -Hcld.Qc / Hcld.Ec 218 Hcld.COPcmax = -Hcld.Qcmax / Hcld.Ecmax 219 Hcld.COPcmin = -Hcld.Qcmin / Hcld.Ecmin 220 221 // JISにおける温湿度条件 222 DBco := 35.0 223 DBci := 27.0 224 WBco := 24.0 225 WBci := 19.0 226 // 絶対湿度 227 xco := FNXtw(DBco, WBco) 228 xci := FNXtw(DBci, WBci) 229 // 湿り比熱 230 cao := Ca + Cv*xco 231 cai := Ca + Cv*xci 232 233 // 室内機、室外機熱交換器のバイパスファクタ 234 Hcld.BFi = 0.2 235 Hcld.BFo = 0.2 236 237 // 理論効率の計算 238 // 定格条件 239 effthr := FNeffthc(DBco, DBci, xci, Hcld.Qc, Hcld.Ec, (1.0-Hcld.BFo)*Hcld.Go, (1.0-Hcld.BFi)*Hcld.Gi, cai, cao) 240 // 最小能力 241 effthmin := FNeffthc(DBco, DBci, xci, Hcld.Qcmin, Hcld.Ecmin, (1.0-Hcld.BFo)*Hcld.Go, (1.0-Hcld.BFi)*Hcld.Gi, cai, cao) 242 // 最大能力 243 effthmax := FNeffthc(DBco, DBci, xci, Hcld.Qcmax, Hcld.Ecmax, (1.0-Hcld.BFo)*Hcld.Go, (1.0-Hcld.BFi)*Hcld.Gi, cai, cao) 244 245 // ファン等動力の計算 246 X := Hcld.COPcmin * Hcld.Qcmin / effthmin * effthr / (Hcld.Qc * Hcld.COPc) 247 Hcld.Pcc = (-Hcld.Qcmin - X*(-Hcld.Qc)) / (Hcld.COPcmin - X*Hcld.COPc) 248 249 // 定格条件、最小能力時の理論COPと実働COPの比R(両条件のRは等しいと仮定) 250 Rr := (-Hcld.Qc * Hcld.COPc) / (effthr * (-Hcld.Qc - Hcld.Pcc*Hcld.COPc)) 251 // 最大能力時のRを計算 252 Rmax := (-Hcld.Qcmax * Hcld.COPcmax) / (effthmax * (-Hcld.Qcmax - Hcld.Pcc*Hcld.COPcmax)) 253 254 // Rの回帰式係数の計算 255 U := make([]float64, 9) 256 Qc := make([]float64, 3) 257 R := make([]float64, 3) 258 Qc[0] = -Hcld.Qcmin 259 Qc[1] = -Hcld.Qc 260 Qc[2] = -Hcld.Qcmax 261 R[0] = Rr 262 R[1] = Rr 263 R[2] = Rmax 264 // 行列Uの作成 265 for i := 0; i < 3; i++ { 266 for j := 0; j < 3; j++ { 267 U[i*3+j] = math.Pow(Qc[i], 2.0-float64(j)) 268 } 269 } 270 271 // Uの逆行列の計算 272 Matinv(U, 3, 3, "<rmacddat> UX") 273 274 // 回帰係数の計算 275 //Hcld.Rc = make([]float64, 3) 276 for i := 0; i < 3; i++ { 277 for j := 0; j < 3; j++ { 278 Hcld.Rc[i] += U[i*3+j] * R[j] 279 } 280 } 281 } 282 283 if Hcld.Qh > 0.0 { 284 Hcld.COPh = Hcld.Qh / Hcld.Eh 285 Hcld.COPhmax = Hcld.Qhmax / Hcld.Ehmax 286 Hcld.COPhmin = Hcld.Qhmin / Hcld.Ehmin 287 288 // JISにおける温湿度条件 289 DBco := 7.0 290 DBci := 20.0 291 WBco := 6.0 292 WBci := 15.0 293 // 絶対湿度 294 xco := FNXtw(DBco, WBco) 295 xci := FNXtw(DBci, WBci) 296 // 湿り比熱 297 cao := Ca + Cv*xco 298 cai := Ca + Cv*xci 299 300 // 室内機、室外機熱交換器のバイパスファクタ 301 Hcld.BFi = 0.2 302 Hcld.BFo = 0.2 303 304 // 理論効率の計算 305 // 定格条件 306 effthr := FNeffthh(DBco, DBci, xco, Hcld.Qh, Hcld.Eh, (1.0-Hcld.BFo)*Hcld.Go, (1.0-Hcld.BFi)*Hcld.Gi, cai, cao) 307 // 最小能力 308 effthmin := FNeffthh(DBco, DBci, xco, Hcld.Qhmin, Hcld.Ehmin, (1.0-Hcld.BFo)*Hcld.Go, (1.0-Hcld.BFi)*Hcld.Gi, cai, cao) 309 // 最大能力 310 effthmax := FNeffthh(DBco, DBci, xco, Hcld.Qhmax, Hcld.Ehmax, (1.0-Hcld.BFo)*Hcld.Go, (1.0-Hcld.BFi)*Hcld.Gi, cai, cao) 311 312 // ファン等動力の計算 313 X := Hcld.COPhmin * Hcld.Qhmin / effthmin * effthr / (Hcld.Qh * Hcld.COPh) 314 Hcld.Pch = (Hcld.Qhmin - X*Hcld.Qh) / (Hcld.COPhmin - X*Hcld.COPh) 315 316 // 定格条件、最小能力時の理論COPと実働COPの比R(両条件のRは等しいと仮定) 317 Rr := (Hcld.Qh * Hcld.COPh) / (effthr * (Hcld.Qh - Hcld.Pch*Hcld.COPh)) 318 // 最大能力時のRを計算 319 Rmax := (Hcld.Qhmax * Hcld.COPhmax) / (effthmax * (Hcld.Qhmax - Hcld.Pch*Hcld.COPhmax)) 320 321 // Rの回帰式係数の計算 322 U := make([]float64, 9) 323 Qc := make([]float64, 3) 324 R := make([]float64, 3) 325 Qc[0] = Hcld.Qhmin 326 Qc[1] = Hcld.Qh 327 Qc[2] = Hcld.Qhmax 328 R[0] = Rr 329 R[1] = Rr 330 R[2] = Rmax 331 // 行列Uの作成 332 for i := 0; i < 3; i++ { 333 for j := 0; j < 3; j++ { 334 U[i*3+j] = math.Pow(Qc[i], 2.0-float64(j)) 335 } 336 } 337 338 // Uの逆行列の計算 339 Matinv(U, 3, 3, "<rmacddat> UX") 340 341 // 回帰係数の計算 342 //Hcld.Rh = make([]float64, 3) 343 for i := 0; i < 3; i++ { 344 for j := 0; j < 3; j++ { 345 Hcld.Rh[i] += U[i*3+j] * R[j] 346 } 347 } 348 } 349 } 350 351 // 冷房時の理論COPを計算する 352 func FNeffthc(Tco, Tci, xci, Qc, Ec, Go, Gi, cai, cao float64) float64 { 353 // 凝縮温度の計算 354 Tcnd := FNTcndc(Tco, Qc, Ec, cao, Go) 355 // 蒸発温度の計算 356 Tevp := FNTevpc(Tci, Qc, cai, Gi, xci) 357 358 // 理論効率の計算 359 return (Tevp + 273.15) / (Tcnd - Tevp) 360 } 361 362 // 暖房時の理論COPを計算する 363 func FNeffthh(Tco, Tci, xco, Qc, Eh, Go, Gi, cai, cao float64) float64 { 364 // 凝縮温度の計算 365 Tcnd := FNTcndh(Tci, Qc, cai, Gi) 366 // 蒸発温度の計算 367 Tevp := FNTevph(Tco, Qc, Eh, cao, Go, xco) 368 369 // 理論効率の計算 370 return (Tcnd + 273.15) / (Tcnd - Tevp) 371 } 372 373 // 冷房時凝縮温度の計算 374 func FNTcndc(Tco, Qc, Ec, cao, Go float64) float64 { 375 return (Tco + (-Qc+Ec)/(cao*Go)) 376 } 377 378 // 暖房時凝縮温度の計算 379 func FNTcndh(Tci, Qc, cai, Gi float64) float64 { 380 return (Tci + Qc/(cai*Gi)) 381 } 382 383 // 冷房時蒸発温度の計算 384 func FNTevpc(Tci, Qc, cai, Gi, xci float64) float64 { 385 386 // 蒸発温度の計算 387 Tevp := Tci - (-Qc)/(cai*Gi) 388 // 室内が結露するかどうかの判定(結露時は等エンタルピー変化による飽和状態とする) 389 RHi := FNRhtx(Tevp, xci) 390 if RHi > 100.0 { 391 Tevp = FNDbrh(100.0, FNH(Tevp, xci)) 392 } 393 394 return (Tevp) 395 } 396 397 // 暖房時蒸発温度の計算 398 func FNTevph(Tco, Qc, Eh, cao, Go, xco float64) float64 { 399 // 蒸発温度の計算 400 Tevp := Tco - (Qc-Eh)/(cao*Go) 401 // 室外が結露するかどうかの判定(結露時は等エンタルピー変化による飽和状態とする) 402 RHo := FNRhtx(Tevp, xco) 403 if RHo > 100.0 { 404 Tevp = FNDbrh(100.0, FNH(Tevp, xco)) 405 } 406 return Tevp 407 } 408 409 /* 特性式の係数 */ 410 411 // 412 // +--------+ ---> [OUT 1] 413 // | HCLOAD | ---> [OUT 2] 414 // +--------+ ---> [OUT 3] 冷温水コイル想定時のみ 415 // 416 func Hcldcfv(_Hcload []*HCLOAD) { 417 var f0, f1 float64 418 419 Tout15 := 15.0 420 Tout20 := 20.0 421 422 for _, Hcload := range _Hcload { 423 Xout15 := FNXtr(Tout15, Hcload.RHout) 424 Xout20 := FNXtr(Tout20, Hcload.RHout) 425 f1 = (Xout20 - Xout15) / (Tout20 - Tout15) 426 f0 = Xout15 - f1*Tout15 427 428 Eo1 := Hcload.Cmp.Elouts[0] 429 Hcload.Ga = Eo1.G 430 431 if Eo1.Control != OFF_SW { 432 Hcload.Ga = Eo1.G 433 Hcload.CGa = Spcheat(Eo1.Fluid) * Hcload.Ga 434 435 Eo1.Coeffo = Hcload.CGa 436 Eo1.Co = 0.0 437 Eo1.Coeffin[0] = -Hcload.CGa 438 } 439 440 Eo2 := Hcload.Cmp.Elouts[1] 441 if Eo2.Control != OFF_SW { 442 if Hcload.Wetmode { 443 Eo2.Coeffo = 1.0 444 Eo2.Co = f0 445 Eo2.Coeffin[0] = 0.0 446 Eo2.Coeffin[1] = -f1 447 } else { 448 Eo2.Coeffo = Hcload.Ga 449 Eo2.Co = 0.0 450 Eo2.Coeffin[0] = -Hcload.Ga 451 Eo2.Coeffin[1] = 0.0 452 } 453 } 454 455 // 冷温水コイル想定時 456 if Hcload.Type == HCLoadType_W { 457 Eo3 := Hcload.Cmp.Elouts[2] 458 if Eo3.Control != OFF_SW { 459 Hcload.Gw = Eo3.G 460 Hcload.CGw = Spcheat(Eo3.Fluid) * Hcload.Gw 461 rGa := Ro * Hcload.Ga 462 463 Eo3.Coeffo = Hcload.CGw 464 465 Eo3.Coeffin[0] = -Hcload.CGw 466 Eo3.Coeffin[1] = -Hcload.CGa 467 Eo3.Coeffin[2] = -rGa 468 469 if Hcload.Wetmode && Hcload.Chmode == COOLING_SW { 470 Eo3.Coeffin[3] = Hcload.CGa + rGa*f1 471 Eo3.Coeffin[4] = 0.0 472 Eo3.Co = -rGa * f0 473 } else { 474 Eo3.Coeffin[3] = Hcload.CGa 475 Eo3.Coeffin[4] = rGa 476 Eo3.Co = 0.0 477 } 478 } 479 } 480 } 481 } 482 483 /* ------------------------------------------ */ 484 485 // 空調負荷の計算 486 func Hcldene(_Hcload []*HCLOAD, LDrest *int, Wd *WDAT) { 487 var rest int 488 var elo *ELOUT 489 ro := 0.0 490 ca := 0.0 491 cv := 0.0 492 493 rest = 0 494 495 for _, Hcload := range _Hcload { 496 elo = Hcload.Cmp.Elouts[0] 497 Hcload.Tain = elo.Elins[0].Sysvin 498 elo = Hcload.Cmp.Elouts[1] 499 Hcload.Xain = elo.Elins[0].Sysvin 500 Hcload.Qfusoku = 0.0 501 502 if Hcload.Type == 'W' { 503 elo = Hcload.Cmp.Elouts[2] 504 if elo.Elins[0].Upv != nil { 505 Hcload.Twin = elo.Elins[0].Upv.Sysv 506 Hcload.Twout = elo.Sysv 507 } else { 508 Hcload.Twin = -999.0 509 Hcload.Twout = -999.0 510 } 511 } 512 513 if Hcload.Cmp.Control != OFF_SW { 514 elo = Hcload.Cmp.Elouts[0] 515 if elo.Control == ON_SW && elo.Sysld == 'y' { 516 Hcload.Qs = elo.Load 517 } else { 518 Hcload.Qs = Hcload.CGa * (elo.Sysv - Hcload.Tain) 519 } 520 521 rest = chswreset(Hcload.Qs, Hcload.Chmode, elo) 522 523 if rest != 0 { 524 (*LDrest)++ 525 Hcload.Cmp.Control = OFF_SW 526 } 527 528 elo = Hcload.Cmp.Elouts[1] 529 if elo.Control == ON_SW && elo.Sysld == 'y' { 530 Hcload.Ql = ro * elo.Load 531 } else { 532 Hcload.Ql = ro * Hcload.Ga * (elo.Sysv - Hcload.Xain) 533 } 534 535 if chqlreset(Hcload) != 0 { 536 (*LDrest)++ 537 } 538 539 Hcload.Qt = Hcload.Qs + Hcload.Ql 540 541 if Hcload.RMACFlg == 'Y' { 542 if Hcload.Qt > 0.0 { 543 var qrhmax, qrhd, Temp float64 544 var To_7 float64 545 var Cafh, Cdf float64 546 var Qhmax, Qhd float64 547 var fht1, fht2, fht3 float64 548 549 To_7 = Wd.T - 7.0 550 Temp = (Hcload.rh - 1.0) / 1.8 551 Cafh = 0.8 552 553 qrhmax = -1.0e-6*(1.0+Temp)*math.Pow(To_7, 3.0) + 554 2.0e-4*(1.0+Temp)*math.Pow(To_7, 2.0) + 555 (0.0134+(0.0457-0.0134)*Temp)*To_7 + Hcload.rh 556 557 Cdf = 1.0 558 if Wd.T < 5.0 && Wd.RH >= 80.0 { 559 Cdf = 0.9 560 } 561 562 Qhmax = qrhmax * Hcload.Qh * Cafh * Cdf 563 564 if Qhmax > Hcload.Qt { 565 Qhd = Hcload.Qt 566 } else { 567 Qhd = Qhmax 568 Hcload.Qfusoku = Hcload.Qt - Qhmax 569 } 570 qrhd = Qhd / Hcload.Qh / Cafh / Cdf 571 572 fht1 = fhtlb(Wd.T, 1.0) 573 fht2 = fhtlb(Wd.T, qrhd*1.9/Hcload.rh) 574 fht3 = fhtlb(Wd.T, 1.9/Hcload.rh) 575 576 Eff := 1.0 / Cafh / Cdf * fht1 * fht2 / qrhd / fht3 577 Hcload.Ele = Eff / Hcload.COPh * Qhd 578 Hcload.COP = Qhd / Hcload.Ele 579 580 Hcload.Ele = Hcload.Qt / Hcload.COP 581 } else { 582 var qrcmax, qrcd float64 583 var To_35 float64 584 var Cafc, Chm float64 585 var Qcmax, Qcd float64 586 var fct1, fct2, fct3 float64 587 588 To_35 = Wd.T - 35.0 589 Cafc = 0.85 590 Chm = 1.0 591 592 qrcmax = -1.0e-5*Hcload.rc*math.Pow(To_35, 3.0) + 593 2.0e-4*0.5*(1.0+Hcload.rc)*math.Pow(To_35, 2.0) - 594 (0.0147+0.014*(Hcload.rc-1.0))*To_35 + Hcload.rc 595 596 Qcmax = qrcmax * Hcload.Qc * (Cafc + Chm) / 2.0 597 598 if Qcmax < Hcload.Qt { 599 Qcd = Hcload.Qt 600 } else { 601 Qcd = Qcmax 602 Hcload.Qfusoku = Hcload.Qt - Qcmax 603 } 604 qrcd = Qcd / Hcload.Qc / ((Cafc + Chm) / 2.0) 605 606 fct1 = fctlb(Wd.T, 1.0) 607 fct2 = fctlb(Wd.T, qrcd*1.5/Hcload.rc) 608 fct3 = fctlb(Wd.T, 1.5/Hcload.rc) 609 610 Hcload.Ele = 1.0 / ((Cafc + Chm) / 2.0) * fct1 * fct2 / qrcd / fct3 / Hcload.COPc * Qcd 611 Hcload.COP = Qcd / Hcload.Ele 612 613 Hcload.Ele = -Hcload.Qt / Hcload.COP 614 } 615 } else if Hcload.RMACFlg == 'y' { 616 if Hcload.Qt < 0.0 { 617 var effth, Tevp, Tcnd, cai, cao, COP, COPd, R float64 618 Qc := make([]float64, 3) 619 620 cao = ca + cv*Wd.X 621 cai = ca + cv*Hcload.Xain 622 Tevp = FNTevpc(Hcload.Tain, Hcload.Qt, cai, (1.0-Hcload.BFi)*Hcload.Ga, Hcload.Xain) 623 624 COPd = Hcload.COPc 625 626 Qc[0] = Hcload.Qt * Hcload.Qt 627 Qc[1] = -Hcload.Qt 628 Qc[2] = 1.0 629 630 R = 0.0 631 for j := 0; j < 3; j++ { 632 R += Hcload.Rc[j] * Qc[j] 633 } 634 635 for i := 0; i < 100; i++ { 636 var E float64 637 638 E = -Hcload.Qt / COPd 639 640 Tcnd = FNTcndc(Wd.T, Hcload.Qt, E, cao, (1.0-Hcload.BFo)*Hcload.Go) 641 642 effth = (Tevp + 273.15) / (Tcnd - Tevp) 643 644 COP = 1.0 / (1.0/(R*effth) + Hcload.Pcc/-Hcload.Qt) 645 646 if math.Abs(COP-COPd) < 1.0e-4 { 647 Hcload.Ele = E 648 Hcload.COP = COP 649 break 650 } else { 651 COPd = COP 652 } 653 } 654 } else { 655 var effth, Tevp, Tcnd, cai, cao, COP, COPd, R float64 656 Qc := make([]float64, 3) 657 658 cao = ca + cv*Wd.X 659 cai = ca + cv*Hcload.Xain 660 Tcnd = FNTcndh(Hcload.Tain, Hcload.Qt, cai, (1.0-Hcload.BFi)*Hcload.Ga) 661 662 COPd = Hcload.COPh 663 664 Qc[0] = Hcload.Qt * Hcload.Qt 665 Qc[1] = Hcload.Qt 666 Qc[2] = 1.0 667 668 R = 0.0 669 for j := 0; j < 3; j++ { 670 R += Hcload.Rh[j] * Qc[j] 671 } 672 673 for i := 0; i < 100; i++ { 674 var E float64 675 676 E = Hcload.Qt / COPd 677 678 Tevp = FNTevph(Wd.T, Hcload.Qt, E, cao, (1.0-Hcload.BFo)*Hcload.Go, Wd.X) 679 680 effth = (Tcnd + 273.15) / (Tcnd - Tevp) 681 682 COP = 1.0 / (1.0/(R*effth) + Hcload.Pch/Hcload.Qt) 683 684 if math.Abs(COP-COPd) < 1.0e-4 { 685 Hcload.Ele = E 686 Hcload.COP = COP 687 break 688 } else { 689 COPd = COP 690 } 691 } 692 } 693 } else { 694 Hcload.Qs = 0.0 695 Hcload.Ql = 0.0 696 Hcload.Qt = 0.0 697 Hcload.Ele = 0.0 698 Hcload.COP = 0.0 699 Hcload.Qfusoku = 0.0 700 } 701 } else { 702 Hcload.Qs = 0.0 703 Hcload.Ql = 0.0 704 Hcload.Qt = 0.0 705 Hcload.Ele = 0.0 706 Hcload.COP = 0.0 707 Hcload.Qfusoku = 0.0 708 } 709 } 710 } 711 712 func fctlb(T, x float64) float64 { 713 a := [...]float64{ 714 0.0148*T + 0.0089, 715 -0.0153*T + 0.1429, 716 0.034*T - 0.4963, 717 -0.0012*T + 0.288 + 0.0322, 718 } 719 720 var Temp float64 721 for i := 0; i < 4; i++ { 722 Temp += a[i] * math.Pow(x, float64(i)) 723 } 724 725 return Temp 726 } 727 728 func fhtlb(T, x float64) float64 { 729 a := [...]float64{ 730 0.0018*T*T - 0.0424*T + 0.4554, 731 -0.006*T*T + 0.1347*T - 1.56, 732 0.0063*T*T - 0.1406*T + 2.2902, 733 -0.002*T*T + 0.0176*T - 0.3789, 734 0.0002*T*T - 0.0007*T + 0.4202, 735 } 736 737 var Temp float64 738 for i := 0; i < 5; i++ { 739 Temp += a[i] * math.Pow(x, float64(i)) 740 } 741 742 return Temp 743 } 744 745 /* --------------------------- */ 746 747 /* 負荷計算指定時の設定値のポインター */ 748 749 func hcldptr(load *ControlSWType, key []string, Hcload *HCLOAD, idmrk *byte) (VPTR, error) { 750 var err error 751 var vptr VPTR 752 if key[1] == "Tout" || key[1] == "Tr" || key[1] == "Tot" { 753 vptr.Ptr = &Hcload.Toset 754 vptr.Type = VAL_CTYPE 755 Hcload.Loadt = load 756 *idmrk = 't' 757 } else if key[1] == "xout" { 758 vptr.Ptr = &Hcload.Xoset 759 vptr.Type = VAL_CTYPE 760 Hcload.Loadx = load 761 *idmrk = 'x' 762 } else { 763 err = errors.New("Tout, Tr, Tot or xout are expected") 764 } 765 return vptr, err 766 } 767 768 /* ------------------------------------------ */ 769 770 /* 負荷計算指定時のスケジュール設定 */ 771 772 func hcldschd(Hcload *HCLOAD) { 773 Eo := Hcload.Cmp.Elouts 774 775 if Hcload.Loadt != nil { 776 if Eo[0].Control != OFF_SW { 777 if Hcload.Toset > TEMPLIMIT { 778 Eo[0].Control = LOAD_SW 779 Eo[0].Sysv = Hcload.Toset 780 } else { 781 Eo[0].Control = OFF_SW 782 783 if Hcload.Wetmode { 784 Eo[1].Control = OFF_SW 785 } 786 } 787 } 788 } else if Hcload.Loadx != nil { 789 if len(Eo) > 1 && Eo[1].Control != OFF_SW { 790 if Hcload.Xoset > 0.0 { 791 Eo[1].Control = LOAD_SW 792 Eo[1].Sysv = Hcload.Xoset 793 } else { 794 Eo[1].Control = OFF_SW 795 } 796 } 797 } 798 799 if Hcload.Type == 'W' { 800 if len(Eo) > 2 && Eo[0].Control == OFF_SW && Eo[1].Control == OFF_SW { 801 Eo[2].Control = OFF_SW 802 } 803 } 804 } 805 806 /* ------------------------------------------ */ 807 808 func hcldprint(fo io.Writer, id int, _Hcload []*HCLOAD) { 809 switch id { 810 case 0: 811 if len(_Hcload) > 0 { 812 fmt.Fprintf(fo, "%s %d\n", HCLOAD_TYPE, len(_Hcload)) 813 } 814 for _, Hcload := range _Hcload { 815 if Hcload.Type == HCLoadType_W { 816 fmt.Fprintf(fo, " %s 1 15\n", Hcload.Name) 817 } else { 818 if Hcload.RMACFlg == 'Y' || Hcload.RMACFlg == 'y' { 819 fmt.Fprintf(fo, " %s 1 14\n", Hcload.Name) 820 } else { 821 fmt.Fprintf(fo, " %s 1 11\n", Hcload.Name) 822 } 823 } 824 } 825 case 1: 826 for _, Hcload := range _Hcload { 827 fmt.Fprintf(fo, "%s_ca c c %s_Ga m f %s_Ti t f %s_To t f %s_Qs q f\n", 828 Hcload.Name, Hcload.Name, Hcload.Name, Hcload.Name, Hcload.Name) 829 fmt.Fprintf(fo, "%s_cx c c %s_xi x f %s_xo x f %s_RHo r f %s_Ql q f", 830 Hcload.Name, Hcload.Name, Hcload.Name, Hcload.Name, Hcload.Name) 831 if Hcload.Type == 'W' { 832 fmt.Fprintf(fo, "%s_cw c c %s_G m f %s_Twi t f %s_Two t f", 833 Hcload.Name, Hcload.Name, Hcload.Name, Hcload.Name) 834 } 835 fmt.Fprintf(fo, " %s_Qt q f\n", Hcload.Name) 836 837 if Hcload.RMACFlg == 'Y' || Hcload.RMACFlg == 'y' { 838 fmt.Fprintf(fo, " %s_Qfusoku q f %s_Ele E f %s_COP C f\n", 839 Hcload.Name, Hcload.Name, Hcload.Name) 840 } 841 } 842 default: 843 for _, Hcload := range _Hcload { 844 el := Hcload.Cmp.Elouts[0] 845 Taout := el.Sysv 846 fmt.Fprintf(fo, "%c %6.4g %4.2f %4.2f %.2f ", 847 el.Control, Hcload.Ga, Hcload.Tain, el.Sysv, Hcload.Qs) 848 849 el = Hcload.Cmp.Elouts[1] 850 RHout := FNRhtx(Taout, float64(el.Sysv)) 851 if RHout > 100.0 { 852 RHout = 999 853 } else if RHout < 0.0 { 854 RHout = -99.0 855 } 856 857 fmt.Fprintf(fo, "%c %.4f %.4f %3.0f %.2f ", 858 el.Control, Hcload.Xain, el.Sysv, RHout, Hcload.Ql) 859 860 if Hcload.Type == 'W' { 861 el = Hcload.Cmp.Elouts[2] 862 fmt.Fprintf(fo, "%c %6.4g %4.1f %4.1f", 863 el.Control, Hcload.Gw, Hcload.Twin, el.Sysv) 864 } 865 fmt.Fprintf(fo, " %.2f\n", Hcload.Qt) 866 867 if Hcload.RMACFlg == 'Y' || Hcload.RMACFlg == 'y' { 868 fmt.Fprintf(fo, " %.0f %.0f %.2f\n", Hcload.Qfusoku, Hcload.Ele, Hcload.COP) 869 } 870 } 871 } 872 } 873 874 /* ------------------------------ */ 875 876 /* 日積算値に関する処理 */ 877 878 func hclddyint(_Hcload []*HCLOAD) { 879 for _, Hcload := range _Hcload { 880 svdyint(&Hcload.Taidy) 881 svdyint(&Hcload.xaidy) 882 883 qdyint(&Hcload.Qdys) 884 qdyint(&Hcload.Qdyl) 885 qdyint(&Hcload.Qdyt) 886 qdyint(&Hcload.Qdyfusoku) 887 qdyint(&Hcload.Edy) 888 } 889 } 890 891 func hcldmonint(_Hcload []*HCLOAD) { 892 for _, Hcload := range _Hcload { 893 svdyint(&Hcload.mTaidy) 894 svdyint(&Hcload.mxaidy) 895 896 qdyint(&Hcload.mQdys) 897 qdyint(&Hcload.mQdyl) 898 qdyint(&Hcload.mQdyt) 899 qdyint(&Hcload.mQdyfusoku) 900 qdyint(&Hcload.mEdy) 901 } 902 } 903 904 func hcldday(Mon, Day, ttmm, Nday, SimDayend int, _Hcload []*HCLOAD) { 905 Mo := Mon - 1 906 tt := ConvertHour(ttmm) 907 908 for _, Hcload := range _Hcload { 909 910 // 日集計 911 svdaysum(int64(ttmm), Hcload.Cmp.Control, Hcload.Tain, &Hcload.Taidy) 912 svdaysum(int64(ttmm), Hcload.Cmp.Control, Hcload.Xain, &Hcload.xaidy) 913 914 qdaysum(int64(ttmm), Hcload.Cmp.Control, Hcload.Qs, &Hcload.Qdys) 915 qdaysum(int64(ttmm), Hcload.Cmp.Control, Hcload.Ql, &Hcload.Qdyl) 916 qdaysum(int64(ttmm), Hcload.Cmp.Control, Hcload.Qt, &Hcload.Qdyt) 917 918 qdaysum(int64(ttmm), Hcload.Cmp.Control, Hcload.Qfusoku, &Hcload.Qdyfusoku) 919 qdaysum(int64(ttmm), Hcload.Cmp.Control, Hcload.Ele, &Hcload.Edy) 920 921 // 月集計 922 svmonsum(Mon, Day, ttmm, Hcload.Cmp.Control, Hcload.Tain, &Hcload.mTaidy, Nday, SimDayend) 923 svmonsum(Mon, Day, ttmm, Hcload.Cmp.Control, Hcload.Xain, &Hcload.mxaidy, Nday, SimDayend) 924 925 qmonsum(Mon, Day, ttmm, Hcload.Cmp.Control, Hcload.Qs, &Hcload.mQdys, Nday, SimDayend) 926 qmonsum(Mon, Day, ttmm, Hcload.Cmp.Control, Hcload.Ql, &Hcload.mQdyl, Nday, SimDayend) 927 qmonsum(Mon, Day, ttmm, Hcload.Cmp.Control, Hcload.Qt, &Hcload.mQdyt, Nday, SimDayend) 928 929 qmonsum(Mon, Day, ttmm, Hcload.Cmp.Control, Hcload.Qfusoku, &Hcload.mQdyfusoku, Nday, SimDayend) 930 qmonsum(Mon, Day, ttmm, Hcload.Cmp.Control, Hcload.Ele, &Hcload.mEdy, Nday, SimDayend) 931 932 // 月・時刻のクロス集計 933 emtsum(Mon, Day, ttmm, Hcload.Cmp.Control, Hcload.Ele, &Hcload.mtEdy[Mo][tt]) 934 } 935 } 936 937 func hclddyprt(fo io.Writer, id int, _Hcload []*HCLOAD) { 938 switch id { 939 case 0: 940 if len(_Hcload) > 0 { 941 fmt.Fprintf(fo, "%s %d\n", HCLOAD_TYPE, len(_Hcload)) 942 } 943 for _, Hcload := range _Hcload { 944 fmt.Fprintf(fo, "%s 4 36 14 14 8\n", Hcload.Name) 945 } 946 947 case 1: 948 for _, Hcload := range _Hcload { 949 fmt.Fprintf(fo, "%s_Ht H d %s_T T f ", Hcload.Name, Hcload.Name) 950 fmt.Fprintf(fo, "%s_ttn h d %s_Tn t f %s_ttm h d %s_Tm t f\n", 951 Hcload.Name, Hcload.Name, Hcload.Name, Hcload.Name) 952 fmt.Fprintf(fo, "%s_Hsh H d %s_Qsh Q f %s_Hsc H d %s_Qsc Q f\n", 953 Hcload.Name, Hcload.Name, Hcload.Name, Hcload.Name) 954 fmt.Fprintf(fo, "%s_tsh h d %s_qsh q f %s_tsc h d %s_qsc q f\n", 955 Hcload.Name, Hcload.Name, Hcload.Name, Hcload.Name) 956 fmt.Fprintf(fo, "%s_Hx H d %s_x X f ", Hcload.Name, Hcload.Name) 957 fmt.Fprintf(fo, "%s_txn h d %s_xn x f %s_txm h d %s_xm c f\n", 958 Hcload.Name, Hcload.Name, Hcload.Name, Hcload.Name) 959 fmt.Fprintf(fo, "%s_Hlh H d %s_Qlh Q f %s_Hlc H d %s_Qlc Q f\n", 960 Hcload.Name, Hcload.Name, Hcload.Name, Hcload.Name) 961 fmt.Fprintf(fo, "%s_tlh h d %s_qlh q f %s_tlc h d %s_qlc q f\n", 962 Hcload.Name, Hcload.Name, Hcload.Name, Hcload.Name) 963 fmt.Fprintf(fo, "%s_Hth H d %s_Qth Q f %s_Htc H d %s_Qtc Q f\n", 964 Hcload.Name, Hcload.Name, Hcload.Name, Hcload.Name) 965 fmt.Fprintf(fo, "%s_tth h d %s_qth q f %s_ttc h d %s_qtc q f\n\n", 966 Hcload.Name, Hcload.Name, Hcload.Name, Hcload.Name) 967 } 968 969 default: 970 for _, Hcload := range _Hcload { 971 fmt.Fprintf(fo, "%1d %3.1f %1d %3.1f %1d %3.1f ", 972 Hcload.Taidy.Hrs, Hcload.Taidy.M, 973 Hcload.Taidy.Mntime, Hcload.Taidy.Mn, 974 Hcload.Taidy.Mxtime, Hcload.Taidy.Mx) 975 fmt.Fprintf(fo, "%1d %3.1f ", Hcload.Qdys.Hhr, Hcload.Qdys.H) 976 fmt.Fprintf(fo, "%1d %3.1f ", Hcload.Qdys.Chr, Hcload.Qdys.C) 977 fmt.Fprintf(fo, "%1d %2.0f ", Hcload.Qdys.Hmxtime, Hcload.Qdys.Hmx) 978 fmt.Fprintf(fo, "%1d %2.0f ", Hcload.Qdys.Cmxtime, Hcload.Qdys.Cmx) 979 980 fmt.Fprintf(fo, "%1d %5.4f %1d %5.4f %1d %5.4f ", 981 Hcload.xaidy.Hrs, Hcload.xaidy.M, 982 Hcload.xaidy.Mntime, Hcload.xaidy.Mn, 983 Hcload.xaidy.Mxtime, Hcload.xaidy.Mx) 984 fmt.Fprintf(fo, "%1d %3.1f ", Hcload.Qdyl.Hhr, Hcload.Qdyl.H) 985 fmt.Fprintf(fo, "%1d %3.1f ", Hcload.Qdyl.Chr, Hcload.Qdyl.C) 986 fmt.Fprintf(fo, "%1d %2.0f ", Hcload.Qdyl.Hmxtime, Hcload.Qdyl.Hmx) 987 fmt.Fprintf(fo, "%1d %2.0f ", Hcload.Qdyl.Cmxtime, Hcload.Qdyl.Cmx) 988 989 fmt.Fprintf(fo, "%1d %3.1f ", Hcload.Qdyt.Hhr, Hcload.Qdyt.H) 990 fmt.Fprintf(fo, "%1d %3.1f ", Hcload.Qdyt.Chr, Hcload.Qdyt.C) 991 fmt.Fprintf(fo, "%1d %2.0f ", Hcload.Qdyt.Hmxtime, Hcload.Qdyt.Hmx) 992 fmt.Fprintf(fo, "%1d %2.0f\n", Hcload.Qdyt.Cmxtime, Hcload.Qdyt.Cmx) 993 } 994 } 995 } 996 997 func hcldmonprt(fo io.Writer, id int, _Hcload []*HCLOAD) { 998 switch id { 999 case 0: 1000 if len(_Hcload) > 0 { 1001 fmt.Fprintf(fo, "%s %d\n", HCLOAD_TYPE, len(_Hcload)) 1002 } 1003 for _, Hcload := range _Hcload { 1004 fmt.Fprintf(fo, "%s 4 36 14 14 8\n", Hcload.Name) 1005 } 1006 1007 case 1: 1008 for _, Hcload := range _Hcload { 1009 fmt.Fprintf(fo, "%s_Ht H d %s_T T f ", Hcload.Name, Hcload.Name) 1010 fmt.Fprintf(fo, "%s_ttn h d %s_Tn t f %s_ttm h d %s_Tm t f\n", 1011 Hcload.Name, Hcload.Name, Hcload.Name, Hcload.Name) 1012 fmt.Fprintf(fo, "%s_Hsh H d %s_Qsh Q f %s_Hsc H d %s_Qsc Q f\n", 1013 Hcload.Name, Hcload.Name, Hcload.Name, Hcload.Name) 1014 fmt.Fprintf(fo, "%s_tsh h d %s_qsh q f %s_tsc h d %s_qsc q f\n", 1015 Hcload.Name, Hcload.Name, Hcload.Name, Hcload.Name) 1016 fmt.Fprintf(fo, "%s_Hx H d %s_x X f ", Hcload.Name, Hcload.Name) 1017 fmt.Fprintf(fo, "%s_txn h d %s_xn x f %s_txm h d %s_xm c f\n", 1018 Hcload.Name, Hcload.Name, Hcload.Name, Hcload.Name) 1019 fmt.Fprintf(fo, "%s_Hlh H d %s_Qlh Q f %s_Hlc H d %s_Qlc Q f\n", 1020 Hcload.Name, Hcload.Name, Hcload.Name, Hcload.Name) 1021 fmt.Fprintf(fo, "%s_tlh h d %s_qlh q f %s_tlc h d %s_qlc q f\n", 1022 Hcload.Name, Hcload.Name, Hcload.Name, Hcload.Name) 1023 fmt.Fprintf(fo, "%s_Hth H d %s_Qth Q f %s_Htc H d %s_Qtc Q f\n", 1024 Hcload.Name, Hcload.Name, Hcload.Name, Hcload.Name) 1025 fmt.Fprintf(fo, "%s_tth h d %s_qth q f %s_ttc h d %s_qtc q f\n\n", 1026 Hcload.Name, Hcload.Name, Hcload.Name, Hcload.Name) 1027 } 1028 1029 default: 1030 for _, Hcload := range _Hcload { 1031 fmt.Fprintf(fo, "%1d %3.1f %1d %3.1f %1d %3.1f ", 1032 Hcload.mTaidy.Hrs, Hcload.mTaidy.M, 1033 Hcload.mTaidy.Mntime, Hcload.mTaidy.Mn, 1034 Hcload.mTaidy.Mxtime, Hcload.mTaidy.Mx) 1035 fmt.Fprintf(fo, "%1d %3.1f ", Hcload.mQdys.Hhr, Hcload.mQdys.H) 1036 fmt.Fprintf(fo, "%1d %3.1f ", Hcload.mQdys.Chr, Hcload.mQdys.C) 1037 fmt.Fprintf(fo, "%1d %2.0f ", Hcload.mQdys.Hmxtime, Hcload.mQdys.Hmx) 1038 fmt.Fprintf(fo, "%1d %2.0f ", Hcload.mQdys.Cmxtime, Hcload.mQdys.Cmx) 1039 1040 fmt.Fprintf(fo, "%1d %5.4f %1d %5.4f %1d %5.4f ", 1041 Hcload.mxaidy.Hrs, Hcload.mxaidy.M, 1042 Hcload.mxaidy.Mntime, Hcload.mxaidy.Mn, 1043 Hcload.mxaidy.Mxtime, Hcload.mxaidy.Mx) 1044 fmt.Fprintf(fo, "%1d %3.1f ", Hcload.mQdyl.Hhr, Hcload.mQdyl.H) 1045 fmt.Fprintf(fo, "%1d %3.1f ", Hcload.mQdyl.Chr, Hcload.mQdyl.C) 1046 fmt.Fprintf(fo, "%1d %2.0f ", Hcload.mQdyl.Hmxtime, Hcload.mQdyl.Hmx) 1047 fmt.Fprintf(fo, "%1d %2.0f ", Hcload.mQdyl.Cmxtime, Hcload.mQdyl.Cmx) 1048 1049 fmt.Fprintf(fo, "%1d %3.1f ", Hcload.mQdyt.Hhr, Hcload.mQdyt.H) 1050 fmt.Fprintf(fo, "%1d %3.1f ", Hcload.mQdyt.Chr, Hcload.mQdyt.C) 1051 fmt.Fprintf(fo, "%1d %2.0f ", Hcload.mQdyt.Hmxtime, Hcload.mQdyt.Hmx) 1052 fmt.Fprintf(fo, "%1d %2.0f\n", Hcload.mQdyt.Cmxtime, Hcload.mQdyt.Cmx) 1053 } 1054 } 1055 } 1056 1057 func hcldmtprt(fo io.Writer, id, Mo, tt int, _Hcload []*HCLOAD) { 1058 switch id { 1059 case 0: 1060 if len(_Hcload) > 0 { 1061 fmt.Fprintf(fo, "%s %d\n", HCLOAD_TYPE, len(_Hcload)) 1062 } 1063 for _, Hcload := range _Hcload { 1064 fmt.Fprintf(fo, " %s 1 1\n", Hcload.Name) 1065 } 1066 1067 case 1: 1068 for _, Hcload := range _Hcload { 1069 fmt.Fprintf(fo, "%s_E E f \n", Hcload.Name) 1070 } 1071 1072 default: 1073 for _, Hcload := range _Hcload { 1074 fmt.Fprintf(fo, " %.2f \n", Hcload.mtEdy[Mo-1][tt-1].D*Cff_kWh) 1075 } 1076 } 1077 } 1078 1079 func hcldswptr(key []string, Hcload *HCLOAD) (VPTR, error) { 1080 if key[1] == "chmode" { 1081 return VPTR{ 1082 Ptr: &Hcload.Chmode, 1083 Type: SW_CTYPE, 1084 }, nil 1085 } 1086 1087 return VPTR{}, errors.New("hcldswptr error") 1088 } 1089 1090 func chhcldswreset(Qload, Ql float64, chmode ControlSWType, Eo *ELOUT) int { 1091 if (chmode == HEATING_SW && Qload < 0.0) || 1092 (chmode == COOLING_SW && Ql > 0.0) || 1093 (chmode == COOLING_SW && Qload > 0.0) { 1094 Eo.Control = ON_SW 1095 Eo.Sysld = 'n' 1096 Eo.Emonitr.Control = ON_SW 1097 1098 return 1 1099 } else { 1100 return 0 1101 } 1102 } 1103 1104 func hcldwetmdreset(Eqsys *EQSYS) { 1105 Hcload := Eqsys.Hcload 1106 1107 for i := range Hcload { 1108 Hcload[i].Wetmode = Hcload[i].Wet 1109 } 1110 }