主要内容

使用s函数生成器自动构建s函数

这个s函数生成器是一个模型万博1manbetx®代码块集成了C/ c++代码,根据您提供的规范和C代码构建s -函数。这个s函数生成器在使用s函数的模型中,也充当生成s函数的包装器。

创建S-Function构建块并指定设置

使用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函数的基本信息。

离散状态数设置为2、离散状态数设置为1、连续状态数设置为0的S函数生成器设置。数组布局设置为“主列”。采样模式设置为离散。采样时间值将灰显。P工作数设置为0。未选中启用对SimStruct的访问。检查直接馈通。

设置状态数和初始条件

使用设置表中,可以指定离散和连续状态的数量及其初始条件。

您可以以逗号分隔的列表形式输入初始条件的值(例如,1,1,1)或作为向量(例如,[1 1 1]).初始条件的数目必须等于所指示的状态的数目。

设置阵列布局

设置你的C/ c++代码的数组布局。您可以选择表中列出的选项之一。

选项 C/C++函数的数组布局 行动
列为主 列为主

S函数生成器块添加SimStruct函数ssSetArrayLayoutForCodeGenmdlInitializeSizes将s函数标记为列主代码生成。

S函数生成器块添加SimStruct函数ssSetArrayLayoutForCodeGenmdlInitializeSizes将s函数标记为行主代码生成。

在模拟过程中,如果您的C/ c++代码涉及矩阵或多维输入、输出或参数,则转置将被添加到这些s -函数回调方法中:

  • 计算输出

  • mdlUpdate

  • mdlDerivatives

万博1manbetxSimulink在加速器和快速加速器模式下运行模拟时也应用这些转换。S函数不是使用TLC内联的。相反,带转置的MEX S函数是直接编译的。

任何 C/C++函数不受数组布局的影响

S函数生成器块添加SimStruct函数ssSetArrayLayoutForCodeGenmdlInitializeSizes将s函数标记为同时接受行主和列主代码生成。

选择样本模式

选择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使用。

启用对SimStruct的访问

使西姆斯特雷特(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-Function指定端口和参数

使用港口和参数编辑器底部的表,用于指定S函数的输入和输出端口以及参数。要添加端口或参数,请执行以下操作:

  • 选择港口和参数表,并从S-Function Builder工具栏中选择您的选项插入端口

  • 选择港口和参数表格,并右键单击表格上的一个标题。

若要删除表中的端口或参数,请选择要删除的端口或参数,右键单击打开菜单并单击删去

表中端口和参数的顺序是块上端口和参数的顺序。例如,表上的第一个输入端口是带有索引的输入端口0,第一个参数是带索引的参数0

港口和参数,表中,您可以定义以下内容:

  1. 的名字—端口名称或参数。若要更改端口或参数的名称,请双击名称。

  2. 范围—端口或参数的范围。变量可以是输入或输出端口或参数。单击范围值可更改端口或参数的范围。

  3. 数据类型-端口或参数的数据类型。您可以将所有Simulink内置数据类型以及fixdt数据类型和总线指定为端口。万博1manbetx

  4. 尺寸—端口或参数的尺寸。对于端口,将维度指定为-1以从另一个块继承维度。对于参数,维度设置为-1和从块接口上的块参数继承。

    若要指定1-D维度,只需输入维度的行数,例如,[2].若要输入2-D维度,请输入行数和列数,例如,[2,1]

  5. 复杂性—可以指定端口或参数的复杂度为real或complex。

使用“库”表指定外部代码和路径

这个的其他包装器方法中输入的自定义代码引用的外部代码文件的位置s函数生成器编辑器。

要输入新路径或条目,请选择表,然后选择下面的一个选项插入路径在S函数生成器工具条上。或者,单击屏幕上的一个标记或值桌子选择路径或条目后,可以通过单击表上的标记来更改选择。您可以输入外部库的路径或条目、对象代码和上的自定义代码引用的源文件s函数生成器编辑器。

要选择的标签 目的
LIB_PATH 指定对象和库路径。
INC_PATH 指定头文件和源文件的包含搜索路径。
SRC_PATH 指定目标文件和源文件的搜索路径。
ENV_PATH 指定环境变量。
条目

指定对象、源和库文件名。您还可以在此字段中输入预处理器指令,例如:-DDEBUG,-DHARDWARE_VARIANT = 1-乌德巴格. 在单独的行中指定每个文件。

将头文件的名称包含在代码编辑器的顶部。如果您正在使用不在同一路径上的自定义头文件,请确保包含与INC_PATH类似地,使用编辑器顶部声明未在头文件中声明的外部函数。在单独的行中包含每个声明。

控件上的自定义代码引用的外部库、目标代码和源文件的路径或条目s函数生成器编辑器。

例如,考虑一个S-函数生成器项目C:\Program Files\MATLAB\work.下表显示了如何链接到外部文件:

文件位置 图书馆表的条目

c: \ customfolder \ customfunctions.lib

库路径c:\customfolder

条目customfunctions.lib

C:\Program Files\MATLAB\work\customobjs\ userfunctions.obj

LIB_PATH MATLABROOT \ customobjs美元

条目userfunctions.obj

D:\externalsource\freesource.c

SRC\u路径D:\externalsource

条目freesource.c

您可以使用LIB_PATH指定对象和库文件路径。属性中可以包含库名LIB_PATH声明时,必须将对象文件名放在单独的行中。标签MATLABROOT美元指示相对于MATLAB的路径®安装。多个列表LIB_PATH在单独的行中输入。将按照指定的顺序搜索路径。

每个指令必须单独列在一行上。

笔记

不要在库路径周围加引号,即使路径名中有空格。如果添加引号,编译器将找不到库。

开发功能

S函数生成器使用包装器方法指定生成相应S函数的S函数代码和属性。使用适当的包装器方法构造S函数体。点击申请在工具条上生成s函数代码。

这个表提供了一个S-Function Builder方法的总结:

S函数法 包装器方法 目的
启动和终止

< system_name > _Start_wrapper

< system_name > _Terminate_wrapper

在模拟开始和结束时分配和释放内存。分配的内存被引用使用工场用于整个s功能。
输出

\u输出\u包装器

输入在每个模拟时间步计算S函数输出的代码。
更新

< system_name > _Update_wrapper

使用当前时间步骤的值,输入用于在下一个时间步骤计算离散状态值的代码。此方法仅在指定时存在离散状态数设置表格
衍生工具

\u衍生品\u包装

输入代码来计算状态导数。此方法仅在指定时存在连续状态数设置表格

现在,您可以更详细地研究这些方法。

使用输出方法计算输出

在S函数生成器中,使用Outputs_wrapper方法输入在每个模拟时间步计算S函数输出的代码。请注意,在生成S函数代码时,s函数生成器使用模型的名称和形式为的包装函数生成包装方法< system_name > _ < function_name > _wrapper. 例如,如果模型的名称为dsfunc_生成器,则输出方法显示为dsfunc_builder_Output_wrappers函数生成器编辑器。如果你还没有为你的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函数

在S-Function Builder编辑器中输入代码后,研究下面的选项构建菜单来建立你的s功能。

s函数生成器构建窗格。有两个按钮;仅构建和生成代码。还有其他选择。这些选项是:显示编译步骤,创建可调试的MEX-file,生成包装器TLC,启用支持覆盖,启用支持设计验证器。万博1manbetx

构建菜单包含以下选项:

  • 显示编译步骤-将每个构建步骤记录在建立日志领域

  • 创建一个可调试的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文件的构建,请选择仅生成代码

另见

|

相关话题