Main Content

Stateflow 图中重用 Simulink 函数

Simulink® 函数是一个图形对象,它使您能够在状态和转移的动作中调用 Simulink 子系统。Simulink 函数在 MATLAB® 中的独立 Stateflow® 图中不受支持。

Simulink 函数可以提高设计效率,增强模型的可读性。典型应用包括:

  • 定义需要 Simulink 模块的函数

  • 调度多个控制器的执行

在 Stateflow 图中使用 Simulink 函数具有以下优势:

  • 不使用函数调用子系统模块

  • 不使用输出事件

  • 不使用信号线

Simulink 函数可以驻留在 Stateflow 图、状态或子图的任意位置。函数的位置确定哪些状态和转移能够调用该函数。

  • 如果只想在一个状态(或子图)及其子状态内调用函数,请将您的 Simulink 函数置于该状态或子图中。该函数将覆盖该状态或子图的父级中同名的任何其他函数。

  • 如果想从图中的任意位置调用函数,需将 Simulink 函数置于与图同一层次的位置。

  • 如果要从模型中的任何图调用函数,请使用 Simulink Function (Simulink) 模块直接在 Simulink 画布中定义函数。有关详细信息,请参阅Simulink Functions Overview (Simulink)

要从您的 Simulink 函数中访问 Stateflow 数据,您必须将该数据作为输入包含到您的 Simulink 函数中。

以下 Simulink 函数的名称为 sim_fcn。它接受三个参量(abc)并返回两个输出值(xy)。

Stateflow chart with a Simulink function called sim_fcn.

该函数包含一个 Simulink 子系统,该子系统将第一个参量乘以增益 25,并将其他两个参量组合成一个复数输出信号。

Simulink subsystem with a gain block and a magnitude-angle to complex block.

一旦定义了您的 Simulink 函数,就可以将其放在您的 Stateflow 图或 Simulink 模型中的任何位置。此外,您可以在相同或不同模型中根据需要多次重用此函数。

注意

您无法从模型引用中的 Stateflow 图调用全局 Simulink 函数。要解决此问题,请在您的 Stateflow 图中创建一个新的 Simulink 函数。在此 Simulink 函数中,包含一个调用原始全局 Simulink 函数的 Function Caller 模块。有关 Function Caller 模块的详细信息,请参阅 Function Caller (Simulink)

定义 Simulink 函数

  1. 在对象选项板中,点击 Simulink 函数图标

  2. 在图画布上,点击新 Simulink 函数的位置。

  3. 输入函数的签名标签。

    函数的签名标签指定函数的名称及其参量和返回值的形式名称。签名标签采用以下语法:

    [return_val1,return_val2,...] = function_name(arg1,arg2,...)
    您可以指定多个返回值和多个输入参量。每个返回值和输入参量可以是一个标量、向量或值的矩阵。对于只有一个返回值的函数,忽略签名标签中的方括号。

    对所有参量和返回值必须使用唯一变量名称。

  4. 要对该函数进行编程,请双击函数框打开 Simulink 编辑器。最初,编辑器包含与函数签名匹配的函数调用 Trigger (Simulink) 模块以及 Inport (Simulink)Outport (Simulink) 模块。您无法删除 Trigger 模块。

  5. 在 Simulink 编辑器中,添加模块以创建您的 Simulink 子系统,并为它们连接 InportOutport 模块。

  6. 配置 InportOutport 模块。

    1. 双击每个模块以打开“模块参数”对话框。

    2. 信号属性选项卡中,指定输入参数或返回值的数据类型端口维度

    3. 点击确定

    注意

    Simulink 函数中的 Inport 模块无法继承其数据类型端口维度。有关详细信息,请参阅Simulink 函数的使用规范

在状态和转移中调用 Simulink 函数

您可以基于任何状态或任何转移的动作或从其他函数来调用 Simulink 函数。

要调用 Simulink 函数,请使用函数签名,并在函数签名中为每个形参包含一个对应的实参值。

[return_val1,return_val2,...] = function_name(arg1,arg2,...)

如果这两个参量的数据类型不同,函数会将实参转换为形参的类型。

指定 Simulink 函数的属性

您可以在“模块参数”对话框中修改 Simulink 函数的属性。

  1. 在 Stateflow 编辑器中,右键点击 Simulink 函数。

  2. 选择属性

  3. 编辑 Simulink 函数属性。

您还可以在模型资源管理器中修改这些属性。有关详细信息,请参阅Model Explorer (Simulink)

有关 Simulink 函数属性的描述,请参阅 Subsystem (Simulink)

您可以使用 Stateflow.SLFunction 对象以编程方式指定 Simulink 函数的其他属性。有关 Stateflow 编程接口的详细信息,请参阅 Overview of the Stateflow API

使用 Simulink 函数访问 Simulink 模块

在此示例中,您可以比较对一个汽车系统换挡逻辑的两种建模。第一个模型不使用 Simulink 函数,而第二个模型使用。

不使用 Simulink 函数的模型

此模型使用函数调用子系统 run() 这个Simulink 模型来计算换挡阈值。然后,Stateflow 图使用输出事件 CALC_TH() 来调用该子系统。

Model old_sf_car with a function-call subsystem .

有关函数调用子系统的详细信息,请参阅使用函数调用子系统 (Simulink)

使用 Simulink 函数的模型

这一同样的功能可以通过 Simulink 函数来实现。在以下 Stateflow 图中,使用 Simulink 函数 calc_th 来计算阈值。

Stateflow chart with a Simulink function.

selection_state 中的 during 动作包含对 calc_th 的函数调用,其中包含 Simulink 模块。

这种建模方法可尽量减少模型中所需的对象。

Modified Simulink model without function-call subsystems.

使用 Simulink 函数调度多个控制器执行

在此示例中,您可以比较调度多个控制器执行的两种方式。第一个模型不使用 Simulink 函数,而第二个模型使用。

不使用 Simulink 函数的模型

此模型使用函数调用子系统对每个控制器建模。该模型在 Stateflow 图中包含输出事件,以调度子系统的执行。

Simulink model with three function-call subsystems.

对于每个输出事件,需要一条信号线将 Stateflow 图与对应的函数调用子系统连接起来。

Simulink 函数在模型方法中的使用

还可以使用 Stateflow 图中的 Simulink 函数对每个控制器建模。此模型使用函数调用来调度子系统的执行。

Stateflow chart with three Simulink functions.

这种建模方法可尽量减少模型中所需的对象。

Modified Simulink model without function-call subsystems.

Simulink 函数的使用规范

 在参量名称中使用字母数字字符和下划线

 显式设置 Inport 模块的属性

 将不连续信号转换为连续信号

 不要在摩尔图中使用 Simulink 函数

 不要在图初始化期间执行的默认转移中调用 Simulink 函数

 不要在连续时间图的状态 During 动作或转移条件中调用 Simulink 函数

 不要为 Simulink 函数生成 HDL 代码

 按值传递参量

另请参阅

(Simulink) | (Simulink) | (Simulink) | (Simulink) | (Simulink) | (Simulink) | (Simulink)

相关主题