La méthode POMPES
Cette méthode de régulation mime le fonctionnement d’une station de pompage comprenant un certain nombre de pompes identiques qui se déclenchent ou s’arrêtent en fonction d’un niveau d’eau bas ou haut et d’une temporisation.
SUBROUTINE CPOMPES(U,Y,YT,PARA)
USE D_GLOBAL, ONLY : REPSI
USE SIRENE_parametres, ONLY : LONG
USE TEMPS, ONLY : T,TDEB,TFIN
USE IFICH, ONLY : JREGS
USE P1, ONLY : INURE
USE P2, ONLY : INU,INY,DTU
IMPLICIT NONE
REAL(KIND=LONG), INTENT(IN) :: Y,YT
REAL(KIND=LONG), INTENT(INOUT) :: PARA, U
INTEGER :: NBMIN,NBINI,NBMAX,NBNOW
REAL(KIND=LONG) :: ZH,ZB,Z1,Z2,Q,TLASTON,TLASTOF
REAL(KIND=LONG) :: TEMPOonoff,TEMPOoffon,TEMPOonon,TEMPOoffoff
REAL(KIND=LONG) :: RHO,P,H,PMAX,ETOT
LOGICAL :: Bon,Boff
DIMENSION U(*),Y(*),YT(*),PARA(*)
!-----Affectations
ZH=PARA(1)
ZB=PARA(2)
NBMIN=INT(PARA(3))
NBINI=INT(PARA(4))
NBMAX=INT(PARA(5))
Q=PARA(6)
TEMPOonoff=PARA(7)
TEMPOoffon=PARA(8)
TEMPOonon=PARA(9)
TEMPOoffoff=PARA(10)
TLASTON=PARA(11)
TLASTOF=PARA(12)
PMAX=PARA(13)
ETOT=PARA(14)
NBNOW=PARA(15)
!-----Protection
IF (Q.EQ.0.) RETURN
!-----Calcul des booléens pour savoir si on peut faire un on et/ou un off
!-----en tenant compte des tempos. Par défaut on ne peut pas (=FALSE)
Bon=.FALSE.
Boff=.FALSE.
IF(TLASTON<=TDEB.AND.TLASTOF<=TDEB) THEN
!--On n'a rien fait encore donc on peut tout faire (on ou off)
Bon=.TRUE.
Boff=.TRUE.
ELSEIF(TLASTON<=TDEB) THEN
!--On a déjà fait un off mais pas encore un on
IF((T-TLASTOF).GE.TEMPOoffon) Bon=.TRUE.
IF((T-TLASTOF).GE.TEMPOoffoff) Boff=.TRUE.
ELSEIF(TLASTOF<=TDEB) THEN
!--On a déjà fait un on mais pas encore un off
IF((T-TLASTON).GE.TEMPOonon) Bon=.TRUE.
IF((T-TLASTON).GE.TEMPOonoff) Boff=.TRUE.
ELSE
!--On a déjà fait un on et un off
IF(TLASTON<TLASTOF) THEN
!--Le dernier réalisé est un off
IF((T-TLASTOF).GE.TEMPOoffon) Bon=.TRUE.
IF((T-TLASTOF).GE.TEMPOoffoff) Boff=.TRUE.
ELSE
!--Le dernier réalisé est un on (ou les 2 en mm temps mais pas possible)
IF((T-TLASTON).GE.TEMPOonon) Bon=.TRUE.
IF((T-TLASTON).GE.TEMPOonoff) Boff=.TRUE.
ENDIF
ENDIF
IF (Y(1).GT.ZH) THEN
IF (Q.GT.0) THEN
!--------Arret d'une pompe (alimentation) si possible si Q>0 (N>NBMIN et TEMPO)
IF(NBNOW.GT.NBMIN.AND.Boff) THEN
NBNOW=NBNOW-1
TLASTOF=T
WRITE(JREGS,830) 'POMPE ',INURE,' - Arret d''une pompe (alimentation) à T=',T,' : ',Y(1),' > ',ZH &
,' . U=',U(1),' -> ',NBNOW*Q
ENDIF
ELSE
!--------Démarrage d'une pompe (extraction) si possible si Q<0 (N<NBMAX et TEMPO)
IF(NBNOW.LT.NBMAX.AND.Bon) THEN
NBNOW=NBNOW+1
TLASTON=T
WRITE(JREGS,830) 'POMPE ',INURE,' - Démarrage d''une pompe (extraction) à T=',T,' : ',Y(1),' > ',ZH &
,' . U=',U(1),' -> ',NBNOW*Q
ENDIF
ENDIF
ELSEIF (Y(1).LT.ZB) THEN
IF (Q.GT.0) THEN
!--------Démarrage d'une pompe (alimentation) si possible si Q>0 (N<NBMAX et TEMPO)
IF(NBNOW.LT.NBMAX.AND.Bon) THEN
NBNOW=NBNOW+1
TLASTON=T
WRITE(JREGS,830) 'POMPE ',INURE,' - Démarrage d''une pompe (alimentation) à T=',T,' : ',Y(1),' < ',ZB &
,' . U=',U(1),' -> ',NBNOW*Q
ENDIF
ELSE
!--------Arret d'une pompe (extraction) si possible si Q<0 (N>NBMIN et TEMPO)
IF(NBNOW.GT.NBMIN.AND.Boff) THEN
NBNOW=NBNOW-1
TLASTOF=T
WRITE(JREGS,830) 'POMPE ',INURE,' - Arret d''une pompe (extraction) à T=',T,' : ',Y(1),' < ',ZB &
,' . U=',U(1),' -> ',NBNOW*Q
ENDIF
ENDIF
ENDIF
!-----Affectation du débit dans la commande U
U(1)=NBNOW*Q
!-----Vérification des cotes de l'eau
IF (Q.LT.0) THEN
!-----Vérification de la cote de l'eau à l'aspiration (Q<0)
!-----Récupération de la cote d'aspiration Z1 pour le calcul du gain de charge
IF(Y(1).LT.YT(1)) THEN
WRITE(JREGS,800) 'POMPE ',INURE,' - Cote de l''eau trop basse à l''aspiration au temps T=',T,' : ',Y(1),' < ',YT(1)
Z1=YT(1)
ELSE
Z1=Y(1)
ENDIF
!-----Récupération de la cote de refoulement Z2 pour le calcul du gain de charge
!-----Si on a un Y2, en option on prend YT(2), sinon on prend YT(1)+10m
IF(INY.LT.2) THEN
Z2=YT(1)+10.0
ELSE
!-----Si on a un U2 on regarde alors la valeur de Y(2) % YT(2) sinon on prend YT(2)
IF(INU.GT.1) THEN
IF(Y(2).LT.YT(2)) THEN
!---------------Le refoulement est dénoyé
Z2=YT(2)
ELSE
!---------------Le refoulement est noyé
Z2=Y(2)
ENDIF
ELSE
Z2=YT(2)
ENDIF
ENDIF
ELSE
!-----Vérification de la cote de l'eau au refoulement (Q>0)
!-----Récupération de la cote de refoulement Z2 pour le calcul du gain de charge
IF(Y(1).GT.YT(1)) THEN
WRITE(JREGS,800) 'POMPE ',INURE,' - Cote de l''eau plus haute au refoulement au temps T= ',T,' : ',Y(1),' > ',YT(1)
Z2=Y(1)
ELSE
Z2=YT(1)
ENDIF
!-----Récupération de la cote d'aspiration Z1 pour le calcul du gain de charge
!-----Si on a un Y2, en option on prend YT(2), sinon on prend YT(1)-10m
IF(INY.LT.2) THEN
Z1=YT(1)-10.0
ELSE
!-----Si on a un U2 on regarde alors la valeur de Y(2) % YT(2) sinon on prend YT(2)
IF(INU.GT.1) THEN
IF(Y(2).LT.YT(2)) THEN
!---------------L'aspiration est dénoyé (pb mais on doit qd mm faire le calcul)
Z1=YT(2)
ELSE
!---------------L'aspiration est noyé (ok cas normal)
Z1=Y(2)
ENDIF
ELSE
Z1=YT(2)
ENDIF
ENDIF
ENDIF
!-----Calcul de la hauteur de refoulement - hauteur d'aspiration
!-----On néglige les V^2/2g à l'amont et à l'aval ainsi que les pertes de charges dans le dispositif
H=Z2-Z1
!-----Calcul de la puissance hydraulique nécessaire au refoulement
RHO=1
P=RHO*9.81*ABS(U(1))*H
!-----Stockage de la puissance max dans PMAX
IF(P.GT.PMAX) THEN
PMAX=P
WRITE(JREGS,810) 'POMPE ',INURE,' - Puissance maximum au temps T=',T,' : ',P,' Watts'
ENDIF
!-----Calcul de l'énergie totale consommée dans ETOT
ETOT=ETOT+P*DTU
IF(T.GE.TFIN) THEN
WRITE(JREGS,820) 'POMPE ',INURE,' - Energie totale consommée jusqu''au au temps T=',T,' : ',ETOT,' Joules'
ENDIF
!-----Possibilité de faire communiquer la pompe avec un autre emplacement (si INU>1)
IF(INU.GT.1) THEN
U(2)=-U(1)
ENDIF
!-----Sauvegarde des variables
PARA(11)=TLASTON
PARA(12)=TLASTOF
PARA(13)=PMAX
PARA(14)=ETOT
PARA(15)=NBNOW
800 FORMAT(A6,I2,A55,F12.2,A3,F14.3,A3,F14.3)
810 FORMAT(A6,I2,A55,F12.2,A3,F12.1,A6)
820 FORMAT(A6,I2,A55,F12.2,A3,E20.1,A7)
830 FORMAT(A6,I2,A55,F12.2,A3,F14.3,A3,F14.3,A5,F10.3,A4,F10.3)
END SUBROUTINE CPOMPESSi vous voulez un module de régulation de stations de pompage différent vous pouvez toujours copier cette routine dans un module USER et la modifier comme bon vous semble (dans ce cas faire aussi cela pour la routine LPOMPES -> LUSER pour la lecture des paramètres).
SUBROUTINE LPOMPES(CHAINE,Reg)
USE D_REGULATION, ONLY : Regulateur_t
USE SIRENE_parametres, ONLY : LONG
USE F1 , ONLY : IERROR,IWARN,CWARN
USE TEMPS , ONLY : TDEB
IMPLICIT NONE
CHARACTER, INTENT(IN) :: CHAINE*(*)
TYPE(Regulateur_t), INTENT(INOUT) :: Reg
REAL(KIND=LONG) :: TEMPOonoff,TEMPOoffon,TEMPOonon,TEMPOoffoff
INTEGER :: I
!-----Debut de la routine
!-----Lecture des parametres specifiques pour cette methode
!-----Debut de la routine
!-----En V 5.31e on passe à 10 paramètres
READ(CHAINE,'(9(F8.3,1X),F8.3)',ERR=10) (Reg%tPara(I),I=1,10)
TEMPOonoff=Reg%tPara(7)
TEMPOoffon=Reg%tPara(8)
TEMPOonon=Reg%tPara(9)
TEMPOoffoff=Reg%tPara(10)
Reg%tPara(11)=TDEB-MAX(TEMPOonoff,TEMPOonon) ! TLASTON
Reg%tPara(12)=TDEB-MAX(TEMPOoffon,TEMPOoffoff) ! TLASTOF
Reg%tPara(13)=0 ! Puissance
Reg%tPara(14)=0 ! Energie
Reg%tPara(15)=Reg%tPara(4) ! Nb de pompes actives en temps réel (NBNOW=NBINI)
RETURN
10 CONTINUE
IERROR=2
END SUBROUTINE LPOMPES