Main Content

初始化信号和离散状态

Simulink® 允许您指定信号和离散状态的初始值,即信号和离散状态在仿真的开始时间时的值。您可以使用信号对象为模型中的任何信号或离散状态指定初始值。此外,对于有些模块,例如,OutportData Store MemoryMemory,您可以使用信号对象和/或模块参数指定模块状态或输出的初始值。在这种情况下,Simulink 会执行检查,以确保通过信号对象和参数指定的值保持一致。有关初始化总线信号的信息,请参阅指定总线元素的初始条件

如果您指定信号对象来初始化信号或离散状态,或者指定变量作为模块参数的值,Simulink 会将您指定的名称解析为相应的对象或变量,如符号解析中所述。

在任何情况下,一个给定的信号最多只能与一个信号对象关联。信号可以多次引用对象,但每次引用必须解析为同一个对象。不同的信号对象即使具有完全相同的属性也不符合唯一性的要求。如果模型将多个信号对象与任一信号关联,就会发生编译时错误。有关详细信息,请参阅 Simulink.SignalMerge 模块。

使用模块参数来初始化信号和离散状态

对于具有初始值或初始条件参数的模块,您可以使用该参数来初始化信号。例如,下面的“模块参数”对话框使用初始条件 0 来初始化 Unit Delay 模块的信号。

要访问这些模块参数,请选择以下方法之一:

  • 使用模型数据编辑器(在建模选项卡上,点击模型数据编辑器)来通过可搜索、可排序的表配置多个信号和状态。要初始化模块状态或数据存储,您可以使用相应的选项卡(状态数据存储)。要初始化信号、状态或数据存储,您可以使用参数选项卡,找到与相关模块参数对应的行。

  • 使用属性检查器(在建模选项卡上,在设计下,点击属性检查器)来一次配置一个信号或状态。选择保持目标状态或生成目标信号的模块,并找到相关模块参数。

  • 使用模块参数对话框。使用此方法可一次配置一个信号或状态,或者并排比较几个信号或状态的配置。

有关访问模块参数(包括用于控制信号和状态初始化的参数)的方法的详细信息,请参阅Set Properties and Parameters

使用信号对象来初始化信号和离散状态

您可以使用其存储类不是 'auto''Model default'(当您在代码映射编辑器中将对应数据类别的默认存储类设置为默认设置 Default 时)的信号对象来初始化下列各项:

  • 具有初始条件参数的离散状态

  • 模型中除总线信号之外的信号以及输出常量值的模块

要指定初始值,请使用模型资源管理器或 MATLAB® 命令执行以下操作:

  1. 创建信号对象。

    在模型资源管理器工具栏上,选择添加 > Simulink 信号。具有默认名称的信号对象将出现在基础工作区。将该对象重命名为 S1。也可以在命令提示符下使用以下命令:

    S1 = Simulink.Signal;

    信号对象的名称必须与该对象初始化的信号的名称相同。虽然不是必需,但可以考虑在“信号属性”对话框中设置信号名称必须解析为 Simulink 信号对象选项。此设置将使 MATLAB 工作区中的信号对象与您模型中出现的信号保持一致。

    可以考虑使用数据对象向导创建信号对象。数据对象向导将在模型中搜索不存在信号对象的信号。然后,您可以通过一个操作为搜索结果中列出的多个信号有选择地创建信号对象。有关数据对象向导的详细信息,请参阅 使用数据对象向导为模型创建数据对象

  2. 将信号对象存储类设置为除 AutoModel default 之外的值。在模型资源管理器的目录窗格中,选择该信号对象。在“对话框”窗格中,将存储类设置为 ExportedGlobal。也可以在命令提示符下使用以下命令:

    S1.CoderInfo.StorageClass = 'ExportedGlobal';

  3. 设置初始值。您可以指定计算结果为数值标量或数组的 MATLAB 表达式,包括工作区变量的名称。

    Simulink 引擎将转换初始值,使类型、复/实性和维度与对应的模块参数值保持一致。如果您指定无效的值或表达式,当您更新模型时,将显示一条错误消息。

    在模型资源管理器的“对话框”窗格中,将初始值设置为 0.5。也可以在命令提示符下使用以下命令:

    S1.InitialValue = '0.5'

    如果您还可以使用模块参数来设置信号或状态的初始值,则应将该参数设置为空 ([]) 或与信号对象的初始值相同。如果将该参数值设置为空,Simulink 将使用由该信号对象指定的值来初始化信号或状态。如果将该参数设置为其他任何值,Simulink 将比较参数值和信号对象值,如果二者不同,将显示错误。

    以下示例显示了指定使能子系统初始输出的信号对象。

    信号 s 被初始化为 4.5。要避免出现一致性错误,使能子系统的 Outport 模块的初始值必须为 [] 或 4.5。

    使用信号 sPreLoadFcn 回调参数创建模型回调。有关 Simulink 中模型回调的详细信息,请参阅模型回调

    如果您需要一个信号对象,还需要将其初始值设置应用于所有 Simulink 会话,请参阅创建持久数据对象

某些初始值设置可能取决于初始化模式。有关详细信息,请参阅 欠定初始化检测

经典初始化模式:在此模式下,表示以下信号和状态的信号对象的初始值设置将覆盖对应的模块参数初始值(如果未定义,即指定为 []):

  • 条件执行子系统和 Merge 模块的输出信号

  • 模块状态

有关详细信息,请参阅Classic Initialization Mode

简化初始化模式:在此模式下,将忽略与以下模块的输出信号关联的信号对象的初始值,而使用对应模块的初始值。

  • 条件执行子系统的输出信号

  • Merge 模块

有关何时使用简化初始化模式以及如何配置模型以使用此初始化模式的详细信息,请参阅Simplified Initialization Mode

您可以将模型的欠定初始化检测设置从经典更改为简化。有关详细信息,请参阅Convert from Classic to Simplified Initialization Mode

使用信号对象调整初始值

Simulink 允许您使用信号对象代替参数对象(请参阅 Simulink.Parameter)来调整可通过可调参数指定的模块输出和状态的初始值。要使用信号对象调整初始值,请创建一个与信号或状态具有相同名称的信号对象,然后将该信号对象的初始值设置为一个表达式,在该表达式中包含一个在 MATLAB 工作区中定义的变量。这样,即可在仿真过程中通过更改对应工作区变量的值来调整初始值。

例如,假设您要调整名为 M1Memory 模块状态的初始值。要执行此操作,您可以创建一个名为 M1 的信号对象,然后将其存储类设置为 'ExportedGlobal',将其初始值设置为 K (M1.InitialValue='K'),其中 K 是 MATLAB 工作区中的工作区变量,并将 Memory 模块的对应初始条件参数设置为 [] 以免出现一致性错误。这样,在仿真过程中,通过在 MATLAB 命令行中更改 K 的值以及更新模块图(例如,通过键入 Ctrl+D),即可随时更改 Memory 模块状态的初始值。

信号对象的初始化行为摘要

下面的模型和表显示了您可以初始化的不同类型的信号和离散状态,以及每一种类型所产生的仿真行为。

信号或离散状态描述行为
S1根输入端口
  • 初始化为 S1.InitialValue

  • 如果您使用“配置参数”对话框的数据导入/导出窗格指定根输入的值,初始值将被覆盖并且可能在每个时间步都不同。否则,该值将保持不变。

X1Unit Delay 模块 - 离散状态带有初始条件的模块
  • 初始化为 X1.InitialValue

  • Simulink 检查 X1.InitialValue 与为模块指定的初始条件是否匹配,如果不匹配,将显示错误。

  • 第一次写入时,输出等于 X1.InitialValue,状态等于 S1

  • 在第一次写入之后的每个时间步,输出等于状态,状态更新为等于 S1

  • 如果模块位于使能子系统内,当子系统的 Enable 模块参数启用时的状态设置为重置时,您可以使用初始值作为重置值。

X2Data Store Memory 模块
  • 数据类型工作 (DWork) 向量被初始化为 X2.InitialValue。有关工作向量的信息,请参阅 DWork Vector Basics

  • Simulink 检查 X2.InitialValue 与为模块指定的初始条件是否匹配,如果不匹配,将显示错误。

  • Data Store Write 模块覆盖该值。

S2使能子系统的输出
  • 初始化为 S2.InitialValueOutport 模块的值。如果为同一个信号指定了多个初始值,所有初始值必须相同。

  • 启用子系统时发生第一次写入。由馈送子系统输出的模块设置该值。

  • 如果子系统的 Enable 模块参数启用时的状态Outport 模块参数禁用时的输出设置为重置,初始值还用作重置值。

S3保持不变的信号
  • 初始化为 S3.InitialValue

  • 模块在每个时间步重置输出值。

  • 只影响代码生成。对于仿真,设置 S3 的初始值没有影响,因为这些值在模型仿真开始时将被覆盖。

相关主题