C*********************************************************************** ! This component has been assigned Type Number 209. If that number conflicts with ! another user Type number, you will need to change it and recompile the appropriate ! dll. SUBROUTINE TYPE209(TIME,XIN,OUT,T,DTDT,PAR,INFO,ICNTRL,*) !DEC$ATTRIBUTES DLLEXPORT :: TYPE209 C ---------------------------------------------------------------------- C C TYPE 209 : STICKY PROPORTIONAL CONTROLLER C C NOTE: this component it to be used ONLY to pass control signals C between superblocks. The variable defined by its output C should not be solved simultaneously! C C*********************************************************************** DOUBLE PRECISION XIN,OUT REAL S,PAR INTEGER INFO DIMENSION XIN(2),OUT(1),PAR(3),INFO(15) C REAL SAVED,PAR C INTEGER IOSTAT C DIMENSION XIN(2),OUT(1),SAVED(3),PAR(3) C DIMENSION IOSTAT(2) C* COMMON /CHRONO/ TIME,TSTEP,TTIME,TMIN,ITIME 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. -1) THEN INFO(10)=3 CALL TYPECK(1,INFO,2,3,0) ENDIF ISAV=INFO(10) CTM= XIN(1) CTS= XIN(2) GAINP= PAR(1) BAND= PAR(2) OFFSET=PAR(3) E=CTS-CTM C* IF (ITIME.GT.1) GOTO 1000 IF (INFO(7).GT.-1) GOTO 1000 C IF (INIT.EQ.0) SAVED(2)=E C IF (INIT.EQ.0 .OR. SAVED(1).GT.TIME) SAVED(1)=0. C 1000 IF (TIME.GT.SAVED(1)) SAVED(3)=SAVED(2) C SAVED(1)=TIME C ENEW=SAVED(3) C DE=E-SAVED(3) IF (INIT .EQ. 0) S(ISAV+1)=E IF (INIT .EQ. 0 .OR. S(ISAV) .GT. TIME) S(ISAV)=0. 1000 IF (TIME .GT. S(ISAV)) S(ISAV+2)=S(ISAV+1) S(ISAV)=TIME ENEW=S(ISAV+2) DE=E-S(ISAV+2) IF (ABS(DE).LT.BAND) GOTO 2000 C ENEW=SAVED(3)+SIGN(BAND,DE) ENEW=S(ISAV+2)+SIGN(BAND,DE) IF (ABS(DE).LE.2.*BAND) ENEW=E C 2000 SAVED(2)=ENEW 2000 S(ISAV+1)=ENEW OUTT=OFFSET+GAINP*ENEW IF (OUTT.GT.1.0) OUTT=1.0 IF (OUTT.LT.0.0) OUTT=0.0 OUT(1)=OUTT C IOSTAT(1)=0 RETURN 1 END