github.com/archlabjp/eeslism-go@v0.0.0-20231109122333-4bb7bfcdf292/eeslism/escntllb_s.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 /* escntllb_s.c */ 17 18 package eeslism 19 20 import ( 21 "errors" 22 "strings" 23 ) 24 25 /* システム変数名、内部変数名、スケジュール名のポインター */ 26 27 func ctlvptr(s string, Simc *SIMCONTL, Compnt []*COMPNT, Mpath []*MPATH, Wd *WDAT, Exsf *EXSFS, Schdl *SCHDL) (VPTR, VPTR, error) { 28 var err error 29 var vptr, vpath VPTR 30 31 if i, err2 := idsch(s, Schdl.Sch, ""); err2 == nil { 32 // 年間の設定値スケジュールへのポインターを作成する 33 vptr = VPTR{ 34 Ptr: &Schdl.Val[i], 35 Type: VAL_CTYPE, 36 } 37 } else if i, iderr := idscw(s, Schdl.Scw, ""); iderr == nil { 38 // 年間の切替スケジュールへのポインターを作成する 39 vptr = VPTR{ 40 Ptr: &Schdl.Isw[i], 41 Type: SW_CTYPE, 42 } 43 } else { 44 // 経路名、システム変数名、内部変数名のポインターを作成する 45 vptr, vpath, err = kynameptr(s, Simc, Compnt, Mpath, Wd, Exsf) 46 } 47 48 //Errprint(1, "<ctlvptr>", s) 49 return vptr, vpath, err 50 } 51 52 /* ----------------------------------------------------------------- */ 53 54 // システム経路名、要素名、システム変数名、内部変数名の分離 55 func strkey(s string) ([]string, int) { 56 if len(s) == 0 { 57 return nil, 0 58 } 59 60 key := strings.Split(s, "_") 61 return key, len(key) 62 } 63 64 /* ----------------------------------------------------------------- */ 65 66 // 経路名、システム変数名、内部変数名のポインターを作成する 67 func kynameptr(s string, Simc *SIMCONTL, _Compnt []*COMPNT, 68 Mpath []*MPATH, Wd *WDAT, Exsf *EXSFS) (VPTR, VPTR, error) { 69 var err error 70 var vptr, vpath VPTR 71 72 key := strings.Split(s, "_") 73 nk := len(key) 74 75 if nk > 0 { 76 switch key[0] { 77 case "Ta": 78 vptr = VPTR{ 79 Type: VAL_CTYPE, 80 Ptr: &Wd.T, 81 } 82 case "xa": 83 vptr = VPTR{ 84 Type: VAL_CTYPE, 85 Ptr: &Wd.X, 86 } 87 case "RHa": 88 vptr = VPTR{ 89 Type: VAL_CTYPE, 90 Ptr: &Wd.RH, 91 } 92 case "ha": 93 vptr = VPTR{ 94 Type: VAL_CTYPE, 95 Ptr: &Wd.H, 96 } 97 case "Twsup": 98 vptr = VPTR{ 99 Type: VAL_CTYPE, 100 Ptr: &Wd.Twsup, 101 } 102 case "Ihol": 103 vptr = VPTR{ 104 Type: VAL_CTYPE, 105 Ptr: &Wd.Ihor, 106 } 107 default: 108 // // 傾斜面名称の検索 109 if Exsf != nil { 110 for _, Exs := range Exsf.Exs { 111 if key[0] == Exs.Name { 112 switch key[1] { 113 case "Idre": 114 // 傾斜面への入射直達日射量 115 vptr = VPTR{ 116 Type: VAL_CTYPE, 117 Ptr: &Exs.Idre, 118 } 119 return vptr, vpath, nil 120 case "Idf": 121 // 傾斜面への入射拡散日射量 122 vptr = VPTR{ 123 Type: VAL_CTYPE, 124 Ptr: &Exs.Idf, 125 } 126 return vptr, vpath, nil 127 case "Iw": 128 // 傾斜面への入射全日射量 129 vptr = VPTR{ 130 Type: VAL_CTYPE, 131 Ptr: &Exs.Iw, 132 } 133 return vptr, vpath, nil 134 } 135 } 136 } 137 } 138 139 if len(Mpath) > 0 { 140 vptr, vpath, err = pathvptr(nk, key, Mpath) 141 } else { 142 err = errors.New("Nmpath == 0") 143 } 144 145 if err != nil { 146 if Simc.Nvcfile > 0 { 147 vptr, err = vcfptr(key, Simc) 148 } else { 149 err = errors.New("Simc.Nvcfile == 0") 150 } 151 } 152 153 if err != nil { 154 for i := range _Compnt { 155 Compnt := _Compnt[i] 156 if key[0] == Compnt.Name { 157 vptr, err = compntvptr(nk, key, Compnt) 158 if err != nil { 159 e := Compnt.Eqptype 160 switch e { 161 case ROOM_TYPE: 162 if SIMUL_BUILDG { 163 vptr, err = roomvptr(nk, key, Compnt.Eqp.(*ROOM)) 164 } 165 case REFACOMP_TYPE: 166 vptr, err = refaswptr(key, Compnt.Eqp.(*REFA)) 167 case HCLOAD_TYPE, HCLOADW_TYPE, RMAC_TYPE, RMACD_TYPE: 168 vptr, err = hcldswptr(key, Compnt.Eqp.(*HCLOAD)) 169 case VAV_TYPE, VWV_TYPE: 170 /* VAV Satoh Debug 2001/1/19 */ 171 vptr, err = vavswptr(key, Compnt.Eqp.(*VAV)) 172 case COLLECTOR_TYPE: 173 vptr, err = collvptr(key, Compnt.Eqp.(*COLL)) 174 case STANK_TYPE: 175 vptr, err = stankvptr(key, Compnt.Eqp.(*STANK)) 176 case STHEAT_TYPE: 177 vptr, vpath, err = stheatvptr(key, Compnt.Eqp.(*STHEAT)) 178 case DESI_TYPE: 179 // Satoh追加 デシカント槽 2013/10/23 180 vptr, err = Desivptr(key, Compnt.Eqp.(*DESI)) 181 case PIPEDUCT_TYPE: 182 vptr, err = pipevptr(key, Compnt.Eqp.(*PIPE)) 183 case RDPANEL_TYPE: 184 vptr, err = rdpnlvptr(key, Compnt.Eqp.(*RDPNL)) 185 case VALV_TYPE, TVALV_TYPE: 186 vptr, err = valv_vptr(key, Compnt.Eqp.(*VALV)) 187 default: 188 Eprint("CONTL", Compnt.Name) 189 } 190 } 191 break 192 } 193 } 194 } 195 } 196 } else { 197 err = errors.New("Some error") 198 } 199 200 if err != nil { 201 Eprint("<kynameptr>", s) 202 } 203 204 return vptr, vpath, err 205 } 206 207 /* ----------------------------------------------------------------- */ 208 209 // 経路名のポインター 210 func pathvptr(nk int, key []string, Mpath []*MPATH) (VPTR, VPTR, error) { 211 var err error 212 var Plist, Plie *PLIST 213 var vptr, vpath VPTR 214 215 found := false 216 for _, Mp := range Mpath { 217 if string(key[0]) == Mp.Name { 218 vpath = VPTR{ 219 Type: MAIN_CPTYPE, 220 Ptr: Mp, 221 } 222 223 if nk == 1 || string(key[1]) == "control" { 224 vptr = VPTR{ 225 Type: SW_CTYPE, 226 Ptr: &Mp.Control, 227 } 228 } 229 found = true 230 break 231 } 232 } 233 234 if found == false { 235 err = errors.New("i == Nmpath") 236 Mpe := Mpath[len(Mpath)-1] 237 238 for _, Plist := range Mpe.Plist { 239 if Plist.Name != "" { 240 if key[0] == Plist.Name { 241 vpath = VPTR{ 242 Type: LOCAL_CPTYPE, 243 Ptr: Plist, 244 } 245 246 if nk == 1 || key[1] == "control" { 247 vptr = VPTR{ 248 Type: SW_CTYPE, 249 Ptr: &Plist.Control, 250 } 251 } else if key[1] == "G" { 252 vptr = VPTR{ 253 Type: VAL_CTYPE, 254 Ptr: &Plist.G, 255 } 256 } 257 break 258 } 259 } 260 } 261 if Plist == Plie { 262 err = errors.New("Plist == Plie") 263 } 264 } 265 return vptr, vpath, err 266 } 267 268 func Compntptr(name string, Compnt []*COMPNT) *COMPNT { 269 for i := range Compnt { 270 if name == Compnt[i].Name { 271 return Compnt[i] 272 } 273 } 274 275 return nil 276 } 277 278 /* ----------------------------------------------------------------- */ 279 280 // システム要素出口温度、湿度のポインター 281 func compntvptr(nk int, key []string, Compnt *COMPNT) (VPTR, error) { 282 var i int 283 var err error 284 var vptr VPTR 285 286 if nk == 1 || key[1] == "control" { 287 etype := Compnt.Eqptype 288 if etype != VALV_TYPE && etype != TVALV_TYPE { 289 // ボイラなど機器自体の停止ではなく、燃焼の停止とする 290 Eo := Compnt.Elouts[0] 291 if etype == STHEAT_TYPE { 292 vptr.Ptr = &Compnt.Control 293 } else { 294 vptr.Ptr = &Eo.Control 295 } 296 vptr.Type = SW_CTYPE 297 } else { 298 v := Compnt.Eqp.(*VALV) 299 vptr = VPTR{ 300 Ptr: &v.X, 301 Type: VAL_CTYPE, 302 } 303 v.Org = 'y' 304 } 305 } else { 306 for i = 0; i < Compnt.Nout; i++ { 307 Eo := Compnt.Elouts[i] 308 if (Eo.Fluid == AIRa_FLD && string(key[1]) == "Taout") || 309 (Eo.Fluid == AIRx_FLD && string(key[1]) == "xout") || 310 (Eo.Fluid == WATER_FLD && string(key[1]) == "Twout") { 311 vptr = VPTR{ 312 Ptr: &Eo.Sysv, 313 Type: VAL_CTYPE, 314 } 315 break 316 } 317 } 318 if i == Compnt.Nout { 319 err = errors.New("i == Compnt.Nout") 320 } 321 } 322 return vptr, err 323 } 324 325 /* ----------------------------------------------------------------- */ 326 327 // 負荷計算を行うシステム要素の設定システム変数のポインターを作成します。 328 // 負荷計算を行うシステム要素の設定システム変数のポインターを作成し、 vtr に保存します。 329 // 内部では、 boildptr, refaldptr, hcldptr, pipeldsptr, rdpnlldsptr,roomldptr に処理を委譲します。 330 func loadptr(loadcmp *COMPNT, load *ControlSWType, s string, _Compnt []*COMPNT) (VPTR, error) { 331 var Room *ROOM 332 var key []string 333 var idmrk byte = ' ' 334 var err error 335 var vptr VPTR 336 337 key = strings.Split(s, "_") 338 nk := len(key) 339 340 if nk != 0 { 341 for i := range _Compnt { 342 Compnt := _Compnt[i] 343 if key[0] == Compnt.Name { 344 switch Compnt.Eqptype { 345 case BOILER_TYPE: 346 vptr, err = boildptr(load, key, Compnt.Eqp.(*BOI)) 347 idmrk = 't' 348 case REFACOMP_TYPE: 349 vptr, err = refaldptr(load, key, Compnt.Eqp.(*REFA)) 350 idmrk = 't' 351 case HCLOAD_TYPE, RMAC_TYPE, RMACD_TYPE: 352 if SIMUL_BUILDG { 353 vptr, err = hcldptr(load, key, Compnt.Eqp.(*HCLOAD), &idmrk) 354 } 355 case PIPEDUCT_TYPE: 356 if SIMUL_BUILDG { 357 vptr, err = pipeldsptr(load, key, Compnt.Eqp.(*PIPE), &idmrk) 358 } 359 case RDPANEL_TYPE: 360 if SIMUL_BUILDG { 361 Rdpnl := Compnt.Eqp.(*RDPNL) 362 vptr, err = rdpnlldsptr(load, key, Rdpnl, &idmrk) 363 if loadcmp != nil && loadcmp.Eqptype == OMVAV_TYPE { 364 Rdpnl.OMvav = loadcmp.Eqp.(*OMVAV) 365 Rdpnl.OMvav.Omwall = Rdpnl.sd[0] 366 } 367 } 368 case ROOM_TYPE: 369 if SIMUL_BUILDG { 370 Room = Compnt.Eqp.(*ROOM) 371 if Room.rmld == nil { 372 Room.rmld = new(RMLOAD) 373 if Room.rmld == nil { 374 Ercalloc(1, "roomldptr") 375 } 376 377 key = strings.Split(s, "_") 378 379 R := Room.rmld 380 R.loadt = nil 381 R.loadx = nil 382 R.FOTN = nil 383 R.FOPL = nil 384 385 if loadcmp != nil && loadcmp.Eqptype == VAV_TYPE { 386 Room.VAVcontrl = loadcmp.Eqp.(*VAV) 387 } 388 } 389 vptr, err = roomldptr(load, key, Room, &idmrk) 390 } 391 } 392 393 if err == nil { 394 if loadcmp == nil { 395 loadcmp = Compnt 396 } 397 398 Eo := Compnt.Elouts[0] 399 eold := loadcmp.Elouts[0] 400 401 if idmrk == 'x' { 402 Eo = Compnt.Elouts[1] 403 eold = loadcmp.Elouts[1] 404 } 405 406 Eo.Eldobj = eold 407 eold.Emonitr = Eo 408 409 break 410 } 411 } else { 412 err = errors.New("") 413 } 414 } 415 return vptr, err 416 } else { 417 return vptr, errors.New("s is empty") 418 } 419 }