Exemple de routine de calcul CPID

La méthode PID correspond à un PID classique, avec filtre éventuel sur le terme dérivé, antiwindup et bande morte. Il est programmé de la manière suivante :

  1. SUBROUTINE CPID(Reg)
  2. USE SIRENE_parametres, ONLY : LONG
  3. USE TEMPS , ONLY : T
  4. USE D_REGULATION, ONLY : Regulateur_t
  5.  
  6. IMPLICIT NONE
  7.  
  8. TYPE(Regulateur_t), INTENT(INOUT) :: Reg
  9.  
  10. REAL(KIND=LONG), POINTER :: KP,N,TI,TD,AWU,EOLD,SE,DE
  11. REAL(KIND=LONG) :: E,STI,A1,A2,U2
  12.  
  13. LOGICAL SATURE !< Détection de l'anti wind-up
  14. INTEGER :: iU !< Compteur pour les commandes U
  15.  
  16. ! Pointeurs pour faciliter la lecture du code
  17. KP=>Reg%tPara(1)
  18. TI=>Reg%tPara(2)
  19. TD=>Reg%tPara(3)
  20. N=>Reg%tPara(4)
  21. AWU=>Reg%tPara(5)
  22. EOLD=>Reg%tPara(6)
  23. SE=>Reg%tPara(7)
  24. DE=>Reg%tPara(8)
  25.  
  26. ! Calcul pour cette methode
  27. ! Nouvel ecart (e = y* - y)
  28. E=Reg%tY(1)%YTVal-Reg%tY(1)%VarY%V
  29. ! On gère une bande morte (POM 21/07/04)
  30. IF(ABS(E).LT.Reg%tY(IY)%DYMax) THEN
  31. E=0.
  32. ENDIF
  33.  
  34. ! Terme integral (approximation de Tustin)
  35. IF(TI.NE.0.) THEN
  36. STI=KP*Reg%tU(1)%VarU%DT/TI*(EOLD+E)/2
  37. ELSE
  38. STI=0.
  39. ENDIF
  40. ! On gère l'antiwindup en utilisant le code de blocage du filtre de la commande :
  41. !> 0 = Fonctionnement libre normal
  42. !> 1 = Caractéristique volontairement bloquée (Valeur calée par Umin>=Umax à la lecture du XML)
  43. !> 2 = Caractéristique bloquée par problème de régulation (Umin, Umax, surverse, hors-loi vanne mixte)
  44. !> 3 = FiltreU => Umin atteint
  45. !> 4 = FiltreU => Umax atteint
  46. !> 5 = FiltreU => DUmin atteint
  47. !> 6 = FiltreU => DUmav atteint
  48. SATURE=Reg%tU(1)%FiltreU%iFlagBloc>=3 .AND. Reg%tU(1)%FiltreU%iFlagBloc/=5
  49. IF(AWU == 0. .OR. .NOT.SATURE) THEN
  50. SE=SE+STI
  51. ENDIF
  52.  
  53. ! Terme derive
  54. IF(TD.NE.0.) THEN
  55. IF(N.EQ.0.) THEN
  56. ! Terme derive sans filtre (backward difference)
  57. ! Avec une consigne y* constante
  58. DE=KP/Reg%tU(1)%VarU%DT*TD*(E-EOLD)
  59. ELSE
  60. ! Terme derive avec filtre (backward difference)
  61. ! Avec une consigne y* constante
  62. A1=1/(1+N*Reg%tU(1)%VarU%DT/TD)
  63. A2=KP*N*A1
  64. DE=A1*DE+A2*(E-EOLD)
  65. ENDIF
  66. ENDIF
  67.  
  68. ! Calcul de la commande
  69. Reg%tU(1)%VarU%V=KP*E+SE+DE
  70. ! Ancien ecart
  71. EOLD=E
  72. ! Si plusieurs U (SIMO) on duplique la meme ouverture
  73. ! (interessant dans le cas de plusieurs vannes identiques en parallele, en mode V par exemple)
  74. DO iU=1, Reg%nbrU
  75. Reg%tU(iU)%VarU%V = Reg%tU(1)%VarU%V
  76. ENDDO
  77.  
  78. END SUBROUTINE CPID

Télécharger

Si vous voulez un PID 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 LPID -> LUSER pour la lecture des paramètres)