Les régulateurs _PID¶
Le _PID implémente une régulation proportionnelle, intégrale et dérivée : il calcule en
continu une commande de sortie pour amener une mesure vers une consigne.
Typiquement : piloter une vanne de mélange pour tenir une température de départ de chauffage, ou moduler la vitesse d'un circulateur.
Une action, pas un objet à déclarer¶
Contrairement aux autres types, _PID ne se déclare pas avec #define. Il s'écrit
directement comme une action, dans la partie droite d'une règle :
- CONDITION -> _PID( input=MESURE, consigne=CONSIGNE,
kp=KP, ki=KI, kd=KD,
min=SORTIE_MIN, max=SORTIE_MAX,
output=COMMANDE );
Le calcul n'est effectué que pendant les tours où la condition est vraie.
Options¶
Toutes les options désignent obligatoirement des registres (_R).
| Option | Rôle |
|---|---|
input |
Registre portant la mesure |
consigne |
Registre portant la valeur visée |
kp |
Registre portant le gain proportionnel |
ki |
Registre portant le gain intégral |
kd |
Registre portant le gain dérivé |
min |
Registre bornant la sortie par le bas |
max |
Registre bornant la sortie par le haut |
output |
Registre recevant la commande calculée |
reset |
reset=1 : remet à zéro l'état interne du régulateur |
Tous les paramètres doivent être des registres
Une valeur littérale est refusée à la compilation : PID : kp must be R.
Déclarez un registre, même pour un gain constant.
Exemple complet¶
#define TEMP_DEPART <-> _R(libelle="Température de départ mesurée", unite="°C");
#define TEMP_CONSIGNE <-> _R(libelle="Consigne de départ", unite="°C", rw);
#define PID_KP <-> _R(libelle="Gain proportionnel", rw);
#define PID_KI <-> _R(libelle="Gain intégral", rw);
#define PID_KD <-> _R(libelle="Gain dérivé", rw);
#define PID_MIN <-> _R(libelle="Ouverture minimale", unite="%");
#define PID_MAX <-> _R(libelle="Ouverture maximale", unite="%");
#define VANNE <-> _R(libelle="Ouverture de la vanne", unite="%");
#define AO_VANNE <-> _AO(libelle="Commande vanne 0-10V");
#define REGULATION_ACTIVE <-> _B(libelle="Régulation en service");
/* Initialisation des gains au démarrage */
- _START -> PID_KP = 2.0, PID_KI = 0.05, PID_KD = 0.0,
PID_MIN = 0.0, PID_MAX = 100.0;
/* Calcul du PID tant que la régulation est active */
- REGULATION_ACTIVE -> _PID( input=TEMP_DEPART, consigne=TEMP_CONSIGNE,
kp=PID_KP, ki=PID_KI, kd=PID_KD,
min=PID_MIN, max=PID_MAX,
output=VANNE );
/* Report sur la sortie analogique */
- REGULATION_ACTIVE -> AO_VANNE = VANNE;
/* Remise à zéro de l'intégrale quand la régulation est coupée */
- /REGULATION_ACTIVE -> _PID( reset=1, input=TEMP_DEPART );
Le reset, un réflexe à prendre¶
L'intégrateur accumule l'écart entre mesure et consigne. Si la régulation est coupée pendant que l'écart persiste, cette accumulation continue de vivre et provoquera un à-coup au redémarrage — c'est l'effet dit d'emballement de l'intégrale.
Remettez toujours le PID à zéro quand vous le désactivez
- /REGULATION_ACTIVE -> _PID( reset=1, input=MESURE );
Faites de même après un changement brutal de consigne ou un passage en manuel.
Régler les gains¶
Une méthode pragmatique, dans cet ordre :
ki = 0,kd = 0. Augmenterkpjusqu'à obtenir une réaction franche sans oscillation entretenue. Un écart résiduel permanent subsiste : c'est normal.- Introduire
kipar petites valeurs, jusqu'à ce que l'écart résiduel disparaisse en quelques minutes. Trop dekiprovoque un dépassement puis des oscillations lentes. kdreste souvent à zéro. Sur des grandeurs thermiques bruitées, le terme dérivé amplifie le bruit plus qu'il n'aide.
Déclarez les gains en rw
Avec l'option rw, les registres de gains sont modifiables depuis un synoptique.
Vous réglez la boucle en observant la réponse réelle, sans recompiler le module.
Bornage¶
min et max ne sont pas des garde-fous cosmétiques : ils définissent la plage physique de
l'actionneur. Une sortie bornée protège l'équipement et limite l'emballement de l'intégrale.
Pour une vanne : min = 0, max = 100.
Pour un circulateur à vitesse minimale imposée : min = 30.
Diagnostic¶
| Symptôme | Cause probable | Correction |
|---|---|---|
| La sortie oscille rapidement | kp trop élevé |
Diviser kp par deux |
| La sortie oscille lentement, avec dépassement | ki trop élevé |
Réduire ki |
| L'écart ne se résorbe jamais | ki nul ou trop faible |
Augmenter ki |
| À-coup au redémarrage de la régulation | Intégrale non remise à zéro | Ajouter la règle de reset |
La sortie reste collée à max |
Consigne inatteignable, ou mesure erronée | Vérifier le capteur et le mapping |
PID : input must be R. à la compilation |
Une option pointe sur autre chose qu'un registre | Déclarer un _R |