C*********************************************************************** ! This component has been assigned Type Number 214. If that number conflicts with ! another user Type number, you will need to change it and recompile the appropriate ! dll. SUBROUTINE TYPE214(TIME,XIN,OUT,T,DTDT,PAR,INFO,ICNTRL,*) !DEC$ATTRIBUTES DLLEXPORT :: TYPE214 C ---------------------------------------------------------------------- C C TYPE 214 : THREE-WAY VALVE MODEL C C C: control signal from controller C Cv: valve position before hysteresis is considered C Y1: actual valve position C C Port 1 is closed when C is zero. C C Head loss (K) parameters are related to valve constant (Av) by: C K=1/(rhow*Av)**2 C C ISEL ([Par(6)] determines characteristics of Port 1 / Port 2 : C ISEL=0 -> Linear/Linear C ISEL=1 -> Linear/Exponential C ISEL=2 -> Exponential/Exponential C C*********************************************************************** DOUBLE PRECISION XIN,OUT REAL PAR,S C REAL PAR,SAVED REAL K1,K2 INTEGER INFO DIMENSION XIN(7),OUT(7),PAR(6),INFO(15) C INTEGER IOSTAT C LOGICAL CON C DIMENSION XIN(7),OUT(6),PAR(6),SAVED(5) C DIMENSION IOSTAT(7) C* COMMON /PROPER/RHOA,RHOW,CPA,CPW C* COMMON /CHRONO/ TIME,TSTEP,TTIME,TMIN,ITIME C* COMMON /SOSCOM/ RTOLX,ATOLX,XTOL C* COMMON /XINIT/ INIT,NSAVED COMMON /SIM/ TIME0,TFINAL,DELT,IWARN COMMON /STORE/ NSTORE,IAV,S(5000) DATA INIT /0/ ! Set the version information for TRNSYS IF (INFO(7).EQ.-2) THEN INFO(12) = 15 RETURN 1 ENDIF IF (INFO(7) .EQ. 0) THEN CVI=OUT(7) ENDIF IF (INFO(7) .EQ. -1) THEN INFO(10)=5 CALL TYPECK(1,INFO,7,6,0) CVI=XIN(7) ENDIF ISAV=INFO(10) W1= XIN(1) W2= XIN(2) P3= XIN(3) T1= XIN(4) T2= XIN(5) C= XIN(6) CV= XIN(7) K1= PAR(1) K2= PAR(2) CL= PAR(3) TCON=PAR(4) HYS= PAR(5) ISEL=INT(PAR(6)+0.1) IF (T1.LT.-30.) T1=-30. ! added 2/24/94 IF (T1.GT.120.) T1=120. IF (T2.LT.-30.) T2=-30. IF (T2.GT.120.) T2=120. C CON=(IOSTAT(6).LT.-1).OR.(IOSTAT(6).EQ.2) IF (C.LT.0.) C=0. IF (C.GT.1.0) C=1.0 IF (CV.LT.0.) CV=0. IF (CV.GT.1.0) CV=1.0 IF (TCON.GE.1.0) GOTO 1000 C* IF (ITIME.GT.1) GOTO 3000 IF (INFO(7).GT.-1) GOTO 3000 C IF (INIT.EQ.0)SAVED(4)=CV C IF (INIT.EQ.0 .OR. SAVED(3).GT.TIME) SAVED(3)=0. C 3000 IF (TIME.GT.SAVED(3)) SAVED(5)=SAVED(4) IF (INIT .EQ. 0) S(ISAV+3)=CV IF (INIT .EQ. 0 .OR. S(ISAV+2) .GT. TIME) S(ISAV+2)=0. 3000 IF (TIME .GT. S(ISAV+2)) S(ISAV+4)=S(ISAV+3) C DCVDT=C CVAA=0 CVBB=C CALL DIFFEQ(TIME,CVAA,CVBB,CVI,CVF,CVBAR) CV=C C* A=TCON/TSTEP A=TCON/DELT IF (A .LT. 0.05) GOTO 2000 C DC=C-SAVED(5) DC=C-S(ISAV+4) IF (ABS(DC).LT.1.E-10) GOTO 2000 CV=C-DC*EXP(-1./A) C DCVDT=CV CVAA=1 CVBB=0 CALL DIFFEQ(TIME,CVAA,CVBB,CVI,CVF,CVBAR) GOTO 2000 C 1000 DCVDT=(C-CV)/TCON 1000 CVAA=-1/TCON CVBB=C/TCON CALL DIFFEQ(TIME,CVAA,CVBB,CVI,CVF,CVBAR) C 2000 Y1=HYSTER(CV,SAVED(1),SAVED(2),SAVED(3),HYS) 2000 Y1=HYSTER(CV,S(ISAV),S(ISAV+1),S(ISAV+2),HYS,INFO) Y2=1.0-Y1 W3=W1+W2 S1=1. S2=1. IF (W1.NE.0.) S1=SIGN(1.,W1) IF (W2.NE.0.) S2=SIGN(1.,W2) IF (ISEL.EQ.0) GOTO 10 IF (ISEL.EQ.1) GOTO 20 GOTO 30 10 P1=P3+K1*S1*(W1/((1.0-CL)*Y1+CL))**2 P2=P3+K2*S2*(W2/((1.0-CL)*Y2+CL))**2 GOTO 100 20 P1=P3+K1*S1*(W1/(CL**(1.0-Y1)))**2 P2=P3+K2*S2*(W2/((1.0-CL)*Y2+CL))**2 GOTO 100 30 P1=P3+K1*S1*(W1/(CL**(1.0-Y1)))**2 P2=P3+K2*S2*(W2/(CL**(1.0-Y2)))**2 C100 T3=(T1+T2)/2. C IF (W3.GT.0.0) T3=(W1*T1+W2*T2)/W3 C ----------Y. ZHU ---------------------- 100 T3=T1*CV+T2*(1.-CV) IF (W3.GT.1.0E-5) THEN IF (W1.LT.0.0) W1=0.0 IF (W2.LT.0.0) W2=0.0 W3=W1+W2 T3=(W1*T1+W2*T2)/W3 ENDIF C ---------------------------------------- C SAVED(4)=CV S(ISAV+3)=CV C IF (ABS(DCVDT).LT.1.E-6) DCVDT=0.0 ! added 2/24/94 C C OUT(1)= DCVDT OUT(1)=CVBAR OUT(2)= W3 OUT(3)= P1 OUT(4)= P2 OUT(5)= T3 OUT(6)= Y1 OUT(7)=CVF C IOSTAT(1)=0 C IF ((ABS(C-CV).LE.RTOLX*ABS(CV)+ATOLX).AND.CON) IOSTAT(1)=1 C IOSTAT(2)=1 C IOSTAT(3)=1 C IOSTAT(4)=1 C IOSTAT(5)=1 C IOSTAT(6)=1 RETURN 1 END C*********************************************************************** C FUNCTION HYSTER(CA,CR,CRO,TOLD,HYS) FUNCTION HYSTER(CA,CR,CRO,TOLD,HYS,INFO) C --------------------------------------------------------------------- C C Models hysteresis of actuators. C CA : Rel. position of actuator (0<=CA<=1) C CR : Rel. position of valve or damper [0<=CR<=(1.-HYS)] C CRO : Value of CR at time TOLD C TOLD: Previous value of TIME C HYSTER: CR scaled such that 0<=HYSTER<=1 C C*********************************************************************** C COMMON/CHRONO/ TIME,TSTEP,TTIME,TMIN,ITIME C COMMON/XINIT/ INIT,NSAVED COMMON /SIM/ TIME0,TFINAL,DELT,IWARN DIMENSION INFO(15) DATA INIT /0/ C IF (ITIME.GT.1 .OR. INIT.NE.0) GOTO 1000 IF (INFO(7) .GT. -1 .OR. INIT .NE. 0) GOTO 1000 TOLD=TIME CRO=CA-HYS IF (CRO.LT.0.) CRO=0. CR=CRO HYSTER=CR/(1.-HYS) RETURN 1000 IF (TIME.GT.TOLD) CRO=CR TOLD=TIME C=MAX(CA,0.) C=MIN(C,1.) SLOPE=1./(1.-HYS) SLACK=C-CRO CR=CRO IF (SLACK.GT.HYS) CR=C-HYS IF (SLACK.LT.0.) CR=C HYSTER=SLOPE*CR RETURN END