Algoritmo PID: cómo dar cuenta de los cambios rápidos de valor de entrada después de un largo retraso


15

Estoy tratando de implementar un algoritmo PID básico en un Arduino Leonardo para mezclar agua corriente 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 sobrepase el punto de ajuste para proteger al usuario de quemaduras. Secundariamente importante es obtener la temperatura cerca del 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 baja temperatura 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 a 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 excede el punto de ajuste, debido a la espera de que el valor integral se reduzca a niveles normales. Por lo tanto, el resultado es agua a temperatura máxima durante varias (decenas) de segundos.

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

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

Gracias por cualquier consejo!


1
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 es probable que obtenga (su sistema puede ser estable en teoría, pero nunca puede dejar de oscilar en la práctica, porque I-action agrega retraso de fase). Además, debido a que posiblemente quemarás personas, ¡no puedo estresarme lo suficiente como para echar un vistazo a los comentarios de Chu y JonRB!
Sanchises

Respuestas:


15

Su problema se llama Integral Windup , es un problema de control común. En una región no lineal o limitada, el controlador no puede rastrear el punto de ajuste 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 dedujo que es el problema.

La solución más simple es limitar el valor del integrador a un máximo sensible. Limitar la contribución integral no funcionará tan bien, ya que el integrador aún estará sujeto a un gran valor.

Mathworks tiene una página con algunas otras soluciones para el enrollamiento 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 obtenga un rendimiento aceptable con solo PD.

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


1
Si. Idealmente, puede medir la temperatura de entrada caliente de forma independiente e inhibir el enrollamiento de esa manera.
Brian Drummond

2
La liquidación puede ser un problema, pero si el integrador no se implementara, por ejemplo, el efecto desestabilizador de la demora aún se mantendrí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.
Chu

2
exactamente, no creo que esto sea puramente integrador windup, incluso si es eso. es una preocupación válida que siempre debe mitigarse incluso si las operaciones normales no alcanzan las condiciones necesarias
JonRB

Wow, gran respuesta! Estaba pensando en esta línea (limitando el valor máximo del integrador) pero no formulé la pregunta correctamente, por lo que me malinterpretaron. Es bueno ver que al menos estoy en el estadio 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 un cambio real de temperatura y nos acerquemos al resultado deseado, vuelva a habilitar la integral para agregar el empuje adicional necesario. Gracias por una respuesta detallada!
Ryan Griggs

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 coeficiente P. no puede ser perfecto todo el tiempo porque variará dependiendo de la presión del agua en ambas tuberías.
Roman Starkov

4

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

Cuando no usa 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, lo que sería increíble tener en los calurosos días de verano, pero estoy las apuestas son bastante raras en la práctica).

Por lo tanto, suponemos que no sabemos lo que obtenemos de la tubería de agua caliente, pero podemos depender de que la tubería de agua fría sea bastante constante a lo largo de una carrera.

Por lo tanto, a partir de la temperatura del agua mezclada, y al conocer la configuración de la válvula, y a partir de una estimación de la temperatura del agua fría, podemos estimar qué tan caliente está actualmente el agua que proviene de la tubería de agua caliente. Luego puede ajustar la válvula para obtener la temperatura de salida correcta sin PID, solo en función de la evaluación de una fórmula termodinámica.

Para obtener la "estimación de la temperatura del agua fría", puede correr agua fría por un corto tiempo (unos segundos tal vez) 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 calculo que entrará de manera confiable dentro del estadio sin la posibilidad de sobrepasar drásticamente. 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 restablezca el estado PID cuando tenga cambios significativos en la temperatura de entrada del agua caliente.

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


Otra gran respuesta: pensar fuera del cuadro PID. Había considerado probar las temperaturas del agua y crear algún tipo de tabla de búsqueda con posiciones aproximadas de la válvula 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 aproximadamente 24-36 pulgadas y generalmente tenemos temperaturas suaves aquí. Luego, también podría tener en cuenta la temperatura máxima de salida de agua caliente (aproximadamente 120 F) y crear una tabla de búsqueda que coloque las válvulas de manera adecuada, utilizando PID para el ajuste fino después del calentamiento.
Ryan Griggs

1
El agua de pozo puede mantenerse muy fría 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 cálida que la que se bombeará desde abajo. Entonces, el agua fría en realidad se enfría con el uso (hasta que se acerca a la temperatura del agua subterránea). Siempre estoy "sorprendido" cuando voy a la "gran ciudad" y el agua fría nunca se enfría.
rickhg12hs

2

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 ocurre en muchos procesos industriales y es un arte más que una ciencia.

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

  1. Cada vez que cruza el nivel de error cero, reinicia el integrador. Esto hace que el integrador sea un integrador a pedido del elemento no lineal en lugar de un acumulador ciego.

  2. Básicamente, conecta el bloque de entrada de acción integral a un elemento indicativo en el bucle. Esto podría ser el resultado del integrador para juzgar si comenzó la acumulación (lo que requiere una comprensión del proceso para hacer el juicio correcto). 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.
Tomnexus

1

A veces puede ser útil tener múltiples conjuntos de parámetros PID, para etapas de grano grueso del rango de operación del sistema, que puede cambiar 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 abre el grifo caliente y obtiene solo agua fría; luego, una vez que comience a ver subir la temperatura, cambie a otro conjunto de Kp, Ki y Kd. Luego sintonice los dos en consecuencia.

¿Está utilizando la Biblioteca PID en el Arduino Playground de Brett Beauregard? Este es bastante bueno. Y hay un ejemplo 'adaptativo' de esto allí también.


Gracias por las sugerencias Al no usar la biblioteca pid, la escribí yo mismo para aprender más sobre cómo funciona.
Ryan Griggs

¿Consideraste avanzar? Es como si los cambios rápidos afectaran la salida a través del bucle abierto, por lo que no espere al bucle cerrado para reaccionar.
Gregory Kornblum

Estoy tratando de entender cómo funcionaría "feed forward" en este caso. ¿La entrada sería la temperatura deseada y la salida colocarí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?
Ryan Griggs

Puede usar feedforward además de sus comentarios (PID de bucle cerrado). Simplemente agregue la acción del controlador de retroalimentación a la acción del controlador de avance. Idealmente, el controlador de avance sería un modelo inverso de la válvula. Feedforward esencialmente le brinda acción instantánea en un cambio de punto de ajuste. Incluso con feedforward plus feedback, aún debe tener en cuenta la ganancia en el compensador de control de feedback. El componente de retroalimentación debe tenerse en cuenta.
docscience

1

¿Has modelado el sistema?

¿Tiene algunos datos basados ​​en el tiempo que muestran 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 integració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

  • Muy pobre topología de integrador discreto
  • No hay abrazaderas / límites en la salida I y mucho menos en la salida P + I

Igualmente podría ser porque es muy alto y lleva tiempo disminuirlo.

Entonces, sí, el valor almacenado en el registro que pude haber terminado para decir ... 1000C porque el P + I no estaba configurado para la respuesta del sistema y luego tiene que apagarse.

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 alcanzara CASI MÁS la temperatura deseada (la teoría de control dice que no lo hará). El dependiendo de si

  1. Análisis de los datos de captura actuales que facilitan la determinación de ganancia adecuada
  2. Se deriva un modelo de planta para crear ganancias adecuadas

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

Realmente necesitas determinar a qué se dirigen estas ganancias. La entrada es la 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 empezando 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 el mejor, ya que me permite aprender y poner el código en mis propias palabras, en lugar de copiar / pegar. Además, ¿puede dirigirme a alguna introducción al modelado de sistemas simples como este? Tiene razón en que los niveles de flujo (mezcla fría y caliente) son las salidas de este sistema. Actualmente es solo H / C inversamente proporcional.
Ryan Griggs


1

Una forma en que me gusta resolver el Windup integral es dejar de acumular el error cada vez que la salida de control está en su deflexión máxima . O escale por lo lejos que está de la desviación máxima. Por lo tanto, siempre que su controlador emita "agua caliente al 100%, agua fría al 0%", simplemente no acumule el error, pero tampoco lo restablezca a cero.

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

También sugeriría que, en lugar de hacer un PID "tonto" que solo tiene un parámetro que está tratando de controlar sin conocer el sistema subyacente, instale dos sensores de temperatura adicionales, tanto en la entrada de calor como en la de frío. 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), lo que depende no solo de las posiciones de las válvulas (conocidas) sino también de la presión del agua (desconocidas).

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 derivación correcto es generalmente el 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, de manera básicamente instantánea, sin ninguna necesidad del elemento derivado.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.