主要内容

在 Stateflow 图中重用 Simulink 函数

R2026b

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

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

  • 定义需要 Simulink 模块的函数

  • 调度多个控制器的执行

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

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

  • 不使用输出事件

  • 不使用信号线

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

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

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

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

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

以下 Simulink 函数的名称为 sim_fcn。它接受三个参量(a、b 和 c)并返回两个输出值(x 和 y)。

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 子系统,并为它们连接 Inport 和 Outport 模块。

  6. 配置 Inport 和 Outport 模块。

    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 编程接口的详细信息,请参阅 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.

有关此示例的详细信息,请参阅Model a Car with Automatic Transmission。

使用 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 和 Output 模块的名称与 Stateflow 图的标识符命名规则兼容。

Simulink 函数中的 Inport 模块无法继承其数据类型和大小。如果 Inport 模块不是 double 类型的标量,您必须设置该模块的数据类型和端口维度。

Simulink 函数中的 Outport 模块可以根据子系统内部的连接继承大小和数据类型。您可以将这些模块的数据类型和端口维度指定为继承。

提示

为了更易于更新 Inport 模块的属性,您可以将数据类型和大小指定为参数。

Simulink 函数中的 Outport 模块不支持不连续信号。如果您的函数包含输出不连续信号的模块,请在不连续输出和 Outport 模块之间插入一个 Signal Conversion (Simulink) 模块。这能确保输出信号连续。

可以输出不连续信号的模块有 Bus Creator (Simulink) 模块和 Mux (Simulink) 模块。对于 Bus Creator 模块,当模块输出虚拟总线时,输出不连续。如果选中以非虚拟总线输出,则输出信号连续,无需转换。有关详细信息,请参阅Create Nonvirtual Buses (Simulink)。

您不能在摩尔图中使用 Simulink 函数。此限制可防止在图执行过程中违反摩尔语义。

如果选择了图属性初始化时执行(进入)图,则不能在图第一次唤醒时执行的默认转移中调用 Simulink 函数。否则,图会在仿真期间生成运行时错误。

在连续时间图中,不能在子时间步内调用 Simulink 函数。您可以在主时间步期间发生的以下动作中调用 Simulink 函数:状态 entry 或 exit 动作和转移动作。在状态 during 动作或转移条件下调用 Simulink 函数会导致仿真期间出现运行时错误。

Simulink 函数不支持 HDL 代码生成。为包含 Simulink 函数的图生成 HDL 代码会导致仿真期间出现运行时错误。

如果通过引用将参量传递给 Simulink 函数,则会导致在仿真过程中出现运行时错误。

另请参阅

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

主题