导出函数模型概述
导出函数模型是 Simulink® 模型,它们可以生成可与外部环境和调度器集成的独立函数的代码。函数是使用 Function-Call
Subsystem、函数调用 Model、Simulink Function 和 S-Function 模块定义的。
以下导出函数模型包含使用 Function-Call Subsystem 模块定义的两个函数。有关创建此模型的分步过程,请参阅Create an Export-Function Model。
从此模型生成的代码具有两个独立函数:一个时滞函数,一个平方函数。
/*
* File: export_function_model.c
* Code generated for Simulink model 'export_function_model'.
*/
void function_call_100ms(void) /* Sample time: [0.1s, 0.0s] */
{
export_function_model_Y.output_100ms =
export_function_model_DW.UnitDelay_DSTATE;
export_function_model_DW.UnitDelay_DSTATE =
export_function_model_Y.output_100ms + 1.0;
}
void function_call_10ms(void) /* Sample time: [0.01s, 0.0s] */
{
export_function_model_Y.output_10ms = export_function_model_U.input_10ms *
export_function_model_U.input_10ms;
}允许的模块
在顶层,导出函数模型仅允许使用以下模块:
Inport
Outport
Goto
From
Function-Call Subsystem
function-callModel
Function-Call Split
Simulink Function
Initialize Function
Reset Function
Terminate Function
Data Store Memory
Bus Creator
Bus Selector
Mux
Demux
Merge
Signal Specification
S-Function导出函数模型的要求
要使导出函数模型成功生成函数代码,必须满足以下要求。
模型配置参数:
求解器 Type 设置为 “Fixed-step”。
Solver 设置为 “auto” 或 “discrete”。
将 Code Generation 部分的 System target file 设置为 “ert.tlc”。选择 ert.tlc 需要 Embedded
Coder® 许可证。
对于函数调用 Model 模块,引用模型的 Periodic sample time constraint 设置为 “Ensure sample time independent”。
根级函数调用模块 Inport:
选中 Output function call 复选框。
不能从 Asynchronous Task Specification 模块接收信号。
根级数据 Inport 和 Outport 模块不能连接到虚拟总线数据信号。
根级 Function-Call Subsystem 模块和函数调用 Model 模块:
模块内的所有内部模块都必须支持代码生成。
如果 Trigger 模块的 Sample time type 设置为:
“triggered”,则内部模块必须将 Sample time 设置为 -1。
“periodic”,则根级函数调用 Inport 模块必须将其 Sample time 设置为指定的离散时间,并且所有内部模块必须将 Sample time 设置为 -1 或指定的离散时间。函数调用子系统的采样时间
在导出函数模型中,您可以为根级函数调用 Inport 模块以及根级 Function-Call Subsystem 模块或函数调用 Model 模块内的 Trigger 模块指定采样时间。下表显示了如何指定这些采样时间。
Trigger 模块的 Sample time typeTrigger block Sample timeInport block Sample time仿真期间的函数调用速率
“Triggered”未指定,参数处于非活动状态。-1(继承)在仿真时,由连接到 Inport 模块的函数调用发起方设置仿真速率。
指定的离散时间在测试模型中连接到 Inport 模块的函数调用发起方的采样时间必须等于 Inport 模块的指定离散时间。
在仿真时,组件以指定的离散速率执行。如果函数调用源使用不同的采样时间,Simulink 将显示错误消息。
“Periodic”
如果从 Model 模块引用导出函数模型,则应用周期性函数调用运行时检查。-1(继承)或 Inport 模块的指定离散时间。-1(继承)不允许此配置。Simulink 显示错误消息。
指定的离散时间。在仿真时,组件按指定的离散采样时间执行。如果函数调用源使用不同的采样时间,Simulink 将显示错误消息。根级函数调用 Inport 模块的执行顺序
通过为函数调用的 Inport 模块指定采样时间和优先级,可以控制 Function-Call Subsystems 和函数调用 Models during simulation 的执行顺序。您也可以使用调度编辑器或 Stateflow® 图来测试调度。请参阅 Test Export-Function Model Simulation Using Schedule Editor 和Test Export-Function Model Simulation Using Stateflow Chart。
指定仿真执行的采样时间。右键点击函数调用 Inport 模块,然后选择 Block parameters。
选择 Signal Attributes 选项卡。在 Sample time 框中,输入离散时间。
指定仿真的模块优先级。右键点击函数调用 Inport 模块,然后选择 Properties。
在 Priority 框中,输入优先级值。
显示仿真的模块执行顺序。在 Debug 选项卡上,选择 Information Overlays ,然后从下拉对话框中选择 Execution Order。这一显示内容对生成的代码没有任何影响。
在以下导出函数模型中,先运行 Function-Call Subsystem 2(Inport 的 Sample time 设置为 0.01 (10 ms)),然后运行 Function-Call Subsystem 1(Inport 模块的 Sample time 设置为 0.1 (100 ms))。
Simulink 使用以下规则比较函数调用 Inport 模块属性以确定其相对执行顺序:
优先级 - 较高优先级(较低的数字)先执行
采样时间(采样时间较小的先执行)
端口号(端口号较小的先执行)
如果两个模块的 Priority 参数具有不同的值,具有较高优先级的模块将先执行。如果 Priority 参数相等,则速率更快(采样时间较小)的模块将先执行。如果两个模块的 Priority 和采样时间都相同,则具有较小端口号的模块将先执行。
注意
如果顶层模型的仿真模式是 Accelerator 或 Rapid Accelerator,Simulink 不会对引用的导出函数模型内根级函数调用 Inport 模块的执行顺序进行运行时仿真检查。
假设一个导出函数模型有五个根级函数调用 Inport 模块,分别是模块 A 到 E,模块属性如下表所示。为了确定它们的相对执行顺序,Simulink 会比较它们的 Priority 参数、采样时间(如果采样时间不同并且不是继承的)和端口号。
根级函数调用模块 InportABCDE优先级1030404030
采样时间-10.20.10.1-1
端口号54321
模块 A 在所有五个模块中的优先级最高。A 先执行。
B 和 E 在 A 之后但在 C 和 D 之前执行。由于 B 和 E 有相同的优先级,Simulink 将比较其采样时间,以确定执行顺序。E 的采样时间为 -1(继承),该值小于 B 的采样时间 0.2,因此 E 在 B 之前执行。
C 和 D 具有相同的优先级和同样的非继承唯一采样时间。D 的端口号 (2) 小于 C (3),因此 D 在 C 之前执行。
这些函数调用 Inport 模块的相对执行顺序是 A、E、B、D 和 C。函数调用子系统的锁存输入数据
您可以锁存 Function-Call
Subsystem 模块中 Inport 模块的输入数据,以确保数据完整性。要锁存输入数据,请选中 Latch input for feedback signals of function-call subsystem outputs 复选框。
在以下模型中,函数调用子系统 ReadDSAndCal1 中 Inport 模块的输入数据被锁存(由
表示)且在子系统执行期间不能更改。在每个函数调用子系统中调用 Data Store Read 和 Data Store Write 模块。第一个和第二个函数调用写入数据,最后一个函数调用将数据读取到 Data Store Memory 模块。注意
默认情况下,数据传输信号在生成的代码中不受保护。使用自定义存储类,以防止由于目标环境中当前任务的抢占而导致这些信号中的数据损坏。嵌套的导出函数模型
嵌套的导出函数模型提供了额外的组织层。以下模型包含两个通过 Model 模块引用的导出函数模型。
注意
导出函数模型不能包含使用异步函数调用输入的引用模型,但可以包含函数调用子系统和函数调用模型。使用异步函数调用输入的模型可以包含导出函数模型、函数调用子系统或函数调用模型。包含多实例函数调用模型的导出函数模型
您可以在导出函数模型中使用 Function-Call Subsystem 模块或函数调用 Model 模块。如果使用函数调用 Model 模块,则还可以创建模型的多个实例。
使用包含 Trigger 模块的模型定义您的算法。将 Trigger type 设置为 “function-call”。
从 Model 模块引用模型。结果是一个函数调用模型。
连接一个函数调用 Inport 模块并选中 Output function call 复选框。添加信号 Inport 和 Outport 模块。更新模型 (Ctrl-D)。结果是一个包含函数调用模型的导出函数模型。
复制引用模型和端口模块以创建模型的第二个实例。执行顺序显示第一个实例在第二个实例之前运行。
导出函数模型功能可供采用异步函数调用输入端口的模型使用。这些模型主要用在通过 Simulink 调度器调用函数的 Simulink 环境中。
比较特性导出函数模型使用异步函数调用输入的模型定义这些模型具有未连接到 Asynchronous Task Specification 模块的根级函数调用 Inport 模块。这些 Inport 模块触发函数调用子系统或函数调用模型(包含 Trigger 模块的 Model 模块)。这些模型包含连接到 Asynchronous Task Specification 模块的根级函数调用 Inport 模块。这些 Inport 模块会触发函数调用子系统或函数调用模型。
根级模块只有在函数调用上下文中执行的模块才允许位于根级。在非函数调用上下文中执行的模块也允许位于根级。
数据传输使用数据传输指示符解释仿真结果。默认情况下,导出函数模型中的数据传输在生成的代码中不受保护。有关详细信息,请参阅函数调用子系统的锁存输入数据。可使用 Rate Transition 模块保护以不同速率运行的函数调用子系统之间的数据传输。有关详细信息,请参阅 Rate Transition。
仿真支持这些模型支持所有仿真模式下的独立仿真和测试模型仿真。这些模型支持所有仿真模式下的测试模型仿真,以及 Normal、Accelerator 和 Rapid Accelerator 模式下的独立仿真。
代码生成支持支持顶层模型和独立代码生成。支持顶层模型和独立代码生成。
另请参阅
模块
相关主题