文档

通过使用S-Function Target加速模拟、重用代码或保护知识产权

s -函数是代码生成器可以为其生成代码的一类重要的系统目标文件。将子系统封装到s函数中的能力允许您提高其执行效率并促进代码重用。

下面几节描述s函数目标的属性,并说明如何生成它们。有关s函数结构的详细信息,请参见C/ c++ s -函数基础(金宝app模型)。

关于S-Function Target

使用s -函数目标,您可以构建s -函数组件,并将其用作另一个模型中的S-function块。下面几节描述s函数目标的部署注意事项。

“功能”CodeFormats函数目标使用的TLC变量生成符合Simulink的代码金宝app®C MEX s功能应用程序编程接口(API)。这种格式的应用程序包括

  • 模型到组件的转换。你可以为一个模型生成一个S-Function块,m1.然后,您可以将生成的S-Function块放在另一个模型中,平方米.重新生成代码平方米不需要重新生成代码m1

  • 子系统到组件的转换。通过将子系统提取到单独的模型并从该模型生成S-Function块,您可以从子系统创建可重用组件。看到从子系统创建s功能块此程序的示例。

  • 加速模拟。通常,由模型生成的s函数比原始模型执行得更有效。

  • 代码重用。您可以将一个模型的多个实例合并到另一个模型中,而无需为每个实例复制代码。每个实例继续维护自己的惟一数据。

您可以将生成的s函数块放入另一个模型中,从中可以生成另一个s函数。这种方法允许嵌套的s函数级别。有关嵌套的限制,请参见嵌套s函数的限制

请注意

虽然您可以使用S-function目标来部署应用程序组件以实现重用,同时屏蔽其内部逻辑以防止检查和修改,但在分布式组件中保护知识产权的首选解决方案是:金宝搏官方网站

  • 受保护模型,一个隐藏块和行信息的引用模型。有关更多信息,请参见从第三方引用受保护的模型(金宝app模型)。

  • 共享库系统目标文件,用于为模型或子系统生成共享库,以便在Simulink外部的系统仿真中使用。金宝app有关更多信息,请参见将生成的代码打包为共享库(嵌入式编码)。

S-Function部署所需文件

部署生成的S-Function块用于模拟和代码生成需要不同的文件。

部署生成的S-Function块以包含在其他模型中为模拟,您只需要提供在当前工作文件夹中创建S-Function块时生成的二进制MEX-file对象。所需文件为:

  • 中高_sf。mexext

在哪里中高子系统名称和mexext是一个依赖于平台的墨西哥文件扩展名(参见mexext).例如,SourceSubsys_sf.mexw64

部署生成的S-Function块以包含在其他模型中用于代码生成,提供创建S-Function块时在当前工作文件夹中生成的文件。所需文件为:

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

  • 中高_sf.h

  • 中高_sf。mexext,在那里mexext是一个依赖于平台的墨西哥文件扩展名(参见mexext

  • 子文件夹中高_sfcn_rtw以及它的内容

生成的s函数代码使用配置参数>硬件实现与构建函数的主机系统匹配的参数值。当您在模型中使用s函数进行代码生成时,请确保模型的这些参数值与s函数的参数值相匹配。

生成的s函数中的样本时间传播

如果满足某些条件,生成的S-Function块可以从它所在的模型继承其采样时间。控制模型块和生成的s -函数块的采样时间传播的条件描述在参考模型采样次数(金宝app模型)和参考模型的继承采样时间

要生成满足继承采样时间的标准的S-Function块,必须约束用于生成S-Function块的模型的求解器。设定模型配置参数类型固定步而且周期采样时间约束确保采样时间独立.如果模型不能继承采样时间,此设置将导致Simulink软件在构建模型时显示错误消息。金宝app有关此选项的详细信息,请参见周期采样时间约束(金宝app模型)。

选择一个求解器类型

该表显示了顶级模型求解器类型的可能组合,因为这些类型与模型是否具有离散或连续的采样时间以及生成的s函数的求解器类型有关。

顶级模型求解器选项和采样时间

模型配置参数:顶层模型配置
样品时间 解算器选项,类型:可变步长 求解器选项,类型:固定步骤
离散 生成的s函数需要一个变步长求解器 生成的s函数可以有一个可变步长求解器或一个固定步长求解器
连续 生成的s函数需要一个变步长求解器 生成的s函数需要固定步长求解器

从子系统生成的s -函数具有硬编码到块中的参数。金宝appSimulink在生成块时计算参数,而不是在模拟运行时计算。验证生成的S-Function块在目标模型中是否按预期工作是很重要的。

从子系统创建s功能块

本节将展示如何从模型中提取子系统,并从中生成可重用的s函数组件。

下一张图显示SourceModel,一个简单的模型,输入信号到子系统。下图显示了子系统,SourceSubsys.信号具有不同的宽度和采样次数,分别为:

  • 采样时间为1的步骤块

  • 一个正弦波块与采样时间0.5

  • 一个常量块,其值为向量[-2 3]

    SourceModel

    SourceSubsys

目的是提取SourceSubsys并使用S-Function目标从模型中构建一个S-Function块。S-Function块必须与生成它的子系统执行相同的操作。

在这个模型中,SourceSubsys从输入信号中继承采样次数和信号宽度。然而,使用S-Function目标从模型创建的S-Function块具有所有信号属性(如信号宽度或采样次数)。(此规则的唯一例外涉及采样时间,如中所述生成的s函数中的样本时间传播.)

在本例中,您希望S-Function块保留的属性SourceSubsys因为它存在于SourceModel.因此,在将子系统构建为单独的s函数组件之前,必须显式地设置输入采样时间和宽度。此外,s函数分量的求解参数必须与原模型的求解参数相同。生成的s函数组件与原始子系统的操作相同(参见选择一个求解器类型以获取更多信息)。

构建SourceSubsys作为s函数分量,

  1. 创建一个新模型并复制/粘贴SourceSubsys进入空窗口。

  2. 设置输入的信号宽度和采样次数SourceSubsys使它们与原始模型中的信号相匹配。尺寸1,过滤器,宽度为1,采样时间为1。轮廓尺寸2,Xferfcn,宽度为1,采样时间为0.5。尺寸3,偏移量,宽度为2,采样时间为0.5。

  3. 生成的S-Function块应该有三个输入和一个输出。连接导入和输出端口SourceSubsys,如下图所示。

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

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

  5. 设定模型配置参数系统目标参数rtwsfcn.tlc

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

    当选择此选项时,构建过程将在构建s函数组件后创建一个新模型。新模型包含一个S-Function块,链接到S-Function组件。

    点击应用

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

  8. 构建模型。

  9. 构建过程在工作文件夹中生成s函数组件。构建完成后,将显示一个新的模型窗口。

    您可以选择保存生成的模型,例如asSourceSubsys_Sfunction

  10. 您现在可以复制从新模型生成的S-Function块,并在其他模型或库中使用它。

    请注意

    有关部署S-Function块以进行模拟或代码生成所需的文件列表,请参见S-Function部署所需文件

    下一张图显示了插入原始模型的S-Function块。给定相同的输入信号,S-Function块执行与原始子系统相同的操作。

    生成S-Function,配置类似SourceModel

S-Function块执行的速度通常比原始模型快。对于更大更复杂的模型,这种速度上的差异更加明显。通过使用生成的s函数,您可以提高建模过程的效率。

生成的s -函数中的可调参数

你可以用两种方式在生成的s函数中使用可调参数:

控件声明为可调的块参数汽车源模型中的存储类成为生成的s函数的可调参数。这些参数不会成为生成的参数的一部分模型_P(原rtP)参数数据结构,就像从其他系统目标文件生成的代码一样。相反,生成的代码通过使用MEX API调用来访问这些参数,例如mxGetPrmxGetData.您的代码应该以同样的方式访问这些参数。

有关MEX API调用的更多信息,请参见关于C MEX S-Functions(金宝app模型)和为您的应用程序选择MATLAB API(MATLAB)。

使用S-Function目标创建的S-Function块将被自动屏蔽。掩码在编辑字段中显示每个可调参数。默认情况下,edit字段按变量名显示参数,如下例所示。

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

选择此参数时,变量的值(在代码生成时)将显示在编辑字段中,如下例所示。

系统目标文件

rtwsfcn.tlcsystem目标文件提供给S-function目标使用。

校验和和s -函数目标

代码生成器为模型创建校验和,并在构建过程中将该校验和用于代码重用、模型引用和外部模式特性。

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

  1. 计算每个子系统的校验和在模型中。子系统的校验和是子系统块的属性(数据类型、复杂性、采样时间、端口尺寸等)的组合。

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

s函数可以通过调用该函数向校验和添加在块属性分析期间未捕获的额外信息ssSetChecksumVal.对于S-Function目标,被添加到校验和的值是生成S-Function的模型或子系统的校验和。

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

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

  • 模型引用——如果当前模型校验和与构建模型时的校验和匹配,构建过程就不会重新构建引用的模型。

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

生成的s函数兼容性

当您从模型构建MEX s函数时,代码生成器将构建第2级非内联s函数。生成的代码和二进制MEX文件的交叉发布使用限制(例如,* .mexw64)包括:

  • 从以前的MATLAB版本软件生成的s函数目标代码与新版本不兼容。不要使用更新的MATLAB版本软件重新编译以前版本生成的代码。使用相同的MATLAB发布软件为S-function目标生成代码,并将代码编译为MEX文件。

  • 您可以使用由以前的MATLAB发行版软件生成的二进制s函数MEX文件,这些文件具有与手写s函数相同的兼容性考虑。有关更多信息,请参见功能的兼容性(金宝app模型)。

  • 代码生成器可以生成代码,并从包含生成的s函数的模型构建可执行文件。这种支持要金宝app求使用构建模型的相同的MATLAB发布软件构建s函数。不可能将以前的MATLAB版本软件生成的S-function MEX文件合并到模型中,并使用新版本构建模型。

s函数目标限制

在表达式中使用可调变量的限制

在表达式中使用可调变量有一定的限制。当代码生成器在生成代码时遇到不支持的表达式时,将出现警告,并在代码中生成等效的数金宝app值。有关限制的列表,请参见可调表达式限制

参数调优

功能Block不支持以下可调参数的金宝app调优:

  • 复杂的值。

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

  • 非内置的数据类型。

如果您选择这些可调参数(通过“生成子系统的s函数”对话框):

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

  • 生成的功能块掩码不显示这些参数。

运行时参数和s -函数兼容性诊断

如果您设置模型配置参数s功能需要升级警告错误时,代码生成器会指示您升级使用生成功能特性。这是因为s函数系统目标文件没有注册运行时参数。只支持内联s -函数的运行时参数,生成的s -函数支持阻止金宝app其内联的特性(例如,它可以调用或包含其他非内联s -函数)。

您可以通过设置参数来解决这个限制s功能需要升级没有一个

使用后向和从块的限制

当使用S-function系统目标文件时,代码生成器限制I/O与根模型的import和Outport块(或生成S-function目标的子系统块的import和Outport块)对应。代码生成器不会生成用于的代码转到块。

要绕过这个限制,请使用所需的import和Outport块创建您的模型和子系统,而不是使用转到和From块,在根模型和子系统之间传递数据。在包含生成的s函数的模型中,然后添加转到和From blocks。

工作前的例子

  • 根模型有一个From块和子系统,Subsystem1

  • Subsystem1与一个转到块,它具有全局可见性,并将其输入传递给根模型中的From块

  • Subsystem1用S-function目标生成的s -函数替换——当您运行模型时,会产生警告,因为生成的s -函数没有实现转到

下班后的例子

的Outport块替换转到块在Subsystem1.当您将生成的s函数插入根模型时,它的输出直接连接到to Workspace块。

构建和更新s函数的限制

以下限制适用于使用s函数系统目标文件构建和更新s函数:

  • 您不能构建包含模型块使用s函数系统目标文件。这也意味着您不能通过使用右键单击上下文菜单来构建子系统,如果子系统包含模型块。此限制仅适用于使用s函数目标生成的s函数,而不适用于ERT s函数。

  • 如果您修改了生成S-Function块的模型,构建过程不会自动重建包含生成的S-Function块的模型。这与自动重建引用的模型的实践相反模型块(取决于Model Reference)重建配置设置)。

  • 没有相应TLC文件的手写s函数必须包含无异常代码。有关无异常代码的更多信息,请参见例外自由代码(金宝app模型)。

不支金宝app持的块

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

  • MATLAB解释函数

  • 功能包含以下任何一个的块:

    • MATLAB®语言s函数(除非你为C代码生成提供了TLC文件)

    • Fortran s -函数(除非您为C代码生成提供了TLC文件)

    • C/ c++ MEX s函数,调用到MATLAB环境中

  • 范围

  • 到工作空间

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

SimState不支持代金宝app码生成

你可以使用SimState在C-MEX和Level-2 MATLAB语言s函数中保存和恢复仿真状态。看到s -函数遵从ModelOperatingPoint(金宝app模型)。然而,SimState不支持代码生成金宝app,包括s函数系统目标文件。

不支持TLC钩子函数的分析代码性能金宝app

中描述的使用目标语言编译器(TLC)钩子函数接口来分析所生成代码的性能配置文件代码执行速度不支持s函数目金宝app标。

请注意

如果你有嵌入式编码器®许可证,看到代码执行分析(Embedded Coder)提供了一种基于软件在环(SIL)或处理器在环(PIL)模拟的替代和更简单的方法。

嵌套s函数的限制

以下限制适用于在模型或子系统中嵌套生成的S-Function块,从中生成另一个S-Function:

  • 该软件不支持嵌套s函数的非虚拟总线输入和输出金宝app信号。

  • 避免在模型或子系统中嵌套与s函数同名的s函数(可能相隔几层)。在这种情况下,可以递归地调用s函数。该软件目前没有检测到s函数依赖中的这种循环,这可能导致中止或挂起MATLAB会话。为了防止这种情况发生,将要生成的子系统或模型唯一地命名为s函数目标,以避免重复MATLAB路径上的现有MEX文件名。

用户定义数据类型的限制

S-function系统目标文件不支持金宝appHeaderFile属性指定的用户定义数据类型,包括基于金宝app仿真软件。AliasType金宝app仿真软件。公共汽车,金宝app仿真软件。NumericType对象。如果模型中的用户定义数据类型使用HeaderFile属性指定关联的头文件,使用s函数系统目标文件的代码生成将忽略该值,并且不生成相应的include语句。

右击生成s函数目标的限制

如果您通过右键单击a生成s函数目标函数调用子系统块时,原始子系统和生成的s函数可能不一致。时发生不一致启用时的状态参数。触发端口块内部的函数调用子系统Block被设置为继承.您必须设置启用时的状态参数重置举行,否则Simulink将金宝app报错。

带有总线I/O信号的s函数的限制

如果使用s函数目标生成的s函数具有总线输入或输出信号,则生成的总线数据结构可能包括填充,以便将总线元素的字段与仿真期间使用的Simulink表示对齐。金宝app但是,如果您在模型中插入s函数并使用模型目标生成代码,例如grt.tlc,为模型构建生成的总线结构对齐可能与为s函数生成的填充不兼容,并可能影响代码执行的数值结果。使模型模拟和模型代码执行之间的结构对齐一致金宝app仿真软件。公共汽车对象时,可以修改HeaderFile属性删除无填充的总线结构头文件。这将导致在模型代码中重用为s -函数生成的总线类型定义。

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

S-function目标不支持创建金宝app功能来自具有函数调用触发器输入或函数调用输出的子系统的块。

数据存储访问

当一个功能在模拟期间访问数据存储时,Simulink将禁用数据存储诊断。金宝app

  • 如果您创建了功能从模型来看,对全局数据存储也禁用了诊断功能。

  • 如果您创建了功能在子系统中,对以下数据存储禁用诊断:

    • 全球数据存储

    • 位于子系统之外,但由数据存储读或数据存储写块访问的数据存储。

不能通过子系统掩码指定输入或输出块参数

你不能指定轮廓尺寸外港如果要生成一个功能来自子系统的块。方法运行模拟时,软件会产生错误功能块,例如:

'testSystem/Subsystem/ __outputssforfun__ /Out2'中参数'PortDimensions'的设置无效…

相关的话题