主要内容

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

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

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

用来s函数生成器,单击Simulink画金宝app布并键入S-Function Builder或拖动s函数生成器阻止金宝appSimulink库>用户自定义.打开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 -函数。

  • 继承模型- 继承语言设置模型设置。看(金宝appSimulink编码器)为更多的信息。

使用自定义S函数的基本功能,例如初始条件和状态数设置右边的窗格s函数生成器编辑器。S-Function生成器使用您在此窗格中输入的信息来生成mdlInitializeSizes回调方法。Simu金宝applink引擎在模拟初始化阶段调用此方法,以获取有关S函数的基本信息。

S-function Builder设置与设置为2的离散状态的数量,将离散状态设置为1逗号1,连续状态设置为0.数组布局设置为列 - 专业。采样模式设置为离散。采样时间值为灰色。设置为0.启用对Simstruct的P工作数量未被选中。检查直接馈通。

设置状态和初始条件的数量

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

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

设置阵列布局

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

选项 C / C ++功能的数组布局 行动
专栏专业 专栏专业

S函数Builder块添加Simstruct函数sssetarraylayoutforcodegen.mdlInitializeSizes将s函数标记为列主代码生成。

S函数Builder块添加Simstruct函数sssetarraylayoutforcodegen.mdlInitializeSizes将s函数标记为行主代码生成。

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

  • 计算输出

  • mdlUpdate

  • mdlDerivatives

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

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

S函数Builder块添加Simstruct函数sssetarraylayoutforcodegen.mdlInitializeSizes将s函数标记为同时接受行主和列主代码生成。

选择样本模式

选择s函数的样本模式。采样模式决定了s函数更新输出的时间间隔的长度。您可以选择以下选项之一:

  • 遗传-S函数从连接到其输入端口的块继承其采样时间。选择“继承的采样时间”时,请注意采样时间值场面的领域设置桌子是不活跃的。

  • 不断的-块在每个模拟步骤更新它的输出。当选择连续采样时间时,注意采样时间值场面的领域设置桌子是不活跃的。

  • 离散—s函数以指定的速率更新输出采样时间值场面的领域设置表格

设置数量垫料

垫料, s函数使用的数据指针的数量。垫料指向块生命周期中的内存。如果输入的值不是0.为了PWorks数量,它添加一个指针,void * * PW,在S函数构建器中的所有功能。例如,您可以将指向文件或内存声明并初始化指针Start_wrapper,进入Outputs_wrapperupdate_wrapper.,衍生品_wrapper.函数,并将其删除终止包装器函数。函数调用在这些函数中编写的代码mdlStart计算输出mdlUpdatemdlDerivatives,mdlTerminate方法。看到的例子开始和结束的移动平均线使用Cpp类排列功能演示

笔记

用于垫料影响模拟状态合规性。如果你申报垫料,不允许使用SimState保存和还原。否则,默认的SimState符合性设置,USE_DEFAULT_SIM_STATE使用。

启用访问SIMACTER

使酝酿S.)可访问S函数生成器正在使用的包装函数。此选项使您能够使用酝酿宏和函数的代码Outputs_wrapper衍生品_wrapper.,update_wrapper.职能。当您打开此设置时,SimStruct *年代添加到参数列表中。

例如,启用此选项后,可以使用宏,例如SSGett.在计算S函数输出的代码中:

双t = ssGetT(S);If (t < 2) {y0[0] = u0[0];} else {y0[0]= 0.0;}

直接引线

选择直接引线复选框设置如果使用s函数输入的当前时间步长的值来计算它的输出,则Simu金宝applink引擎使用这个信息来检测直接或间接连接s函数输出和s函数输入所产生的代数循环。

为S-Function指定端口和参数

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

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

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

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

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

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

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

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

  3. 数据类型- 端口或参数的数据类型。您可以指定所有Simulink内置数据类金宝app型,以及FixDT数据类型和总线作为端口。

  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-udebug..在单独的行上指定每个文件。

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

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

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

文件位置 图书馆表的条目

c: \ customfolder \ customfunctions.lib

lib_path 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功能。
输出

_outputs_wrapper

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

< system_name > _Update_wrapper

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

_derivation_wrapper

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

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

使用输出方法计算输出

在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函数生成器在计算输出它为s函数生成的回调方法。Simu金宝applink引擎调用计算输出方法在每个模拟或采样时间步计算S函数输出。这个计算输出方法将调用包含输出代码的包装器函数。然后输出代码计算并返回s函数输出。

计算输出方法将下列部分或全部参数传递给输出包装器函数。

论点 描述
情况,u1,…联合国 指向包含s函数输入的数组的指针,其中N是上指定的输入端口数输入发现的范围港口和参数表格输出包装器函数中出现的参数名称与输入的范围港口和参数桌子每个数组的宽度与为上的每个输入指定的输入宽度相同方面窗格。如果输入是一个矩阵,则宽度等于数组的维数的乘积。如果指定-1作为输入宽度,则该数组的宽度由包装器函数指定u_width论点。
y0,y1。。。伊恩 指向包含S函数输出的阵列,其中N是在上指定的输出端口数范围面板上的港口和参数表格输出包装器函数中出现的参数名称与输出的范围港口和参数表格属性上为每个输出指定的输出宽度与每个数组的宽度相同方面窗格。如果输出是矩阵,则宽度等于阵列尺寸的乘积。如果将-1指定为输出宽度,则阵列的宽度由包装器函数指定y_width论点。使用这个数组将代码计算的输出传递回Simulink引擎。金宝app
xD 指向包含s函数离散状态的数组的指针。上指定离散状态时,此参数才会出现离散态数设置菜单。在第一个模拟时间步,离散状态有你在离散状态集成电路.在随后的采样时间步骤中,状态由s函数在前一个时间步骤中计算的值得到。
xC 指向包含S函数连续状态的数组的指针。只有在指定持续状态的数量时,才会出现此参数连续状态数行的行设置菜单。在第一个仿真时间步骤中,连续状态具有您指定的初始值连续状态集成电路行。在随后的时间步,状态是通过对前一个时间步的状态导数进行数值积分得到的。
param0p_width0param1p_width1, ...paramNP_Widthn. param0param1, ...paramN是指向包含S函数参数的数组的指针,其中N参数的数量是否在港口和参数表格p_width0p_width1, ...P_Widthn.是参数数组的宽度。如果参数是一个矩阵,则宽度等于数组的维数的乘积。例如,一个3 × 2矩阵参数的宽度是6。
y_width 包含S函数输出的数组的宽度。如果指定,则此参数仅显示在生成的代码中-1为s函数输出的宽度。如果输出是一个矩阵,y_width是矩阵维数的乘积。
u_width 包含s函数输入的阵列的宽度。如果指定,则此参数仅显示在生成的代码中-1为s函数输入的宽度。如果输入是一个矩阵,u_width是矩阵维数的乘积。

这些参数允许您将块的输出计算为其输入的函数,还可以选择计算其状态和参数。在此字段中输入的代码可以调用头文件中声明的外部函数或表,它允许您使用现有代码来计算s函数的输出。

使用更新方法更新离散状态

使用update_wrapper.函数输入代码,该代码根据当前时间步长的值计算下一个时间步长的离散状态值。参见以下代码:

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函数生成器在mdlUpdate它为s函数生成的回调方法。Simu金宝applink引擎呼叫mdlUpdate方法,得到下一个时间步的离散状态值(见金宝appSimulink引擎与C S函数的交互).在下次步骤中,发动机将更新状态传递回计算输出方法。

mdlUpdate为S函数生成的回调方法将以下参数传递给update_wrapper.功能:

  • y

  • xD

  • param0p_width0param1p_width1, ...paramNP_Widthn.

  • y_width

  • u_width

使用输出方法计算输出了解这些参数的含义和用法。您的代码应该使用离散状态变量,xD,以返回它计算的离散状态的值。参数允许代码以s函数输入、输出和可选参数的函数的形式计算离散状态。您的代码可以调用代码编辑器中声明的外部函数。

用导数方法计算连续状态

如果s函数有连续状态,用衍生品_wrapper.函数输入计算状态导数所需的代码。输入代码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函数生成的方法。Simu金宝applink引擎呼叫mdlDerivatives方法在每个时间步骤结束时,得到连续状态的导数(见金宝appSimulink引擎与C S函数的交互).Simu金宝applink求解器数值整合衍生物以在下次步骤中确定连续状态。在下次步骤中,发动机将更新状态传递回计算输出方法。有关Simulink引擎如何与S-functions交互金宝app的更多信息,请参见金宝appSimulink引擎与C S函数的交互

mdlDerivatives为s -函数生成的方法将以下参数传递给导数包装函数:

  • y

  • DX.

  • xC

  • param0p_width0param1p_width1, ...paramNP_Widthn.

  • y_width

  • u_width

DX.参数是指向阵列的指针,其宽度与在上指定的连续导数的数量相同设置窗格。您的代码应该使用这个数组来返回它所计算的导数的值。请看下面的解释使用输出方法计算输出方法,以了解其他参数的含义和用法。参数允许您的代码以s函数输入、输出和可选参数的函数的形式计算导数。您的代码可以调用代码编辑器中声明的外部函数。

使用start和终止方法分配和解析内存

使用Start_wrapper方法编写代码以在模拟开始时分配内存。已分配的资源由引用工场用于整个s函数。同样,使用终止包装器方法编写代码以释放在Start_wrapper方法。内存由此引用垫料也可以看到终止,应该在这里重新分配。

看到设置垫料的数量了解更多关于垫料

构建S函数

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

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

构建菜单包含以下选项:

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

  • 创建一个可调试的mex -文件-在生成的MEX文件中包含调试信息。

  • 生成包装器薄层色谱—选择此选项可以生成TLC文件。如果您在快速加速器模式下运行模型或生成模型,则需要生成一个TLC文件金宝app仿真软件编码器™模型中的代码。此外,虽然这不是加速器模式模拟的必要条件,但TLC文件为S-function生成代码,从而使您的模型在加速器模式下运行得更快。

  • 支持覆盖金宝app-使s -功能兼容型号覆盖。有关更多信息,请参见Simulink模型中的自定义C / C ++代码的覆盖范围金宝app(金宝app仿真软件覆盖)金宝app仿真软件覆盖™文档。

  • 启用对设计验证金宝app程序的支持- 生成用于使用的S函数金宝appSimulink Design Verifier™. 有关详细信息,请参阅金宝app支持S函数和C / C ++代码的限制(金宝appSimulink设计验证程序)

当您选择选择时,请单击构建来构建s -函数并构建mex -文件。要从生成的源代码中排除mex文件的构建,请选择只生成代码

也可以看看

|

相关话题