s函数是代码生成器可以为其生成代码的一类重要的系统目标文件。将子系统封装到s -函数的能力允许您提高它的执行效率并促进代码重用。
以下部分描述了S函数目标的属性,并说明了如何生成它们。有关S函数结构的更多详细信息,请参阅C / C ++ S功能基础知识.
使用s -功能目标,您可以构建一个s -功能组件,并将其作为另一个模型中的s -功能块使用。下面几节描述S-function目标的部署注意事项。
的's-function'
值codeformat.
S函数目标使用的TLC变量生成符合Simulink的代码万博1manbetx®C MEX S函数应用程序编程接口(API)。这种格式的应用包括
将模型转换为组件。您可以为模型生成一个S函数块,M1
.然后,您可以将生成的S-Function块放到另一个模型中,M2
.再生代码M2
不需要重新生成代码M1
.
子系统到组件的转换。通过将一个子系统提取到一个单独的模型,并从该模型生成一个S-Function块,您可以从该子系统创建一个可重用的组件。看到从子系统创建S函数块有关此过程的示例。
加快模拟。通常,从模型生成的S函数比原始模型更有效地执行。
代码重用。您可以在另一个模型内包含多个模型的实例,而无需为每个实例复制代码。每个实例都继续维护自己的独特数据。
您可以将生成的S函数块放入另一个模型中,您可以从中生成另一个S函数。这种方法允许嵌套S函数的级别。有关与嵌套有关的限制,请参阅嵌套S函数.
请注意
如果要为建模软件组件生成代码,请使用引用模型而不是从子系统生成S函数块。
请注意
虽然您可以使用S-Function目标来部署应用程序组件,但在屏蔽其内部逻辑免受检查和修改的同时,用于保护分布式组件中的知识产权的首选解决方案是:万博 尤文图斯
受保护的模型,隐藏块和行信息的引用模型。有关更多信息,请参阅来自第三方的参考保护型号.
共享库系统目标文件,用于为模型或子系统生成共享库,以用于Simulink外部的系统仿真。万博1manbetx有关更多信息,请参阅包生成的代码作为共享库(嵌入式编码).
部署生成的S函数块需要不同的文件,用于模拟与代码生成。
部署生成的S函数块以包含在其他模型中为模拟,您只需要提供在创建S函数块时在当前工作文件夹中生成的二进制MEX文件对象。所需文件是:
子句
_SF。Mexext.
在哪里
子系统名称和子句
是一个依赖于平台的MEX文件扩展名(见Mexext.
Mexext.
).例如,sourceubsys_sf.m.mexw64.
.
部署生成的S函数块以包含在其他模型中用于代码生成,提供在创建S函数块时在当前工作文件夹中生成的文件。所需的文件是:
或子句
_SF.C..cpp.
,在哪里
是子系统名称(例如,子句
sourceubsys_sf.c.
)
子句
_sf.h.
,在哪里子句
_SF。Mexext.
是一个依赖于平台的MEX文件扩展名(见Mexext.
Mexext.
)
子文件夹
及其内容子句
_sfcn_rtw
生成的s函数代码使用配置参数>硬件实现与构建功能的主机系统匹配的参数值。当您在代码生成模型中使用S-函数时,请确保模型的这些参数值与S函数的参数值匹配。
如果满足某些条件,生成的S-Function块可以从它所在的模型继承它的样本时间。控制模型块和生成的s -函数块的样本时间传播的条件描述在参考模型采样时间和指定示例时间继承规则的s -函数.
要生成满足用于继承采样时间的标准的S函数块,必须为生成S函数块的模型限制求解器。设定模型组态参数type到目前为止固定步
和定期采样时间约束到目前为止确保样本时间无关
.如果模型无法继承示例时间,则此设置会导致Simulink软件在构建模型时显示错误消息。万博1manbetx有关此选项的详细信息,请参阅定期采样时间约束.
表中显示了顶级模型求解器类型的可能组合,因为这些类型与模型是否具有离散或连续的样本时间和生成的s -函数的求解器类型有关。
顶级模型求解器选项和采样时间
模型配置参数:顶级模型配置 | ||
---|---|---|
样本时间 | 求解器选项,类型:可变步骤 | 求解器选项,类型:固定步骤 |
离散 | 生成的s函数需要一个变步长求解器 | 生成的s函数可以有一个变步长求解器或一个固定步长求解器 |
连续 | 生成的s函数需要一个变步长求解器 | 生成的s函数需要一个固定步长求解器 |
从子系统生成的s -函数具有硬编码到块中的参数。万博1manbetxSimulink在生成块时计算参数,比如采样时间,而不是在模拟运行时。重要的是要验证生成的S-Function块在目标模型中是否按照预期工作。
本节展示如何从模型中提取子系统,并从中生成可重用的s -功能组件。
下一个数字显示SourceModel.
,一个简单的模型,将信号输入子系统。随后的图显示子系统,SourceSubsys
.不同宽度和采样时间的信号为:
具有采样时间1的步骤块
具有采样时间0.5的正弦波块
一个常量块,其值为向量[-2 3]
SourceModel.
SourceSubsys
目的是提取SourceSubsys
从模型并使用S函数目标从中构建S函数块。S函数块必须与生成它的子系统相同执行。
在这个模型中,SourceSubsys
从其输入信号继承采样时间和信号宽度。但是,使用S函数目标从模型创建的S函数块具有所有信号属性(例如信号宽或采样时间)硬连线。(本规则的唯一例外问题涉及样品时间,如下所述生成s函数中的采样时间传播.)
在此示例中,您希望S函数块保留属性SourceSubsys
因为它存在于SourceModel.
.因此,在将子系统构建为单独的S函数组件之前,必须明确地设置Inport采样时间和宽度。此外,S函数组件的求解器参数必须与原始模型的参数相同。生成的S函数组件与原始子系统相同运行(参见选择求解器类型有关更多信息)。
建造SourceSubsys
作为S函数组件,
创建一个新模型并复制/粘贴SourceSubsys
堵住空窗户。
设置信号宽度和内部导入的采样时间SourceSubsys
这样它们与原始模型中的信号匹配。inport 1,过滤器
,具有1的宽度和样品时间为1.Inport 2,XFERFCN.
,宽度为1,采样时间为0.5。尺寸3,偏移量
,宽度为2,采样时间为0.5。
生成的S-Function块应该有三个输入口和一个输出口。连接入口和出口到SourceSubsys
,如下图所示。
信号宽度和采样时间传播到这些端口。
设置求解器类型,模式和其他求解器参数,使得它们与源模型的相同。如果您使用Model Explorer,这是最容易的。
设定模型组态参数系统目标文件到目前为止RTWSFCN.TLC.
.
选择S函数目标窗格。确保创建新的模型被选中,如下图所示:
当选择此选项时,构建流程在构建s -功能组件之后创建一个新模型。新型号包含一个S-Function模块,链接到S-Function组件。
点击应用.
保存包含子系统的新模型,例如SourceSubsys
.
构建的模型。
构建过程在工作文件夹中生成S函数组件。构建后,将显示一个新的模型窗口。
您可以选择保存生成的模型,例如SourceSubsys_Sfunction
.
您现在可以复制从新模型生成的S函数块并在其他模型或库中使用它。
请注意
有关部署用于模拟或代码生成的S-Function块所需的文件列表,请参见s -功能部署所需文件.
下图显示插入原始模型的S函数块。给定相同的输入信号,S函数块相同地执行到原始子系统。
生成的s -功能配置类似于sourcmodel
S-Function块执行的速度通常比原始模型快。这种速度上的差异在更大、更复杂的车型上表现得更明显。通过使用生成的s函数,您可以提高建模过程的效率。
您可以通过两种方式使用生成的S函数中的可调参数:
使用生成功能功能(参见从子系统生成s函数).
或
使用Model参数配置对话框(参见使用Model参数配置对话框将工作区变量声明为可调参数)来声明所需的块参数可调。
阻止您声明可调谐的参数自动
源模型中的存储类成为生成的S函数的可调参数。这些参数不会成为生成的一部分
(以前模型
_PrtP
)参数数据结构,因为它们将在其他系统目标文件生成的代码中。相反,生成的代码通过使用MEX API调用来访问这些参数,例如mxGetPr
或mxgetdata.
.您的代码应该以同样的方式访问这些参数。
有关MEX API调用的更多信息,请参阅关于C MEX S-Functions和为您的申请选择Matlab API.
使用S-Function目标创建的S-Function块被自动屏蔽。掩码在编辑字段中显示每个可调参数。默认情况下,edit字段按变量名显示参数,如下例所示。
您可以选择通过选择Model Configuration参数来显示参数而不是其变量名称的值使用可调参数的值.
选择此参数时,变量的值(在代码生成时间)显示在“编辑”字段中,如以下示例中。
的RTWSFCN.TLC.
提供系统目标文件以与S函数目标一起使用。
代码生成器为模型创建校验和,并在构建过程中使用校验和进行代码重用,模型引用和外部模式功能。
代码生成器计算模型校验和
通过调用该功能,S函数可以在块属性分析期间添加未捕获的附加信息,以通过调用该函数sssetchecksumval.
.对于S函数目标,添加到校验和的值是从生成S函数的模型或子系统的校验和。
代码生成器适用子系统和模型校验和如下:
代码重用——如果模型中的两个子系统具有相同的校验和,则代码生成器只为一个函数生成代码。
模型引用 - 如果当前模型校验和匹配校验和构建模型时,构建过程不会重建引用的模型。
外部模式 - 如果当前模型校验和与目标硬件上运行的代码的校验和不匹配,则构建过程会生成错误。
当您从模型中构建MEX S函数时,代码生成器构建了一个级别的2级非终端的S函数。生成的代码和二进制MEX文件上的跨释放使用限制(例如,* .mexw64
)包括:
s函数目标生成的代码从以前的MATLAB发布软件不兼容较新的版本。不要用较新的MATLAB发行版软件重新编译从先前发行版生成的代码。使用相同的MATLAB发布软件为s -函数目标生成代码,并将代码编译成一个MEX文件。
您可以使用由以前的MATLAB发行版软件生成的二进制S-function MEX文件,这些文件具有与手写S-function相同的兼容性考虑。有关更多信息,请参阅S功能兼容性.
代码生成器可以生成代码,并从包含生成的s -函数的模型构建可执行文件。这种支持要万博1manbetx求使用构建模型的相同MATLAB发布软件构建s -函数。不可能将以前MATLAB发布软件生成的S-function MEX文件合并到模型中,并使用更新的版本构建模型。
右键单击“生成S函数的构建方法”不保留连续采样时间inport.和外港块。由于不保留采样时间,会影响生成的S-Function块的模拟。
在表达式中使用可调变量存在某些限制。当代码生成器在生成代码时遇到不支持的表达式时,将出现警告并在代码中生成等价的数值万博1manbetx。有关限制的列表,请参见可调表达限制.
的功能Block不支持以下参数的可调万博1manbetx优:
复数。
转换为常量的值或数据类型(通过设置模型配置参数)优化>默认参数行为到目前为止衬
).
没有内置的数据类型。
浮点数据类型不等同于内置类型。
如果选择这些可调节参数(通过“子系统”对话框的“生成S函数”):
该软件在构建过程中产生警告。
生成功能块掩码不显示这些参数。
如果设置模型配置参数所需的S函数升级到目前为止警告
或错误
,代码生成器指示您升级您的函数生成功能功能。这是因为S函数系统目标文件未注册运行时参数。Run-Time参数仅支持内联的S函数,生成的S函数支持阻万博1manbetx止它被内嵌的功能(例如,它可以调用或包含其他非终端的S函数)。
您可以通过设置参数来克服这个限制所需的S函数升级到目前为止没有
.
当使用S-function系统目标文件时,代码生成器将I/O限制为与根模型的import和Outport块(或者生成S-function目标的子系统块的import和Outport块)相对应。代码生成器不为goto.或从块。
要解决这个限制,使用所需的import和Outport块创建模型和子系统,而不是使用goto.和From块来在根模型和子系统之间传递数据。在合并生成的s函数的模型中,您将添加goto.来自块。
工作前的例子
具有来自块和子系统的根模型,子系统1
子系统1
与A.goto.块,具有全局可见性,并将其输入到从根模型中的来自块传递
子系统1
替换为使用S函数目标生成的S函数 - 当您运行模型时,警告结果是因为生成的S函数不实现goto.块
工作后的例子
一个出口块取代goto.块在子系统1
.当您将生成的s函数插入根模型时,它的输出直接连接到to Workspace块。
使用S-function系统目标文件构建和更新S-function有以下限制:
您无法构建包含的模型模型块使用s -函数系统目标文件。这也意味着如果子系统包含,您就不能通过使用右键单击上下文菜单来构建子系统模型块。此限制仅适用于使用S函数目标生成的S函数,而不是ert S函数。
你可以用以下方法构建一个模型:
仅当工具链支持MEX文件生成时才有一个工具链。万博1manbetx
仅当模板makefile是一个模板makefile与工具链相关联的支持mex万博1manbetx文件生成。
如果修改生成S-Function块的模型,则构建过程不会自动重新构建包含生成的S-Function块的模型。这与自动重建被引用的模型的做法形成了对比模型块被修改时(取决于模型引用)重建配置设置)。
没有相应TLC文件的手写s -函数必须包含无异常代码。有关无异常代码的更多信息,请参见例外免费代码.
S-function格式不支持以下内置块:万博1manbetx
解释MATLAB函数块
功能包含以下任何一种的块:
马铃薯®语言s -函数(除非您为C代码生成提供了TLC文件)
Fortran S函数(除非您为C代码提供TLC文件)
将C/ c++ MEX s函数调用到MATLAB环境中
范围块
到工作区块
S-function格式不支持从万博1manbetxembeddedtargetslib
块库。
兴色
代码生成万博1manbetx不支持你可以使用兴色
在C-MEX和二级MATLAB语言s函数中保存和恢复仿真状态。看到S函数符合ModeloperationPoint.然而,兴色
不支持代码生成万博1manbetx,包括S函数系统目标文件。
使用目标语言编译器(TLC)钩子函数接口分析生成代码的性能配置文件代码执行速度S-funct万博1manbetxion目标不支持。
请注意
如果您有嵌入式编码器®许可证,参见代码执行分析(嵌入式编码)基于软件在环(SIL)或处理器在环(PIL)模拟的替代和更简单的方法。
以下限制适用于在模型或子系统中嵌套生成的S-Function块,从中生成另一个S-Function:
该软件不支持嵌套S函数的非视频总线输入和输出万博1manbetx信号。
避免在具有与S函数的模型或子系统中嵌套S-函数,作为S函数(可能是几个级别分开)。在这种情况下,可以递归调用S函数。该软件目前不会检测到S函数依赖关系中的此类循环,这可能导致中止或挂起MATLAB会话。为了防止这种情况发生,请将要作为S函数目标生成的子系统或模型命名,以避免在MATLAB路径上重复现有的MEX文件名。
系统目标文件不支持万博1manbetx标题文件
属性,可以根据用户定义的数据类型指定,包括基于万博1manbetx仿真软件。AliasType
,万博1manbetxsimulink.bus.
,和万博1manbetxsimulink.numerictype.
对象。如果模型中的用户定义数据类型使用标题文件
属性要指定关联的标题文件,具有S函数系统目标文件的代码生成忽略了值,并且不会生成相应的包含语句。
如果通过右键单击生成S函数目标函数调用子系统块,原始子系统和生成的s函数可能不一致。不一致发生时州时启用参数的触发港口块内函数调用子系统块设置为继承.你必须设置州时启用参数重置或举行,否则Simulink报万博1manbetx告错误。
如果使用S函数目标生成的S函数具有总线输入或输出信号,则生成的总线数据结构可以包括填充以将总线元素的字段与模拟期间使用的Simulink表示对齐。万博1manbetx但是,如果您在模型中插入S-函数并使用诸如的型号目标生成代码grt.tlc.
,为模型构建生成的总线结构对准可能与为S函数产生的填充不兼容,并且可能影响代码执行的数值结果。为了使结构对齐在模型仿真和模型代码的执行之间一致,每个万博1manbetxsimulink.bus.
对象,您可以修改标题文件
属性删除未填充的总线结构头文件。这将导致在模型代码中重用为s -函数生成的总线类型定义。
S-function目标不支持创建万博1manbetx功能来自具有函数呼叫触发输入或函数调用输出的子系统的块。
如果模型包含此函数呼叫子系统建模模式,则必须插入一个信号转换块。
函数呼叫子系统直接连接到外港块和连接子系统到的信号线外港块分支到具有的块更新
函数(块在每个主要时间步骤中更新,例如单位延迟和内存).分支可以在子系统内部或外部。在包含函数调用子系统的模型中,必须插入信号转换在其中一个位置块:
子系统块和分支之间
在树枝和根之间外港块
在树枝和木块之间更新
功能
在为子系统生成S-Function块之前,设置这些信号转换块参数:
集输出信号复制
选择从“块减少”优化中排除此博克
如果您不应用了解决方法,请将生成的S函数块添加到模型,然后模拟该模型,MATLAB可能会崩溃。
当AN.功能在模型中,在模拟期间访问数据存储,Simulink禁用数据存储诊断。万博1manbetx
如果您创建了功能在模型中,也对全局数据存储禁用诊断。
如果您创建了功能从一个子系统,以下数据存储的诊断被禁用:
全球数据商店
数据存储放置在子系统外,但通过数据存储读取或数据存储写入块访问。
你不能指定inport.或外港块参数使用子系统掩码变量,如果你想生成功能来自子系统的块。当您尝试运行使用的模拟时,该软件会产生错误功能块,例如:
在'testSystem/Subsystem/ __outputssforfun__ /Out2'中设置参数'PortDimensions'无效…