The POMPES method

This control method mimics the operation of a pumping station comprising a number of identical pumps which start or stop depending on a low or high water level and a time delay.

  1. SUBROUTINE CPOMPES(U,Y,YT,PARA)
  2.  
  3. USE D_GLOBAL, ONLY : REPSI
  4. USE SIRENE_parametres, ONLY : LONG
  5. USE TEMPS, ONLY : T,TDEB,TFIN
  6. USE IFICH, ONLY : JREGS
  7. USE P1, ONLY : INURE
  8. USE P2, ONLY : INU,INY,DTU
  9.  
  10. IMPLICIT NONE
  11.  
  12. REAL(KIND=LONG), INTENT(IN) :: Y,YT
  13. REAL(KIND=LONG), INTENT(INOUT) :: PARA, U
  14.  
  15. INTEGER :: NBMIN,NBINI,NBMAX,NBNOW
  16. REAL(KIND=LONG) :: ZH,ZB,Z1,Z2,Q,TLASTON,TLASTOF
  17. REAL(KIND=LONG) :: TEMPOonoff,TEMPOoffon,TEMPOonon,TEMPOoffoff
  18. REAL(KIND=LONG) :: RHO,P,H,PMAX,ETOT
  19. LOGICAL :: Bon,Boff
  20.  
  21. DIMENSION U(*),Y(*),YT(*),PARA(*)
  22. !-----Affectations
  23. ZH=PARA(1)
  24. ZB=PARA(2)
  25. NBMIN=INT(PARA(3))
  26. NBINI=INT(PARA(4))
  27. NBMAX=INT(PARA(5))
  28. Q=PARA(6)
  29. TEMPOonoff=PARA(7)
  30. TEMPOoffon=PARA(8)
  31. TEMPOonon=PARA(9)
  32. TEMPOoffoff=PARA(10)
  33. TLASTON=PARA(11)
  34. TLASTOF=PARA(12)
  35. PMAX=PARA(13)
  36. ETOT=PARA(14)
  37. NBNOW=PARA(15)
  38.  
  39. !-----Protection
  40. IF (Q.EQ.0.) RETURN
  41.  
  42. !-----Calcul des booléens pour savoir si on peut faire un on et/ou un off
  43. !-----en tenant compte des tempos. Par défaut on ne peut pas (=FALSE)
  44. Bon=.FALSE.
  45. Boff=.FALSE.
  46. IF(TLASTON<=TDEB.AND.TLASTOF<=TDEB) THEN
  47. !--On n'a rien fait encore donc on peut tout faire (on ou off)
  48. Bon=.TRUE.
  49. Boff=.TRUE.
  50. ELSEIF(TLASTON<=TDEB) THEN
  51. !--On a déjà fait un off mais pas encore un on
  52. IF((T-TLASTOF).GE.TEMPOoffon) Bon=.TRUE.
  53. IF((T-TLASTOF).GE.TEMPOoffoff) Boff=.TRUE.
  54. ELSEIF(TLASTOF<=TDEB) THEN
  55. !--On a déjà fait un on mais pas encore un off
  56. IF((T-TLASTON).GE.TEMPOonon) Bon=.TRUE.
  57. IF((T-TLASTON).GE.TEMPOonoff) Boff=.TRUE.
  58. ELSE
  59. !--On a déjà fait un on et un off
  60. IF(TLASTON<TLASTOF) THEN
  61. !--Le dernier réalisé est un off
  62. IF((T-TLASTOF).GE.TEMPOoffon) Bon=.TRUE.
  63. IF((T-TLASTOF).GE.TEMPOoffoff) Boff=.TRUE.
  64. ELSE
  65. !--Le dernier réalisé est un on (ou les 2 en mm temps mais pas possible)
  66. IF((T-TLASTON).GE.TEMPOonon) Bon=.TRUE.
  67. IF((T-TLASTON).GE.TEMPOonoff) Boff=.TRUE.
  68. ENDIF
  69. ENDIF
  70.  
  71. IF (Y(1).GT.ZH) THEN
  72. IF (Q.GT.0) THEN
  73. !--------Arret d'une pompe (alimentation) si possible si Q>0 (N>NBMIN et TEMPO)
  74. IF(NBNOW.GT.NBMIN.AND.Boff) THEN
  75. NBNOW=NBNOW-1
  76. TLASTOF=T
  77. WRITE(JREGS,830) 'POMPE ',INURE,' - Arret d''une pompe (alimentation) à T=',T,' : ',Y(1),' > ',ZH &
  78. ,' . U=',U(1),' -> ',NBNOW*Q
  79. ENDIF
  80. ELSE
  81. !--------Démarrage d'une pompe (extraction) si possible si Q<0 (N<NBMAX et TEMPO)
  82. IF(NBNOW.LT.NBMAX.AND.Bon) THEN
  83. NBNOW=NBNOW+1
  84. TLASTON=T
  85. WRITE(JREGS,830) 'POMPE ',INURE,' - Démarrage d''une pompe (extraction) à T=',T,' : ',Y(1),' > ',ZH &
  86. ,' . U=',U(1),' -> ',NBNOW*Q
  87. ENDIF
  88. ENDIF
  89. ELSEIF (Y(1).LT.ZB) THEN
  90. IF (Q.GT.0) THEN
  91. !--------Démarrage d'une pompe (alimentation) si possible si Q>0 (N<NBMAX et TEMPO)
  92. IF(NBNOW.LT.NBMAX.AND.Bon) THEN
  93. NBNOW=NBNOW+1
  94. TLASTON=T
  95. WRITE(JREGS,830) 'POMPE ',INURE,' - Démarrage d''une pompe (alimentation) à T=',T,' : ',Y(1),' < ',ZB &
  96. ,' . U=',U(1),' -> ',NBNOW*Q
  97. ENDIF
  98. ELSE
  99. !--------Arret d'une pompe (extraction) si possible si Q<0 (N>NBMIN et TEMPO)
  100. IF(NBNOW.GT.NBMIN.AND.Boff) THEN
  101. NBNOW=NBNOW-1
  102. TLASTOF=T
  103. WRITE(JREGS,830) 'POMPE ',INURE,' - Arret d''une pompe (extraction) à T=',T,' : ',Y(1),' < ',ZB &
  104. ,' . U=',U(1),' -> ',NBNOW*Q
  105. ENDIF
  106. ENDIF
  107. ENDIF
  108. !-----Affectation du débit dans la commande U
  109. U(1)=NBNOW*Q
  110. !-----Vérification des cotes de l'eau
  111. IF (Q.LT.0) THEN
  112. !-----Vérification de la cote de l'eau à l'aspiration (Q<0)
  113. !-----Récupération de la cote d'aspiration Z1 pour le calcul du gain de charge
  114. IF(Y(1).LT.YT(1)) THEN
  115. WRITE(JREGS,800) 'POMPE ',INURE,' - Cote de l''eau trop basse à l''aspiration au temps T=',T,' : ',Y(1),' < ',YT(1)
  116. Z1=YT(1)
  117. ELSE
  118. Z1=Y(1)
  119. ENDIF
  120. !-----Récupération de la cote de refoulement Z2 pour le calcul du gain de charge
  121. !-----Si on a un Y2, en option on prend YT(2), sinon on prend YT(1)+10m
  122. IF(INY.LT.2) THEN
  123. Z2=YT(1)+10.0
  124. ELSE
  125. !-----Si on a un U2 on regarde alors la valeur de Y(2) % YT(2) sinon on prend YT(2)
  126. IF(INU.GT.1) THEN
  127. IF(Y(2).LT.YT(2)) THEN
  128. !---------------Le refoulement est dénoyé
  129. Z2=YT(2)
  130. ELSE
  131. !---------------Le refoulement est noyé
  132. Z2=Y(2)
  133. ENDIF
  134. ELSE
  135. Z2=YT(2)
  136. ENDIF
  137. ENDIF
  138. ELSE
  139. !-----Vérification de la cote de l'eau au refoulement (Q>0)
  140. !-----Récupération de la cote de refoulement Z2 pour le calcul du gain de charge
  141. IF(Y(1).GT.YT(1)) THEN
  142. WRITE(JREGS,800) 'POMPE ',INURE,' - Cote de l''eau plus haute au refoulement au temps T= ',T,' : ',Y(1),' > ',YT(1)
  143. Z2=Y(1)
  144. ELSE
  145. Z2=YT(1)
  146. ENDIF
  147. !-----Récupération de la cote d'aspiration Z1 pour le calcul du gain de charge
  148. !-----Si on a un Y2, en option on prend YT(2), sinon on prend YT(1)-10m
  149. IF(INY.LT.2) THEN
  150. Z1=YT(1)-10.0
  151. ELSE
  152. !-----Si on a un U2 on regarde alors la valeur de Y(2) % YT(2) sinon on prend YT(2)
  153. IF(INU.GT.1) THEN
  154. IF(Y(2).LT.YT(2)) THEN
  155. !---------------L'aspiration est dénoyé (pb mais on doit qd mm faire le calcul)
  156. Z1=YT(2)
  157. ELSE
  158. !---------------L'aspiration est noyé (ok cas normal)
  159. Z1=Y(2)
  160. ENDIF
  161. ELSE
  162. Z1=YT(2)
  163. ENDIF
  164. ENDIF
  165. ENDIF
  166. !-----Calcul de la hauteur de refoulement - hauteur d'aspiration
  167. !-----On néglige les V^2/2g à l'amont et à l'aval ainsi que les pertes de charges dans le dispositif
  168. H=Z2-Z1
  169. !-----Calcul de la puissance hydraulique nécessaire au refoulement
  170. RHO=1
  171. P=RHO*9.81*ABS(U(1))*H
  172. !-----Stockage de la puissance max dans PMAX
  173. IF(P.GT.PMAX) THEN
  174. PMAX=P
  175. WRITE(JREGS,810) 'POMPE ',INURE,' - Puissance maximum au temps T=',T,' : ',P,' Watts'
  176. ENDIF
  177. !-----Calcul de l'énergie totale consommée dans ETOT
  178. ETOT=ETOT+P*DTU
  179. IF(T.GE.TFIN) THEN
  180. WRITE(JREGS,820) 'POMPE ',INURE,' - Energie totale consommée jusqu''au au temps T=',T,' : ',ETOT,' Joules'
  181. ENDIF
  182. !-----Possibilité de faire communiquer la pompe avec un autre emplacement (si INU>1)
  183. IF(INU.GT.1) THEN
  184. U(2)=-U(1)
  185. ENDIF
  186. !-----Sauvegarde des variables
  187. PARA(11)=TLASTON
  188. PARA(12)=TLASTOF
  189. PARA(13)=PMAX
  190. PARA(14)=ETOT
  191. PARA(15)=NBNOW
  192. 800 FORMAT(A6,I2,A55,F12.2,A3,F14.3,A3,F14.3)
  193. 810 FORMAT(A6,I2,A55,F12.2,A3,F12.1,A6)
  194. 820 FORMAT(A6,I2,A55,F12.2,A3,E20.1,A7)
  195. 830 FORMAT(A6,I2,A55,F12.2,A3,F14.3,A3,F14.3,A5,F10.3,A4,F10.3)
  196.  
  197. END SUBROUTINE CPOMPES

Download

If you want a different pumping station control module you can always copy this routine into a USER module and modify it as you wish (in this case, do this for the LPOMPES -> LUSER routine for parameter reading).

  1. SUBROUTINE LPOMPES(CHAINE,Reg)
  2. USE D_REGULATION, ONLY : Regulateur_t
  3. USE SIRENE_parametres, ONLY : LONG
  4. USE F1 , ONLY : IERROR,IWARN,CWARN
  5. USE TEMPS , ONLY : TDEB
  6.  
  7. IMPLICIT NONE
  8.  
  9. CHARACTER, INTENT(IN) :: CHAINE*(*)
  10. TYPE(Regulateur_t), INTENT(INOUT) :: Reg
  11.  
  12. REAL(KIND=LONG) :: TEMPOonoff,TEMPOoffon,TEMPOonon,TEMPOoffoff
  13. INTEGER :: I
  14.  
  15. !-----Debut de la routine
  16. !-----Lecture des parametres specifiques pour cette methode
  17.  
  18. !-----Debut de la routine
  19. !-----En V 5.31e on passe à 10 paramètres
  20. READ(CHAINE,'(9(F8.3,1X),F8.3)',ERR=10) (Reg%tPara(I),I=1,10)
  21. TEMPOonoff=Reg%tPara(7)
  22. TEMPOoffon=Reg%tPara(8)
  23. TEMPOonon=Reg%tPara(9)
  24. TEMPOoffoff=Reg%tPara(10)
  25. Reg%tPara(11)=TDEB-MAX(TEMPOonoff,TEMPOonon) ! TLASTON
  26. Reg%tPara(12)=TDEB-MAX(TEMPOoffon,TEMPOoffoff) ! TLASTOF
  27. Reg%tPara(13)=0 ! Puissance
  28. Reg%tPara(14)=0 ! Energie
  29. Reg%tPara(15)=Reg%tPara(4) ! Nb de pompes actives en temps réel (NBNOW=NBINI)
  30.  
  31. RETURN
  32. 10 CONTINUE
  33. IERROR=2
  34.  
  35. END SUBROUTINE LPOMPES

Download