github.com/archlabjp/eeslism-go@v0.0.0-20231109122333-4bb7bfcdf292/eeslism/mcvalv.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 /* mcvav.c */ 17 18 /* VALV */ 19 20 package eeslism 21 22 import ( 23 "errors" 24 "fmt" 25 "math" 26 "strings" 27 ) 28 29 /* ------------------------------------------ */ 30 31 func (eqsys *EQSYS) Valvcountreset() { 32 for _, v := range eqsys.Valv { 33 v.Count = 0 34 } 35 } 36 37 /***********************************************/ 38 39 func (eqsys *EQSYS) Valvcountinc() { 40 for _, v := range eqsys.Valv { 41 v.Count++ 42 } 43 } 44 45 // 通常はバルブの上流の流量に比率を乗じるが、基準となるOMvavが指定されている場合には、この流量に対する比率とする 46 // OMvavが指定されているときだけの対応 47 func Valvinit(Valv []*VALV, Mpath []*MPATH) { 48 for _, v := range Valv { 49 if v.Cmp.MonPlistName != "" { 50 for _, mpath := range Mpath { 51 for _, Plist := range mpath.Plist { 52 if v.Cmp.MonPlistName == Plist.Plistname { 53 v.MonPlist = Plist 54 v.MGo = &Plist.G 55 56 if v.Cmb != nil { 57 CValv := v.Cmb.Eqp.(*VALV) 58 CValv.MonPlist = Plist 59 CValv.MGo = &Plist.G 60 } 61 break 62 } 63 } 64 } 65 } else { 66 Pelm := v.Plist.Pelm[len(v.Plist.Pelm)-1] 67 v.MGo = Pelm.Cmp.Elouts[0].Lpath.Go 68 v.MonPlist = Pelm.Cmp.Elouts[0].Lpath 69 70 if v.Cmb != nil { 71 CValv := v.Cmb.Eqp.(*VALV) 72 CValv.MonPlist = v.MonPlist 73 CValv.MGo = &v.MonPlist.G 74 } 75 } 76 } 77 } 78 79 func Valvene(Valv []*VALV, Valvreset *int) { 80 var etype EqpType 81 var T1, T2 float64 82 var Vcb *VALV 83 var r float64 84 85 for _, v := range Valv { 86 etype = v.Cmp.Eqptype 87 if etype == TVALV_TYPE && v.Org == 'y' { 88 if v.Mon.Elouts[0].Control != OFF_SW { 89 T1 = *v.Tin 90 Vcb = v.Cmb.Eqp.(*VALV) 91 T2 = *Vcb.Tin 92 93 if math.Abs(*v.Tout-*v.Tset) >= 1.0e-3 && math.Abs(T1-T2) >= 1.0e-3 { 94 r = (*v.Tset - T2) / (T1 - T2) 95 r = math.Min(1.0, math.Max(r, 0.0)) 96 v.X = r 97 Vcb.X = 1.0 - r 98 99 v.Plist.Gcalc = r * *v.MGo 100 Vcb.Plist.Gcalc = (1.0 - r) * *v.MGo 101 (*Valvreset)++ 102 103 if DEBUG { 104 fmt.Printf("<Valvene> Valvname=%s G=%f\n", v.Name, v.Plist.G) 105 fmt.Printf(" T1=%.1f T2=%.1f Tset=%.1f\n", T1, T2, *v.Tset) 106 } 107 } else { 108 v.Plist.Gcalc = v.X * *v.MGo 109 Vcb.Plist.Gcalc = (1.0 - v.X) * *v.MGo 110 (*Valvreset)++ 111 } 112 } 113 } 114 } 115 } 116 117 /************************************************************************/ 118 119 func ValvControl(fi *EeTokens, Compnt []*COMPNT, Schdl *SCHDL, Simc *SIMCONTL, Wd *WDAT, vptr *VPTR) { 120 var s string 121 var Valv, Vb *VALV 122 var Vc *COMPNT 123 var k, i int 124 var elins *ELIN 125 var Pelm *PELM 126 var err error 127 128 Vb = nil 129 s = fi.GetToken() 130 131 ad := fi.GetPos() 132 133 Vc = Compntptr(s, Compnt) 134 if Vc == nil { 135 Eprint("<CONTRL>", s) 136 } 137 138 vptr.Ptr = &Vc.Control 139 vptr.Type = SW_CTYPE 140 141 Valv = Vc.Eqp.(*VALV) 142 Valv.Org = 'y' 143 for fi.IsEnd() == false { 144 s = fi.GetToken() 145 146 if strings.HasPrefix(s, ";") { 147 fi.RestorePos(ad) 148 break 149 } 150 151 if s == "-init" { 152 s = fi.GetToken() 153 ad = fi.GetPos() 154 155 if k, err = idsch(s, Schdl.Sch, ""); err == nil { 156 Valv.Xinit = &Schdl.Val[k] 157 } else { 158 Valv.Xinit = envptr(s, Simc, Compnt, Wd, nil) 159 } 160 } else if s == "-Tout" { 161 s = fi.GetToken() 162 ad = fi.GetPos() 163 if k, err = idsch(s, Schdl.Sch, ""); err == nil { 164 Valv.Tset = &Schdl.Val[k] 165 } else { 166 Valv.Tset = envptr(s, Simc, Compnt, Wd, nil) 167 } 168 169 Pelm = Valv.Plist.Pelm[len(Valv.Plist.Pelm)-1] 170 Valv.Mon = Pelm.Cmp 171 Valv.Tout = &Valv.Mon.Elouts[0].Sysv 172 Valv.MGo = &Pelm.Cmp.Elouts[0].Lpath.G 173 Vb = Valv.Cmb.Eqp.(*VALV) 174 Vb.MGo = &Pelm.Cmp.Elouts[0].Lpath.G 175 176 if Valv.Plist.Go == nil { 177 Vb = Valv.Cmb.Eqp.(*VALV) 178 Valv.Plist.Go = Valv.Mon.Elouts[0].Lpath.Go 179 Vb.Plist.Go = Valv.Mon.Elouts[0].Lpath.Go 180 } 181 } 182 } 183 184 Pelm = Valv.Plist.Pelm[len(Valv.Plist.Pelm)-1] 185 elins = Pelm.Cmp.Elins[0] 186 187 for i = 0; i < Pelm.Cmp.Nin; i++ { 188 if elins.Lpath.Valv.Name == Valv.Name { 189 Valv.Tin = &elins.Sysvin 190 } else { 191 Vb.Tin = &elins.Sysvin 192 } 193 } 194 } 195 196 // バルブの内部変数へのポインタ 197 func valv_vptr(key []string, Valv *VALV) (VPTR, error) { 198 var err error 199 var vptr VPTR 200 201 if strings.Compare(key[1], "value") == 0 { 202 vptr.Ptr = &Valv.X 203 vptr.Type = VAL_CTYPE 204 } else { 205 err = errors.New("'value' is expected") 206 } 207 208 return vptr, err 209 }