主要内容

加速模拟,重用代码,或保护知识产权利用s函数的目标

S-functions是系统的一个重要类目标文件的代码生成器可以产生代码。封装一个子系统的能力成为一个功能允许你增加它的执行效率和促进代码重用。

以下部分描述的属性功能目标和说明如何生成它们。S-functions结构的更多细节,请参阅C / c++函数基础知识

的功能目标

使用功能目标,您可以构建一个功能组件和使用它作为一个功能块在另一个模型。以下部分描述的部署考虑功能的目标。

“功能”CodeFormatTLC变量使用的功能目标符合模型生成代码金宝app®C墨西哥人功能应用程序编程接口(API)。这种格式的应用程序包括

  • 一个模型转换成一个组件。您可以生成一个功能块模型,m1。然后,您可以将生成的功能块在另一个模型中,平方米。重新生成代码平方米不需要重新生成代码m1

  • 转换组件的一个子系统。通过提取子系统到一个单独的模型,并从模型生成一个功能块,您可以创建一个可重用的组件的子系统。看到创建从一个子系统功能块对这个过程的一个例子。

  • 加速模拟。通常,一个s函数生成的模型比原模型更有效地执行。

  • 代码重用。你可以把一个模型的多个实例在另一个没有复制每个实例的代码。每个实例继续保持其独特的数据。

您可以将生成的功能块到另一个模型,您可以生成另一个功能。这种方法允许嵌套S-functions水平。有关嵌套限制,看到嵌套S-Functions

请注意

如果你是生成代码建模软件组件,使用一个参考模型,而不是从一个子系统生成一个功能块。

请注意

虽然您可以使用功能目标部署一个应用程序组件重用而屏蔽其内部逻辑与检查和修改,保护知识产权的首选解决方案在分布式组件:金宝搏官方网站

为功能部署所需的文件

有不同的文件需要部署一个功能块生成模拟与代码生成。

部署功能块生成包含在其他模型为模拟,您只需要提供生成的二进制MEX-file对象在当前工作目录中创建屏蔽功能。所需文件:

  • 中高_sf。mexext

在哪里中高子系统名称和吗mexext是一个与平台相关的MEX-file扩展(见mexext)。例如,SourceSubsys_sf.mexw64

部署功能块生成包含在其他模型对于代码生成,提供的文件生成功能块时在当前工作目录中创建。所需文件:

  • 中高_sf.c. cpp,在那里中高是子系统名称(例如,SourceSubsys_sf.c)

  • 中高_sf.h

  • 中高_sf。mexext,在那里mexext是一个与平台相关的MEX-file扩展(见mexext)

  • 子文件夹中高_sfcn_rtw及其内容

生成的函数代码使用配置参数>硬件实现主机系统相匹配的参数值的函数。当你使用代码生成模型的功能,确保这些参数值为模型匹配函数的参数值。

样品时间传播S-Functions生成

生成的功能块可以继承采样时间从模型中放置特定条件是否满足。条件控制样本时间传播模型块和生成功能块中描述引用的模型样品时间S-Functions指定样品时间继承规则

生成一个符合标准的s函数块继承采样时间,你必须约束模型的解算器的功能块生成。集模型配置参数类型固定步定期取样时间约束确保样品时间独立。如果模型无法继承示例,该设置导致Simulink仿真软件构建模型时显示一条错误消息。金宝app关于这个选项的更多信息,请参阅定期取样时间约束

选择一种解算器

顶级的表格显示了可能的组合模型解算器类型,这些类型与模型是否离散或连续的样本时间和解决者类型S-functions生成。

顶层模型解算器的选择和样品时间

模型配置参数:顶级配置模型
样品时间 解算器选项,类型:变步 解算器选项,类型:固定步
离散 生成函数需要变步解算器 生成功能可以变步解算器或固定的解决者
连续 生成函数需要变步解算器 生成函数需要一个固定的解决者

S-functions产生一个子系统参数硬编码到块中。金宝app模型计算参数,如样本时它生成,而不是在模拟运行时间。重要的是要验证生成的功能块是否按预期工作目标模型。

创建从一个子系统功能块

本节展示如何从模型中提取一个子系统和生成一个可重用的功能组件。

下一个图显示SourceModel一个简单的模型,输入信号子系统。随后的图中显示子系统,SourceSubsys。的信号有不同的宽度和样品时间,有:

  • 一步与样本时间1块

  • 一个正弦波块样品时间0.5

  • 一个常数块,其价值是向量[2 3]

    SourceModel

    SourceSubsys

目标是提取SourceSubsys从模型和构建一个功能块,使用功能的目标。功能块必须执行相同的子系统是生成的。

在这个模型中,SourceSubsys继承采样时间和信号输入信号的宽度。然而,功能块使用功能的目标已经从一个模型创建所有信号属性(如信号宽度或样品)的。(唯一例外问题样品,所述样品时间传播S-Functions生成。)

在本例中,您想要的功能块保留的属性SourceSubsys因为它存在于SourceModel。因此,构建子系统作为一个单独的功能组件之前,您必须显式地设置尺寸样品时间和宽度。此外,解算器功能组件的参数必须与这些参数的原始模型。生成的功能组件运行相同(见原子系统选择一种解算器的更多信息)。

构建SourceSubsys作为一个功能组件,

  1. 创建一个新的模型,复制/粘贴SourceSubsys块空窗口。

  2. 港口内设置信号宽度和样品的时候SourceSubsys这样,他们与原始信号的模型。尺寸1,过滤器,宽度1和一个示例1。轮廓尺寸2,Xferfcn,宽度1和样品时间为0.5。尺寸3,偏移量宽度是2和样品时间为0.5。

  3. 生成的功能块应该有三个港口和一个输出港。连接港口和一个输出港SourceSubsys,如第二图所示。

    信号宽度和样品时间传播到这些端口。

  4. 设置解算器类型、模式和其他参数解算器,这样就完全相同的源模型。这是最容易做的如果你使用模型资源管理器。

  5. 集模型配置参数系统目标文件rtwsfcn.tlc

  6. 选择功能目标窗格。确保创建新的模型被选中时,如第二图所示:

    当这个选项被选中时,构建过程创建一个新的模型构建后功能组件。新模型包含一个功能块,与功能组件。

    点击应用

  7. 保存新模型包含子系统,例如SourceSubsys

  8. 构建的模型。

  9. 构建过程生成功能组件在工作文件夹。构建后,一个新的模型显示窗口。

    你也可以选择保存生成的模型,例如SourceSubsys_Sfunction

  10. 你现在可以复制功能块生成的新模型,并使用它在其他模型或在图书馆。

    请注意

    列表文件需要部署功能块模拟或代码生成,明白了为功能部署所需的文件

    下一个图显示功能块插入原始模型。鉴于相同的输入信号,功能块执行相同原始子系统。

    像SourceModel生成功能配置

功能块执行的速度通常比原模型。这种差异在速度更明显更大、更复杂的模型。通过使用S-functions生成,您可以增加您的建模过程的效率。

在生成的S-Functions可调参数

您可以使用可调参数生成S-functions在两个方面:

您声明块参数可调的汽车存储类源模型成为可调参数的生成的功能。这些参数不成为一个生成的一部分模型_P(原rtP)参数数据结构,因为他们从其他系统目标文件将生成的代码。相反,生成的代码访问这些参数通过墨西哥人API调用等mxGetPrmxGetData。您的代码应该以相同的方式访问这些参数。

墨西哥人API调用的更多信息,请参阅关于C墨西哥人S-Functions选择一个MATLAB API为您的应用程序

功能块利用s函数创建的目标会自动屏蔽。面具一个编辑框显示每一个可调参数。默认情况下,编辑字段显示参数的变量名称,如以下示例。

你可以选择显示参数的值,而不是它的变量名通过选择模型配置参数使用可调参数的值

当选择该参数,变量的值(在代码生成时)显示在编辑字段,如以下示例。

系统目标文件

rtwsfcn.tlc系统提供目标文件使用功能的目标。

校验和和功能目标

代码生成器为模型创建一个校验和,在构建过程中使用校验和代码重用,模型参考,和外部模式特性。

代码生成器模型计算校验和

  1. 为每个子系统计算校验和在模型中。一个子系统的校验和的组合属性(数据类型、复杂性,样品时间,港口维度,等等)子系统的街区。

  2. 结合子系统校验和和其他模型级信息。

一个功能可以添加额外的信息,而不是在块属性分析,校验和通过调用函数ssSetChecksumVal。的功能目标,校验和的值被添加到模型的校验和或子系统的功能是生成的。

代码生成器应用子系统和模型校验和如下:

  • 代码重用,如果两个子系统模型有相同的校验和,代码生成器生成的代码仅供一个函数。

  • 模型参考——如果当前模型校验和校验和匹配的模型建立时,引用的构建过程不重建模型。

  • 外部模式——如果当前模型的校验和校验和不匹配在目标硬件上运行的代码,构建过程生成一个错误。

生成的功能兼容性

当你建立一个墨西哥人从您的模型功能,代码生成器构建一个二级noninlined s函数。Cross-release限制使用生成的代码和二进制文件(例如,墨西哥人* .mexw64)包括:

  • 功能目标从先前的MATLAB生成的代码发布软件不兼容新版本。不重新编译生成的代码从先前版本更新的MATLAB版本软件。使用相同的MATLAB版本软件来生成代码的功能目标和编译代码到一个墨西哥人的文件中。

  • 您可以使用二进制s函数生成墨西哥人文件从以前的MATLAB软件发布相同或较新的版本兼容性考虑相同的手写S-functions。有关更多信息,请参见功能的兼容性

  • 代码生成器可以生成代码并构建一个可执行的模型,该模型包含S-functions生成。这种支持要金宝app求S-functions构建相同的MATLAB版本软件构建模型。不可能将生成的功能从先前的MATLAB软件释放到墨西哥人文件新版本的模型和构建模型。

功能目标的局限性

配置轮廓尺寸外港块连续采样时间

右键单击构建方法生成一个函数不保持连续的采样时间轮廓尺寸外港块。因为样品时间不保存,模拟生成的功能块可以影响。

在表达式中使用可调变量

某些限制适用于可调变量表达式的使用。当代码生成器遇到一个不受支持的表达式在生产代码中,会出现一个警告和等效数值生成代金宝app码。限制的列表,请参阅可调表达的局限性

参数调优

功能块不支持的可调参数调优:金宝app

  • 复杂的值。

  • 值或数据类型转换为一个常数(通过设置模型配置参数优化>默认参数的行为内联)。

  • 没有内置的数据类型。

  • 浮点数据类型不相当于一个内置的类型。

如果你选择这些可调参数(通过为子系统生成功能对话框):

  • 在构建过程中软件产生警告。

  • 生成的功能块面具不显示这些参数。

运行时参数和诊断功能兼容性

如果你集模型配置参数功能升级需要警告错误,代码生成器指示你升级S-functions创建的生成功能特性。这是因为功能系统目标文件不注册运行时参数。运行时参数只支持内联S-Functions和生成的功能支持金宝app功能,防止它被内联(例如,它可以打电话或包含其他noninlined S-Functions)。

你可以绕过这个限制通过设置参数功能升级需要没有一个

Goto和块

当使用功能系统目标文件,代码生成器对I / O限制对应根模型尺寸和外港块(或子系统的轮廓尺寸和外港块街区的功能目标生成)。代码生成器不会产生代码转到块。

为了解决这个限制,创建您的模型和子系统所需的尺寸和外港块,而不是使用转到从块到根模型和子系统之间传递数据。在模型中,包含生成的功能,您将添加转到从街区。

例子之前解决

  • 根模型从块和子系统,Subsystem1

  • Subsystem1与一个转到块,全球可见性和将其输入传递给从根块模型

  • Subsystem1替换功能的s函数生成的目标——一个警告结果运行模型时,因为生成的功能没有实现转到

下班后在例子

外港块取代了转到块在Subsystem1。当你把生成的s函数代入根模型,其输出直接连接到工作区。

建立和更新S-Functions

以下限制适用于建筑使用功能和更新S-functions系统目标文件:

  • 你不能包含构建模型模型使用功能块系统目标文件。这也意味着你不能建立一个子系统通过使用鼠标右键上下文菜单如果子系统包含模型块。这个限制只适用于S-functions利用s函数生成的目标,不要ERT S-functions。

  • 您可以构建一个模型:

    • 工具链只有在工具链支持MEX-file一代。金宝app

    • 一个模板只有模板makefile makefile关联到一个工具链支持MEX金宝app-file一代。

  • 如果你修改模型,生成一个功能块,构建过程不会自动重建模型包含生成的功能块。这与自动重建模型的实践参考模型块时修改(根据模型参考重建配置设置)。

  • 手写S-functions没有相应的TLC文件必须包含exception-free代码。exception-free代码的更多信息,参见除了免费代码

不支金宝app持的块

s函数的格式不支持内置模块如下:金宝app

  • 解释MATLAB函数

  • 功能块包含下列:

    • MATLAB®语言S-functions(除非你供应TLC文件C代码生成)

    • Fortran S-functions(除非你供应TLC文件C代码生成)

    • C / c++墨西哥人S-functions,调用MATLAB环境

  • 金宝app仿真软件的功能

  • 函数调用者

  • 范围

  • 到工作空间

s函数的格式不支持的块金宝appembeddedtargetslib块库。

SimState不支持代金宝app码生成

您可以使用SimState在C-MEX和2级MATLAB语言S-functions保存和恢复仿真状态。看到功能符合ModelOperatingPoint。然而,SimState不支持代码生成金宝app,包括与目标文件的功能系统。

嵌套S-Functions

以下限制适用于嵌套模型中生成的功能块或子系统生成的另一个功能:

  • 软件不支持nonvirtual总线嵌套函数的金宝app输入和输出信号。

  • 避免嵌套模型中的一个功能或子系统名称相同的功能(可能是多个层面分开)。在这种情况下,函数可以递归地调用。软件目前在s函数依赖不检测这样的循环,这可以导致流产或挂你的MATLAB会话。为了防止这种情况的发生,将生成子系统或模型作为一个独特的功能目标,避免复制现有的墨西哥人在MATLAB路径文件名。

用户定义的数据类型

目标文件不支持的功能系统金宝appHeaderFile属性,可以指定用户定义的数据类型,包括基于金宝appSimulink.AliasType,金宝appSimulink.Bus,金宝appSimulink.NumericType对象。如果在你的模型使用一个用户定义的数据类型HeaderFile属性指定一个相关的头文件,代码生成功能系统目标文件忽视了相应产生的价值,不包括声明。

右键单击代的功能目标

如果您生成一个目标通过右键单击一个功能函数调用子系统块,原来的子系统和生成的功能可能不一致。发生不一致时州时启用参数的触发端口块内函数调用子系统块设置为继承。你必须设置州时启用参数重置举行,否则仿真软件就会报告错金宝app误。

总线的I / O信号

如果一个函数使用s函数生成目标总线输入或输出信号,生成的总线数据结构可能包括对齐字段填充的总线中使用模拟仿真软件的元素表示。金宝app然而,如果你插入的s函数模型和生成代码使用一个模型目标等grt.tlc,总线结构对齐生成的模型构建可能不兼容填充生成的功能,可能会影响代码执行的数值结果。使结构之间对齐一致模型模拟和模型代码的执行,为每一个金宝appSimulink.Bus对象,您可以修改HeaderFile头文件属性删除填充物的总线结构。这将导致总线类型定义为函数生成模型中被重用代码。

与函数调用的I / O子系统的信号

功能不支持创建一个目标金宝app功能块的一个子系统,函数调用触发输入或函数调用的输出。

函数调用子系统建模模式

如果一个模型包括这个函数调用子系统建模模式,你必须插入一个信号转换块。

函数调用子系统直接连接到一个外港块和连接的信号线的子系统外港块一块有一个分支更新函数(块更新主要在每个时间步,等单位延迟内存)。分支可以子系统的内部或外部。在模型中,包括函数调用子系统,必须插入一个信号转换块在其中一个地点:

  1. 子系统之间的块和分支

  2. 分支和根外港

  3. 分支和阻止的更新函数

之前生成子系统的功能块,设置这些信号转换块参数:

  • 输出信号复制

  • 选择排除这一杯啤酒从减少块的优化

如果你不应用解决方案,当您添加生成的功能块模型,然后模拟模型,用MATLAB可能崩溃。

数据存储访问

当一个功能在你的模型中访问数据存储在仿真中,仿真软件禁用数据存储诊断。金宝app

  • 如果你创建了功能从一个模型,诊断为全球数据存储是禁用的。

  • 如果你创建了功能从一个子系统,诊断是禁用以下数据存储:

    • 全球数据存储

    • 数据存储在子系统,但访问数据存储读或写数据存储块。

不能指定替代进口或外港块参数通过子系统面具

你不能指定轮廓尺寸外港块参数通过子系统面具变量如果你想生成一个功能块的子系统。软件生成一个错误当你试图运行一个模拟使用功能块,例如:

无效的设置在“testSystem /子系统/ __OutputSSForSFun__ / Out2”参数“PortDimensions”……

相关的话题