Main Content

本页的翻译已过时。点击此处可查看最新英文版本。

Simulink 模型

模型是使用数学方程和图对系统的抽象和简化描述。本主题中的建模概念为理解使用 Simulink® 软件工具对系统进行数学描述的过程提供了上下文。

模块图

模块图是 Simulink Editor 中模型的可视化表示。该编辑器允许您添加从包含基本模型组件的模块库中选择的模块。基本组件包括积分器、增益以及求和模块。模块通过信号线和事件线相互连接,以直观地构造模型方程。

模块图语义

典型的系统模块图是用模块和线条通过图形方式绘制而成的。这些模块图的历史源于反馈控制理论和信号处理等工程领域。模块图中的一个模块本身便可定义一个模型。基本模型之间的关系由连接模块的信号线表示。模块图中的模块和线条共同描述系统的整体模型。

Simulink 通过以下方式扩展典型模块图:

  • 向每个模块添加一组方程(模块方法)来定义输入信号、输出信号和模块状态变量之间基于时间的关系。

  • 向每个模块添加参数来基于模型方程指定系数。

  • 通过计算随时间变化的关系,为模块图的数值解提供引擎,其中时间从用户指定的“开始时间”开始,在用户指定的“停止时间”结束。

另请参阅 Simulink 模块图以交互方式构建和编辑模型仿真

模块

模块是 Simulink Editor 的基本建模结构。从内置的 Simulink 库中添加模块以执行特定操作。您也可以创建自定义模块。有些模块有输入信号、输出信号和状态。大多数模块都有用于指定模块行为的参数。模块是否有参数以及这些参数的性质取决于每个具体的模块。

每个模块表示 Simulink 引擎的一组方程。这些方程表示为模块方法。上面显示的模块有以下模块方法。

模块方法是在模块图仿真过程中计算的。模块方法的计算是在仿真循环中执行的,其中仿真循环中的每个循环都表示模块图在给定时间点的计算。

虚拟模块

虚拟模块用于在模型中组织并提供图形层次结构,但它们不影响仿真结果。在模型仿真期间,Simulink 会在执行之前原位展开模块,此过程称为扁平化。这种展开类似于宏在 C 或 C++ 等编程语言中的工作方式。

Simulink 定义以下虚拟模块:

  • Virtual Subsystem - 使用虚拟子系统将相关功能部件封装在一个更大的模型中。Virtual Subsystem 模块清除了参数 Treat as atomic unit 的复选框。

  • InportOutport - 使用端口模块将数据(信号)和事件(函数调用)从 Subsystem 模块或引用 Model 模块外部移至模块内部,反之亦然。

  • Bus CreatorBus AssignmentBus Selector - 总线模块将信号组合成一个虚拟总线,并管理复杂模块图的信号路由。虚拟总线可帮助您更方便地查看图形,它不会更改模型的行为。

请参阅非虚拟和虚拟模块信号类型合成信号的类型

非虚拟模块

非虚拟模块在模型中提供执行控制和图形层次结构。Simulink 定义以下非虚拟 Subsystem 模块和 Model 模块:

  • 原子子系统和模型 - 引用模型的 Atomic Subsystem 模块或 Model 模块中的模块在每个时间步作为单个单元执行(原子执行)。对于 Atomic Subsystem 模块,参数 Treat as atomic unit 的复选框处于选中状态。

    您可以在 Atomic Subsystem 或引用模型中放置任何 Simulink 模块,包括具有不同执行速率的模块。利用这种灵活性优势,您可以在执行级别对模型的功能方面进行分组。

    在以下示例中,车辆模型是一个 Atomic Subsystem 模块,其中包含对汽车力学进行建模的模块。控制模型是从 Model 模块引用的。

  • 使能和/或触发 - 其执行由来自信号的外部数据控制的 Atomic SubsystemModel 模块。包含 EnableTrigger 模块,或同时包含两者。对于 Trigger 模块,参数 Trigger type 设置为 “rising”、“falling” 或 “either”。

  • 函数调用 - Atomic SubsystemModel 模块,其执行由来自函数调用发起方(如 Stateflow® 图或 Function-Call GeneratorS-FunctionHit Crossing 模块)的事件控制。包含 Trigger type 设置为 “function-call” 的 Trigger 模块。

Simulink 仅为 Subsystem 模块定义以下非虚拟组件。

  • 执行子系统 - Atomic Subsystem 模块,其执行由来自动作发起方(例如,IfSwitch Case 模块)的事件控制。在 Subsystem 模块中包含 Action Port 模块。

  • While Iterator Subsystem - 在每个模型时间步中运行多次迭代的 Atomic Subsystem 模块。包含 While Iterator 模块,该模块通过计算逻辑条件来控制迭代次数。

    While Iterator Subsystem 类似于函数调用子系统,因为它可以在给定时间步内运行任意次数的迭代。While Iterator Subsystem 与函数调用子系统的不同之处在于没有单独的发起方。

  • For Iterator Subsystem - Atomic Subsystem 模块,它在每个模型时间步中运行固定次数的迭代。包含控制迭代次数的 For Iterator 模块。

请参阅非虚拟和虚拟模块

模块封装

模块封装是一个仅显示所选模块参数的自定义模块参数接口。Subsystem 模块的封装允许您提供对 Subsystem 模块内的模块设置参数的接口,而不必导航模型层次结构。

请参阅封装基础知识

自定义模块

自定义模块是扩展 Simulink 内置功能的新模块。您可以创建要在模型中使用的自定义模块库。

以下模块通过模块图以图形方式或以编程方式定义自定义模块的算法:

  • MATLAB® 函数 - 使用在 Simulink 模型中运行的 MATLAB 语言编写 MATLAB 函数代码。请参阅使用模块实现 MATLAB 函数

  • MATLAB 系统 - 将基于 matlab.System 的现有 System 对象放入 Simulink 中。请参阅MATLAB System 模块

  • 子系统 - 绘制表示算法的模块图,将此图封装在 Simulink Subsystem 模块实例中,然后使用 Simulink 模块封装为此模块提供参数对话框。请参阅Subsystem、Atomic Subsystem、CodeReuse Subsystem

  • C Caller - 将您的外部 C 代码集成到 Simulink 模型中。请参阅使用 C Caller 模块集成 C 代码

  • S-Function - 通过创建包含模块的系统函数的 MATLAB 文件或 MEX 文件,以编程方式创建自定义模块。生成的文件称为 S-Function。然后,将该 S-Function 与模型中的 Simulink S-Function 模块实例相关联。请参阅S-Function

请参阅自定义模块的类型模块编写和仿真集成

线

线是 Simulink Editor 的一个基本建模结构。线将模块的输出端口与其他模块的输入端口连接起来。

信号线

信号线在仿真期间将数据从一个模块传输到另一个模块。信号是随时间变化的量,在所有时间点(连续)或指定的时间点(离散)都有对应的值。信号的来源是指在计算其模块输出方法的过程中写入信号的模块。信号的目标是指在计算其模块输入方法的过程中读取信号的模块。

您可以指定信号属性,包括信号名称、数据类型(如双精度、32 位整数)、数值类型(如实数、复数)和维度(如一维、二维、多维数组)。许多模块可以接受或输出任何数据类型或维度的信号。其他模块对它们能够处理的信号的属性施加限制。

在仿真期间,系统通过对信号进行记录来保存信号中的数据。

事件线

在对函数调用或操作发起方进行响应时,事件线会向 SubsystemModel 模块发送事件。接收该事件的模块在一个时间步内对其中的模块执行一次或多次。函数调用发起方包括 Stateflow 图、Function-Call Generator 模块、S-Function 模块和 Hit Crossing 模块。动作发起方包括 IfSwitch Case 模块。

请参阅信号信号基础知识

数据

数据包括参数和输入信号值,Simulink 将它们用于生成仿真模型行为的输出值。

数据的类型:

  • 模型参数 - 用于指定模型中模块和信号参数的变量。包括 MATLAB 变量、参数和信号数据对象、数据类型对象和总线对象。

  • 模型配置参数 - 通过指定控制模型行为的设置来确定模型如何运行的参数。

  • 仿真数据 - 驱动仿真的输入数据和仿真生成的输出数据。

  • 数据对象 - 数据类的实例,它们允许您指定信号、状态和模块参数的特征。使用 Simulink.SignalSimulink.Parameter 类创建数据对象。请参阅数据对象

数据的位置:

  • 模块参数 - 使用模块参数直接指定数值。您也可以在 Simulink 模型工作区、Simulink 数据字典或 MATLAB 基础工作区中输入变量名称并定义其值。

  • MATLAB 基础工作区 - 使用 MATLAB 基础工作区将与模型分离的变量保存在 MAT 文件或 MATLAB 脚本中。

    Simulink 将基础工作区和数据字典视为单个全局命名空间。如果基础工作区和引用的数据字典具有相同的变量名称,则 Simulink 使用数据字典中的变量值。

    MATLAB 基础工作区包含的变量是全局变量且对所有 Simulink 模型均可见。

    请参阅Comparison of Signal Loading Techniques导出仿真数据

  • Simulink 模型工作区 - 使用模型工作区来定义和存储局部数据变量。模型工作区中定义的变量仅在具有唯一命名空间的模型作用域内可见。因此,您可以在多个模型工作区中使用相同的变量名称,并且可以为每个模型中的名称赋予唯一变量值。

    使用模型资源管理器在数据字典中定义变量。在 Modeling 选项卡中,点击 Model Explorer 。在左窗格中,选择 Model Workspace。

    模型工作区变量的值是从与模型一起保存的值、从单独的 MAT 文件或 MATLAB 文件或使用与模型一起保存的 MATLAB 代码初始化而来的。

    请参阅模型工作区在模型工作区中指定数据源

  • Simulink 数据字典 - 使用数据字典来定义和存储全局数据、在模型之间共享数据并跟踪对数据所做的更改。数据保存在独立于模型的文件中。

    创建一个数据字典文件。在 Modeling 选项卡中的 Design 下,点击 Data Dictionary 。点击 New,输入扩展名为 .sldd 的文件名。

    使用模型资源管理器在数据字典中定义变量。在 Modeling 选项卡中,点击 Model Explorer 。在左窗格中,选择 Design Data

    请参阅什么是数据字典?

  • 导入和导出的数据 - 从 MATLAB 基础工作区、MAT 文件或电子表格导入仿真信号。使用源模块或 Signal Editor 模块创建输入信号。使用信号记录导出仿真结果。信号保存为每个主时间步的时间、状态和输出的向量 [t, X, Y]

另请参阅:确定在何处存储 Simulink 模型的变量和对象符号解析

参数

参数是影响仿真和代码生成结果的 Simulink 模型特征。

模型配置参数

模型配置参数指定编译、仿真和代码生成期间的模型行为,例如要使用的求解器以及要显示的错误和警告类型。

要指定模型配置参数,请在 Modeling 选项卡中,点击 Model Settings。Configuration Parameters 对话框将打开。

请参阅为模型设置模型配置参数

模块参数

模块参数定义模型动态特性和数学特性。模块是否具有可以设置的参数以及这些参数的性质取决于每个模块。要指定模块参数,请打开模块参数对话框,或在 Modeling 选项卡的 Design 下,点击以下各项之一:

  • Property Inspector - 直接指定模块参数或为参数值输入变量名称。

  • Model Data Editor - 用变量指定模块参数。

  • Model Explorer - 用变量指定模块参数。

请参阅设置模块参数值

模块参数变量

如果在一个大型模型内的许多位置使用单一参数,更新该参数的每个实例可能会是一项困难的任务。更好的做法是输入变量名称作为参数值,然后使用以下方法之一定义一次该变量:

  • Simulink 模型工作区 - 创建模型工作区变量并为变量赋值。您定义的参数特定于模型并与模型一起保存。使用 MATLAB 变量可以方便维护。使用 Simulink.Parameter 对象来控制其他属性,包括数据类型、维度和单位。请参阅使用模型资源管理器编辑和管理工作区变量

  • Simulink 数据字典 - 在数据字典中创建设计数据变量,并将字典链接到模型。在模型仿真期间,Simulink 从数据字典中检索数据。

  • MATLAB 基础工作区 - 在 MATLAB 基础工作区中,使用任何 MATLAB 变量定义机制来定义参数。例如,您可以使用 MAT 文件,并在打开模型时加载变量。使用 MATLAB 表达式指定参数变量值。Simulink 在运行仿真之前计算该表达式。请参阅保存和加载工作区变量

当您对多个模型使用同一组参数时,使用 MATLAB 基础工作区或 Simulink 数据字典来定义变量非常有用。此机制还允许您对同一模型使用不同参数值组。

另请参阅:通过创建变量来共享和重用模块参数值创建、编辑和管理工作区变量

模型参数和实例参数

当您从多个 Model 模块中引用同一模型时,您将创建该模型的实例。您可以将模块参数设置为对模型的每个实例使用相同或不同的值。

要使用不同的值,请执行以下操作:

  1. 在引用模型的模型工作区中,创建一个 MATLAB 变量或 Simulink.Parameter 对象。

  2. 输入参数名称和默认参数 Value。选中 Argument 复选框以创建模型参数

  3. 对于引用模型中的模块,输入模型参数的名称作为模块参数的值。

  4. 对于每个 Model 模块,打开模块参数对话框,选择 Instance parameters 选项卡,并为具有模型参数名称的实例参数输入值。

另请参阅:参数化可重用引用模型的实例

可调模块参数

您可以在仿真期间更改可调模块参数的值。这允许您以交互方式确定最适合某个参数的值。当您更改可调参数的值时,更改将在下一个时间步开始时生效。例如,Gain 模块的增益参数是可调的。您可以在仿真运行时更改模块增益。请参阅使用模块参数值进行调优和实验

使用属性检查器设置模块参数

要指定参数,请在 Modeling 选项卡中,在 Design 下,点击 Property Inspector。点击一个模块以显示模块参数和属性。

另请参阅:指定模块属性

属性

属性是通常不影响仿真结果的 Simulink 模型特性。要指定属性,请在 Modeling 选项卡中,在 Design 下,点击 Property Inspector

模型属性

在属性检查器处于打开状态下,点击模块图中的空白区域,或在 Modeling 选项卡中,选择 Model Settings > Model Properties。模型属性包括:

  • 常规 - 模型文件的名称和位置。

  • 设计数据 - 在模型外定义的变量,用于参数化模型及其模块和信号。

  • 回调 - 特定模型事件发生时执行的命令。

请参阅管理模型版本并指定模型属性

模块属性

在属性检查器处于打开状态下,选择一个模块,然后选择 Properties 选项卡。模块属性包括:

  • 模块注释 - 显示在模块下方的所选模块参数的值。

  • 回调 - 特定模块事件发生时执行的命令。例如,您可以设置 MATLAB 脚本来使用表达式加载和定义模块参数变量。

  • 优先级 - 设置模块的相对执行顺序。先执行优先级值较低的模块,再执行优先级值较高的模块。

  • 标记 - 可通过编程方式搜索的模块标识符。

端口属性

在属性检查器处于打开状态下,选择一个端口,然后选择 Properties 选项卡。您可以使用属性检查器修改端口对象、信号和端口模块的属性。子系统模块上的端口也有端口模块选项卡,其中包含相关联的端口模块的属性。

Port properties shown in Property Inspector

使用属性检查器设置模型和模块属性

要设置属性,请在 Simulation 选项卡的 Prepare 下,点击 Property Inspector。点击空白区域可显示模型属性。点击模块可显示模块属性。

另请参阅:指定模块属性针对自定义模型行为的回调

状态变量

模型的状态由其状态变量的值定义。状态变量是一组变量,这些变量在时间零点的值以及模型输入和模型方程的值,可以确定模型在仿真期间的行为。状态变量的示例包括电机位置和速度、电感电流、电容电压、溶液温度和气压。

如果模块的当前输出值是先前输出值的函数,则该模块定义一个需要在时间步之间保存的状态变量。因此,计算模块输出需要保存当前时间步的状态变量的值,以便在后续时间步计算输出时使用。

使用状态

可以使用以下方法在仿真期间确定、初始化和记录模型状态:

  • 模型的 Configuration Parameters 对话框的 Data Import/Export 窗格(请参阅State Information)允许您指定模型状态的初始值,并在仿真期间以数组或结构体变量形式在 MATLAB 工作区中记录每个时间步的状态值。

    打开 Configuration Parameters 对话框。选中 States 复选框以记录到 MATLAB 变量 xout

    在 MATLAB 命令行窗口中,列出在每个时间步记录的 Integrator 模块状态的值。

        >> xout{1}.Values.Data
    
        ans =
    
            0.0000
            1.8127
            3.2968
            4.5119 . . .
  • model 命令显示有关模型所定义状态的信息,包括状态总数和用初始值定义每个状态的模块。

    列出模型 vehicle_model 中具有状态的模块。在 MATLAB 命令行窗口中,输入模型函数,然后列出具有状态的模块。

        [sys,x0,str,ts] = vehicle_model([],[],[],'sizes')
        str =
            {'vehicle_model/Integrator'}
  • Simulink 调试器显示仿真期间每个时间步的状态值,而 Simulink 调试器的 states 命令显示模型当前状态的有关信息(请参阅 Simulink 调试器)。

    在 MATLAB 命令行窗口中,启动 Simulink 调试器,然后输入命令 states

        sldebug 'vehicle_model'
        (sldebug @0): >> states
    
        Continuous States for 'vehicle_model':
        Idx  Value                    (system:block:element  Name   'BlockName')
             0. 0                        (0:0:0  CSTATE  'vehicle_model/Integrator')
  • Block Parameters 对话框(以及 ContinuousStateAttributes 参数)允许您为那些使用连续状态的模块(如 Integrator)指定状态名称。这可以简化对记录的状态数据的分析,尤其是当模块有多个状态时。

连续状态

为所有时间值定义一个连续状态。连续状态的一个示例是模拟速度计上显示的汽车速度,其指针位置随着轮胎的旋转而连续变化。

具有连续状态和模块参数 Initial condition 的模块包括:

一般情况下,排除简单模型,不存在对常微分方程表示的状态进行积分的解析方法。对状态进行积分需要使用数值方法。

离散状态

离散状态仅在特定时间上定义。它是连续状态的一种逼近,其中状态以周期性或非周期性时间间隔更新。离散状态的一个示例是显示在数字速度计上的汽车速度,它每秒更新一次,而不是连续更新。

具有离散状态的模块包括:

计算模块的离散状态需要知道它在前一个时间步的值以及该模块的当前输入值。Simulink 提供两种类型的离散求解器:

  • 固定步长离散求解器 - 为模型的所有离散状态确定可命中所有采样时间的固定步长,而不管在采样时间命中点上状态是否实际更改了值。

  • 可变步长离散求解器 - 更改步长以确保采样时间命中点仅在状态值更改时发生。

混合系统建模

混合模型既有连续状态,也有离散状态。求解这样的模型需要选择既满足连续状态积分精度约束又满足离散状态采样时间间隔约束的步长。Simulink 通过传递离散求解器的下一个采样时间间隔作为连续求解器的附加约束来满足此要求。连续求解器会选择一个步长,该步长将仿真提前到下一个离散采样时间前但不会超出该时间。连续求解器可以在下一个采样时间命中点之前采用一个时间步来满足其准确性约束,但即使准确性约束允许,它也不能采用超出下一次采样时间命中点的步长。

您可以使用任何积分方法对混合系统进行仿真,但有些方法比其他方法更高效。对于大多数混合系统,ode23ode45 在效率方面优于其他求解器。由于存在与离散模块的采样和保持相关联的不连续性,请不要对混合系统使用 ode15sode113 求解器。

采样时间

采样时间是指定执行模块方法以产生输出和更新模块内部状态的速率(1/采样时间)的时间间隔。时间是模块图的一个固有组成部分,因为模块图的仿真结果随时间而变化。

采样时间指定为:

  • 连续 - 基于求解器设置,模块的运行时间是变化的。

  • 离散 - 模块在显式指定的特定时间运行。

在以下示例中,控制器以指定的离散速率运行,采样时间为 0.01 秒,而 Simulink 确定车辆模型具有连续采样时间。

因此,确定系统随时间变化的行为需要从时间跨度的开始到结束,以一定间隔(称为时间步或时间间隔)重复求解模型。在连续时间步中求解模型的过程称为仿真模型所表示的系统。

另请参阅什么是采样时间?采样时间的类型指定采样时间查看采样时间信息

模块采样时间

每个 Simulink 模块都有定义模块执行时间的采样时间。大多数模块允许您通过 SampleTime 参数指定采样时间。常见的选择项包括离散、连续和继承采样时间。

常见采样时间类型采样时间示例
离散[Ts, To]Unit Delay、Digital Filter
连续[0, 0]Integrator、Derivative
继承[–1, 0]Gain、Sum

对于离散模块,采样时间是向量 [Ts, To],其中 Ts 是连续采样时间之间的时间间隔或期间,To 是采样时间的初始偏移量。相反,非离散模块的采样时间由有序对组表示,有序对组使用零、负整数或无穷大来表示特定类型的采样时间。例如,连续模块的名义采样时间为 [0, 0],用于对状态连续变化的系统进行建模(例如,汽车加速),而您以符号形式将继承模块的采样时间类型表示为 [-1, 0],则 Simulink 根据模型中继承模块的上下文确定实际值。

请注意,并非所有模块都接受所有类型的采样时间。例如,离散模块无法接受连续采样时间。

为了直观起见,Simulink 允许对任何模块图进行可选的颜色编码和注释,以指示模块采样时间的类型和速度。您可以捕获一个图例中的所有颜色和注释(请参阅查看采样时间信息)。

有关采样时间的更详细讨论,请参阅采样时间

单位

单位用于衡量一个量的总量。

Simulink 单位指定为 Simulink 模型组件边界处的 Inport 模块或 Outport 模块参数。Simulink 模型组件包括 Subsystem 模块、Model 模块、Stateflow 图和 Simulink 至 Simscape™ 转换器模块。要在模型上显示单位,请在 Debug 选项卡中,选择 Information Overlays > Units

另请参阅:Simulink 模型中的单位指定Converting Units

直接馈通

直接馈通根据模块的输入端口信号的值计算模块的输出端口信号。输出信号值是输入信号值的函数。

具有直接馈通的模块包括 GainProductSumMath Function 模块。

代数环

具有直接馈通的各模块之间的信号环称为代数环。当具有直接馈通的模块的输入端口由同一模块的输出端口直接驱动或通过其他具有直接馈通的模块间接驱动时,通常会出现代数环。

在以下模型中,两个具有直接馈通的 Gain 模块形成一个代数环:

另请参阅:代数环概念

人为代数环

当原子子系统或 Model 模块导致 Simulink 检测到代数环时,将发生人为代数环,即使该子系统的内容不包含从输入到输出的直接馈通也是如此。当您创建原子子系统时,所有 Inport 模块都将是直接馈通,从而导致代数环。

以包含的模型为例,该模型表示被控对象的简单比例控制,其描述如下

$$ G(s) = \frac{1}{s^2+2s+1}$$

它可以重写为以下状态空间形式:

$$
\dot{x} = \left[
 \begin{array}{cc}
 -2 & -1 \\
1 & 0
 \end{array}
 \right]
+ \left(
\begin{array}{c}
0\\1
\end{array}
\right)
$$

$$
y = \left[\begin{array}{cc}0&1\end{array}\right]
$$

该方程组既没有代数变量也没有直接馈通,因此不包含代数环。

按照以下步骤中的说明修改模型:

  1. 将 Controller 和 Plant 模块包含在子系统中。

  2. 在子系统对话框中,选择 Treat as atomic unit 使子系统成为原子子系统。

  3. 在 Model Configuration Parameters 的 Diagnostics 窗格中,将 Algebraic Loop 参数设置为 error

在对此模型进行仿真时,会出现代数环,因为该子系统是直接馈通,即使原子子系统内的路径不是直接馈通也是如此。仿真停止并出现代数环错误。

过零检测

Simulink 使用一种称为过零检测的方法来准确定位不连续性,无需在仿真期间借助于过小的时间步。通常这种方法可以缩短仿真运行时间。