Main Content

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

Integrator

对信号求积分

  • Integrator block

库:
Simulink / Commonly Used Blocks
Simulink / Continuous

描述

Integrator 模块求输入信号关于时间的积分,并将结果作为输出信号。

Simulink®Integrator 模块作为具有一种状态的动态系统进行处理。模块动态由以下方程指定:

{x˙(t)=u(t)y(t)=x(t)   x(t0)=x0

,其中:

  • u 是模块输入。

  • y 是模块输出。

  • x 是模块状态。

  • x0x 的初始条件。

虽然这些方程定义了连续时间下的准确关系,但 Simulink 使用数值逼近方法以有限精度来进行计算。Simulink 可以使用若干不同的数值积分方法来计算模块的输出,每种方法都在特定的应用中各具优势。使用“配置参数”对话框的求解器窗格(请参阅求解器窗格)可以选择最适合您的应用的方法。

所选求解器会使用当前输入值和前一个时间步的状态值计算 Integrator 模块在当前时间步的输出。为支持此计算模型,Integrator 模块会保存在当前时间步的输出,以供求解器计算其在下一个时间步的输出。该模块还为求解器提供了初始条件,用于计算该模块在仿真开始时的初始状态。初始条件的默认值为 0。使用模块参数对话框可以为初始条件指定其他值,或在模块上创建初始值输入端口。

使用参数对话框可以:

  • 定义积分的上限和下限

  • 创建可将模块的输出(状态)重置为初始值的输入,具体取决于输入的变化方式。

  • 创建可选的状态输出,以便模块的输出值可以触发模块重置

使用 Discrete-Time Integrator 模块可以创建纯离散系统。

定义初始条件

可以在模块对话框上将初始条件定义为参数,或者从外部信号输入初始条件:

  • 要将初始条件定义为模块参数,请将初始条件来源参数指定为内部并在初始条件字段中输入值。

  • 要从外部源提供初始条件,请将初始条件来源参数设置为外部。模块上出现一个额外的输入端口。

    An Integrator block configured with an initial condition port has two input ports and one output port.

    注意

    如果选择限制输出参数,初始条件必须在饱和界限内。如果初始条件不在模块饱和界限范围内,该模块会显示错误消息。

限制积分

要将输出信号限制在指定的值范围内,请选择限制输出并指定饱和界限。当输出达到其中一个限值时,积分动作被禁用以防止积分饱和。在仿真期间,您可以更改限制,但不能更改是否限制输出。该模块按照以下准则确定输出信号值:

  • 当积分值小于或等于饱和下限时,输出信号值为饱和下限。

  • 当积分值在饱和下限与饱和上限之间时,输出为积分值。

  • 当积分值大于或等于饱和上限时,输出信号值为饱和上限。

要生成指示状态何时受饱和界限限制的信号,请选择显示饱和端口。第二个输出端口出现在模块上。

An Integrator block configured to limit the output and show the saturation port. The block has two output signals: the first is labeled Output and the second is labeled Saturation.

饱和信号具有以下三个值之一:

  • 1 - 状态受饱和上限限制

  • 0 - 状态不受限制

  • –1 - 状态受饱和下限限制

当限制 Integrator 模块输出时,该模块有三个过零信号:一个用于检测积分值何时超出饱和上限,一个用于检测积分值何时小于饱和下限,一个用于检测积分值何时从饱和变为不饱和。

注意

默认情况下,为 Integrator Limited 模块启用限制输出参数,其中饱和上限参数值设置为 1饱和下限参数值设置为 0

绕回循环状态

一些物理现象,如振荡器和展示旋转运动的机器,本质上是循环的、周期的或旋转的。在 Simulink 模块图中对这些现象进行建模时,需要对周期或循环信号的变化率进行积分以获取运动状态。在长仿真时间跨度上,这种方法可以导致表示周期性或循环信号的状态会积分为很大的值。计算这些信号的三角值(如正弦或余弦)需要更长时间,因为这些值会因角度减小而变大。随着信号值变大,求解器的性能和准确性会下降。

克服这一缺点的一种方法是在角状态达到 2π 时将其重置为 0(或者在其达到 π 时重置为 –π,以确保数值对称)。此方法可改进正弦和余弦计算的准确性,并缩短角度减小时间。但该方法还需要过零检测,并引入了求解器重置,这会减慢变步长求解器的仿真,尤其是在大型模型中。

为消除绕回点处的求解器重置,Integrator 模块支持绕回状态,您可以通过在模块参数对话框上选中绕回状态来启用这些状态。当启用绕回状态时,模块图标将更改为指示该模块具有绕回状态。

An Integrator block configured to wrap state values. The block icon is annotated with a circle with arrows.

Integrator 模块支持以绕回状态上限和下限值参数为边界的绕回状态。下面的方程给出了确定绕回状态的算法:

y={xx[xl,xu)x(xuxl)xxlxuxlotherwise

其中:

  • xl 是绕回状态的下限值。

  • xu 是绕回状态的上限值。

  • y 是输出。

支持绕回状态具有以下优势。

  • 消除当模型接近大角度和大状态值时的仿真不稳定性。

  • 减少仿真期间的求解器重置次数并消除对过零检测的需求,从而改善仿真时间。

  • 消除大角度值,从而加速针对角状态的三角函数计算。

  • 提高求解器的准确性和性能,并支持无限制仿真时间。

重置状态

模块可以根据外部信号将其状态重置为指定的初始条件。要使模块重置其状态,请选中其中一个外部重置选项。模块输入端口下方将显示一个触发端口,并指示触发类型。

An integrator block configured to reset the state. The block has two input signals, labeled Input and Reset, and one output signal, labeled Output.

  • 选择上升沿可在重置信号从负值或零上升到正值时重置状态。

  • 选择下降沿可在重置信号从正值下降到零或负值时重置状态。

  • 选择任一沿可在重置信号从零变为非零值、从非零值变为零或改变符号时重置状态。

  • 选择电平可于重置信号在当前时间步为非零值时或者从上一个时间步的非零值更改为当前时间步的零值时重置状态。

  • 选择电平保持可于重置信号在当前时间步为非零值时重置状态。

重置端口具有直接馈通。如果模块输出直接或通过一系列带直接馈通的模块反馈到此端口中,则会产生代数环(请参阅代数环概念)。使用 Integrator 模块的状态端口可以反馈该模块的输出,而不会创建代数环。

注意

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

关于状态端口

在 Integrator 模块的参数对话框上选中显示状态端口复选框会导致 Integrator 模块的顶部显示一个附加输出端口,即状态端口。

An integrator block configured to show the state port. The block has one input signal, labeled Input, and two output signals. The state output port is on the top of the block, and the port that provides the output signal value is on the right of the block.

状态端口的输出与模块的标准输出端口的输出相同,但以下情况除外。如果在当前时间步重置模块,则状态端口的输出为模块尚未重置时在模块的标准输出中显示的值。状态端口的输出在时间步中的显示会早于 Integrator 模块输出端口的输出的显示。使用状态端口可以避免以下建模场景中出现代数环:

  • 使用自重置积分器的系统

  • 将状态从一个使能子系统传递给另一个

    注意

    当更新模型时,Simulink 会检查状态端口是否适用于这两个场景中的一个。如果不适用,会显示错误消息。此外,不能将此端口的输出记录在于加速模式下执行的引用模型中。如果为该端口启用记录,Simulink 将在执行引用模型期间生成“signal not found”警告。

指定模块输出的绝对容差

默认情况下,Simulink 软件会使用在“配置参数”对话框中指定的绝对容差值(请参阅Error Tolerances for Variable-Step Solvers)来计算 Integrator 模块的输出。如果此值未提供足够的误差控制,则请在 Integrator 模块对话框的绝对容差字段中指定更合适的值。您指定的值将用于计算所有模块输出。

示例

全部展开

当需要 Integrator 模块根据模块输出值进行重置时,可以使用状态端口来避免产生代数环。

打开模型 SelfResettingIntegratorAlgLoop。模型中的 Integrator 模块已进行了配置,它将在重置信号从正值变为零值或负值时进行重置。重置信号是通过从 1 中减去当前模块输出值而产生的,因此每当输出值达到 1 时,模块就会自行重置。

mdl = "SelfResettingIntegratorAlgLoop";
open_system(mdl)

The model SelfResettingIntegratorAlgLoop.

由于重置端口具有直接馈通,因此使用输出信号来计算重置信号的值会产生代数环。输出信号值取决于重置信号的值,反之亦然。由于这种相互依赖关系,软件无法计算任一值。

当您尝试仿真模型时,软件会发出有关代数环的诊断信息。要查看模型中的代数环,请使用 Simulink.BlockDiagram.getAlgebraicLoops 函数。代数环查看器打开,显示模型包含一个真实代数环。

Simulink.BlockDiagram.getAlgebraicLoops(mdl);

代数环在模型中突出显示。

The model SelfResettingIntegratorAlgLoop has the algebraic loop highlighted from the output port through the sum block and into the reset port.

Integrator 模块在每个时间步中计算输出值之前的状态值。由于状态值出现在输出值之前,您可以使用状态值来创建自重置 Integrator 模块而不会产生代数环。

要查看此解,请打开模型 SelfResettingIntegrator。Integrator 模块已启用了状态端口。该模型没有使用输出信号,而是使用状态值以计算重置信号的值。

mdl2 = "SelfResettingIntegrator";
open_system(mdl2)

The model SelfResettingIntegrator..

要验证使用状态而不是输出中断了代数环,请再次调用 Simulink.BlockDiagram.getAlgebraicLoops 函数。

Simulink.BlockDiagram.getAlgebraicLoops(mdl2);
No algebraic loops were found.

要查看自重置积分器的应用实例,请对该模型进行仿真。

simOut = sim(mdl2);

要在示波器中查看输出和重置信号,请双击 Scope 模块。Integrator 模块输出信号在值 01 之间振荡。每当重置信号值为 0 时,输出值重置为 0

The Scope window displays the output and reset signals.

当一个使能子系统中的 Integrator 模块需要使用另一个使能子系统中的 Integrator 模块的状态时,可以使用状态端口来防止创建代数环。

打开模型 EnabledSubsystemStatesAlgLoop。该模型包含两个使能子系统,即 AB。Constant 模块为每个子系统提供第一个输入。子系统 A 的输出是子系统 B 的另一个输入。子系统 B 的输出是子系统 A 的另一个输入。Pulse 模块为两个子系统提供使能信号。Pulse 模块直接使能子系统 B。使用 Logical Operator 模块反转 Pulse 模块输出,为子系统 A 创建使能信号。因此,随着 Pulse 模块输出值的变化,使能子系统的执行在子系统 A 和子系统 B 之间交替进行。

mdl = "EnabledSubsystemStatesAlgLoop";
open_system(mdl);

The model EnabledSubsystemStatesAlgLoop.

每个使能子系统包含一个 Integrator 模块,该模块使用输入端口为模块提供初始条件。每个子系统中的 Enable 模块配置为在每次子系统执行时重置状态。当重置 Integrator 模块的状态时,初始值来自初始条件输入端口,该端口连接到另一个子系统中 Integrator 模块的输出。将状态从一个子系统传递给另一个子系统便于信号的持续集成,同时在子系统之间交替执行。

The contents of subsystem A and subsystem B are shown side by side with a dotted line dividing them.

但是,要计算子系统 B 的输出值,求解器需要子系统 A 的输出,反之亦然。将一个 Integrator 模块的输出连接到另一个 Integrator 模块的输入会产生代数环。要查看模型中的代数环,请使用 Simulink.BlockDiagram.getAlgebraicLoops 函数。代数环查看器打开,显示模型包含一个真实代数环。

Simulink.BlockDiagram.getAlgebraicLoops(mdl);

代数环在模型中突出显示。

The model EnabledSubsystemStatesAlgLoop has the algebraic loop highlighted.

为了避免产生这种代数环,您可以使用状态端口(而不是输出端口)将一个子系统中 Integrator 模块的状态传递给另一个子系统中 Integrator 模块的初始条件。求解器在每个时间步的较早点处计算模块状态值,因此子系统 B 的输出不再依赖子系统 A 的输出,反之亦然。

要查看此解,请打开模型 EnabledSubsystemStates。输入、使能和输出信号是相同的,但子系统 A 的输出不再作为子系统 B 的第二个输入,反之亦然。

mdl2 = "EnabledSubsystemStates";
open_system(mdl2)

The model EnabledSubsystemStates

软件不支持将 Integrator 模块的状态端口连接到使能子系统的输出端口。子系统 A 中 Integrator 模块的状态端口使用具有全局可见性的 GoTo 和 From 模块连接到子系统 B 中 Integrator 模块的初始条件端口。子系统 B 中 Integrator 模块的状态端口使用相同的策略连接到子系统 A 中 Integrator 模块的初始条件端口。

The contents of subsystem A and subsystem B displayed side by side, divided by a dotted line and labeled with an A and a B.

要验证使用状态端口是否解决了代数环,请再次使用 Simulink.BlockDiagram.getAlgebraicLoops 函数。

Simulink.BlockDiagram.getAlgebraicLoops(mdl2);
No algebraic loops were found.

对模型进行仿真。要查看结果,请双击 Scope 模块。示波器窗口显示每个子系统的使能信号和输出信号。

out = sim(mdl2);

The Scope window displays traces for the three signals.

有关在使能子系统之间传递状态值的系统的另一个示例,请参阅Building a Clutch Lock-Up Model

扩展示例

端口

输入

全部展开

输入信号是此模块积分的实数值标量、向量或矩阵。

此端口没有直接馈通。

数据类型: double

外部重置信号是布尔标量、向量或矩阵,用于将模块状态重置为初始条件。请参阅重置状态

此端口具有直接馈通。

依存关系

要启用此端口,请选择外部重置

数据类型: Boolean

初始条件信号是为模块设置初始条件的实数值标量、向量或矩阵。

此端口具有直接馈通。

依存关系

要启用此端口,请将初始条件参数设置为外部

数据类型: double

输出

全部展开

输出信号是具有积分输入信号值的标量、向量或矩阵。积分信号的维度与输入信号的维度匹配。

数据类型: double

输出饱和信号是标量、向量或矩阵,它指示处于模块状态的每个元素何时受到饱和上限或下限的限制。信号值指示该值是否受限以及应用哪个限制。

  • -1 - 值受饱和下限限制

  • 0 - 值不受任一饱和界限限制

  • 1 - 值受饱和上限制

有关详细信息,请参阅限制积分

依存关系

要启用此端口,请选择显示饱和端口

数据类型: double

模块状态信号是具有与模块状态值匹配的值的实数值标量、向量或矩阵。

有关详细信息,请参阅关于状态端口

依存关系

要启用此端口,请选择显示状态端口

数据类型: double

参数

全部展开

指定用于外部重置信号的触发类型。

  • 选择上升沿可在重置信号从负值或零上升到正值或者从负值上升到零值时重置状态。

  • 选择下降沿可在重置信号从正值下降到零或负值或者从零值下降到负值时重置状态。

  • 选择任一沿可在重置信号从零变为非零值、从非零值变为零或改变符号时重置状态。

  • 选择电平可于重置信号在当前时间步为非零值时或者从上一个时间步的非零值更改为当前时间步的零值时重置状态。

  • 选择电平保持可于重置信号在当前时间步为非零值时重置状态。

编程用法

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

选择初始条件的来源:

  • 内部 - 从初始条件参数获取状态的初始条件。

  • 外部 - 从外部信号获取状态的初始条件。选择此选项时,输入端口会出现在模块上。

编程用法

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

设置 Integrator 模块的初始状态。

提示

Simulink 软件不允许此模块的初始条件为 infNaN

依存关系

初始条件来源设置为 internal 将启用此参数。

初始条件来源设置为 external 将禁用此参数。

编程用法

模块参数:InitialCondition
类型:标量或向量
默认值:'0'

将模块的输出限制为介于饱和下限饱和上限参数之间的值。

  • 选中此复选框会将模块输出限制为介于饱和下限饱和上限参数之间的值。

  • 清除此复选框后,不会限制模块的输出值。

依存关系

选择此参数将启用饱和下限饱和上限参数。

编程用法

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

将积分的上限指定为标量、向量或矩阵。您必须指定在输出最小值输出最大值参数值之间的值。

依存关系

要启用此参数,请选中限制输出复选框。

编程用法

模块参数:UpperSaturationLimit
类型:字符向量、字符串
值:标量 | 向量 | 矩阵
默认值: 'inf'

将积分的下限指定为标量、向量或矩阵。您必须指定在输出最小值输出最大值参数值之间的值。

依存关系

要启用此参数,请选中限制输出复选框。

编程用法

模块参数:LowerSaturationLimit
类型:字符向量、字符串
值:标量 | 向量 | 矩阵
默认值:'-inf'

绕回状态上限值绕回状态下限值参数之间启用状态绕回。启用绕回状态可在对旋转和循环状态轨迹建模时消除对过零检测的需求,减少求解器重置,提高求解器性能和准确性,并增加仿真时间范围。

如果将绕回状态上限值指定为 inf 并将绕回状态下限值指定为 -inf,则不会发生绕回。

依存关系

选择此参数将启用绕回状态上限值绕回状态下限值参数。

编程用法

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

模块输出的上限。

依存关系

选择绕回状态会启用此参数。

编程用法

模块参数:WrappedStateUpperValue
类型:标量或向量
值:'2*pi'
默认值:'pi'

模块输出的下限。

依存关系

选择绕回状态会启用此参数。

编程用法

模块参数:WrappedStateLowerValue
类型:标量或向量
值:'0'
默认值:'-pi'

选中此复选框可将饱和输出端口添加到模块中。清除此复选框时,模块没有饱和输出端口。

依存关系

选择此参数将启用饱和输出端口。

编程用法

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

选中此复选框可将状态输出端口添加到模块中。清除此复选框时,模块没有状态输出端口。

依存关系

选择此参数将启用状态输出端口。

编程用法

模块参数:ShowStatePort
类型:字符向量、字符串
值:'off' | 'on'
默认值:'off'
  • 如果输入 auto 或 -1,则 Simulink 会使用“配置参数”对话框中的绝对容差值(请参阅求解器窗格)来计算模块状态。

  • 如果输入实数标量,则在计算所有模块状态时,该值会覆盖“配置参数”对话框中的绝对容差。

  • 如果输入实数向量,则该向量的维度必须匹配模块中连续状态的维度。这些值将覆盖“配置参数”对话框中的绝对容差。

编程用法

模块参数: AbsoluteTolerance
类型:字符向量、字符串、标量或向量
值:'auto' | '-1' | 任何正实数标量或向量
默认值: 'auto'

当您选择此参数时,软件会在线性化期间忽略此模块的重置和限制参数,并使用这些参数的默认值。

提示

当您要在导致积分器重置或饱和工作点附近线性化模型时,请启用此参数。

编程用法

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

选择此项以启用过零检测。有关详细信息,请参阅过零检测

编程用法

模块参数ZeroCross
类型:字符向量 | 字符串
'off' | 'on'
默认值'on'
  • 要为单个状态分配名称,请输入名称并用引号引起来,例如 'velocity'

  • 要为多个状态分配名称,请输入以逗号分隔的列表并用花括号括起来,例如 {'a', 'b', 'c'}。每个名称都必须是唯一的。

  • 状态名称只会应用于所选模块。

  • 状态数量必须能够被状态名称的数量均分。

  • 指定的名称数量可以少于状态数量,但不能多于状态数量。

    例如,可以在具有四个状态的系统中指定两个名称。第一个名称应用于前两个状态,第二个名称应用于后两个状态。

  • 要在 MATLAB® 工作区中分配带变量的状态名称,请输入不带引号的变量。变量可以是字符向量、字符串、元胞数组或结构体。

编程用法

模块参数:ContinuousStateAttributes
类型:字符向量、字符串
值:' ' | 用户定义
默认值:' '

模块特性

数据类型

double

直接馈通

a

多维信号

可变大小信号

过零检测

a 此模块的端口具有不同的直接馈通特性。

扩展功能

版本历史记录

在 R2006a 之前推出