Algorithme PID: comment tenir compte des changements rapides de valeur d'entrée après un long délai

15

J'essaie d'implémenter un algorithme PID de base sur un Arduino Leonardo pour mélanger l'eau du robinet chaude et froide à l'aide de vannes asservies. Le but est de maintenir la température aussi près que possible d'une consigne. Il est particulièrement important d'empêcher la température de sortie de dépasser le point de consigne pour protéger l'utilisateur contre les brûlures. Il est également important d'obtenir la température près du point de consigne le plus rapidement possible.

Pour les petits changements de température, une implémentation standard de l'algorithme PID semble fonctionner correctement. Mais je ne sais pas comment tenir compte des longs retards qui peuvent survenir en attendant que l'eau chaude atteigne la vanne, car ces retards sont beaucoup plus longs que les retards standard après avoir changé les positions de la vanne.

Évidemment, en fonction de la longueur de la conduite d'eau chaude et du temps écoulé depuis la dernière utilisation d'eau chaude, cela peut prendre plusieurs dizaines de secondes pour que l'eau chaude atteigne la vanne, donc pendant ce temps, la température de l'eau reste assez constante à basse température. et la vanne d'eau chaude s'ouvre bientôt à 100%. Le composant intégral commence à accumuler une grande valeur d'erreur.

Lorsque l'eau chaude atteint enfin la vanne, la température détectée augmente très rapidement jusqu'à la température maximale de l'eau chaude. En raison de la grande erreur intégrale, la vanne d'eau chaude est maintenue à 100% pendant longtemps après que la température dépasse le point de consigne, en raison de l'attente de la valeur intégrale réduite à des niveaux normaux. Ainsi, le résultat est une eau à température maximale pendant plusieurs (dizaines) de secondes.

Je ne sais pas comment expliquer ce retard possible . Dans un tel cas, serait-il sage de fixer une borne supérieure (et inférieure) sur la valeur d'erreur intégrale, afin de limiter le temps de réponse maximum? Cela semble aller à l'encontre de l'objectif de la composante intégrale et imposerait également un certain retard après avoir atteint le point de consigne.

Ou existe-t-il une meilleure façon de gérer les changements d'entrée rapides après un long délai?

Merci pour tout conseil!

Ryan Griggs
la source
1
En fait, je me demande si vous avez besoin de l'action I, car je pense que les changements de température de l'eau sont relativement lents par rapport à l'actionnement de la vanne. Pire encore, vous pourriez obtenir un comportement oscillatoire en raison de la marge de phase extrêmement faible que vous obtiendrez probablement (votre système peut être stable en théorie, mais peut ne jamais cesser d'osciller en pratique, car l'action I ajoute un retard de phase). De plus, parce que vous brûlerez peut-être des gens, je ne saurais trop insister pour jeter un coup d'œil aux commentaires de Chu et JonRB!
Sanchises

Réponses:

15

Votre problème s'appelle Integral Windup , c'est un problème de contrôle commun. Dans une région non linéaire ou autrement délimitée, le contrôleur ne peut pas suivre le point de consigne et l'intégrale augmente à une valeur élevée. Cela provoque un grand dépassement lorsque le point de consigne est finalement atteint, ce qui est exactement ce que vous avez déduit du problème.

La solution la plus simple consiste à limiter la valeur de l' intégrateur lui-même à un maximum raisonnable. Limiter la contribution intégrale ne fonctionnera pas aussi bien, car l'intégrateur sera toujours liquidé à une valeur importante.

Mathworks a une page avec quelques autres solutions à la liquidation intégrale.

Dans un contrôleur PID, vous voulez généralement aussi peu de termes intégraux que possible. Dans une vanne de régulation de température mécanique standard, seule une régulation proportionnelle est utilisée et fonctionne correctement. Gardez le terme intégral aussi petit que possible - l'utilisateur ne remarquera pas une petite erreur dans la température finale. Vous pourriez constater que vous obtenez des performances acceptables avec seulement PD.

Comme il s'agit d'un cas connu très spécial, vous pourriez envisager d'avoir un mode différent pour le contrôleur. Mesurer la température d'entrée chaude, et pendant qu'elle est inférieure au point de consigne, il suffit de faire fonctionner 100% à chaud, 20% à froid. Quand il se réchauffe, passez au PID, avec de bonnes conditions initiales.

tomnexus
la source
1
Oui. Idéalement, vous pouvez mesurer la température d'entrée chaude indépendamment et inhiber ainsi la remontée.
Brian Drummond,
2
La liquidation peut être un problème, mais si l'intégrateur n'était pas implémenté, par exemple, l'effet déstabilisateur du retard persisterait. Smith Predictor est une bonne méthode pour atténuer les effets d'un délai pur. La résolution de la liquidation de l'intégrateur à elle seule ne résout en rien le retard de phase inhérent introduit par le retard.
Chu
2
exactement, je ne pense pas que ce soit une liquidation purement intégrateur, même si c'est ça. c'est une préoccupation valable qui devrait toujours être atténuée pour MÊME si les opérations normales n'atteignent pas les conditions nécessaires
JonRB
Wow, bonne réponse! Je pensais dans ce sens (en limitant la valeur maximale de l'intégrateur) mais je n'ai pas formulé correctement la question, j'ai donc été mal compris. C'est bon de voir que je suis au moins dans le stade avec une solution. Je pense que la solution la plus simple serait de désactiver le facteur "I" jusqu'à ce que la température atteigne une plage contrôlable. Cela permettrait une réponse très rapide aux changements. Ensuite, lorsque nous voyons un changement de température réel et que nous nous rapprochons du résultat souhaité, réactivez l'intégrale pour ajouter la poussée supplémentaire nécessaire. Merci pour une réponse détaillée!
Ryan Griggs
Mais le terme intégral n'est pas là pour l'accélérer, il est là pour corriger une erreur systématique, en particulier un coefficient proportionnel qui n'est pas tout à fait correct. Non? Et dans cette situation, le P coef. ne peut pas être parfait tout le temps car il varie en fonction de la pression de l'eau dans les deux tuyaux.
Roman Starkov
4

La clé pour contrôler efficacement ce processus est de réaliser que les robinets chaud et froid ne fonctionnent pas de manière symétrique, et tout algorithme optimal doit en tenir compte.

Lorsque vous n'utilisez pas l'eau chaude pendant un certain temps, elle se refroidit dans le tuyau.

Lorsque vous n'utilisez pas l'eau froide pendant un certain temps, elle reste la même que jamais (sauf si l'eau froide provient d'un réservoir d'eau froide avec un refroidisseur, ce qui serait génial d'avoir les jours chauds d'été, mais je suis les paris sont assez rares en pratique).

Ainsi, nous supposons que nous ne savons pas ce que nous obtenons du tuyau d'eau chaude, mais nous pouvons dépendre du fait que le tuyau d'eau froide est à peu près constant tout au long d'une analyse.

Ainsi, à partir de la température de l'eau mélangée, de la connaissance du réglage de la vanne et d'une estimation de la température de l'eau froide, nous pouvons estimer la chaleur de l'eau provenant actuellement de la conduite d'eau chaude. Ensuite, vous pouvez régler la vanne pour obtenir la température de sortie correcte sans PID, simplement en fonction de l'évaluation d'une formule thermodynamique.

Pour obtenir "l'estimation de la température de l'eau froide", vous pouvez faire couler de l'eau froide pendant une courte période (quelques secondes peut-être) au début du cycle et lire la température. Supposez ensuite que cela ne changera pas par la suite, car vous n'avez pas suffisamment de données à résoudre pour les deux températures.

Ce schéma ne sera pas parfaitement précis, mais j'estime qu'il parviendra de manière fiable dans le stade sans la possibilité d'un dépassement drastique. Ensuite, vous exécutez PID au-dessus de ce schéma pour affiner les résultats, mais limitez la modification du paramètre de vanne que PID est autorisé à produire. Et éventuellement réinitialiser l'état PID lorsque vous avez des changements importants dans la température d'entrée de l'eau chaude.

Des solutions plus sophistiquées sont possibles avec plusieurs capteurs de température.

Atsby
la source
Une autre excellente réponse - sortir des sentiers battus PID. J'avais envisagé de simplement tester les températures de l'eau et de créer une sorte de table de recherche avec des positions approximatives des vannes pour produire la température de sortie souhaitée. Vous avez raison de dire que le froid est relativement constant, mais peut-être plus froid en hiver. Les conduites d'eau sont enterrées à environ 24 à 36 pouces et nous avons généralement des températures douces ici. Ensuite, je pourrais également tenir compte de la température maximale de sortie d'eau chaude (environ 120 F) et créer une table de recherche qui positionne les vannes de manière appropriée, en utilisant le PID pour un réglage fin après le préchauffage.
Ryan Griggs
1
L'eau de puits peut rester très fraîche même pendant les étés chauds selon la profondeur / la source. L'eau "froide" qui repose dans les tuyaux de la maison est plus chaude que celle qui sera pompée par le bas. Ainsi, l'eau froide devient plus froide à l'usage (jusqu'à ce qu'elle approche de la température de l'eau souterraine). Je suis toujours "surpris" quand je vais dans la "grande ville" et que l'eau froide ne refroidit jamais.
rickhg12hs
2

Je voulais juste ajouter un détail aux belles réponses ci-dessus sur ce que les ingénieurs de contrôle font pour les possibilités de liquidation intégrale. Cela se produit également dans de nombreux processus industriels et c'est un art plutôt qu'une science.

Il y a des actions classiques contre cela sans sacrifier le gain intégral qui pourrait être vraiment requis pour la spécification de performance.

  1. Chaque fois que vous franchissez le niveau d'erreur zéro, vous réinitialisez l'intégrateur. Cela fait de l'intégrateur un élément non linéaire de type intégrateur à la demande au lieu d'un accumulateur aveugle.

  2. Vous connectez essentiellement le bloc d'entrée d'action intégrale à un élément indicatif de la boucle. Cela peut être soit la sortie de l'intégrateur pour juger s'il a commencé la construction (ce qui nécessite une compréhension du processus pour faire le bon jugement). Ou vous vérifiez si vos actionneurs sont saturés ou non et formez une boucle de rétroaction basée sur ces informations. J'ai juste choisi au hasard le premier lien qui est sorti de google et à la fin de cette vidéo il y a une explication graphique de mon dernier point. https://www.youtube.com/watch?v=H4YlL3rZaNw

percusse
la source
Bons points, merci d'avoir développé l'idée. Merci pour la vidéo, cela explique très bien le problème.
tomnexus
1

Parfois, il peut être utile d'avoir plusieurs ensembles de paramètres PID, pour les étapes à granularité grossière de la plage de fonctionnement du système, que vous modifiez à la volée lorsque le système passe d'une étape de comportement à une autre. Par exemple, un ensemble de Kp, Ki et Kd lorsque vous ouvrez le robinet chaud et que vous obtenez uniquement de l'eau froide; puis une fois que vous commencez à voir la température monter, passez à un autre ensemble de Kp, Ki & Kd. Réglez ensuite les deux en conséquence.

Utilisez-vous la bibliothèque PID dans l'Arduino Playground de Brett Beauregard? Celui-ci est assez sympa. Et il y a aussi un exemple «adaptatif» de cela.

Techydude
la source
Merci pour les suggestions. N'utilisant pas la bibliothèque pid, je l'ai écrite moi-même pour en savoir plus sur son fonctionnement.
Ryan Griggs
Avez-vous envisagé de faire avancer les choses? C'est comme si des changements rapides affectaient la sortie via la boucle ouverte, vous n'attendez donc pas la boucle fermée pour réagir.
Gregory Kornblum
J'essaie de comprendre comment le "feed forward" fonctionnerait dans ce cas. L'entrée serait-elle la température souhaitée et la sortie placerait-elle les vannes dans une position prédéterminée (comme indiqué dans mon autre commentaire ci-dessus) à l'aide d'une table de recherche ou d'une équation simple?
Ryan Griggs
Vous pouvez utiliser feedforward en plus de vos commentaires (PID en boucle fermée). Vous ajoutez simplement l'action du contrôleur de rétroaction à l'action du contrôleur de feedforward. Idéalement, le contrôleur à action directe serait un modèle inverse de la vanne. Feedforward vous donne essentiellement une action instantanée sur un changement de point de consigne. Même avec feedforward plus feedback, vous devez toujours tenir compte de la liquidation dans le compensateur de contrôle de rétroaction. Le composant feedback doit être pris en compte.
docscience
1

Avez-vous modélisé le système?

Avez-vous des données temporelles montrant le dépassement - en particulier la fréquence

Ce sont deux questions qui doivent être posées avec toute requête basée sur un contrôle.

D'après ce que vous avez décrit, votre gain intégral est trop élevé, beaucoup trop élevé. Cela pourrait être dû à la liquidation de l'intégrateur: le code affiché présente de réelles préoccupations pratiques, dont l'une n'est pas le plus grand des intégrateurs discrets

  • Topologie d'intégrateur discret très médiocre
  • Pas de pinces / limites non plus sur la sortie I et encore moins sur la sortie P + I

Cela pourrait également être dû au fait qu'il est très élevé et qu'il faut du temps pour diminuer.

Alors oui, la valeur stockée dans le registre I aurait pu se résumer à dire ... 1000C parce que le P + I n'était pas réglé sur la réponse du système et qu'il devait ensuite baisser.

La première chose que je ferais serait de capturer des données en temps réel pour le post-traitement. Ensuite, je lancerais P-only et m'assurerais que le gain proportionnel atteigne PRESQUE la température souhaitée (la théorie du contrôle dit que ce ne sera pas le cas). Le selon que

  1. Analyse des données de capture actuelles facilitant la détermination du gain I approprié
  2. Un modèle de plante est dérivé pour créer des gains appropriés

Je commencerais par changer le code PID pour être une meilleure implémentation, puis ajouterais un petit peu de I, juste pour prouver un point.

Vous devez vraiment déterminer à quoi ces gains sont destinés. L'entrée est la température, la sortie est ... le débit? il devrait donc y avoir un transfert de flux / C et une fonction de transfert de Flow / Cs.

JonRB
la source
Bonne réponse aussi, merci. Je n'ai pas modélisé le système, car je ne sais pas encore comment - je commence juste à me mouiller les pieds dans cette étude. Vous avez raison de dire que la valeur I augmente hors des limites raisonnables. Pouvez-vous me diriger vers un meilleur algorithme d'implémentation pour l'intégrateur? Le pseudocode est le meilleur, car il me permet d'apprendre et de mettre le code dans mes propres mots, plutôt que de copier / coller. Pouvez-vous également me diriger vers des introductions à la modélisation de systèmes simples comme celui-ci? Vous avez raison de dire que les niveaux de débit (mélange chaud et froid) sont les sorties de ce système. Actuellement, c'est juste H / C inversement proportionnel.
Ryan Griggs
1
Je
1

Une façon que j'aime résoudre la liquidation intégrale est d' arrêter d'accumuler l'erreur chaque fois que votre sortie de contrôle est à sa déflexion maximale . Ou redimensionnez-la en vous éloignant de la déflexion maximale. Donc, chaque fois que votre contrôleur génère "eau chaude 100%, eau froide 0%", n'accumulez simplement pas l'erreur, mais ne la remettez pas à zéro non plus.

Je n'aime pas limiter l'intégrale à un maximum car il y a alors une limite à l'erreur systématique que votre PID peut compenser.

Je suggérerais également qu'au lieu de créer un PID "stupide" qui n'a qu'un seul paramètre qu'il essaie de contrôler sans connaître le système sous-jacent, vous installez deux capteurs de température supplémentaires, à la fois sur l'entrée chaude et froide. Vous essayez ensuite de trouver une fonction qui se rapproche de la position souhaitée en fonction des températures d'entrée, et vous utilisez uniquement la boucle PID pour régler l' erreur de sortie de cette fonction.

L'erreur sera importante car vous ne mesurez pas le débit (enfin, sauf si vous le faites bien sûr), ce qui dépend non seulement des positions des vannes (connues) mais aussi de la pression de l'eau (inconnue).

Pourtant, cela devrait aider beaucoup avec le problème de l'eau chaude atteignant enfin le robinet car dans une boucle PID bien amortie, vous devez vous fier à l'élément D bien calibré pour réduire rapidement le flux chaud. D'après mon expérience, obtenir le coefficient dérivé correct est généralement le plus difficile. Mais si vous aviez les deux capteurs supplémentaires, la sortie principale changerait exactement aussi rapidement que la température d'entrée de l'eau, donc essentiellement instantanée, sans aucun besoin de l'élément dérivé.

Roman Starkov
la source