Algoritmo PID: cómo tener en cuenta los cambios rápidos del valor de entrada después de un retraso prolongado

Estoy tratando de implementar un algoritmo PID básico en un Arduino Leonardo para mezclar agua del grifo caliente y fría usando válvulas servocontroladas. El objetivo es mantener la temperatura lo más cerca posible de un punto de ajuste. Es especialmente importante evitar que la temperatura de salida supere el punto de ajuste para proteger al usuario de quemaduras. Secundariamente importante es lograr que la temperatura se acerque al punto de ajuste lo más rápido posible.

Para pequeños cambios de temperatura, una implementación estándar del algoritmo PID parece funcionar bien. Pero no sé cómo explicar los largos retrasos que pueden ocurrir cuando se espera que el agua caliente llegue a la válvula, ya que estos retrasos son mucho más largos que los retrasos estándar después de cambiar las posiciones de la válvula.

Obviamente, dependiendo de la longitud de la línea de agua caliente y el tiempo transcurrido desde el último uso de agua caliente, el agua caliente puede tardar varias decenas de segundos en llegar a la válvula, por lo que durante este tiempo, la temperatura del agua permanece bastante constante a una temperatura baja. y la válvula de agua caliente pronto se abre al 100%. El componente integral comienza a acumular un gran valor de error.

Cuando el agua caliente finalmente llega a la válvula, la temperatura detectada aumenta muy rápidamente hasta la temperatura máxima del agua caliente. Debido al gran error integral, la válvula de agua caliente se mantiene al 100 % durante mucho tiempo después de que la temperatura exceda el punto de referencia, debido a la espera de que el valor integral se reduzca a los niveles normales. Así, el resultado es agua a temperatura máxima durante varias (decenas) de segundos.

No estoy seguro de cómo explicar este posible retraso prolongado. En tal caso, ¿sería prudente establecer un límite superior (e inferior) en el valor del error integral para limitar el tiempo de respuesta máximo? Esto parece anular el propósito del componente integral y también impondría cierto retraso después de alcanzar el punto de ajuste.

¿O hay una mejor manera de manejar cambios de entrada rápidos después de un retraso prolongado?

¡Gracias por cualquier consejo!

De hecho, me pregunto si necesita la acción I, porque creo que los cambios de temperatura del agua son relativamente lentos en comparación con el accionamiento de la válvula. Peor aún, es posible que obtenga un comportamiento oscilatorio debido al margen de fase extremadamente pobre que probablemente obtenga (su sistema puede ser estable en teoría, pero es posible que nunca deje de oscilar en la práctica, porque I-action agrega retraso de fase). Además, debido a que posiblemente quemarás a la gente, ¡no puedo enfatizar lo suficiente como para echar un vistazo a los comentarios de Chu y JonRB!

Respuestas (6)

Su problema se llama Integral Windup , es un problema de control común. En una región no lineal o limitada de otro modo, el controlador no puede rastrear el punto de referencia y la integral aumenta a un valor grande. Esto provoca un gran sobreimpulso cuando finalmente se alcanza el punto de ajuste, que es exactamente lo que ha deducido que es el problema.

La solución más simple es limitar el propio valor del integrador a un máximo razonable. Limitar la contribución integral no funcionará tan bien, porque el integrador aún tendrá un gran valor.

Mathworks tiene una página con algunas otras soluciones para la liquidación integral.

En un controlador PID, generalmente desea el menor término integral posible. En una válvula de control de temperatura mecánica estándar, solo se usa el control proporcional y funcionan bien. Mantenga el término integral lo más pequeño posible: el usuario no notará un pequeño error en la temperatura final. Es posible que descubra que obtiene un rendimiento aceptable solo con PD.

Como este es un caso conocido muy especial, podría considerar tener un modo diferente para el controlador. Mida la temperatura de entrada de agua caliente y, mientras esté por debajo del punto de referencia, simplemente ejecute caliente al 100 %, fría al 20 %. Cuando se caliente, cambie al PID, con buenas condiciones iniciales.

Sí. Idealmente, puede medir la temperatura de entrada en caliente de forma independiente e inhibir el enrollamiento de esa manera.
La liquidación puede ser un problema, pero si el integrador no se implementara, por ejemplo, el efecto desestabilizador de la demora aún persistiría. Smith Predictor es un buen método para mitigar los efectos de un retraso de tiempo puro. Abordar la liquidación del integrador por sí solo no hace nada para superar el retraso de fase inherente introducido por el retraso de tiempo.
exactamente, no creo que esto sea puramente una liquidación del integrador, incluso si es eso. es una preocupación válida que siempre debe mitigarse INCLUSO si las operaciones normales no alcanzan las condiciones necesarias
¡Guau, gran respuesta! Estaba pensando en esta línea (limitando el valor máximo del integrador) pero no formulé la pregunta correctamente, por lo que no me entendieron. Es bueno ver que al menos estoy en el estadio de béisbol con una solución. Estoy pensando que la solución más simple sería deshabilitar el factor "I" hasta que la temperatura alcance un rango controlable. Esto permitiría una respuesta muy rápida a los cambios. Luego, cuando veamos algún cambio de temperatura real y nos acerquemos al resultado deseado, vuelva a habilitar la integral para agregar el impulso adicional necesario. ¡Gracias por una respuesta detallada!
Pero el término integral no está ahí para acelerarlo, está ahí para corregir un error sistemático, especialmente un coeficiente proporcional que no es del todo correcto. ¿No? Y en esta situación el P coef. no puede ser perfecto todo el tiempo porque variará dependiendo de la presión del agua en ambas tuberías.
@romkyns ah sí, leyendo tu comentario con más atención, tienes razón. Creo que quise decir "pequeño error en la temperatura final", que es lo que eventualmente eliminaría Integral.

La clave para controlar este proceso de manera eficiente es darse cuenta de que los grifos de agua caliente y fría no funcionan simétricamente, y cualquier algoritmo óptimo debe tener esto en cuenta.

Cuando no usas el agua caliente por un tiempo, se enfría en la tubería.

Cuando no usa el agua fría durante un tiempo, permanece igual que antes (a menos que el agua fría provenga de un tanque de agua fría con un enfriador, que sería increíble tener en los días calurosos de verano, pero estoy las apuestas son bastante raras en la práctica).

Por lo tanto, asumimos que no sabemos lo que obtenemos de la tubería de agua caliente, pero podemos confiar en que la tubería de agua fría será bastante constante durante una ejecución.

Así, a partir de la temperatura del agua mezclada, y conociendo el ajuste de la válvula, y a partir de una estimación de la temperatura del agua fría, podemos estimar qué tan caliente está el agua que sale actualmente de la tubería de agua caliente. Luego puede ajustar la válvula para obtener la temperatura de salida correcta sin PID, solo con base en la evaluación de una fórmula termodinámica.

Para obtener la "estimación de la temperatura del agua fría", puede dejar correr el agua fría durante un tiempo breve (quizás unos segundos) al comienzo del ciclo y leer la temperatura. Luego suponga que no cambiará a partir de entonces, ya que no tiene suficientes datos para resolver ambas temperaturas.

Este esquema no será perfectamente preciso, pero estimo que se aproximará de forma fiable al estadio de béisbol sin la posibilidad de un exceso drástico. Luego, ejecuta PID sobre este esquema para ajustar los resultados, pero limita el cambio a la configuración de la válvula que PID puede producir. Y posiblemente restablecer el estado de PID cuando tenga cambios significativos en la temperatura de entrada del agua caliente.

Son posibles soluciones más sofisticadas con múltiples sensores de temperatura.

Otra gran respuesta: pensar fuera del cuadro PID. Había considerado simplemente probar las temperaturas del agua y crear algún tipo de tabla de búsqueda con las posiciones aproximadas de las válvulas para obtener la temperatura de salida deseada. Tienes razón en que el frío es relativamente constante, aunque posiblemente más frío en invierno. Las líneas de agua están enterradas a unas 24-36 pulgadas y generalmente tenemos temperaturas suaves aquí. Luego, también podría tener en cuenta la temperatura máxima de salida del agua caliente (alrededor de 120 F) y crear una tabla de búsqueda que ubique las válvulas de manera adecuada, usando PID para el ajuste fino después del calentamiento.
El agua de pozo puede permanecer muy fresca incluso durante los veranos cálidos dependiendo de la profundidad/fuente. El agua "fría" que descansa en las tuberías de la casa es más caliente que la que se bombea desde abajo. Entonces, el agua fría en realidad se vuelve más fría con el uso (hasta que se acerca a la temperatura del agua subterránea). Siempre me "sorprendo" cuando voy a la "gran ciudad" y el agua fría nunca se enfría.

Solo quería agregar un detalle a las buenas respuestas anteriores sobre lo que hacen los ingenieros de control para las posibilidades integrales de liquidación. Esto también sucede en muchos procesos industriales y es más un arte que una ciencia.

Hay acciones típicas de libros de texto contra esto sin sacrificar la ganancia integral que podría ser realmente necesaria para la especificación de rendimiento.

  1. Cada vez que cruza el nivel de error cero, restablece el integrador. Esto convierte al integrador en un elemento no lineal de tipo integrador bajo demanda en lugar de un acumulador ciego.

  2. Básicamente, conecta el bloque de entrada de acción integral a un elemento indicativo en el ciclo. Esta podría ser la salida del integrador para juzgar si inició la acumulación (lo que requiere una comprensión del proceso para hacer el juicio adecuado). O verifica si sus actuadores están saturados o no y forma un circuito de retroalimentación basado en esa información. Elegí al azar el primer enlace que salió de Google y al final de este video hay una explicación gráfica de mi último punto. https://www.youtube.com/watch?v=H4YlL3rZaNw

Buenos puntos, gracias por ampliar la idea. Gracias por el video, explica muy bien el problema.

A veces puede ser útil tener múltiples conjuntos de parámetros PID, para etapas de granularidad gruesa del rango de operación del sistema, que se cambian sobre la marcha a medida que el sistema pasa de una etapa de comportamiento a otra. Por ejemplo, un conjunto de Kp, Ki y Kd para cuando abra el grifo de agua caliente y obtenga solo agua fría; luego, una vez que comience a ver que la temperatura aumenta, cambie a otro conjunto de Kp, Ki y Kd. Luego afine los dos en consecuencia.

¿Está utilizando la biblioteca PID en Arduino Playground de Brett Beauregard? Este es bastante agradable. Y también hay un ejemplo 'adaptativo' de esto.

Gracias por las sugerencias. Al no usar la biblioteca pid, lo escribí yo mismo para aprender más sobre cómo funciona.
¿Consideró la alimentación hacia adelante? Es como si los cambios rápidos afectaran la salida a través de un bucle abierto, por lo que no tiene que esperar a un bucle cerrado para reaccionar.
Estoy tratando de entender cómo funcionaría la "alimentación hacia adelante" en este caso. ¿Sería la entrada la temperatura deseada y la salida establecería las válvulas en una posición predeterminada (como se discutió en mi otro comentario anterior) usando una tabla de búsqueda o una ecuación simple?
Puede usar feedforward además de su retroalimentación (PID de circuito cerrado). Simplemente agregue la acción del controlador de retroalimentación a la acción del controlador de avance. Idealmente, el controlador feedforward sería un modelo inverso de la válvula. Feedforward esencialmente le brinda una acción instantánea en un cambio de punto de ajuste. Incluso con feedforward más retroalimentación, aún debe tener en cuenta la liquidación en el compensador de control de retroalimentación. El componente de retroalimentación debe tenerse en cuenta.

¿Ha modelado el sistema?

¿Tiene algunos datos basados ​​en el tiempo que muestren el sobreimpulso, especialmente la frecuencia?

Estas son dos preguntas que deben hacerse con cualquier consulta basada en control.

Por lo que ha descrito, su ganancia integral es demasiado alta, demasiado alta. Podría deberse a la liquidación del integrador: el código que se muestra tiene algunas preocupaciones prácticas reales, una de las cuales es que no es el mejor de los integradores discretos.

  • Topología de integrador discreto muy pobre
  • Sin abrazaderas/límites en la salida I y mucho menos en la salida P+I

También puede deberse a que es muy alto y tarda en bajar.

Entonces, sí, el valor almacenado en el registro I podría haber terminado diciendo ... 1000C porque el P + I no se configuró para la respuesta del sistema y luego tiene que reducirse.

Lo primero que haría es capturar datos en tiempo real para el procesamiento posterior. A continuación, ejecutaría solo P y me aseguraría de que la ganancia proporcional alcance CASI la temperatura deseada (la teoría de control establece que no lo hará). El dependiendo de si

  1. Análisis de los datos de captura presentes facilitando en la determinación del adecuado gano
  2. Se deriva un modelo de planta para crear ganancias adecuadas

Comenzaría cambiando el código PID para que sea una mejor implementación y luego agregaría un poco de I, solo para probar un punto.

Realmente necesita determinar contra qué están destinadas estas ganancias. La entrada es temperatura, la salida es... ¿flujo? entonces debería haber una transferencia de flujo/C y una función de transferencia de Flujo/Cs.

Buena respuesta también, gracias. No he modelado el sistema, ya que aún no sé cómo, solo estoy comenzando a mojarme los pies en este estudio. Tiene razón en que el valor I aumenta fuera de los límites razonables. ¿Me puede dirigir a un mejor algoritmo de implementación para el integrador? El pseudocódigo es mejor, ya que me permite aprender y poner el código en mis propias palabras, en lugar de copiar y pegar. Además, ¿me puede dirigir a alguna introducción al modelado de sistemas simples como este? Tiene razón en que los niveles de flujo (mezcla caliente y fría) son las salidas de este sistema. Actualmente es simplemente H/C inversamente proporcional.
Agregaré un ajuste en breve

Una forma en que me gusta resolver el Integral Windup es dejar de acumular el error siempre que la salida de control esté en su desviación máxima . O escálelo según la distancia a la que se encuentre de la deflexión máxima. Entonces, cada vez que su controlador emita "agua caliente 100%, agua fría 0%", simplemente no acumule el error, pero tampoco lo restablezca a cero.

No me gusta limitar la integral al máximo porque entonces hay un límite para el error sistemático que puede compensar su PID.

También sugeriría que en lugar de hacer un PID "tonto" que solo tiene un parámetro que está tratando de controlar sin conocimiento del sistema subyacente, instale dos sensores de temperatura adicionales, tanto en la entrada fría como en la caliente. Luego intenta encontrar una función que se aproxime a la posición deseada en función de las temperaturas de entrada, y solo usa el bucle PID para ajustar el error en la salida de esta función.

El error será significativo porque no mide el flujo (bueno, a menos que lo haga, por supuesto), que depende no solo de las posiciones de la válvula (conocidas) sino también de la presión del agua (desconocida).

Aún así, esto debería ayudar mucho con el problema de que el agua caliente finalmente llegue al grifo porque en un circuito PID bien amortiguado, debe confiar en que el elemento D esté bien calibrado para reducir rápidamente el flujo caliente. En mi experiencia, obtener el coeficiente de derivada correcto suele ser lo más difícil. Pero si tuviera los dos sensores adicionales, la salida principal cambiaría exactamente tan rápido como la temperatura del agua de entrada, por lo que básicamente sería instantáneo, sin necesidad del elemento derivado.