Main Content

本页翻译不是最新的。点击此处可查看最新英文版本。

Discrete PID Controller

离散时间或连续时间 PID 控制器

  • Discrete PID Controller block

库:
Simulink / Discrete
HDL Coder / Discrete
HDL Coder / HDL Floating Point Operations

描述

Discrete PID Controller 模块实现一个 PID 控制器(PID、PI、PD、仅 P 或仅 I)。该模块与时域参数设置为离散时间PID Controller 模块相同。

此模块的输出是输入信号、输入信号积分和输入信号导数的加权和。权重为比例、积分和导数增益参数。通过一阶极点过滤导数操作。

该模块支持多种控制器类型和结构体。此模块中可配置的选项包括:

  • 控制器类型(PID、PI、PD、仅 P 或仅 I)- 请参阅控制器参数。

  • 控制器形式(Parallel 或 Ideal)- 请参阅形式参数。

  • 时域(连续或离散)- 请参阅时域参数。

  • 初始条件和重置触发器 - 请参阅外部重置参数。

  • 输出饱和界限和内置抗饱和机制 - 请参阅限制输出参数。

  • 无扰动切换和多环控制的信号跟踪 - 请参阅启用跟踪模式参数。

当您更改这些选项时,模块的内部结构体会通过激活不同的可变子系统而发生更改。(有关详细信息,请参阅Implement Variations in Separate Hierarchy Using Variant Subsystems。)要检查模块及其可变子系统的内部结构体,请右键点击该模块,然后选择封装 > 查看封装内部

控制配置

在一个常见的实现中,PID Controller 模块在反馈回路的前馈路径中运行。

模块的输入通常是一个误差信号,这是参考信号与系统输出之间的误差。有关允许设定点加权的双输入模块,请参阅 Discrete PID Controller (2DOF)

PID 增益调整

可手动或自动调整 PID 控制器增益。自动调整需要 Simulink® Control Design™ 软件。有关自动调整的详细信息,请参阅选择调节方法参数。

端口

输入

全部展开

参考信号与受控系统输出之间的差异,如下图所示。

数据类型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | fixed point

比例增益,从模块外部的信源提供。外部增益输入非常有用,例如,当您希望将不同的 PID 参数化映射到模块的 PID 增益时。您还可以使用外部增益输入来实现增益调度 PID 控制。在增益调度控制中,您可以通过模型中的逻辑或其他计算确定 PID 系数,并将它们提供给模块。

依存关系

要启用此端口,请将控制器参数源设置为外部

数据类型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | fixed point

积分增益,由模块外部的信源提供。外部增益输入非常有用,例如,当您希望将不同的 PID 参数化映射到模块的 PID 增益时。您还可以使用外部增益输入来实现增益调度 PID 控制。在增益调度控制中,您可以通过模型中的逻辑或其他计算确定 PID 系数,并将它们提供给模块。

当您从外部提供增益时,还会对积分增益中的时变进行积分。这是由于 PID 增益是在模块内实现而造成的。有关详细信息,请参阅控制器参数源参数。

依存关系

要启用此端口,请将控制器参数源设置为外部,并将控制器设置为具有积分动作的控制器类型。

数据类型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | fixed point

对于离散时间控制器,积分增益乘以控制器采样时间,由模块外部的源提供。外部增益输入非常有用,例如,当您希望将不同的 PID 参数化映射到模块的 PID 增益时。您还可以使用外部增益输入来实现增益调度 PID 控制。在增益调度控制中,您可以通过模型中的逻辑或其他计算确定 PID 系数,并将它们提供给模块。

注意

PID 调节工具,如 PID 调节器Closed-Loop PID Autotuner 模块,可调节增益 I,但无法调节增益 I*T s。因此,将从调节工具获得的积分增益值乘以采样时间,然后将其提供给此端口。

当您使用 I*Ts 而不是 I 时,模块需要较少的计算来执行积分。这会改进生成代码的执行时间。

对于连续时间控制器,禁用使用 I*Ts 并改用 I 端口。

依存关系

要启用此端口,请将控制器参数源设置为外部,将控制器设置为具有积分动作的控制器类型,并启用使用 I*Ts 参数。

数据类型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | fixed point

导数增益,由模块外部的信源提供。外部增益输入非常有用,例如,当您希望将不同的 PID 参数化映射到模块的 PID 增益时。您还可以使用外部增益输入来实现增益调度 PID 控制。在增益调度控制中,您可以通过模型中的逻辑或其他计算确定 PID 系数,并将它们提供给模块。

当您从外部提供增益时,还会对导数增益中的时变进行微分。这是由于 PID 增益是在模块内实现而造成的。有关详细信息,请参阅控制器参数源参数。

依存关系

要启用此端口,请将控制器参数源设置为外部,并将控制器设置为具有导数动作的控制器类型。

数据类型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | fixed point

导数滤波器系数,由模块外部的信源提供。外部系数输入非常有用,例如,当您希望将不同的 PID 参数化映射到模块的 PID 增益时。您还可以使用外部输入来实现增益调度 PID 控制。在增益调度控制中,您可以通过模型中的逻辑或其他计算确定 PID 系数,并将它们提供给模块。

依存关系

要启用此端口,请将控制器参数源设置为外部,并将控制器设置为具有滤波后的导数的控制器类型。

数据类型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | fixed point

用于将积分器和滤波器重置为其初始条件的触发器。外部重置参数的值确定重置发生在上升信号、下降信号还是水平信号上。端口图标指示所选触发器类型。例如,下图显示外部重置设置为上升沿的连续时间 PID 模块。

当触发事件发生时,模块将积分器和滤波器重置为由积分器初始条件滤波器初始条件参数或 I0D0 端口指定的初始条件。

注意

为了符合汽车行业软件可靠性协会 (MISRA™) 的软件标准,您的模型必须使用布尔值信号来驱动 PID controller 模块的外部重置端口。

依存关系

要启用此端口,请将外部重置设置为以外的任何值。

数据类型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | fixed point | Boolean

积分器初始条件,由模块外部的信源提供。

依存关系

要启用此端口,请将初始条件源设置为外部,并将控制器设置为具有积分动作的控制器类型。

数据类型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | fixed point

导数滤波器的初始条件,由模块外部的信源提供。

依存关系

要启用此端口,请将初始条件源设置为外部,并将控制器设置为具有导数动作的控制器类型。

数据类型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | fixed point

模块输出的上限,由模块外部的源提供。如果比例、积分和导数动作的加权总和超过此端口上提供的值,则模块输出保持在该值。

依存关系

要启用此端口,请选择限制输出,并将输出饱和设置为外部

数据类型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | fixed point

模块输出的下限,由模块外部的源提供。如果比例、积分和导数动作的加权总和低于此端口上提供的值,则模块输出保持在该值。

依存关系

要启用此端口,请选择限制输出,并将输出饱和设置为外部

数据类型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | fixed point

控制器输出要跟踪的信号。激活信号跟踪后,跟踪信号与模块输出之间的差异将反馈给积分器输入。信号跟踪可用于实现系统在两个控制器之间的无扰动切换。它也可用于在多回路控制系统中防止模块饱和。有关详细信息,请参阅启用跟踪模式参数。

依存关系

要启用此端口,请选择启用跟踪模式参数。

数据类型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | fixed point

离散积分器时间,作为标量提供给模块。您可以使用自己的离散时间积分器采样时间值来定义该模块在 Simulink 中或外部硬件上运行的速率。当在条件执行子系统中使用该模块时,离散时间积分器时间的值应与外部中断的平均采样率相匹配。

换句话说,您可以为以下任何积分器方法指定 Ts,使该值与外部中断的平均采样率相匹配。在离散时间内,控制器传递函数的导数项为:

D[N1+Nα(z)],

其中 α(z) 取决于您使用此参数指定的积分器方法。

前向欧拉

α(z)=Tsz1.

后向欧拉

α(z)=Tszz1.

梯形

α(z)=Ts2z+1z1.

有关离散时间积分的详细信息,请参阅 Discrete-Time Integrator 模块参考页。有关条件执行子系统的详细信息,请参阅条件执行子系统概述

依存关系

要启用此端口,请将时域设置为离散时间并选择 PID 控制器位于条件执行子系统内选项。

数据类型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

输出

全部展开

控制器输出,通常基于输入信号、输入信号的积分和输入信号的导数,经由比例、积分和导数增益参数加权求和。通过一阶极点过滤导数操作。控制器信号中存在哪些项取决于您为控制器参数选择的内容。当前设置的基本控制器传递函数显示在模块参数的补偿器公式部分中和封装下。其他参数修改模块输出,例如上限下限饱和参数指定的饱和界限。

当任一输入为向量信号时,控制器输出是向量信号。在这种情况下,模块充当 N 个独立 PID 控制器,其中 N 是输入向量中的信号数。

数据类型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | fixed point

参数

全部展开

指定在控制器中包含比例项、积分项和导数项中的哪些项。

PID

比例、积分和导数动作。

PI

仅比例和积分动作。

PD

仅比例和导数动作。

P

仅比例动作。

I

仅积分动作。

提示

当前设置的控制器传递函数显示在模块参数的补偿器公式部分中和封装下。

编程用法

模块参数Controller
类型:字符串、字符向量
值:"PID""PI""PD""P""I"
默认值:"PID"

指定控制器结构是“并行”还是“理想”。

并行

控制器输出是比例、积分和导数动作的总和,三者分别用 PID 独立进行加权。例如,对于连续时间并行形式 PID 控制器,传递函数为:

Cpar(s)=P+I(1s)+D(Nss+N).

对于离散时间并行形式的控制器,传递函数为:

Cpar(z)=P+Iα(z)+D[N1+Nβ(z)],

其中积分器方法滤波器方法参数分别确定 α(z) 和 β(z)。

理想

比例增益 P 作用于所有动作的总和。例如,对于连续时间理想形式 PID 控制器,传递函数为:

Cid(s)=P[1+I(1s)+D(Nss+N)].

对于离散时间理想形式的控制器,传递函数为:

Cid(z)=P[1+Iα(z)+DN1+Nβ(z)],

其中积分器方法滤波器方法参数分别确定 a(z) 和 b(z)。

提示

当前设置的控制器传递函数显示在模块参数的补偿器公式部分中和封装下。

编程用法

模块参数Controller
类型:字符串、字符向量
值:"Parallel""Ideal"
默认值"Parallel"

选择离散时间时,建议您为模块指定显式采样时间。请参阅采样时间(-1 表示继承) 参数。选择离散时间也会启用积分器方法滤波器方法参数。

PID Controller 模块位于具有同步状态控件(请参阅 State Control (HDL Coder) 模块)的模型中时,您不能选择连续时间

注意

PID ControllerDiscrete PID Controller 模块是相同的,只是此参数的默认值不同。

编程用法

模块参数TimeDomain
类型:字符串、字符向量
值:"Continuous-time""Discrete-time"
默认值"Discrete-time"

对于离散时间 PID 控制器,启用离散时间积分器端口以使用您自己的离散时间积分器采样时间值。为确保正确积分,请使用 TDTI 端口提供标量值 Δt,用于精确的离散时间积分。

依存关系

要启用此参数,请将时域设置为离散时间

编程用法

模块参数UseExternalTs
类型:字符串、字符向量
值:"on""off"
默认值"off"

通过输入正标量值(例如 0.1)指定采样时间。默认的离散采样时间为 -1,表示该模块从上游模块继承其采样时间。但是,建议您显式设置控制器采样时间,尤其是在您预计上游模块的采样时间会发生变化时。控制器系数 P、I、D 和 N 的影响取决于采样时间。因此,对于给定的一组系数值,更改采样时间会更改控制器的性能。

有关详细信息,请参阅 指定采样时间

要实现连续时间控制器,请将时域设置为连续时间

提示

如果要使用外部指定的或可变的采样时间运行模块,请将此参数设置为 -1 并将模块放在 Triggered Subsystem 中。然后,在所需的采样时间触发该子系统。

依存关系

要启用此参数,请将时域设置为离散时间

编程用法

模块参数:SampleTime
类型:标量
值: -1、正标量
默认值: -1

在离散时间内,控制器传递函数的积分项为 Iα(z),其中 α(z) 取决于您使用此参数指定的积分器方法。

前向欧拉

正向矩形(左手)逼近方法,

α(z)=Tsz1.

这种方法最适合较小的采样时间,此时奈奎斯特限制与控制器带宽相比来说比较大。对于较大的采样时间,前向欧拉方法可能带来不稳定性,即使离散的是在连续时间下表现稳定的系统。

后向欧拉

反向矩形(右手)逼近方法,

α(z)=Tszz1.

后向欧拉方法的一个优点是:使用这种方法离散稳定的连续时间系统始终会生成稳定的离散时间结果。

梯形

双线性逼近法。

α(z)=Ts2z+1z1.

梯形方法的一个优点是:使用这种方法离散稳定的连续时间系统始终会生成稳定的离散时间结果。在所有可用的积分方法中,梯形方法可在离散化系统与对应的连续时间系统的频域属性之间生成最接近的匹配。

提示

当前设置的控制器公式显示在模块参数的补偿器公式部分中和封装下。

注意

对于后向欧拉梯形方法,如果出现以下情况之一,则不能为模块生成 HDL 代码:

  • 选择了限制输出抗饱和方法以外的值。

  • 选择了启用跟踪模式

有关离散时间积分的详细信息,请参阅Discrete-Time Integrator模块参考页。

依存关系

要启用此参数,请将时域设置为离散时间,并将控制器设置为具有积分动作的控制器类型。

编程用法

模块参数IntegratorMethod
类型:字符串、字符向量
值:"Forward Euler""Backward Euler""Trapezoidal"
默认值"Forward Euler"

在离散时间内,控制器传递函数的导数项为:

D[N1+Nα(z)],

其中 α(z) 取决于您使用此参数指定的滤波器方法。

前向欧拉

正向矩形(左手)逼近方法,

α(z)=Tsz1.

这种方法最适合较小的采样时间,此时奈奎斯特限制与控制器带宽相比来说比较大。对于较大的采样时间,前向欧拉方法可能带来不稳定性,即使离散的是在连续时间下表现稳定的系统。

后向欧拉

反向矩形(右手)逼近方法,

α(z)=Tszz1.

后向欧拉方法的一个优点是:使用这种方法离散稳定的连续时间系统始终会生成稳定的离散时间结果。

梯形

双线性逼近法。

α(z)=Ts2z+1z1.

梯形方法的一个优点是:使用这种方法离散稳定的连续时间系统始终会生成稳定的离散时间结果。在所有可用的积分方法中,梯形方法可在离散化系统与对应的连续时间系统的频域属性之间生成最接近的匹配。

提示

当前设置的控制器公式显示在模块参数的补偿器公式部分中和封装下。

有关离散时间积分的详细信息,请参阅Discrete-Time Integrator模块参考页。

依存关系

要启用此参数,请将时域设置为离散时间并启用使用滤波导数

编程用法

模块参数FilterMethod
类型:字符串、字符向量
值:"Forward Euler""Backward Euler""Trapezoidal"
默认值"Forward Euler"

常设

如果为参数启用外部输入,您可以在模块外部计算 PID 增益和滤波器系数,并将它们作为信号输入提供给模块。

内部

使用模块参数 PIDN 指定控制器增益和滤波器系数。

外部

使用模块输入从外部指定 PID 增益和滤波器系数。对于当前控制器类型需要的每个参数,模块上会出现一个额外的输入端口。

外部增益输入非常有用,例如,当您希望将不同的 PID 参数化映射到模块的 PID 增益时。您还可以使用外部增益输入来实现增益调度 PID 控制。在增益调度控制中,您可以通过模型中的逻辑或其他计算确定 PID 增益,并将它们提供给模块。

小心

如果启用外部增益输入,请避免使增益依赖模块输出 y。如果存在这样的依存关系,生成的 PID 传递函数会导致代数环,因为计算模块输出值需要知道模块输出值。这种代数环容易带来不稳定性和发散性。尝试用时间和模块输入来表示收益,而不是输出。有关代数环的详细信息,请参阅代数环概念

如果从外部提供增益,则会分别对积分和导数增益值的时变进行积分和微分。出现这种结果是因为在连续时间和离散时间中,增益都会在积分或微分之前应用于信号。例如,对于采用外部输入的连续时间 PID 控制器,积分项的实现方式如下图所示。

在进行积分之前,系统会在模块内将输入信号 u 乘以外部提供的积分增益 I。此实现的结果为:

yi=uIdt.

因此,积分增益包含在积分中。类似地,在模块的导数项中,进行微分之前会乘以导数增益,从而导致导数增益 D 被微分。

编程用法

模块参数ControllerParametersSource
类型:字符串、字符向量
值:"internal""external"
默认值"internal"

为比例增益指定有限实数增益值。控制器形式可以是:

  • 并行 - 比例动作独立于积分和导数动作。例如,对于连续时间并行 PID 控制器,传递函数为:

    Cpar(s)=P+I(1s)+D(Nss+N).

    对于离散时间并行形式的控制器,传递函数为:

    Cpar(z)=P+Iα(z)+D[N1+Nβ(z)],

    其中积分器方法滤波器方法参数分别确定 α(z) 和 β(z)。

  • 理想 - 比例增益乘以积分和导数项。例如,对于连续时间理想 PID 控制器,传递函数为:

    Cid(s)=P[1+I(1s)+D(Nss+N)].

    对于离散时间理想形式的控制器,传递函数为:

    Cid(z)=P[1+Iα(z)+DN1+Nβ(z)],

    其中积分器方法滤波器方法参数分别确定 α(z) 和 β(z)。

可调: Yes

依存关系

要启用此参数,请在常设选项卡中,将控制器参数设置为内部,并将控制器设置为 PIDPDPIP

编程用法

模块参数P
类型:标量、向量
默认值:1

为积分增益指定有限实数增益值。

可调: Yes

依存关系

要启用此参数,请在常设选项卡中将控制器参数设置为内部,并将控制器设置为具有积分动作的类型。

编程用法

模块参数I
类型:标量、向量
默认值:1

对于离散时间控制器,为积分增益乘以采样时间指定有限实数增益值。

注意

PID 调节工具,如 PID 调节器Closed-Loop PID Autotuner 模块,可调节增益 I,但无法调节增益 I*T s。因此,将从调节工具获得的积分增益值乘以采样时间,然后将其写入此参数。

当您使用 I*Ts 而不是 I 时,模块需要较少的计算来执行积分。这会改进生成代码的执行时间。

对于连续时间控制器,禁用使用 I*Ts 并改用 I 参数。

可调: No

依存关系

要启用此参数,请在常设选项卡中将控制器参数设置为内部,将控制器设置为具有积分动作的类型,并启用使用 I*Ts 参数。

编程用法

模块参数I
类型:标量、向量
默认值:1

对于具有积分动作的离散时间控制器,该模块将积分增益作为输入,并在内部将其乘以采样时间,作为执行积分的一部分。如果您启用此参数,您将显式指定积分增益乘以采样时间作为输入 (I*Ts),代替积分增益 (I)。这样做可以减少内部计算的次数,并且在您要改进所生成代码的执行时间时非常有用。

如果您启用信号跟踪或抗饱和模式反算,并且启用 I*Ts,则还必须将跟踪增益参数 Kt 设置为 Kt*Ts,并将反算系数 Kb 设置为 Kb*Ts

对于连续时间控制器,启用此参数对积分增益不起作用。

依存关系

要启用此参数,请将控制器设置为具有积分动作的控制器类型。

编程用法

模块参数UseKiTs
类型:字符串、字符向量
值:"on""off"
默认值"on"

为导数增益指定有限实数增益值。

可调: Yes

依存关系

要启用此参数,请在常设选项卡中将控制器参数设置为内部,并将控制器设置为 PIDPD

编程用法

模块参数D
类型:标量、向量
默认值:0

仅针对离散时间 PID 控制器,取消选中此选项以将滤波后的导数替换为未滤波的离散时间微分器。执行此操作时,控制器传递函数的导数项变为:

Dz1zTs.

对于连续时间 PID 控制器,始终对导数项进行滤波。

依存关系

要启用此参数,请将时域设置为离散时间,并将控制器设置为具有导数动作的类型。

编程用法

模块参数UseFilter
类型:字符串、字符向量
值:"on""off"
默认值"on"

为滤波器系数指定有限实数增益值。滤波器系数确定滤波器在模块的导数动作中的极点位置。滤波器极点的位置取决于时域参数。

  • 时域连续时间时,极点位置为 s = -N

  • 时域离散时间时,极点位置取决于滤波器方法参数。

    滤波器方法滤波器极点的位置
    前向欧拉zpole=1NTs
    后向欧拉zpole=11+NTs
    梯形zpole=1NTs/21+NTs/2

模块不支持 N = Inf(理想的未滤波导数)。当时域离散时间时,可以清除使用滤波导数以删除导数滤波器。

可调: Yes

依存关系

要启用此参数,请在常设选项卡中将控制器参数设置为内部,并将控制器设置为 PIDPD

编程用法

模块参数N
类型:标量、向量
默认值:100

如果您有 Simulink Control Design 软件,则可以自动调整 PID 系数。为此,请使用此参数选择调整工具,然后点击调节

基于传递函数(PID 调节器)

使用 PID 调节器,您可以在检查相关系统响应以验证性能的同时交互调节 PID 系数。默认情况下,这种 PID 调节器适合线性化被控对象模型。对于无法线性化的模型,您可以根据从仿真或测量的响应数据估算出的被控对象模型来调整 PID 系数。有关详细信息,请参阅 Simulink 中基于模型的 PID 调节简介 (Simulink Control Design)

基于频率响应

使用基于频率响应的 PID 调节器,它根据通过仿真获得的频率响应估计数据来调节 PID 控制器系数。这种调整方法特别适用于不可线性化或线性化为零的被控对象。有关详细信息,请参阅Design PID Controller from Plant Frequency-Response Data (Simulink Control Design)

这两种调整方法都采用单回路控制配置。Simulink Control Design 软件提供适合更复杂配置的其他调整方法。有关调整 PID Controller 模块的其他方法的信息,请参阅Choose a Control Design Approach (Simulink Control Design)

过零检测可以准确无误地确定信号的不连续性,而无需检测特别小的时间步,因为这样可能会大大延长仿真时间。如果在 PID Controller 模块中选择限制输出或者激活外部重置,激活过零检测可以缩短仿真时的计算时间。选择此参数可在以下时间激活过零检测:

  • 在初始状态重置时

  • 在进入上限或下限饱和状态时

  • 在退出上限或下限饱和状态时

有关过零检测的详细信息,请参阅过零检测

编程用法

模块参数ZeroCross
类型:字符串、字符向量
值:"on""off"
默认值"on"

初始化:

Simulink 使用初始条件在仿真开始时或在指定的触发事件发生时初始化积分器和导数滤波器(或未滤波的导数)输出。(请参阅外部重置参数。)这些初始条件确定初始模块输出。使用此参数选择如何向模块提供初始条件值。

内部

使用积分器初始条件滤波器初始条件参数指定初始条件。如果未选择使用滤波导数,请使用微分器参数指定未滤波的微分器的初始条件,而不是滤波器初始条件。

外部

使用模块输入从外部指定初始条件。额外的输入端口 IoDo 出现在模块中。如果未选择使用滤波导数,请在 Do 处提供未滤波的微分器的初始条件,而不是滤波器初始条件。

编程用法

模块参数InitialConditionSource
类型:字符串、字符向量
值:"internal""external"
默认值"internal"

Simulink 在仿真一开始或在发生指定的触发事件时(请参阅外部重置)使用积分器初始条件来初始化积分器。积分器初始条件与滤波器初始条件一起确定 PID controller 模块的初始输出。

积分器初始条件不能是 NaNInf

依存关系

要使用此参数,请在初始化选项卡中将设置为内部,然后将控制器设置为具有积分动作的类型。

编程用法

模块参数InitialConditionForIntegrator
类型:标量、向量
默认值:0

Simulink 在仿真一开始或在发生指定的触发事件时(请参阅外部重置)使用滤波器初始条件来初始化导数滤波器。积分器初始条件与滤波器初始条件一起确定 PID controller 模块的初始输出。

滤波器初始条件不能是 NaNInf

依存关系

要使用此参数,请在初始化选项卡中将设置为内部,并使用具有导数滤波器的控制器。

编程用法

模块参数InitialConditionForFilter
类型:标量、向量
默认值:0

使用未滤波的导数时,Simulink 使用此参数在仿真一开始或在发生指定的触发事件时(请参阅外部重置)初始化微分器。积分器初始条件和导数初始条件一起确定 PID controller 模块的初始输出。

导数初始条件不能是 NaNInf

依存关系

要使用此参数,请将时域设置为离散时间,清除使用滤波导数复选框,然后在初始化选项卡中,将设置为内部

编程用法

模块参数DifferentiatorICPrevScaledInput
类型:标量、向量
默认值:0

使用此参数指定是否将积分器初始条件滤波器初始条件参数应用于对应的模块状态或输出。您只能在命令行中使用 set_param 设置模块的 InitialConditionSetting 参数来更改此参数。

自动

除非模块在触发子系统或函数调用子系统中且启用了简化初始化模式,否则其他所有情况下均使用此选项。

输出

当模块在触发子系统或函数调用子系统中且启用了简化初始化模式时,使用此选项。

有关初始条件设置参数的详细信息,请参阅 Discrete-Time Integrator 模块。

此参数只能通过编程用法访问。

编程用法

模块参数InitialConditionSetting
类型:字符串、字符向量
值:"Auto""Output"
默认值:"Auto"

指定使模块将积分器和滤波器重置为初始条件的触发条件。(如果未选择使用滤波导数,则触发器会将积分器和微分器重置为初始条件。)选择之外的任何选项都将在模块上启用重置端口以接收外部重置信号。

积分器和滤波器(或微分器)输出在仿真开始时设置为初始条件,在仿真期间不会重置。

上升沿

当重置信号具有上升沿时重置输出。

下降沿

当重置信号具有下降沿时重置输出。

任一沿

当重置信号上升或下降时重置输出。

电平

当重置信号具有以下情况之一时重置输出:

  • 在当前时间步为非零值时

  • 从上一时间步的非零更改为当前时间步的零时

此选项在重置信号非零时使输出保持在初始条件。

依存关系

要启用此参数,请将控制器设置为具有导数或积分动作的类型。

编程用法

模块参数ExternalReset
类型:字符串、字符向量
值:"none""rising""falling""either""level"
默认值"none"

选择此项可强制 Simulink 和 Simulink Control Design 线性化命令忽略在外部重置参数中指定的任何重置机制。忽略重置状态将允许您围绕某个工作点对模型进行线性化,即使该工作点会导致模块重置也一样。

编程用法

模块参数IgnoreLimit
类型:字符串、字符向量
值:"off""on"
默认值"off"

信号跟踪使模块输出能够跟随您在 TR 端口提供的跟踪信号。激活信号跟踪后,跟踪信号与模块输出之间的差异将反馈给由跟踪增益 (Kt) 参数指定的增益为 Kt 的积分器输入。跟踪信号具有多种应用,包括无扰动切换和避免多回路控制结构中的饱和。

无扰动切换

使用信号跟踪可以实现系统在两个控制器之间切换时的无扰动切换。假设您要在 PID 控制器和另一个控制器之间转移控制权。为此,将控制器输出连接到 TR 输入,如下图所示。

有关详细信息,请参阅Bumpless Control Transfer

多回路控制

使用信号跟踪来防止多回路控制方法中的模块饱和,如以下模型中所示。

Inner Loop 子系统包含下图所示的模块。

由于 PID 控制器跟踪内环的输出,因此其输出永远不会超过饱和内环输出。有关详细信息,请参阅Prevent Block Windup in Multiloop Control

依存关系

要启用此参数,请将控制器设置为具有积分动作的类型。

编程用法

模块参数TrackingMode
类型:字符串、字符向量
值:"off""on"
默认值"off"

选择启用跟踪模式时,信号 TR 与模块输出之间的差异将反馈到具有增益 Kt 的积分器输入。使用此参数指定该反馈回路中的增益。

对于离散时间控制器,如果您选择模块的使用 I*Ts 参数,则将此参数设置为值 Kt*Ts,其中 Kt 是所需增益,Ts 是采样时间。

依存关系

要启用此参数,请选择启用跟踪模式

编程用法

模块参数:Kt
类型:标量
默认值:1

饱和

输出饱和

激活此选项可限制模块输出,因此无需在控制器后面另加 Saturation 模块。它还允许您激活模块内置的抗饱和机制(请参阅抗饱和方法参数)。使用下限上限参数指定输出饱和界限。您也可以在外部指定饱和界限作为模块输入端口。

编程用法

模块参数LimitOutput
类型:字符串、字符向量
值:"off""on"
默认值"off"

使用此参数指定如何提供模块输出的饱和上限及饱和下限。

内部

使用上限下限参数指定输出饱和界限。

外部

使用模块输入端口从外部指定输出饱和界限。额外的输入端口 uplo 出现在该模块上。您可以使用输入端口来实现由 Simulink 模型中的逻辑或其他计算确定并传递给该模块的输出饱和上限和下限。

编程用法

模块参数SatLimitsSource
类型:字符串、字符向量
值:"internal""external"
默认值"internal"

指定模块输出的上限值。一旦比例、积分和导数动作的加权和高于饱和上限,模块输出将保持在该上限值。

依存关系

要启用此参数,请选择限制输出

编程用法

模块参数:UpperSaturationLimit
类型:标量
默认值Inf

指定模块输出的下限。一旦比例、积分和微分动作的加权和低于饱和下限时,模块输出将保持在该下限值。

依存关系

要启用此参数,请选择限制输出

编程用法

模块参数:LowerSaturationLimit
类型:标量
默认值-Inf

强制 Simulink 和 Simulink Control Design 线性化命令忽略在上限下限参数中指定的模块输出限制。忽略输出限制允许您围绕某个工作点对模型进行线性化,即使该工作点会导致模块超出输出限制也一样。

依存关系

要启用此参数,请选择限制输出参数。

编程用法

模块参数LinearizeAsGain
类型:字符串、字符向量
值:"off""on"
默认值"off"

如果选中了限制输出且控制器组件的加权和超出了指定的输出限制,模块输出将保持在指定的限制值。但是,积分器输出可以继续增加(积分器饱和),从而加大了模块输出与模块组件之和之间的差距。换句话说,即使输出看起来在饱和界限范围内,模块中的内部信号也可以无限大。如果没有积分器抗饱和机制,可能会产生以下两种结果:

  • 输入信号的符号永远不变,积分器继续计算积分,直到溢出。溢出值是积分器输出的数据类型的最大值或最小值。

  • 如果输入信号的符号在加权和超出输出界限时发生改变,它将需要很长时间来防止积分器饱和,并返回位于模块饱和界限范围内的加权和。

无论哪种情况,控制器性能都会受到影响。要在没有抗饱和机制的情况下消除饱和效果,可能需要解调控制器(例如,通过减小控制器增益),从而导致控制器速度缓慢。要避免此问题,请使用此参数激活抗饱和机制。

不使用抗饱和机制。

反算

当模块输出饱和时,通过将饱和控制信号与非饱和控制信号之间的差异反馈给积分器来防止积分器饱和。下图表示连续时间控制器的反算反馈电路。要查看控制器配置的实际反馈电路,请右键点击该模块,然后选择封装 > 查看封装内部

使用反算系数(Kb) 参数指定抗饱和反馈电路的增益。通常,设置 Kb = I(对于具有导数动作的控制器,设置 Kb = sqrt(I*D))是恰当的。对于饱和时间相对较长的被控对象,反算很有效。[1]

钳位

当模块组件之和超出输出限制且积分器输出与模块输入具有相同的符号时,积分停止。当模块组件之和超出输出限制且积分器输出与模块输入具有相反的符号时,积分恢复。钳位有时称为条件积分。

对于饱和时间相对较小的被控对象,钳位可能很有用;但对于饱和时间较大的被控对象,它可能产生不良的瞬时响应。[1]

依存关系

要启用此参数,请选择限制输出参数。

编程用法

模块参数AntiWindupMode
类型:字符串、字符向量
值:"none""back-calculation""clamping"
默认值"none"

当模块输出饱和时,back-calculation 抗饱和方法防止积分器饱和。它通过向积分器反馈饱和控制信号与非饱和控制信号之间的差异来实现此目的。使用反算系数(Kb) 参数指定抗饱和反馈电路的增益。有关详细信息,请参阅抗饱和方法参数。

对于离散时间控制器,如果选择模块的使用 I*Ts 参数,则将此参数设置为值 Kb*Ts,其中 Kb 是所需的系数,Ts 是采样时间。

依存关系

要启用此参数,请选择限制输出参数,并将抗饱和方法参数设置为反算

编程用法

模块参数:Kb
类型:标量
默认值:1
积分器饱和

启用此参数可将积分器输出限制在指定范围内。当积分器输出达到界限时,积分动作将关闭以防止积分饱和。使用下限上限参数指定饱和界限。

依存关系

要启用此参数,请将控制器设置为具有积分动作的控制器类型。

编程用法

模块参数LimitIntegratorOutput
类型:字符串、字符向量
值:"off""on"
默认值"off"

指定积分器输出的上限。一旦积分器输出超出此值,就会保持为该值。

依存关系

要启用此参数,请在积分器饱和下,选择限制输出

编程用法

模块参数UpperIntegratorSaturationLimit
类型:标量
默认值Inf

指定积分器输出的下限。一旦积分器输出低于此值,就会保持为该值。

依存关系

要启用此参数,请在积分器饱和下,选择限制输出

编程用法

模块参数LowerIntegratorSaturationLimit
类型:标量
默认值-Inf

数据类型

此选项卡中的参数主要用于使用 Fixed-Point Designer™ 生成定点代码。它们定义在生成代码时如何存储和处理与模块关联的数值量。

如果需要为定点代码生成配置数据类型,请点击打开定点工具并使用该工具配置选项卡中的其余参数。有关使用定点工具的信息,请参阅Autoscaling Data Objects Using the Fixed-Point Tool (Fixed-Point Designer)

使用定点工具后,在必要时可以使用此选项卡中的参数调整定点数据类型设置。对于与模块关联的每个量,您可以指定:

  • 浮点或定点数据类型,包括数据类型是否继承自模块中的上游值。

  • 量的最小值和最大值,用于确定如何对量进行定标以使用定点表示。

要获取帮助以选择适当的值,请点击 以打开对应量的数据类型助手。有关详细信息,请参阅使用数据类型助手指定数据类型

“数据类型”选项卡中具体列出的量取决于您配置 PID 控制器模块的方式。通常,您可以为以下类型的量配置数据类型:

  • 乘积输出 - 存储在模块封装下执行的乘法的结果。例如,P 乘积输出存储增益模块的输出,该输出是模块输入与比例增益 P 的乘积。

  • 参数 - 存储数值模块参数的值,例如 PID

  • 模块输出 - 存储位于 PID 控制器模块封装下的模块的输出。例如,使用积分器输出指定名为 Integrator 的模块输出的数据类型。此模块位于 Integrator 子系统中的封装下,并计算控制器操作的积分项。

  • 累加器 - 存储与求和模块关联的值。例如,SumI2 累加器设置与求和模块 SumI2 关联的累加器的数据类型。此模块位于 Anti-Windup 子系统的 Back Calculation 子系统中的封装下。

通常,您可以通过查看 PID Controller 模块封装并检查其子系统来查找与任何列出的参数关联的模块。您还可以使用模型资源管理器在封装下搜索列出的参数名称,例如 SumI2。(请参阅模型资源管理器。)

匹配输入和内部数据类型

默认情况下,模块中的所有数据类型都设置为继承: 从内部规则继承。使用此设置时,Simulink 在考虑嵌入式目标硬件的属性的同时,会选择相应的数据类型来平衡数值准确性、性能和生成的代码大小。

在某些情况下,模块内的数据类型之间可能会发生不兼容。例如,在连续时间下,封装下的 Integrator 模块只能接受 double 类型的信号。如果模块输入信号的类型不能转换为 double,例如 uint16,则生成代码时类型继承的内部规则会生成错误。

为了避免此类错误,可以使用“数据类型”设置强制进行数据类型转换。例如,您可以将 P 乘积输出I 乘积输出D 乘积输出显式设置为 double,确保到达连续时间积分器的信号类型为 double

通常,不建议在连续时间下将模块用于代码生成应用。但是,如果您将某些值显式设置为与模块中的下游信号约束不兼容的数据类型,则在离散时间下会发生类似的数据类型错误。在这种情况下,请使用“数据类型”设置确保所有数据类型在内部兼容。

定点运算参数

指定定点运算的舍入模式。有关详细信息,请参阅舍入 (Fixed-Point Designer)

模块参数始终舍入到最邻近的可表示值。要控制模块参数的舍入方法,请在封装字段中使用 MATLAB® 舍入函数输入表达式。

编程用法

模块参数RndMeth
类型:字符向量
值:'Ceiling' | 'Convergent' | 'Floor' | 'Nearest' | 'Round' | 'Simplest' | 'Zero'
默认值:'Floor'

指定对溢出是进行饱和处理还是绕回处理。

  • off - 溢出将绕回到数据类型可以表示的合适值。

    例如,数字 130 不适合一个有符号的 8 位整数,因此绕回 -126。

  • on - 将溢出饱和处理为数据类型能够表示的最小值或最大值。

    例如,一个有符号的 8 位整数的溢出可以饱和处理为 -128 或 127。

提示

  • 如果您的模型存在可能的溢出,而您希望在生成的代码中进行显式饱和保护,请考虑选中此复选框。

  • 如果您希望优化生成的代码的效率,请考虑清除此复选框。

    清除此复选框还可以帮助您避免过度地指定信号超出范围时的处理方式。有关详细信息,请参阅信号范围错误故障排除

  • 如果选中此复选框,饱和将应用于模块中的每个内部操作,而不仅仅应用于输出或结果。

  • 一般情况下,代码生成进程可以检测到何时不可能发生溢出。在这种情况下,代码生成器不会生成饱和代码。

编程用法

模块参数SaturateOnIntegerOverflow
类型:字符向量
值:'off' | 'on'
默认值:'off'

选择此参数可防止定点工具覆盖您对此模块指定的数据类型。有关详细信息,请参阅Lock the Output Data Type Setting (Fixed-Point Designer)

编程用法

模块参数LockScale
类型:字符向量
值:'off' | 'on'
默认值:'off'

状态属性

此选项卡中的参数主要用于代码生成。

对于连续时间 PID 控制器,为与积分器或滤波器关联的状态分配唯一名称。(有关离散时间 PID 控制器中的状态名称的信息,请参阅状态名称参数。)状态名称的用途举例如下:

  • 用于生成代码中的对应变量

  • 作为在仿真期间记录状态时存储名称的一部分

  • 用于通过线性化模块获得的线性模型中的对应状态

有效的状态名称以字母或下划线字符开始,后跟字母数字或下划线字符。

依存关系

要启用此参数,请将时域设置为连续时间

编程用法

参数:IntegratorContinuousStateAttributesFilterContinuousStateAttributes
类型:字符向量
默认值:''

对于离散时间 PID 控制器,为与积分器或滤波器关联的状态分配唯一名称。(有关连续时间 PID 控制器中的状态名称的信息,请参阅状态名称(例如,'position') 参数。)

有效的状态名称以字母或下划线字符开始,后跟字母数字或下划线字符。状态名称的用途举例如下:

  • 用于生成代码中的对应变量

  • 作为在仿真期间记录状态时存储名称的一部分

  • 用于通过线性化模块获得的线性模型中的对应状态

有关在代码生成中使用状态名称的详细信息,请参阅C Data Code Interface Configuration for Model Interface Elements (Simulink Coder)

依存关系

要启用此参数,请将时域设置为离散时间

编程用法

参数:IntegratorStateIdentifierFilterStateIdentifier
类型:字符串、字符向量
默认值:""

选择此参数会要求将离散时间积分器或滤波器状态名称解析为 Simulink 信号对象。

依存关系

要为离散时间积分器或滤波器状态启用此参数,请执行下列操作:

  1. 时域设置为离散时间

  2. 指定积分器或滤波器状态名称的值。

  3. 将模型配置参数信号解析设置为以外的值。

编程用法

模块参数:IntegratorStateMustResolveToSignalObjectFilterStateMustResolveToSignalObject
类型:字符串、字符向量
值:"off""on"
默认值"off"

模块特性

数据类型

double | fixed point | integer | single

直接馈通

多维信号

可变大小信号

过零检测

参考

[1] Visioli, A., "Modified Anti-Windup Scheme for PID Controllers," IEE Proceedings - Control Theory and Applications, Vol. 150, Number 1, January 2003

扩展功能

PLC 代码生成
使用 Simulink® PLC Coder™ 生成结构化文本代码。

版本历史记录

在 R2009b 中推出

全部展开