对模型或子系统使用s函数目标
s -函数是代码生成器可以为其生成代码的一类系统目标文件。s函数目标可以封装一个子系统,以提高其执行效率,促进代码重用,并保护其知识产权。
请注意
虽然您可以使用S-function目标来部署应用程序组件以实现重用,同时屏蔽其内部逻辑以防止检查和修改,但在分布式组件中保护知识产权的首选解决方案是:
受保护模型,一个隐藏块和行信息的引用模型。有关更多信息,请参见保护模型以隐藏内容.
共享库系统目标文件,用于为模型或子系统生成共享库,以便在Simulink外部的系统仿真中使用®.有关更多信息,请参见将生成的代码打包为共享库(嵌入式编码).
这些解决方案还可以提高执行效率并促进代码重用。
可以使用生成的s函数目标生成的功能块。
的“功能”
的值。CodeFormat
s函数目标使用TLC变量生成符合Simulink C MEX s函数API (application programming interface)的代码。
S-Function部署所需文件
部署生成的文件需要不同的文件功能块用于模拟和代码生成。
要部署生成的功能块,以便包含在其他模型中为模拟时,您只需要提供在当前工作文件夹中生成的二进制MEX-file对象功能Block被创建。所需文件为:
中高
_sf。mexext
在哪里
子系统名称和中高
是一个依赖于平台的墨西哥文件扩展名(参见mexext
mexext
).例如,SourceSubsys_sf.mexw64
.
要部署生成的功能块,以便包含在其他模型中用于代码生成时,提供在当前工作文件夹中生成的文件功能Block被创建。所需文件为:
或中高
_sf.c. cpp
,在那里
子系统名称(例如,中高
SourceSubsys_sf.c
)中高
_sf.h
,在那里中高
_sf。mexext
是一个依赖于平台的墨西哥文件扩展名(参见mexext
mexext
)子文件夹
以及它的内容中高
_sfcn_rtw
生成的s函数代码使用配置参数>硬件实现与构建函数的主机系统匹配的参数值。当您在模型中使用s函数进行代码生成时,请确保模型的这些参数值与s函数的参数值相匹配。
生成的s函数中的样本时间传播
一个生成的功能如果满足某些条件,块可以从它所在的模型继承它的采样时间。控制两者的样本时间传播的条件模型块和生成的功能块描述在参考模型采样次数而且指定采样时间继承规则的s函数.
生成功能块满足继承采样时间的标准时,必须约束求解器的模型功能块生成。设定模型配置参数类型来固定步
而且周期采样时间约束来确保采样时间独立
.如果模型不能继承采样时间,此设置将导致Simulink软件在构建模型时显示错误消息。有关此选项的详细信息,请参见周期采样时间约束.
求解器类型的顶级模型与生成的s函数
该表显示了顶层模型求解器类型的可能组合,因为这些类型与模型是否具有离散或连续的采样时间以及生成的s函数的求解器类型有关。
顶级模型求解器选项和采样时间
模型配置参数:顶层模型配置 | ||
---|---|---|
样品时间 | 解算器选项,类型:可变步长 | 求解器选项,类型:固定步骤 |
离散 | 生成的s函数需要一个变步长求解器 | 生成的s函数可以有一个可变步长求解器或一个固定步长求解器 |
连续 | 生成的s函数需要一个变步长求解器 | 生成的s函数需要固定步长求解器 |
从子系统生成的s -函数具有硬编码到块中的参数。Simulink在生成块时计算参数,而不是在模拟运行时计算。重要的是验证是否生成功能Block在目标模型中按预期工作。
生成的s -函数中的可调参数
要在生成的s函数中使用可调参数,请使用模型配置参数来声明所需的块参数是可调的。看到使用“模型参数配置”对话框将工作区变量声明为可调参数.
控件声明为可调的块参数汽车
源模型中的存储类成为生成的s函数的可调参数。这些参数不会成为生成的参数的一部分
(原模型
_PrtP
)参数数据结构,就像从其他系统目标文件生成的代码一样。相反,生成的代码通过使用MEX API调用来访问这些参数,例如mxGetPr
或mxGetData
.您的代码应该以同样的方式访问这些参数。
有关MEX API调用的更多信息,请参见关于C MEX S-Functions而且集成MATLAB与外部编程语言和系统.
功能使用s函数目标创建的块被自动屏蔽。掩码在编辑字段中显示每个可调参数。默认情况下,edit字段按变量名显示参数,如下例所示。
通过选择模型配置参数,您可以选择显示参数的值,而不是它的变量名将value用于可调参数.
当选择此参数时,变量的值(在代码生成时)将显示在编辑字段中。
宏参数
假设您应用一个存储类,例如定义
到一个仿真软件。参数
对象,使参数在生成的代码中显示为宏。如果在生成ERT s -函数的子系统中使用参数对象,则不能选择参数对象作为可调参数。相反,s函数代码生成器将自定义存储类应用于参数对象。在s -函数代码中生成宏使您能够从包含变量元素的子系统生成s -函数,例如不同的子系统块,您可以将其配置为在生成的代码中产生预处理器条件。在模拟s函数时,不能更改参数的值。
若要选择参数对象作为可调参数,请应用不同的存储类或创建自己的存储类。将参数视为宏的存储类包括定义
,ImportedDefine
,CompilerFlag
,以及通过设置创建的存储类数据初始化来宏
自定义存储类设计器。如果使用非宏存储类,则不能使用参数对象作为变量控制变量并生成预处理器条件。
如果应用将参数对象视为导入宏的存储类,在生成ERT s函数之前,请提供宏定义。例如,假设应用存储类ImportedDefine
到一个仿真软件。参数
对象,并在子系统中使用参数对象作为变量控制变量。如果您设置自定义属性HeaderFile
来“myHdr.h”
,在生成s函数时,放置自定义头文件myHdr.h
在当前文件夹中。生成的s -函数使用头文件中的宏值,而不是价值
参数对象的属性。
要使用通过编译器选项定义的宏,例如通过应用存储类CompilerFlag
,使用模型配置参数代码生成>自定义代码>代码信息>定义了指定编译器选项。有关更多信息,请参见代码生成窗格:自定义代码:附加构建信息:定义.
系统目标文件
的rtwsfcn.tlc
system目标文件提供给S-function目标使用。
校验和和s -函数目标
代码生成器为模型创建校验和,并在构建过程中将该校验和用于代码重用、模型引用和外部模式特性。
代码生成器通过计算模型校验和
计算模型中每个子系统的校验和。子系统的校验和是子系统块的属性(数据类型、复杂性、采样时间、端口尺寸等)的组合。
结合子系统校验和和其他模型级信息。
s函数可以通过调用该函数向校验和添加在块属性分析期间未捕获的额外信息ssSetChecksumVal
.对于S-Function目标,被添加到校验和的值是生成S-Function的模型或子系统的校验和。
代码生成器应用子系统和模型校验和,如下所示:
代码重用——如果一个模型中的两个子系统具有相同的校验和,代码生成器只生成一个函数的代码。
模型引用——如果当前模型校验和与构建模型时的校验和匹配,构建过程就不会重新构建引用的模型。
外部模式——如果当前模型校验和与目标硬件上运行的代码的校验和不匹配,构建过程将生成一个错误。
生成的s函数兼容性
当您从模型构建MEX s函数时,代码生成器将构建第2级非内联s函数。生成的代码和二进制MEX文件的交叉发布使用限制(例如,* .mexw64
)包括:
s函数目标生成代码从以前的MATLAB®发行版软件与更新版本不兼容。不要使用更新的MATLAB版本软件重新编译以前版本生成的代码。使用相同的MATLAB发布软件为S-function目标生成代码,并将代码编译为MEX文件。
您可以使用由以前的MATLAB发行版软件生成的二进制s函数MEX文件,这些文件具有与手写s函数相同的兼容性考虑。有关更多信息,请参见功能的兼容性.
代码生成器可以生成代码,并从包含生成的s函数的模型构建可执行文件。这种支持要求使用构建模型的相同的MATLAB发布软件构建s函数。不可能将以前的MATLAB版本软件生成的S-function MEX文件合并到模型中,并使用新版本构建模型。
s函数目标限制
轮廓尺寸而且外港连续采样时间块
用于生成s函数的右键单击构建方法不会保留连续采样时间轮廓尺寸而且外港块。由于采样时间不保存,仿真产生了功能Block会受到影响。
表达式中的可调变量
在表达式中使用可调变量有一定的限制。当代码生成器在生成代码时遇到不支持的表达式时,将出现警告,并在代码中生成等效的数值。有关限制的列表,请参见可调表达式限制.
参数调优
的功能Block不支持以下可调参数的调优:
复杂的值。
转换为常量的值或数据类型(通过设置模型配置参数)优化>默认参数行为来
内联
).非内置的数据类型。
不等同于内置类型的浮点数据类型。
运行时参数和s -函数兼容性诊断
如果您设置模型配置参数s功能需要升级来警告
或错误
,代码生成器指示您升级子系统生成的s函数。s函数系统目标文件不注册运行时参数。只支持内联s函数的运行时参数,生成的s函数支持阻止其内联的特性,例如,它可以调用或包含其他非内联s函数。
要解决这个限制,请设置参数s功能需要升级来没有一个
.
转到而且从块
当使用s函数系统目标文件时,代码生成器限制输入和输出与根模型相对应轮廓尺寸而且外港块(或轮廓尺寸而且外港街区子系统生成s函数目标的块)。代码生成器不会生成用于的代码转到或从块。
为了绕过这个限制,创建您的模型和子系统轮廓尺寸而且外港块,而不是使用转到而且从块,以便在根模型和子系统之间传递数据。在包含生成的s函数的模型中,然后添加转到而且从块。
工作前的例子
根模型,其中包括从块和子系统,
Subsystem1
Subsystem1
这包括转到块,该块具有全局可见性并将其输入传递给从根模型中的块Subsystem1
用S-function系统目标文件生成的s -函数替换-当您运行模型时,会产生警告,因为生成的s -函数没有实现转到块
下班后的例子
一个外港块替换转到块在Subsystem1
.将生成的s函数插入根模型时,其输出直接连接到到工作空间块。
构建和更新s函数
以下限制适用于使用s函数系统目标文件构建和更新s函数:
您不能构建包含模型块使用s函数系统目标文件。这也意味着您不能通过使用右键单击上下文菜单来构建子系统,如果子系统包含模型块。此限制仅适用于使用s函数目标生成的s函数,而不适用于ERT s函数。
你可以用:
只有当工具链支持墨西哥文件生成时,才指定工具链。
仅当模板makefile为与工具链相关联支持墨西哥文件生成。
如果修改模型,则生成一个功能块,构建过程不会自动重建包含生成的S-Function块的模型。这与自动重建引用的模型的实践相反模型块(取决于Model Reference)重建配置设置)。
没有相应TLC文件的手写s函数必须包含无异常代码。有关无异常代码的更多信息,请参见例外自由代码.
不支持的块
s函数格式不支持以下内置块:
MATLAB解释函数块
功能包含以下任何一个的块:
MATLAB语言s -函数(除非您提供了用于C代码生成的TLC文件)
Fortran s -函数(除非您为C代码生成提供了TLC文件)
C/ c++ MEX s函数,调用到MATLAB环境中
仿真软件的功能块
函数调用者块
范围块
到工作空间块
s函数格式不支持embeddedtargetslib
块库。
代码生成不支持模型操作点
您可以编写利用模型工作点的C-MEX和Level-2 MATLAB s函数,用于保存和恢复仿真状态,如中所述s -函数遵从ModelOperatingPoint.代码生成不支持模型操作点,包括s函数系统目标文件。
当您为指定默认操作点遵从性或不支持操作点的s函数生成代码时,生成的代码不包括模型操作点功能。不能为实现自定义工作点功能的s函数生成代码。
嵌套S-Functions
下面的限制适用于嵌套生成的功能在模型或子系统中生成另一个s函数的块:
该软件不支持嵌套s函数的非虚拟总线输入和输出。
避免在模型或子系统中嵌套与s函数同名的s函数(可能相隔几层)。在这种情况下,可以递归地调用s函数。该软件目前没有检测到s函数依赖中的这种循环,这可能导致中止或挂起MATLAB会话。为了防止这种情况发生,将要生成的子系统或模型唯一地命名为s函数目标,以避免重复MATLAB路径上的现有MEX文件名。
自定义数据类型
S-function系统目标文件不支持HeaderFile
属性指定的用户定义数据类型,包括基于仿真软件。AliasType
,仿真软件。公共汽车
,仿真软件。NumericType
对象。如果模型中的用户定义数据类型使用HeaderFile
属性指定关联的头文件,使用s函数系统目标文件的代码生成将忽略该值,并且不生成相应的include语句。
右键单击生成S-Function目标
如果您通过右键单击a生成s函数目标函数调用子系统块时,原始子系统和生成的s函数可能不一致。时发生不一致启用时的状态参数。触发端口块内部的函数调用子系统Block被设置为继承.您必须设置启用时的状态参数重置或举行,否则Simulink将报错。
总线输入输出
如果使用s函数目标生成的s函数具有总线输入或输出,则生成的总线数据结构可能包括填充,以便将总线元素的字段与模拟期间使用的Simulink表示对齐。但是,如果您在模型中插入s函数并使用模型目标生成代码,例如grt.tlc
,为模型构建生成的总线结构对齐可能与为s函数生成的填充不兼容,并可能影响代码执行的数值结果。使模型模拟和模型代码执行之间的结构对齐一致仿真软件。公共汽车
对象时,可以修改HeaderFile
属性删除无填充的总线结构头文件。这将导致在模型代码中重用为s -函数生成的总线类型定义。
具有函数调用输入和输出信号的子系统
S-function目标不支持创建功能来自具有函数调用触发器输入或函数调用输出的子系统的块。
函数调用子系统建模模式
当你添加一个生成功能块,然后模拟该模型,如果生成的s函数使用这种函数调用子系统建模模式,MATLAB可能会崩溃。
函数调用子系统直接连接到外港块。连接子系统和外港块分支到具有更新
函数,即在每个主要时间步骤更新的块,例如单位延迟而且内存.分支可以在子系统内部也可以在子系统外部。
在包含函数调用子系统的模型中,a信号转换块在这些位置之一可以解决生成的s函数的问题:
子系统块和分支之间
在树枝和根之间外港块
的分支和块之间
更新
函数
的信号转换Block中有这些参数设置:
输出设置为
信号复制
排除这个博克从'块减少'优化选择
数据存储访问
当一个功能在模拟期间,模型中的块访问数据存储,Simulink将禁用数据存储诊断。
如果您创建了功能如果从模型中阻塞,则对全局数据存储也禁用诊断。
如果您创建了功能对于以下数据存储,诊断将被禁用:
全球数据存储
位于子系统之外的数据存储,但由数据存储读取或数据存储写块。
轮廓尺寸或外港通过子系统掩码屏蔽参数
由子系统生成的s函数轮廓尺寸或外港类的模拟时,由子系统掩码变量指定的块参数产生错误功能块。
'testSystem/Subsystem/ __outputssforfun__ /Out2'中参数'PortDimensions'的设置无效…
MEX s -功能包装器
仅在创建包装器的MATLAB版本中使用MEX s -函数包装器。