PID算法:长时间延迟后如何考虑快速的输入值变化


15

我正在尝试在Arduino Leonardo上实现基本的PID算法,以使用伺服控制阀将冷热水混合。目的是使温度尽可能接近设定值。尤其重要的是防止输出温度超过设定值,以保护用户免遭灼伤。其次重要的是尽快使温度接近设定点。

对于较小的温度变化,PID算法标准实现似乎可以正常工作。但是我不知道如何解决在等待热水到达阀门时可能出现的长时间延迟,因为这些延迟比更改阀门位置后的标准延迟长得多。

显然,取决于热水管线的长度和自上次使用热水以来的时间,热水到达阀门需要花费数十秒的时间,因此在此期间,水温在低温下保持相当恒定热水阀很快就会打开100%。积分分量开始累积较大的误差值。

当热水最终到达阀门时,检测到的温度会迅速上升到最高热水温度。由于较大的积分误差,温度超过设定值后,由于等待积分值降低到正常水平,热水阀长时间保持在100%。因此,结果是几秒钟(数十秒)的最高温度水。

我不确定如何解决这种可能的长时间延迟。在这种情况下,为了限制最大响应时间,在积分误差值上设置一个上限(和下限)是否明智?这似乎无法达到积分部分的目的,并且在达到设定值后仍会出现一定的滞后。

还是有更好的方法来处理长时间的延迟后快速的输入变化?

感谢您的任何建议!


1
实际上,我想知道您是否完全需要I动作,因为与阀门致动相比,我认为水温变化相对较慢。更糟糕的是,由于可能获得的极差的相位裕度,您可能会出现振荡行为(您的系统理论上可能是稳定的,但实际上可能永远不会停止振荡,因为I动作会增加相位滞后)。另外,因为您可能会惹恼别人,所以我无法承受太多压力,无法看看Chu和JonRB的评论!
桑契斯,2015年

Answers:


15

您的问题称为“ 积分缠绕”,这是一个常见的控制问题。在非线性或有界的区域中,控制器无法跟踪设定值,并且积分会增加到较大的值。最终达到设定值时,这会导致较大的超调,这正是您从中得出的问题。

最简单的解决方案是将积分器值本身限制在合理的最大值内。限制积分的贡献也不会起作用,因为积分器仍然会达到某个较大的价值。

Mathworks的页面上有一些其他有关积分结束的解决方案。

在PID控制器中,通常需要尽可能少的积分项。在标准的机械温度控制阀中,仅使用比例控制,它们可以正常工作。保持积分项尽可能小-用户不会注意到最终温度中的小误差。您可能会发现仅使用PD即可获得可接受的性能。

由于这是一个非常特殊的已知情况,因此您可以考虑为控制器使用其他模式。测量入口热温度,当温度低于设定值时,仅运行100%热,运行20%冷。预热后,以良好的初始条件切换到PID。


1
是。理想情况下,您可以独立地测量入口热温度,并以此方式抑制缠绕。
布赖恩·德拉蒙德

2
结束可能是一个问题,但是如果未使用积分器,则例如,延迟的不稳定影响仍然会存在。Smith Predictor是缓解纯时间延迟影响的好方法。单独解决积分器饱和问题并不能克服延时带来的固有相位滞后。

2
确切地说,我认为这并不是纯粹的集成商预案,即使是那样。这是一个有效的关注点,即使正常操作未达到所需条件,也应始终减轻该关注点
JonRB 2015年

哇,好答案!我沿这条线思考(限制积分器的最大值),但未正确说明问题,因此我被误解了。很高兴看到我至少有一个解决方案。我认为最简单的解决方案是禁用“ I”因子,直到温度达到可控范围。这将允许非常快速地响应更改。然后,当我们看到一些实际温度变化并接近预期结果时,请重新启用积分功能以添加所需的额外推动力。感谢您的详细回答!
瑞安·格里格斯

但是积分项并不能加快积分的速度,而是可以修正系统误差,尤其是比例系数不太正确的地方。没有?并在这种情况下P系数。不能一直都是完美的,因为它会根据两条管道中的水压而变化。
罗曼·斯塔科夫

4

有效控制此过程的关键是要认识到冷热水龙头不是对称运行的,任何最佳算法都必须考虑到这一点。

当您暂时不使用热水时,它会在管道中冷却。

当您暂时不使用冷水时,它会保持与以往相同的状态(除非冷水来自带有冷却器的冷水箱,在炎热的夏季,这会很棒,但是我在实践中,投注很少见)。

因此,我们假设我们不知道从热水管中得到什么,但是我们可以依靠冷水管在整个运行过程中保持恒定。

因此,根据混合水的温度,已知阀的设置以及对冷水的温度进行估算,我们可以估算出当前来自热水管的水的温度。然后,仅基于热力学公式的评估,就可以调节阀以在没有PID的情况下获得正确的输出温度。

要获得“冷水温度的估算值”,您可以在循环开始时短时间(可能几秒钟)运行冷水并读取温度。然后假设此后它不会改变,因为您没有足够的数据来解决这两个温度。

这种方案并不是十分准确,但是我估计它可以可靠地进入球场,而不会发生过大的超调。然后,您可以在此方案之上运行PID以微调结果,但将更改限制为允许PID产生的阀门设置。当热水输入温度发生重大变化时,可能会重置PID状态。

多个温度传感器可提供更出色的解​​决方案。


另一个很好的答案-在PID框外思考。我曾考虑过只是测试水温,并创建某种类型的查找表,并在阀位置上近似得出所需的输出温度。您是对的,尽管冬天可能会变冷,但感冒相对稳定。水线埋在约24-36英寸处,我们这里的温度通常较低。然后,我还可以考虑最高热水输出温度(约120 F),并创建一个查找表来适当定位阀门,并在预热后使用PID进行微调。
瑞安·格里格斯

1
取决于深度/水源,即使在温暖的夏天,井水也会保持非常凉爽。放置在房屋管道中的“冷”水比从下面抽出的水要热。因此,使用中的冷水实际上会变冷(直到其接近地下水温度)。当我去“大城市”时,我总是感到“惊讶”,而冷水永远不会变冷。
rickhg12hs 2015年

2

我只是想在上面的漂亮答案中添加一个细节,即控制工程师为实现完整卷绕功能所做的工作。这在许多工业过程中也会发生,这是一门艺术,而不是科学。

有一些针对这种情况的典型教科书措施,而并未牺牲性能规格可能真正需要的积分增益。

  1. 每次超过零错误级别时,都会重置积分器。这使积分器成为积分器按需类型的非线性元件,而不是盲式累加器。

  2. 您基本上将积分动作输入块连接到循环中的指示性元素。这可能是积分器判断其是否开始积累的结果(这需要了解过程以使判断正确)。或者,您检查执行器是否饱和,并根据该信息形成反馈回路。我只是随机选择了Google提供的第一个链接,在此视频的末尾有关于我最后一点的图形化说明。https://www.youtube.com/watch?v=H4YlL3rZaNw


好点子,感谢您对此想法的扩展。感谢您的视频,它很好地说明了问题。
tomnexus

1

有时,对于系统操作范围的粗粒度阶段,拥有多组PID参数可能会有所帮助,您可以在系统从行为的一个阶段转移到另一阶段时,随时进行更改。例如,一组Kp,Ki和Kd用于打开热水龙头并仅获得冷水。然后,当您开始看到温度上升时,请切换到另一组Kp,Ki和Kd。然后相应地调整两者。

您是否正在使用Brett Beauregard的Arduino Playground中的PID库?这个很好。那里也有一个“自适应”的例子。


感谢您的建议。我没有使用pid库,而是自己编写了它,以了解有关它如何工作的更多信息。
瑞安·格里格斯

您考虑过前馈吗?就像快速变化会通过开环影响输出一样,因此您不必等待闭环做出反应。
Gregory Kornblum 2015年

在这种情况下,我试图围绕“前馈”的工作方式进行思考。输入将是所需温度,输出将使用查找表或简单方程式将阀门设置到预定位置(如我在上面的其他评论中所述)?
瑞安·格里格斯

除了反馈(闭环PID)以外,您还可以使用前馈。您只需将反馈控制器的动作添加到前馈控制器的动作即可。理想地,前馈控制器将是阀的逆模型。前馈本质上使您可以立即更改设定值。即使使用前馈和反馈,您仍然需要考虑反馈控制补偿器中的饱和。反馈组件需要被分解。
docscience

1

您对系统建模了吗?

您是否有一些基于时间的数据显示过冲,尤其是频率

这是任何基于控件的查询都应询问的两个问题。

根据您的描述,您的积分增益太高了,越来越高。这可能是由于积分器饱和:显示的代码有一些实际的实际问题,其中之一是它并不是最大的离散积分器

  • 离散积分器拓扑非常差
  • 在I输出上没有钳位/限制,更不用说在P + I输出上

同样可能是因为它很高,并且递减会花费时间。

因此,是的,存储在I寄存器中的值可能会达到... 1000C,因为P + I未设置为系统的响应,因此必须减小。

我要做的第一件事是捕获实时数据以进行后期处理,然后我将仅运行P并确保比例增益达到所需温度的ALMOST(控制理论表明不会)。取决于是否

  1. 对当前捕获数据的分析有助于确定合适的I增益
  2. 得出工厂模型以创建合适的收益

我首先将PID代码更改为更好的实现,然后再添加一点点I,以证明这一点。

您确实需要确定这些收益意味着什么。输入是温度,输出是...流量?因此应该有一个Flow / C传递和一个Flow / Cs传递函数。


也很好的答案,谢谢。我还没有为系统建模,因为我还不知道如何-在本研究中刚开始涉足这一领域。您是正确的,I值超出了合理范围。您能指导我为集成器找到更好的实现算法吗?伪代码是最好的,因为它允许我学习并将代码放入自己的文字中,而不是复制/粘贴。另外,您能指导我介绍对这样的简单系统建模的介绍吗?您是正确的,流量水平(冷热混合)是该系统的输出。目前,它只是反比例的H / C。
瑞安·格里格斯

1
病情

1

我想解决积分饱和的一种方法是,只要控制输出达到最大偏转,停止累积误差。或将其缩放到离最大挠度的距离。因此,只要您的控制器输出“热水100%,冷水0%”,就不要累积错误,也不要将其重置为零。

我不喜欢将积分限制为最大值,因为这样PID可以补偿的系统误差就会受到限制。

我还建议不要在不知道底层系统的情况下制作仅具有一个要控制的参数的“哑” PID,而应在热输入和冷输入上安装两个额外的温度传感器。然后,您尝试根据输入温度找到近似所需位置的函数,并且仅使用PID回路来调整误差该函数输出中。

该错误将非常严重,因为您不会测量流量(当然,除非您这样做),这不仅取决于阀门位置(已知),而且还取决于水压(未知)。

尽管如此,这仍将有助于解决热水最终到达水龙头的问题,因为在阻尼良好的PID回路中,您必须依靠经过良好校准的D元素来快速减少热水流量。以我的经验,正确确定导数系数通常是最困难的。但是,如果您有两个额外的传感器,则主输出将与输入水温完全一样快地变化,因此基本上是瞬时的,根本不需要任何导数元素。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.