Main Content

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

使用初始化、重新初始化、重置和终止函数

某些模块会保留在仿真过程中使用的状态信息。例如,Unit Delay 模块使用模块的当前状态来计算下一个仿真时间步的输出信号值。

Subsystem 模块具有默认的初始化和终止例程。您可以使用 Initialize FunctionReinitialize FunctionTerminate Function 模块将自定义例程添加到默认例程以更改或读取模块状态。您还可以使用 Reset Function 模块实现自定义例程。这些函数模块包含:

  • Event Listener 模块,它在接收初始化、重新初始化或终止函数调用事件时执行综合例程,或在接收重置函数调用事件时执行自定义例程。

  • State Writer 模块,它用于初始化或设置模块状态;或 State Reader 模块,它用于读取状态。

要定义自定义例程,请编辑模块的内容。例如:

  • 设置 State WriterState Reader 模块的状态所有者模块参数。

  • 添加其他 State WriterState Reader 模块。

  • 添加 Parameter Writer 模块以设置模块参数的值。请参阅Initialize and Reset Parameter Values

  • 添加 Data Store Write 模块以将数据写入数据存储,或 Data Store Read 模块以读取数据存储中的数据。请参阅通过创建数据存储对全局数据建模

  • 添加模块和信号线,以便为 State WriterParameter WriterData Store Write 模块提供要写入的值,或保存由 State ReaderData Store Read 模块读取的值。

使用状态创建模型组件

您可以使用 Simulink® 模块定义模型算法。在此示例中,单个 Discrete-Time Integrator 模块定义输入信号的积分算法。

  1. 打开一个新的 Simulink 模型。使用名称 Model01 保存此模型。

  2. 添加一个 Discrete-Time Integrator 模块。验证默认参数值如下:增益值1.0初始条件0初始条件设置为“自动”、采样时间-1

  3. Constant 模块连接到 Discrete-Time Integrator 模块的输入以对输入信号建模。将 Scope 模块连接到输出信号。

  4. 打开“配置参数”对话框。对求解器的仿真参数进行如下设置:类型为“定步”,求解器为“自动”,定步长1

  5. 打开 Scope 模块,然后运行仿真。输出信号在每个时间步按 1 递增。

初始化模块状态

一些模型算法包含可以初始化的状态。例如,使用读取传感器值的算法,可以执行计算来设置初始传感器状态。

在仿真开始时,使用 State Writer 模块初始化模块的状态。要控制何时发生初始化,请使用包含 State Writer 模块的 Initialize Function 模块。

  1. 添加一个 Initialize Function 模块。

    默认情况下,Initialize Function 模块包含 Event Listener 模块,其事件类型参数设置为“初始化”。该模块还包含 State Writer 模块和 Constant 模块作为初始状态值来源的占位符。

  2. 对初始条件建模。在此示例中,将 Constant 模块的常量值参数设置为 4

  3. 连接状态写入方和状态所有者。打开 State Writer 对话框。展开“状态所有者选择器树”,选择 “Discrete-Time Integrator”,然后点击应用

    State Writer 模块显示状态所有者模块的名称。状态所有者模块显示一个标记,指示指向 State Writer 模块的链接。如果点击该标记上方的标签,将打开一个列表,其中包含导航到 State Writer 模块的链接。

  4. 运行仿真以确认您的模型能够正确地进行仿真。

    Initialize Function 模块在仿真开始时执行。输出信号以 4为初始值,然后按 1 递增,直到仿真结束。

重置模块状态

在仿真过程中,可以使用 State Writer 模块重置模块的状态。要控制何时发生重置,请使用 Reset Function 模块。

注意

您可以使用 Reinitialize Function 模块或 Reset Function 模块来重置模块的状态。Reinitialize Function 模块和 Reset Function 模块都可以写入模块状态或执行您在配置模块时指定的任何操作。这些模块之间的区别在于,Reinitialize Function 首先隐式将模型中所有模块的状态重置回其初始状态,然后执行您在配置模块时指定的任何其他操作,包括写入模块状态。而 Reset Function 模块仅执行您在配置该模块时指定的操作。在此示例中,由于除了 Discrete-Time Integrator 模块之外,模型不包含其他具有状态的模块,因此可以使用 Reinitialize Function 模块来代替 Reset Function 模块,结果没有差异。

  1. 添加一个 Reset Function 模块。

  2. 打开该 Reset Function 模块。

  3. 对重置条件建模。在此示例中,将 Constant 模块的常量值参数设置为 2

  4. 连接状态写入方和状态所有者。打开 State Writer 模块对话框。展开“状态所有者选择器树”,选择 “Discrete-Time Integrator”,然后点击应用

  5. Reset Function 模块的事件名称 reset 将显示在模块上。

    如果您在标记的上方点击,将打开一个列表,其中包含导航到 State Writer 模块的链接,该模块位于 Initialize Function 模块和 Reset Function 模块中。

    注意

    如果 Reset Function 模块被 Reinitialize Function 模块替换,则 Reinitialize Function 模块首先将 Discrete-Time Integrator 模块的状态设置回其初始条件 0,如 Discrete-Time Integrator 模块对话框中所指定的。然后,Reinitialize Function 模块使用 State Writer 模块将 Discrete-Time Integrator 模块的状态设置为 2,这会覆盖隐式重新初始化为 0。此系列操作与 Reset Function 模块的效果相同,后者直接将 Discrete-Time Integrator 模块的状态设置为 2。

    如果在没有 State Writer 模块的情况下使用 Reinitialize Function 模块,则它会将 Discrete-Time Integrator 模块的状态设置为其初始条件 0。如果在没有 State Writer 模块的情况下使用 Reset Function 模块,它不会影响任何其他模块的状态。

  6. 运行仿真以确认您的模型能够正确地进行仿真。

    Reset Function 模块在仿真期间不执行。该模块需要函数调用事件信号。

    要为 Reset Function 模块创建函数调用事件信号,请参阅Create Test Harness to Generate Function Calls

读取并保存模块状态

在仿真结束时,您可以读取模块的状态,并保存该状态。

  1. 添加一个 Terminate Function 模块。

    默认情况下,Terminate Function 模块包含一个 Event Listener 模块,其参数事件类型设置为“终止”。该模块还包含 State Reader 模块和 Terminator 模块作为保存状态值的占位符。

  2. 将状态读取方连接到状态所有者。打开 State Reader 模块对话框。从“状态所有者选择器树”中,选择 “Discrete-Time Integrator”,然后点击应用

  3. 运行仿真以确认您的模型能够正确地进行仿真。Terminate Function 模块在仿真结束时执行。

  4. 删除您为测试而添加的模块。将 Constant 模块替换为 Inport 模块,将 Scope 模块替换为 Outport 模块。

为测试准备模型组件

进行以下更改,以避免将组件模型置于导出函数模型中进行仿真测试时出现仿真错误。

  1. 打开 Discrete-Time Integrator 模块的“模块参数”对话框。将积分器方法设置为“累加:前向欧拉”。

  2. 打开“模型配置参数”对话框。确认求解器类型设置为“定步长”,并且求解器设置为“自动”。将定步长1 更改为 auto

    此更改可避免在一个函数调用子系统中有多个采样时间时导致仿真错误。

创建导出函数模型

若要将模型组件放入测试框架以测试初始化、重置和终止函数,需要模型遵循导出函数规则。请参阅导出函数模型概述Create Test Harness to Generate Function Calls

要创建导出函数模型,请使用 Model 模块将模型组件放置在 Function-Call Subsystem 模块中。将模型的输入和输出端口连接到子系统输入和输出端口。

  1. 创建一个 Simulink 模型。使用名称 Model02 保存此模型。

  2. 打开“配置参数”对话框。将求解器的仿真参数类型设置为“定步长”。确认求解器设置为“自动”,定步长设置为 auto

  3. 添加一个 Function-Call Subsystem 模块。通过双击该模块打开子系统。

  4. 向子系统添加一个 Model 模块,并将模型名称设置为 Model01。添加 InportOutport 模块。

  5. 导航到模型的顶层。

  6. 添加一个 Inport 模块。此模块是执行子系统的控制信号。将模块名称更改为 Run,并将其连接到 function() 端口。

    打开 Inport 模块对话框,并在信号属性选项卡上选中输出函数调用复选框。

  7. 添加另一个 Inport 模块并将其重命名为 Signal In。将它连接到子系统的 In1 端口。此模块是积分算法的信号。

    添加一个 Outport 模块,将其重命名为 Signal Out,然后将其连接到子系统的 Out1 端口。此模块是积分信号。

  8. 转至属性检查器并将模型的执行域设置为“导出函数”,将模型指定为导出函数模型。请参阅指定导出函数模型

  9. 打开“配置参数”对话框。在模型引用窗格中,将每个顶层模型允许的实例总数设置为“一个”。

  10. Ctrl-D 更新您的模型并确认没有错误。

下一步是创建测试框架。请参阅Create Test Harness to Generate Function Calls

另请参阅

模块

相关主题