# 使用 PID Controller 模块进行抗饱和控制
# 引言
此示例展示在执行器发生饱和时,如何通过抗饱和策略避免 PID 控制器出现积分饱和。Sysblock 中的 PID Controller 模块内置 “ 反算 ” 抗饱和方法,并提供 “ 跟踪模式 ” 以应对更复杂的工业场景。
单击右侧打开示例按钮,在 Sysplorer 中打开所需文件。 # 模型搭建
单击主页 > 新建模型 > Sysblock 模型,将模型名称修改为 Demo_PID_Controller,单击确定保存设置。

在库浏览器中搜索 step(阶跃信号发生器)、sum(对输入执行加法或减法)、PIDController(此模块实现连续和离散时间 PID 控制算法)、transferFcn(传递函数)、transportDelay(对输入信号应用指定的延迟)、outport(输出端口)、saturation(将输入信号限制在饱和上界和下界值之间)、scope(显示仿真过程中生成的信号)。各组件对应的模型库路径如下表所示。
组件名 组件对应的模型库路径 step Sysblock.Sources(信号源模型库).step sum Sysblock.MathOperation(数学运算模型库).sum PIDController Sysblock.Continuous(连续模型库).PIDController transferFcn Sysblock.Continuous(连续模型库).transferFcn transportDelay Sysblock.Continuous(连续模型库).transportDelay outport Sysblock.Port(端口模型库).outport saturation Sysblock.Discontinuities(不连续模型库).saturation scope Sysblock.Utilities(实用工具模型库).scope 在库浏览器中找到上述元器件,并且将它们拖到图中,按照如下位置进行摆放。

# 参数设置
双击打开 step 模块,设置阶跃时间 80,初始值 10,终值 5,采样时间 0,再单击确定保存设置。

双击打开 sum1 模块,设置符号列表为 +-,单击确定保存设置。

双击打开 PID 模块,将比例(P)、积分(I)、微分(D)、滤波系数(N) 的参数分别设置为 2.7、0.3、2、0.3,单击确定保存设置。

双击打开 saturation 模块,将上限、下限分别设置为 10、-10,单击确定保存设置。

双击打开 transferFcn 模块,将分子系数设置为 1,分母系数设置为 [10, 1],单击确定保存设置。

双击打开 transportDelay 模块,将时滞设置为 2,初始输出设置为 0,初始缓冲区大小设置为 2048, 单击确定保存设置。

# 连接模块
将 step 模块的输出端连接到 sum1 模块的 + 输入端,sum1 模块的输出端连接到 pIDController 模块的输入端,pIDController 模块输出端连接到 saturation 模块的输入端,将 saturation 模块的输出端连接到 transferFcn 模块的输入端。将 transferFcn 模块的输出端连接到 transportDelay 模块的输入端。将 transportDelay 模块的输出端分别连接到 outport 模块、scope 模块的输入端,以及 sum1 模块的 - 输入端。
# 仿真设置
在进行仿真之前需要进行仿真设置,在软件上方功能区,单击主页 > 仿真设置,打开仿真设置界面。在该界面设置开始时间 0,终止时间 200、输出区间步长 0.001。积分算法的类型设置为定步长、算法为 ImplicitEuler(隐式欧拉、Runge-Kutta、1 阶、刚性)、容差 0.0001、积分步数 1,单击确定并保存到模型。
# 仿真运行
首先,检查当 PID Controller 模块不考虑饱和模型时饱和对闭环的影响。单击主页 > 仿真,运行仿真并且等待仿真运行结束。

双击 scope 示波器查看运行结果。

单击主页 > 结果查看器,单击选择 step>y,再单击 transferFcn>outport。

单击取消 step>y 和 transferFcn>outport 的勾选。单击选择 pIDController>outport,再单击选择 saturation>y。

以上图片显示无抗饱和时设定点与测量输出的关系。设计考虑饱和影响的 PID 控制器可以让其大部分时间在线性区域中操作并快速从非线性中恢复,从而提高其性能。因此可以使用抗饱和机制来实现这一点。
# 基于反算配置抗饱和模块
当控制器达到指定的饱和界限并进入非线性操作时,反算抗饱和方法使用反馈环来防止 PID Controller 模块内部积分器饱和。要启用抗饱则双击打开 pIDController 模块,单击饱和 > 限制输出,将上限设置为 10,下限设置为 -10。抗饱和方法设置为反算,反算系数设置为 1,单击确定保存设置。

单击主页 > 仿真,等待仿真结束。再单击结果查看器,单击选择 pIDController>outport,再单击选择 saturation>y。

此时控制器 pIDController 模块输出和饱和 saturation 模块输出彼此吻合,这是因为启用了 “ 限制输出 ”。
# 使用跟踪模式处理复杂的抗饱和场景
到目前为止讨论的抗饱和策略依赖于内置方法来处理通过对话框提供给模块的饱和信息。要使这些内置方法按预期工作,必须满足两个条件:
- 被控对象的饱和界限是已知的,可以输入到模块的对话框中。
- PID Controller 模块输出信号是馈送给执行器的唯一信号。
这些条件在处理一般的抗饱和情况时可能是限制性的。PIDController 模块具有一种跟踪模式,该模式允许您在外部设置反算抗饱和环。接下来的两个示例说明如何将跟踪模式用于抗饱和目的:
- 具有级联动态的饱和作动器的抗饱和。
- 具有前馈的 PID 控制的抗饱和。
# 具有级联动态的饱和执行器的抗饱和
当执行器有自己的闭环动态时,复杂动态很常见。PID 控制器位于外环,将执行器动态视为内环,它也称为级联饱和动态。
单击选中 transferFcn 模块,按下键盘上 Ctrl+C 复制该模块,再按下两次 Ctrl+V 粘贴两个 transferFcn 模块。单击选中 saturation 模块的输入与输出信号线,单击 Delete 删除信号线。将 transferFcn1 模块放在 saturation 模块左边,将 transferFcn2 模块放在 saturation 模块右边,将它们依次连接。

双击打开 transferFcn1 模块,将分子系数设置为 0.7,分母系数设置为 [1, 0.7],单击确定保存设置。

双击打开 transferFcn2 模块,将分子系数设置为 0.5,分母系数设置为 [1, 0.5],单击确定保存设置。

双击 pIDController 模块,单击初始化 > 启用跟踪模式。再单击饱和 > 限制输出,取消掉限制输出的勾选,单击确定保存设置。

将 transferFcn2 模块的输出端口连接到 pIDController 模块的 TR 输入端口。

单击主页 > 仿真,等待仿真结束。再单击结果查看器,单击选择 pIDController>outport,再单击选择 transferFcn2>y。
您可使用上述步骤中搭建的模型进行仿真操作。如未通过上述步骤搭建完整模型,也可单击右侧打开示例按钮,使用提供的模型进行仿真。

单击取消选择 pIDController>outport、transferFcn2>y 的勾选,再单击选择 step>y、transferFcn>y。

# 具有前馈的 PID 控制的抗饱和
在另一种常见的控制配置中,执行器接收控制信号,该控制信号是 PID 控制信号和前馈控制信号的组合。
分别单击选中 transferFcn1 和 transferFcn2 模块,单击 Delete 按键删除该模块及相关信号线。

放置一个 gain 模块(按元素增益(y = k * u 或 y = u * k)),它的位置在库浏览器 Sysblock.MathOperation(数学运算模型库).gain。单击选中 sum1 模块,按下键盘上 Ctrl+C 复制该模块,再按下两次 Ctrl+V 粘贴两个 sum 模块。

双击打开 sum2 模块,将符号列表修改为 ++,单击确定保存设置。

右击选中 sum3 模块,单击水平翻转,再右击选中 sum3 模块,单击垂直翻转。

将 step 模块的输出端口连接到 gain 模块的输入端口。gain 模块的输出端口连接到 sum2 模块的 + 输入端口、sum3 模块的 - 输入端口。pIDController 模块的输出端口连接到 sum2 模块的 + 输入端口。sum2 模块的输出端口连接到 saturation 模块的输入端口。saturation 模块的输出端口连接到 transferFcn 模块的输入端口、sum3 模块的 + 输入端口。sum3 模块的输出端口连接到 pIDController 模块的 TR 输入端口。

单击主页 > 仿真,等待仿真结束。再单击结果查看器,单击选择 step>y,再单击选择 transportDelay>y。
您可使用上述步骤中搭建的模型进行仿真操作。如未通过上述步骤搭建完整模型,也可单击右侧打开示例按钮,使用提供的模型进行仿真。

单击取消选择 step>y、transportDelay>y。再单击选择 saturation>y、sum2>y。

再单击取消选择 saturation>y、sum2>y。再单击选择 step>y、pIDController>outport。
