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.

  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

Télécharger

Si 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).

  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

Télécharger