这个s函数生成器是一个模型万博1manbetx®代码块集成了C/ c++代码,根据您提供的规范和C代码构建s -函数。这个s函数生成器在使用s函数的模型中,也充当生成s函数的包装器。
使用s函数生成器,单击Simulink画万博1manbetx布并键入S-Function Builder或拖动s函数生成器阻止万博1manbetxSimulink库>用户定义.打开s函数生成器编辑器,双击S-Function Builder块图标或选择块。然后选择开放的街区从编辑“模型编辑器”上的菜单或块的关联菜单。
s函数生成器编辑器由四个用户界面组件组成:
S函数生成器工具条
设置面板
端口及参数
库表
为开始构造的s -函数指定一个名称s函数生成器块。请注意,当您命名一个S-function时,S-function Builder编辑器中的所有函数都会更改,并且S-function名称会成为所有包装器函数的前缀。
使用S-Function Builder工具条来指定你想要生成的S-Function的目标语言:
C—生成C s函数。
C++-生成c++ s -函数。
继承模型-从中继承语言设置语言模型设置。看见语言(万博1manbetxSimulink编码器)为更多的信息。
使用自定义S函数的基本功能,例如初始条件和状态数设置右边的窗格s函数生成器编辑器。S-Function生成器使用您在此窗格中输入的信息来生成mdlInitializeSizes
回调方法。Simulink引擎在模拟的模型万博1manbetx初始化阶段调用此方法,以获取有关S函数的基本信息。
使用设置表中,可以指定离散和连续状态的数量及其初始条件。
您可以以逗号分隔的列表形式输入初始条件的值(例如,1,1,1
)或作为向量(例如,[1 1 1]
).初始条件的数目必须等于所指示的状态的数目。
设置你的C/ c++代码的数组布局。您可以选择表中列出的选项之一。
选项 | C/C++函数的数组布局 | 行动 |
---|---|---|
列为主 |
列为主 | S函数生成器块添加SimStruct函数 |
行 |
行 | S函数生成器块添加SimStruct函数 在模拟过程中,如果您的C/ c++代码涉及矩阵或多维输入、输出或参数,则转置将被添加到这些s -函数回调方法中:
万博1manbetxSimulink在加速器和快速加速器模式下运行模拟时也应用这些转换。S函数不是使用TLC内联的。相反,带转置的MEX S函数是直接编译的。 |
任何 |
C/C++函数不受数组布局的影响 | S函数生成器块添加SimStruct函数 |
选择s函数的样本模式。采样模式决定了s函数更新输出的时间间隔的长度。您可以选择以下选项之一:
继承
-S函数从连接到其输入端口的块继承其采样时间。选择“继承的采样时间”时,请注意采样时间值领域设置桌子是不活跃的。
不断的
-块在每个模拟步骤更新它的输出。当选择连续采样时间时,注意采样时间值领域设置桌子是不活跃的。
离散
—s函数以指定的速率更新输出采样时间值领域设置表格
工场
设置工场
, s函数使用的数据指针的数量。工场
指向块生命周期中的内存。如果输入的值不是0
对于PWorks数量,它添加一个指针,void * * PW
,指向S-Function Builder中的所有函数。例如,您可以在Start_wrapper
,进入Outputs_wrapper
,更新包装器
,包装纸
函数,并在终止包装器
函数。函数调用在这些函数中编写的代码mdlStart
,计算输出
,mdlUpdate
,mdlDerivatives
,mdlTerminate
方法。看到的例子开始和结束的移动平均线和使用Cpp类排列在功能演示.
笔记
使用工场
影响模拟状态合规性。如果你申报工场
,不允许使用SimState保存和还原。否则,默认的SimState符合性设置,USE_DEFAULT_SIM_STATE
使用。
使西姆斯特雷特
(s
)可访问S函数生成器正在使用的包装函数。此选项使您能够使用西姆斯特雷特
宏和函数的代码Outputs_wrapper
,包装纸
,更新包装器
功能。当你打开这个设置,SimStruct *年代
添加到参数列表中。
例如,启用此选项后,可以使用宏,例如斯盖特
在计算S函数输出的代码中:
双t = ssGetT(S);If (t < 2) {y0[0] = u0[0];} else {y0[0]= 0.0;} |
选择直接引线复选框设置如果使用s函数输入的当前时间步长的值来计算它的输出,则Simu万博1manbetxlink引擎使用这个信息来检测直接或间接连接s函数输出和s函数输入所产生的代数循环。
使用港口和参数编辑器底部的表,用于指定S函数的输入和输出端口以及参数。要添加端口或参数,请执行以下操作:
选择港口和参数表,并从S-Function Builder工具栏中选择您的选项插入端口
.
选择港口和参数表格,并右键单击表格上的一个标题。
若要删除表中的端口或参数,请选择要删除的端口或参数,右键单击打开菜单并单击删去.
表中端口和参数的顺序是块上端口和参数的顺序。例如,表上的第一个输入端口是带有索引的输入端口0
,第一个参数是带索引的参数0
.
在港口和参数,表中,您可以定义以下内容:
的名字—端口名称或参数。若要更改端口或参数的名称,请双击名称。
范围—端口或参数的范围。变量可以是输入或输出端口或参数。单击范围值可更改端口或参数的范围。
数据类型-端口或参数的数据类型。您可以将所有Simulink内置数据类型以及fixdt数据类型和总线指定为端口。万博1manbetx
尺寸—端口或参数的尺寸。对于端口,将维度指定为-1以从另一个块继承维度。对于参数,维度设置为-1
和从块接口上的块参数继承。
若要指定1-D维度,只需输入维度的行数,例如,[2]
.若要输入2-D维度,请输入行数和列数,例如,[2,1]
.
复杂性—可以指定端口或参数的复杂度为real或complex。
这个库的其他包装器方法中输入的自定义代码引用的外部代码文件的位置s函数生成器编辑器。
要输入新路径或条目,请选择库表,然后选择下面的一个选项插入路径
在S函数生成器工具条上。或者,单击屏幕上的一个标记或值库桌子选择路径或条目后,可以通过单击表上的标记来更改选择。您可以输入外部库的路径或条目、对象代码和上的自定义代码引用的源文件s函数生成器编辑器。
要选择的标签 | 目的 |
---|---|
LIB_PATH |
指定对象和库路径。 |
INC_PATH |
指定头文件和源文件的包含搜索路径。 |
SRC_PATH |
指定目标文件和源文件的搜索路径。 |
ENV_PATH |
指定环境变量。 |
条目 |
指定对象、源和库文件名。您还可以在此字段中输入预处理器指令,例如: |
将头文件的名称包含在代码编辑器的顶部。如果您正在使用不在同一路径上的自定义头文件,请确保包含与INC_PATH
类似地,使用编辑器顶部声明未在头文件中声明的外部函数。在单独的行中包含每个声明。
控件上的自定义代码引用的外部库、目标代码和源文件的路径或条目s函数生成器编辑器。
例如,考虑一个S-函数生成器项目C:\Program Files\MATLAB\work
.下表显示了如何链接到外部文件:
文件位置 | 图书馆表的条目 |
---|---|
|
|
C:\Program Files\MATLAB\work\customobjs\ userfunctions.obj |
|
|
|
您可以使用LIB_PATH
指定对象和库文件路径。属性中可以包含库名LIB_PATH
声明时,必须将对象文件名放在单独的行中。标签MATLABROOT美元
指示相对于MATLAB的路径®安装。多个列表LIB_PATH
在单独的行中输入。将按照指定的顺序搜索路径。
每个指令必须单独列在一行上。
笔记
不要在库路径周围加引号,即使路径名中有空格。如果添加引号,编译器将找不到库。
S函数生成器使用包装器方法指定生成相应S函数的S函数代码和属性。使用适当的包装器方法构造S函数体。点击申请在工具条上生成s函数代码。
这个表提供了一个S-Function Builder方法的总结:
S函数法 | 包装器方法 | 目的 |
---|---|---|
启动和终止 |
|
在模拟开始和结束时分配和释放内存。分配的内存被引用使用工场 用于整个s功能。 |
输出 | 输入在每个模拟时间步计算S函数输出的代码。 | |
更新 |
|
使用当前时间步骤的值,输入用于在下一个时间步骤计算离散状态值的代码。此方法仅在指定时存在离散状态数在设置表格 |
衍生工具 | 输入代码来计算状态导数。此方法仅在指定时存在连续状态数在设置表格 |
现在,您可以更详细地研究这些方法。
在S函数生成器中,使用Outputs_wrapper
方法输入在每个模拟时间步计算S函数输出的代码。请注意,在生成S函数代码时,s函数生成器使用模型的名称和形式为的包装函数生成包装方法< system_name > _ < function_name > _wrapper
. 例如,如果模型的名称为dsfunc_生成器
,则输出方法显示为dsfunc_builder_Output_wrapper
在s函数生成器编辑器。如果你还没有为你的s函数生成器Block yet,它看起来是system_Output_wrapper
.
的示例,请参阅下面的代码输出
方法:
void sfun_输出_包装(const real_T*u,real_T*y,const real_T*xD,/*可选*/const real_T*xC,/*可选*/const real_T*param0,/*可选*/int_T p_width0/*可选*/real_T*param1/*可选*/int_T p_width1/*可选*/int_width,/*可选*/*插入此处的代码*/*可选*/* |
哪里sfun
是s函数的名称。函数的S-Function生成器将对该包装器函数的调用插入计算输出
它为s函数生成的回调方法。Simu万博1manbetxlink引擎调用计算输出
方法在每个模拟或采样时间步计算S函数输出。这个计算输出
方法将调用包含输出代码的包装器函数。然后输出代码计算并返回s函数输出。
这个计算输出
方法将以下部分或全部参数传递给输出包装函数。
论点 | 描述 |
---|---|
情况,u1,…联合国 |
指向包含s函数输入的数组的指针,其中N 是在上指定的输入端口数输入发现的范围港口和参数表格输出包装器函数中出现的参数名称与输入的范围港口和参数桌子每个数组的宽度与为上的每个输入指定的输入宽度相同尺寸窗格。如果输入是一个矩阵,则宽度等于数组的维数的乘积。如果指定-1作为输入宽度,则该数组的宽度由包装器函数指定u_width 论点。 |
y0,y1。。。伊恩 |
指向包含S函数输出的数组的指针,其中N 是在上指定的输出端口数范围面板上的港口和参数表格输出包装器函数中出现的参数名称与输出的范围港口和参数表格属性上为每个输出指定的输出宽度与每个数组的宽度相同尺寸窗玻璃如果输出是矩阵,则宽度等于数组维数的乘积。如果指定-1作为输出宽度,则数组的宽度由包装函数的y_width 论点。使用这个数组将代码计算的输出传递回Simulink引擎。万博1manbetx |
xD |
指向包含s函数离散状态的数组的指针。上指定离散状态时,此参数才会出现离散态数在设置菜单。在第一个模拟时间步,离散状态有你在离散状态集成电路.在随后的采样时间步骤中,状态由s函数在前一个时间步骤中计算的值得到。 |
xC |
指向包含S函数连续状态的数组的指针。仅当您在上指定连续状态数时,此参数才会出现连续状态数一排设置菜单在第一个模拟时间步中,连续状态具有您在上指定的初始值连续状态集成电路行。在随后的时间步,状态是通过对前一个时间步的状态导数进行数值积分得到的。 |
param0 ,p_width0 ,参数1 ,p_width1 , ...paramN ,p_widthN |
param0 ,参数1 , ...paramN 是指向包含S函数参数的数组的指针,其中N 参数的数量是否在港口和参数表格p_width0 ,p_width1 , ...p_widthN 是参数数组的宽度。如果参数是一个矩阵,则宽度等于数组的维数的乘积。例如,一个3 × 2矩阵参数的宽度是6。 |
y_width |
包含S函数输出的数组的宽度。仅当您指定-1 为s函数输出的宽度。如果输出是一个矩阵,y_width 是矩阵维数的乘积。 |
u_width |
包含s函数输入的阵列的宽度。只有当您指定时,此参数才会出现在生成的代码中-1 为s函数输入的宽度。如果输入是一个矩阵,u_width 是矩阵维数的乘积。 |
这些参数允许您将块的输出计算为其输入的函数,还可以选择计算其状态和参数。在此字段中输入的代码可以调用头文件中声明的外部函数或库表,它允许您使用现有代码来计算s函数的输出。
使用更新包装器
函数输入代码,该代码根据当前时间步长的值计算下一个时间步长的离散状态值。参见以下代码:
void sfun_Update_wrapper(const real_T *u, const real_T *y, real_T *xD, const real_T *param0, /*可选*/ int_T p_width0, /*可选*/ real_T *param1,/*可选*/ int_T p_width1, /*可选*/ int_T y_width, /*可选*/ int_T u_width) /*可选*/{/*此处插入代码。* /}
哪里sfun
是s函数的名称。函数的S-Function生成器将对该包装器函数的调用插入mdlUpdate
它为s函数生成的回调方法。Simu万博1manbetxlink引擎调用mdlUpdate
方法,得到下一个时间步的离散状态值(见万博1manbetxSimulink引擎与C S函数的交互)。在下一个时间步骤中,引擎将更新后的状态传递回计算输出
方法。
这个mdlUpdate
为S函数生成的回调方法将以下参数传递给更新包装器
功能:
U
Y
xD
param0
,p_width0
,参数1
,p_width1
, ...paramN
,p_widthN
y_width
u_width
看见使用输出方法计算输出了解这些参数的含义和用法。您的代码应该使用离散状态变量,xD
,以返回它计算的离散状态的值。参数允许代码以s函数输入、输出和可选参数的函数的形式计算离散状态。您的代码可以调用代码编辑器中声明的外部函数。
如果S函数具有连续状态,则使用包装纸
函数输入计算状态导数所需的代码。输入代码mdlDerivatives
函数计算此字段下连续状态编辑器的导数。函数的示例声明可能如下所示:
空白system_Derivatives_wrapper (const real_T * u, const real_T * y, real_T * dx, real_T * xC, const real_T * param0, / *可选* / int_T p_width0, / *可选* / real_T * param1, / *可选* / int_T p_width1, / *可选* / int_T y_width, / *可选* / int_T u_width) / *可选* /{/ *代码插入。* /} |
哪里系统
是s函数的名称。
函数的S-Function生成器将对该包装器函数的调用插入mdlDerivatives
为S函数生成的方法。Simulink引擎调用万博1manbetxmdlDerivatives
方法在每个时间步骤结束时,得到连续状态的导数(见万博1manbetxSimulink引擎与C S函数的交互).Simul万博1manbetxink解算器对导数进行数值积分,以确定下一时间步的连续状态。在下一个时间步骤中,引擎将更新的状态传递回计算输出
方法。有关Simulink引擎如何与S-functions交互万博1manbetx的更多信息,请参见万博1manbetxSimulink引擎与C S函数的交互.
这个mdlDerivatives
为s -函数生成的方法将以下参数传递给导数包装函数:
U
Y
dx
xC
param0
,p_width0
,参数1
,p_width1
, ...paramN
,p_widthN
y_width
u_width
这个dx
参数是指向数组的指针,该数组的宽度与设置窗格。您的代码应该使用这个数组来返回它所计算的导数的值。请看下面的解释使用输出方法计算输出方法,以了解其他参数的含义和用法。参数允许您的代码以s函数输入、输出和可选参数的函数的形式计算导数。您的代码可以调用代码编辑器中声明的外部函数。
使用Start_wrapper
方法编写代码以在模拟开始时分配内存。已分配的资源由引用工场
用于整个s函数。同样,使用终止包装器
方法编写代码以释放在Start_wrapper
方法引用的内存工场
也可以看到终止,应该在这里重新分配。
看到设置PWorks的数量了解更多关于工场
.
在S-Function Builder编辑器中输入代码后,研究下面的选项构建菜单来建立你的s功能。
构建菜单包含以下选项:
显示编译步骤-将每个构建步骤记录在建立日志领域
创建一个可调试的mex -文件-在生成的MEX文件中包含调试信息。
生成包装器薄层色谱-选择此选项可以生成TLC文件。如果您正在快速加速器模式下运行模型或正在生成TLC文件,则需要生成TLC文件万博1manbetx仿真软件编码器™模型中的代码。此外,虽然这不是加速器模式模拟的必要条件,但TLC文件为S-function生成代码,从而使您的模型在加速器模式下运行得更快。
支持覆盖万博1manbetx-使s -功能兼容型号覆盖。有关更多信息,请参见Simulink模型中自定义C/C++代码的覆盖率万博1manbetx(万博1manbetx仿真软件覆盖)在万博1manbetx仿真软件覆盖™文档。
启用对设计验证万博1manbetx程序的支持-生成一个S函数,用于万博1manbetxSimulink设计验证程序™. 有关详细信息,请参阅万博1manbetx对S函数和C/C++代码的支持限制(万博1manbetxSimulink设计验证程序).
进行选择时,单击构建来构建s -函数并构建mex -文件。要从生成的源代码中排除mex文件的构建,请选择仅生成代码.