Les méthodes USER1 à USER9
Les méthodes USER1 à USER9 permettent d’écrire des nouveaux modules de régulation directement en langage FORTRAN. Elles se programment d’une manière similaire à la routine CPID. Ces méthodes nécessite une compilation d’un module USER avec le compilateur Microsoft Digital 6.1 ou ultérieur ou avec le compilateur Intel 10 ou supérieur (compilation en 32 bits), et une nouvelle édition de lien avec le linkeur associé. Un module programmé en FORTRAN et compilé est beaucoup plus rapide qu’avec un lien DDE MatLab ou un module WDLANG.
Pour écrire ce module on peut s’inspirer du module PID. On peut imaginer que l’on met au point une méthode grâce à la méthode MATLAB et une fois qu’elle est mise au point et testée on l’intègre au logiciel SIC par la méthode USER1 (ou USER2 à USER9) pour gagner en rapidité d’exécution.
On peut programmer jusqu’à 9 modules de régulation en utilisant les méthodes USER1 à USER9. Pour chacune, on dispose de 3 routines à renseigner éventuellement dans le fichier REGUSER.FOR :
!=================================================== !> Routine de supervision du module de régulation USER1 !=================================================== SUBROUTINE SUSER1(Reg) IMPLICIT NONE TYPE(Regulateur_t), INTENT(INOUT) :: Reg END SUBROUTINE SUSER1 !===================================================!> Lecture des parametres specifiques pour la methode USER1 !=================================================== SUBROUTINE LUSER1(CHAINE,Reg) USE SIRENE_Parametres, ONLY : LONG ! USE F1 , ONLY : IERROR IMPLICIT NONE CHARACTER, INTENT(IN) :: CHAINE*(*) TYPE(Regulateur_t), INTENT(INOUT) :: Reg !-----Exemple de lecture d'un reel sur une ligne PS=12. par exemple !-----Cette valeur est mise dans PARA pour une utilisation future dans !-----le regulateur correspondant. Le vecteur PARA est en effet !-----transmis a CUSER1. !-----A maximum of $NBPA parameters can be read and stored in the PARA !-----array variable. If you need more than $NBPA parameters, you must !-----store them in another common. ! READ (CHAINE,'(F3.0)',ERR=100) Reg%tPara(1) Reg%tPara(1)=0. ! RETURN ! 100 CONTINUE ! IERROR=2 END SUBROUTINE LUSER1 !=================================================== !> Calcul de la commande U a partir des données du régulateur (variables !> controllees Y, consignes correspondantes YT et variables mesurees Z !=================================================== SUBROUTINE CUSER1(Reg) USE SIRENE_Parametres, ONLY : LONG IMPLICIT NONE !> Régulateur (Voir structure Regulateur_t dans le source FLUXML, module D_REGULATION) TYPE(Regulateur_t), INTENT(INOUT) :: Reg !-----Exemple d'utilisation de CUSER1 pour imprimer des variables sur !-----le fichier .LST !-----Exemple de calcul de la premiere composante U(1) IF (Reg%tZ(1)%V > 0.) THEN Reg%tU(1)%VarU%V = Reg%tPara(1) * (Reg%tY(1)%VarY%V - Reg%tY(1)%YTVal) ELSE Reg%tU(1)%VarU%V = Reg%tPara(2) * (Reg%tY(1)%VarY%V - Reg%tY(1)%YTVal) ENDIF Reg%tU(1)%VarU%V = 0. END SUBROUTINE CUSER1
La routine SUSER1 est une routine de supervision appelée à chaque pas de temps. Elle permet éventuellement de changer les paramètres d’un module de régulation, de type de méthode, etc.
La routine LUSER1(CHAINE,PARA) est appelée uniquement en début de programme, au temps initial. Elle est appelée pour chaque ligne de paramètres spécifiques du régulateur. Elle permet de lire les paramètres spécifiques de la méthode USER1, dans la chaîne de caractère CHAINE située à la suite d’un code "PS=". Si plusieurs lignes "PS=" doivent être lues il faut donc gérer un compteur de ligne dans cette routine LUSER1, permettant de lire des variables différentes dans différentes lignes. Ce compteur iLignePS
est géré et founit dans le module D_REGULATION
. Le vecteur PARA est dimensionné à 50 (ce nombre était limité à 10, 20 ou 22 paramètres dans d’anciennes versions de SIC), ce qui signifie qu’un maximum de 50 paramètres peuvent être lus et stockés par cette routine de lecture pour chaque régulateur. Si vous voulez lire et stocker plus de 50 paramètres il faut créer de nouvelles variables en tête du module USER
.
La routine CUSER1 est une routine de régulation appelée à chaque pas de temps de régulation (DTU), après la routine de supervision SUSER1. Elle permet de calculer les Reg%nbrU
variables de contrôle Reg%tU(:)%VarU%V
à partir des Reg%nbrY
variables contrôlées Reg%tY(:)%VarY%V
, des Reg%nbrZ
consignes correspondantes Reg%tY(:)%YTVal
, des variables mesurées Reg%tZ(:)%V
et des paramètres placés dans le tableau Reg%tPara( :).