环套环
前十九章讨论的都是「怎么调好一个环」。这一章换一个层次的问题:要不要多来一个环。答案往往是要,而且回报大得不成比例——因为一个扰动最好的处理方式,是在它离开出生地之前就被按住。
一个加热炉:燃气经过阀门进入炉膛,炉温是被控量。炉子的热惯性是 30 秒,阀门到流量的响应是 2 秒。
扰动是燃气管路压力的波动——同样的阀门开度,进气量会变。
现在有两种做法:甲,一个 PI 直接从炉温算到阀门开度;乙,两个 PI 串起来——外环从炉温算出「我要多大流量」,内环从流量算到阀门开度。
扰动进来的地方,决定了它有多贵
先看那个扰动是从哪进来的。
# 单环:从炉温到阀门,一条链
目标温度 ─▶ ⊕ ─▶ [PI] ─▶ [阀+炉子] ─┬─▶ 炉温
▲(−) ▲ │
│ │ │
│ 燃气压力波动 │
└────── 温度计(慢,30s)─┘
# 扰动从阀门那里进来,但要等**炉温**变了才被发现。
# 而炉温的时间常数是 30 秒 —— 扰动早就把炉子搅乱了。
# 串级:套一个快环
目标温度 ─▶ ⊕ ─▶ [外环 PI] ─▶ ⊕ ─▶ [内环 PI] ─▶ [阀] ─▶ [炉子] ─┬─▶ 炉温
▲(−) ▲(−) ▲ │
│ │ 燃气压力波动 │
│ └── 流量计(快,2s)──┘ │
└───────────── 温度计(慢,30s)────────────────────────┘
★ 扰动一影响流量,**内环两秒内就发现并按住了**。
外环的温度计还没来得及有反应,事情已经结束了。
串级控制的全部道理:把扰动关在离它最近的那个环里。
一个扰动要造成多大伤害,取决于它在被发现之前能自由活动多久。而这个时间等于「从它进来的位置,到你的传感器所在位置」那一段的动态。
单环里,燃气压力波动必须一路传到炉温才被看见——它在这条路上有 30 秒的自由时间。
串级里,它一影响流量就被内环逮住——自由时间 2 秒。
而外环的控制器一个参数都没改。你没有调参,你改的是结构。
| 结构 | 扰动造成的峰值偏差 | 扰动后的累计误差 IAE |
|---|---|---|
| 单环 | 0.18337 | 19.18 |
| 串级(加一个快内环) | 0.01736 | 0.849 |
| 相差 | 10.6 倍 | 22.6 倍 |
一个数量级。而代价是:多一个传感器(流量计)、多一个 PI、多一次整定。
这就是为什么在过程工业里,串级几乎是默认配置——凡是能找到一个「更快、更靠近扰动」的中间变量,就把它做成内环。
内环该选什么
不是随便找个中间变量都行。一个好的内环变量要满足三条:
- 它必须比外环快得多。经验值是快 5 到 10 倍(本例是 30 秒 vs 2 秒,15 倍,很舒服)。如果两个环速度接近,它们会互相干扰——内环还没稳定,外环已经在改它的目标了,两个环会打架。
- 主要扰动必须先经过它。如果扰动是从炉膛那边进来的(比如有人开了炉门),那流量内环完全帮不上忙——扰动根本不路过它。内环只能挡住它上游的扰动。
- 它必须可测,而且测得快。这一条经常是决定性的:理论上最好的内环变量,可能根本没有传感器。
条件 1 那个「快 5 到 10 倍」值得多说一句。它其实就是第 11 章那条律的另一个用法:对外环来说,内环的动态就是一段额外的延迟。内环越快,这段延迟越小,外环的力气预算就越充裕。如果内环只比外环快一倍,那你等于往外环里塞了一段和它自身尺度相当的延迟——那不但没帮忙,还添了乱。
整定的顺序:从里往外
串级的整定有一个固定顺序,反了就调不出来:
① 先把外环切成手动(或者把外环增益设成 0)
② 整定内环 —— 它面对的就是一个普通的单环问题
内环要**快**,可以整定得比较紧;通常用 P 或 PI 即可
③ 内环闭合之后,外环看到的「对象」已经变了 ——
它现在看到的是「内环 + 炉子」,而不是「阀 + 炉子」
④ 对着这个**新的**对象整定外环
★ 关键在 ③:内环一闭合,外环面对的对象就换了一个。
拿开环时辨识的模型去整定外环,会得到完全错误的参数。
第 ③ 步那句话是串级最容易踩的坑。而它也揭示了串级的另一个好处:内环把一个可能很难缠的对象(有非线性、有滞回、特性会漂的阀门),包装成了一个对外环来说干净得多的东西。阀门的非线性被内环吃掉了,外环看到的近似是一个规规矩矩的一阶环节。
串级和第 18 章的前馈,是应对扰动的两种正交手段,值得并排记住:
- 前馈:我能测到扰动本身,所以我在它生效前就抵消掉。要求:扰动可测、有模型。
- 串级:我测不到扰动,但我能测到一个离它更近的中间量,所以我在它扩散之前就按住。要求:中间量可测、且够快。
它们可以叠加,而且在工业上经常叠加。共同的思想是同一句话:缩短「扰动发生」到「有人反应」之间的距离。而这句话,正是第 11 章那条延迟律在扰动侧的翻版。
汽车的三层环。巡航定速(外环,管车速)→ 发动机扭矩控制(中环)→ 喷油/点火的闭环(内环,毫秒级)。每一层都比外面那层快一个数量级。你踩油门时感受到的线性响应,是这三层环共同伪装出来的——真实的燃烧过程一点也不线性。
Kubernetes 的两层。HPA(按指标调副本数,分钟级)是外环,kubelet 的健康检查和重启(秒级)是内环。一个 Pod 挂掉不需要惊动 HPA——内环几秒内就补上了。如果没有内环,每一次单点故障都会变成一次扩缩容决策,那个环会忙得不可开交。
组织的层级。一个健康的组织结构就是串级:一线自己能处理的问题不上报(内环,小时级),需要跨团队的上一级(中环,天级),需要改战略的再上一级(外环,季度级)。而「什么事都要汇报到老板」等于把内环拆了——所有扰动都要跑完整条链路才被处理,于是每一件小事都以季度的时间尺度在系统里荡漾。
反过来,层级之间速度差不够也是常见病:如果中层和高层的决策周期都是「每周例会」,那它们就是两个速度相同的环,会持续互相推翻。这在控制论里有精确的诊断——不是沟通问题,是时间尺度没分开。
这个直觉来自一个合理的顾虑(更多的环 = 更复杂 = 更多出错的地方),但它把因果搞反了。关键在于那个「快 5 到 10 倍」的条件:
- 内环足够快时:外环看到的是一个近似理想的执行器。阀门的滞回、非线性、压力波动全被内环吃掉了。外环的日子变好过了。
- 内环不够快时:那确实是在往外环里加相位滞后,会让事情变糟。所以速度差是串级能不能成立的硬门槛,不是一个可选的优化。
换句话说,这个直觉不是错的,只是它描述的是串级没做对的情况。做对的判据只有一条,而且很好查:内环闭合后的响应速度,是不是比外环快 5 倍以上?是,就上;不是,那你要么把内环调快,要么别做串级。
C好一个数量级。峰值偏差从 0.18337 降到 0.01736(小 10.6 倍),扰动后的累计误差从 19.18 降到 0.849(小 22.6 倍)。
而外环控制器的参数一个字都没改。这个回报不是来自更好的整定,是来自把传感器放到了离扰动更近的地方。
A 「反正最终都靠炉温反馈」——最终确实都靠炉温,但「最终」之前那段时间才是全部代价所在。扰动在被发现之前能自由活动多久,决定了它造成多大的坑。这也是第 12 章那句话的又一次应用:稳态一样,路上天差地别。 B 「好 20%–30%」——这是把串级当成一次「优化」。它不是优化,是结构改变:扰动被发现的时间从 30 秒尺度变成 2 秒尺度,差了 15 倍,所以效果也在这个量级上。结构改动的回报,通常和参数调优不在一个数量级。 D 「多一个环 = 多一份风险」——如果内环不够快,这个担心是对的。而当内环快 5 到 10 倍时,它对外环近似是一根导线,几乎不加相位。判据很简单,去量一下内环闭合后的响应时间就知道。这一章的一句话
一个扰动的代价,取决于它在被发现之前能跑多远——所以最有效的改进往往不是把控制器调得更好,而是把传感器搬得更近。
卷 V 到此结束。你现在手上有一整套工具:三个旋钮、稳定判据、两把尺子、抗饱和、前馈、观测器、串级。最后一卷不再教新工具,而是把这套工具拿去看别的地方——仓库、机房、身体、央行。第一站是一条四级供应链:顾客的需求一点没变得更疯,而工厂看到的订单波动是它的 4.27 倍,而且每一级都做了完全理性的事。