使用函数调用子系统
Function-Call Subsystem 模块是一种条件执行子系统,它在每次控制端口收到函数调用事件时运行。Stateflow® 图、Function-Call Generator 模块、MATLAB Function 模块、S-Function 模块或 Hit Crossing 模块可以提供函数调用事件。
函数调用子系统类似于过程编程语言中的函数。调用函数调用子系统将按执行顺序执行子系统中的模块的输出方法。有关 Function-Call Subsystem 模块参数的说明,请参阅 Subsystem。
创建函数调用子系统
创建函数调用子系统:
为您的模型添加一个 Function-Call Subsystem 模块。
打开子系统模块。添加一个模块图,用于定义在子系统收到函数调用事件时执行的算法。
设置 Outport 模块的初始值和禁用值。请参阅条件子系统初始输出值和Conditional Subsystem Output Values When Disabled。
设置子系统执行时如何处理子系统状态:
打开子系统模块,然后打开 Trigger 模块的模块参数对话框。从启用时的状态下拉列表中,选择一个选项:
保持 - 状态保持最近使用的值。
重置 - 状态重置为初始条件。
inherit - 使用发出函数调用的父级子系统的 held 或 reset 设置。
对于其 Function-Call Subsystem 模块具有不同参数设置的嵌套子系统,子级子系统中的设置将覆盖从父级子系统继承的设置。请参阅 Trigger。
将函数调用发起方连接到函数调用输入端口。
如果您连接 Inport 模块,请打开该模块,选择“信号属性”选项卡,然后选中输出函数调用复选框。
函数调用子系统中的采样时间传播
配置 Function-Call Subsystem 模块,方法是:将其 Trigger Port 模块的采样时间类型设置为已触发或周期性。
触发(非周期)函数调用子系统可在一个时间步执行零次、一次或多次。
如果函数调用子系统由具有离散采样时间的根级函数调用 Inport 模块执行,则不允许在一个时间步进行多次函数调用。要允许多个函数调用,请将采样时间设置为
-1
(继承),并将函数调用子系统中所有模块的采样时间设置为-1
(继承)。周期函数调用子系统在其接收到函数调用信号时在每个时间步内执行一次,而在其未接收到函数调用信号时则不会在时间步内执行。将函数调用子系统中所有模块的采样时间设置为
-1
(继承)。
有关采样时间类型设置的详细信息,请参阅 Simulink 子系统语义中的函数调用子系统示例。
注意
在范围检查期间,最小值和最大值参数设置会反向传播到函数调用子系统的实际源端口,即使未启用该函数调用子系统也是如此。
要防止这种反向传播,请执行以下操作:
在源端口后添加 Signal Conversion 模块和 Signal Specification 模块。
将 Signal Conversion 模块的输出设置为信号副本。
指定 Signal Specification 模块的最小值和最大值,而不是在源端口上指定最小值和最大值。
函数调用子系统的锁存输入数据
您可以锁存 Function-Call Subsystem 模块中 Inport 模块的输入数据,以确保数据完整性。要锁存输入数据,请在 Inport 模块参数中,选择针对函数调用子系统输出的反馈信号锁存输入。
在以下模型中,函数调用子系统 ReadDSAndCal1
中 Inport 模块的输入数据被锁存(由 <Li>
表示)且在子系统执行期间不能更改。在每个函数调用子系统中调用 Data Store Read 和 Data Store Write 模块。第一个和第二个函数调用写入数据,最后一个函数调用将数据读取到 Data Store Memory 模块。
注意
如果连接到根级模块的所有模块都被锁存,则连接到内部 Inport 模块的根级数据 Inport 模块也会锁存。有关详细信息,请参阅 针对函数调用子系统输出的反馈信号锁存输入。
注意
默认情况下,数据传输信号在生成的代码中不受保护。使用自定义存储类,以防止由于目标环境中当前任务的抢占而导致这些信号中的数据损坏。
另请参阅
模块
- Function-Call Subsystem | Function-Call Generator | Function-Call Split | Function-Call Feedback Latch | Trigger | Subsystem