文档

s函数生成器对话框

关于S-Function Builder

“S-Function Builder”对话框使您能够指定要由控件构建的s -函数的属性s函数生成器块。要显示对话框,双击S-Function Builder块图标或选择该块,然后选择开放的街区编辑模型编辑器上的菜单或块的上下文菜单。

对话框包含的控件允许您输入S-Function Builder块所需的信息,以便根据您的规范构建s -函数。控件被分组到窗格中。有关窗格及其包含的控件的信息,请参阅以下部分。

请注意

下面几节使用这个术语目标函数以引用s函数生成器对话框中指定的s函数。

看到示例:建模一个双输入/双输出系统以获取如何使用S-Function Builder为双输入/双输出离散状态空间系统建模的示例。

参数/ s -功能名称面板

此窗格显示目标s函数名称和参数,并包含以下控件。

功能名称

目标s函数的名称。

功能参数

该表显示目标s函数的参数。表格的每一行对应一个参数,每一列显示参数的一个属性,如下所示:

  • 名字-参数名称。属性定义和修改此属性参数面板

  • 数据类型—列出参数的数据类型。属性定义和修改此属性参数面板

  • 价值-指定参数的值。输入有效的MATLAB®表达在这个领域。

建立/保存

使用此按钮可以根据您在S-Function Builder中输入的信息生成C源代码和可执行的MEX文件。如果按钮被标记构建, S-Function Builder生成源代码和可执行的MEX文件。如果按钮被标记保存,它只生成C源代码。使用只保存代码的复选框。建立信息窗格以切换此按钮的功能。

隐藏/显示s功能编辑选项卡

的右下角的小按钮参数/ s函数名窗格,以折叠和展开S-Function Builder对话框的底部部分。

港口/参数面板

港口/参数左侧窗格显示对话框中为目标s功能指定的端口和参数。

该窗格包含一个树形控件,其顶部节点分别对应于目标s函数的输入端口、输出端口和参数。展开“输入端口”、“输出端口”或“参数”节点,分别显示目标s函数指定的输入端口、输出端口或参数。选择任何端口或参数节点将选择相应端口或参数规范窗格上的相应条目。

初始化面板

初始化窗格允许您指定s函数的基本特性,例如其输入和输出端口的宽度以及采样时间。

S-Function Builder使用您在此窗格中输入的信息来生成mdlInitializeSizes回调方法。的仿真软万博1manbetx件®engine在仿真的模型初始化阶段调用此方法,以获取s函数的基本信息。(见万博1manbetxSimulink引擎与c++函数的交互有关模型初始化阶段的更多信息。)

初始化窗格包含以下字段。

离散状态数

s函数中离散状态的个数。

离散态集成电路

s函数离散状态的初始条件。您可以将值输入为逗号分隔的列表或向量(例如,[0 1 2]).初始条件的数目必须等于离散状态的数目。

连续状态数

s函数中连续状态的个数。

连续态集成电路

s函数连续状态的初始条件。您可以将值输入为逗号分隔的列表或向量(例如,[0 1 2]).初始条件的数目必须等于连续状态的数目。

样本模式

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

  • 继承了

    s函数从连接到其输入端口的块中继承其采样时间。

  • 连续

    该块在每个模拟步骤更新其输出。

  • 离散

    函数以指定的速率更新其输出采样时间值字段,在S-Function Builder对话框中。

采样时间值

标量值,表示s函数输出更新之间的间隔。该字段只有在选择时才会启用离散随着样本模式

请注意

S-Function Builder目前不支持多块采样时间或非零偏移时间。万博1manbetx

的数量PWorks

s函数使用的数据指针的数目。的PWorks指向块生命周期内的内存。例如,可以声明并初始化指向文件或内存的指针开始,并访问它输出更新,衍生品窗格,并在终止窗格。在这些窗格中编写的代码由mdlStartmdlOutputsmdlUpdatemdlDerivatives,mdlTerminate.请参阅示例有起始和终止的移动平均线使用Cpp类进行排列

请注意

使用PWorks影响SimState合规性。如果你申报PWorks,不允许使用SimState保存和恢复。否则,默认的SimState遵从性设置USE_DEFAULT_SIM_STATE,是常用的。

数据属性面板

数据属性面板允许您向s函数添加端口和参数。窗格左侧的按钮列允许您根据当前选择的窗格添加、删除或重新排序端口或参数。

  • 如果需要添加端口或参数,请单击添加按钮。

  • 如果需要删除当前选中的端口或参数,单击删除按钮。

  • 若要将当前选中的端口或参数在对应的S-Function端口或参数列表中向上移动一个位置,单击向上按钮。

  • 如果需要将当前选中的端口或参数在对应的S-function端口或参数列表中下移一个位置,单击下来按钮。

此窗格还包含选项卡窗格,使您能够指定所创建的端口和参数的属性。有关更多信息,请参阅以下主题。

输入端口面板

输入端口面板允许您检查和修改s函数输入端口的属性。该窗格包含一个可编辑的表,该表按照端口在S-Function Builder块上出现的顺序列出了输入端口的属性。表的每一行对应一个端口。行中的每个条目显示端口的一个属性,如下所示。

端口名称

端口名称。编辑此字段以修改端口名称。

列出端口可接受的输入信号的维度数。若要显示支持的维度列表,请单击相邻的按钮。万博1manbetx若要更改端口维度,请从列表中选择一个新值。指定一维无论信号的实际维度如何,动态地调整信号的大小。

指定输入信号的第一个(或唯一)维度的大小。指定1动态调整信号大小。

指定输入信号的第二维尺寸(仅当输入端口接受二维信号时)。

请注意

对于具有两个维度的输入信号,如果行维度是动态调整大小的,列维度也必须动态调整大小或设置为1。如果将列维度设置为其他值,则将编译s -函数,但由于维度规范无效,任何包含此s -函数的模拟都将无法运行。

复杂性

指定输入端口是接受实值信号还是复值信号。

公共汽车

如果S-Function Builder块的输入信号是总线,则使用公共汽车要选择的列'.

总线名称

第二步自动构建s函数如果输入信号是总线,则指示您创建总线对象。在提供的字段中总线名称列中,输入您在创建导入总线对象时定义的总线名称。

输出端口面板

输出端口通过该界面,您可以查看和修改s函数输出端口的属性。该窗格由一个表组成,该表按照端口在S-Function块上出现的顺序列出了输出端口的属性。表的每一行对应一个端口。行中的每个条目显示端口的一个属性,如下所示。

端口名称

端口名称。编辑此字段以修改端口名称。

列出端口输出信号的维数。若要显示支持的维度列表,请单击相邻的按钮。万博1manbetx若要更改端口维度,请从列表中选择一个新值。指定一维无论信号的实际维度如何,动态地调整信号的大小。

指定输出信号的第一个(或唯一)维度的大小。指定1动态调整信号大小。

指定输出信号的第二维大小(仅当端口输出二维信号时)。

请注意

对于具有两个维度的输出信号,如果其中一个维度是动态大小的,则另一个维度也必须是动态大小或设置为1。如果将第二个维度设置为其他值,则s -函数将被编译,但由于尺寸规格无效,任何包含此s -函数的模拟都将无法运行。在某些情况下,决定动态大小输出端口尺寸的计算可能不足,并且2-D输出信号的两个维度可能都需要硬编码。

复杂性

指定端口输出实值信号还是复值信号。

公共汽车

如果S-Function Builder块的输出信号是总线,则使用公共汽车要选择的列'.

总线名称

第二步自动构建s函数指示您创建总线对象。在提供的字段中总线名称列中,输入您在创建输出总线对象时定义的名称。

参数面板

参数窗格允许您检查和修改s函数参数的属性。该窗格由一个表组成,该表列出了s函数参数的属性。表的每一行对应一个参数。参数出现的顺序与用户必须在控件中指定它们的顺序相对应功能参数字段。该行中的每个条目显示参数的一个属性,如下所示。

参数名称

参数名称。编辑此字段以更改名称。

数据类型

列出参数的数据类型。单击相邻按钮以显示支持的数据类型列表。万博1manbetx若要更改参数数据类型,请从列表中选择新类型。

复杂性

指定参数是实数还是复数值。

数据类型属性窗格

此窗格允许您指定目标s函数的输入和输出端口的数据类型属性。该窗格包含一个表,其中列出了每个S-functions端口的数据类型属性。您只能编辑表中的某些字段。其他的田地都变成灰色了。每行对应于目标s函数的一个端口。每一列指定相应端口的一个属性。

港口

端口名称。属性中输入的名称输入端口输出端口窗格。您不能编辑此字段。

数据类型

端口的数据类型。单击相邻按钮以显示支持的数据类型列表。万博1manbetx若要更改数据类型,请从列表中选择不同的数据类型。

此窗格上的其余字段仅在数据类型字段指定定点数据类型。看到指定定点数据类型了解更多信息。

库面板

窗格允许您指定在S-Function Builder对话框的其他窗格中输入的自定义代码引用的外部代码文件的位置。它包括以下字段。

图书馆/对象/源文件

外部库、目标代码和源文件由您在S-Function Builder对话框的其他地方输入的自定义代码引用。在单独的行中列出每个文件。如果文件位于当前文件夹中,则只需要指定文件名。如果文件位于其他文件夹中,则必须指定文件的完整路径。

或者,您也可以使用此字段指定库、目标文件、头文件和源文件的搜索路径。为此,输入标记LIB_PATHINC_PATH,或SRC_PATH,后面跟着路径名。您可以根据需要创建任意多的此类条目,但每个条目必须位于单独的行上。

例如,考虑一个S-Function Builder项目驻留在d: \ matlab6p5 \工作并且需要链接到以下文件:

  • c: \ customfolder \ customfunctions.lib

  • d: \ matlab7 \ customobjs \ userfunctions.obj

  • d: \ externalsource \ freesource.c

以下条目使S-Function Builder能够查找这些文件:

SRC_PATH d:\externalsource LIB_PATH $MATLABROOT\customobjs LIB_PATH c:\customfolder customfunctions。自由userfunctions。obj freesource.c

如本例所示,您可以使用LIB_PATH指定对象和库文件路径。类中包含库名称LIB_PATH声明,但是您必须将目标文件名放在单独的行上。标签MATLABROOT美元表示相对于MATLAB安装的路径。你包含了多个LIB_PATH条目在单独的行上。按照指定的顺序搜索路径。

您也可以输入预处理器(- d)指令,例如:

-DDEBUG

每个指令必须位于单独的行上。

请注意

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

包括

头文件包含函数、变量和宏的声明,这些声明由您在S-Function Builder对话框的其他地方输入的自定义代码引用。在单独的行中指定每个文件为# include语句。使用括号括起标准C头文件的名称(例如,# include < math.h >).使用引号括起自定义头文件的名称(例如,# include“myutils.h”).如果s函数使用不驻留在当前文件夹中的自定义包含文件,则必须使用INC_PATH标签图书馆/对象/源文件字段将S-Function Builder的包含路径设置为包含包含文件的目录(参见图书馆/对象/源文件).

外部函数声明

中列出的头文件中未声明的外部函数的声明包括字段。将每个声明放在单独的行上。S-Function Builder在它生成的S-Function源文件中包含指定的声明。这允许计算s -函数状态或输出的s -函数代码调用外部函数。

开始窗格

使用开始窗格来编写代码,以便在模拟开始时分配内存。所分配的被引用Pworks用于整个s函数。

输出窗格

使用输出窗格输入代码,该代码计算s函数在每个模拟时间步长的输出。此窗格包含以下字段。

代码描述

的代码mdlOutputs计算s函数在每个时间步长的输出(或在离散s函数的情况下的采样时间命中)的函数。在生成s -函数的源代码时,S-function Builder将代码插入到表单的包装器函数的此字段中

void sfun_Outputs_wrapper(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_T y_width, /*可选*/ int_T u_width) /*可选*/{/*这里插入的代码*/}

在哪里sfun是s函数的名称。类中插入对该包装器函数的调用mdlOutputs它为s函数生成的回调方法。Simu万博1manbetxlink引擎调用mdlOutputs方法在每个模拟时间步长(或离散s函数情况下的样本时间步长)计算s函数输出。的mdlOutputs方法反过来调用包含输出代码的包装器函数。然后,您的输出代码实际计算并返回s函数输出。

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

论点 描述
U0, u1,…联合国 指向包含s函数输入的数组的指针,其中N输入端口的数量是否指定在输入端口面板上的数据属性窗格。出现在输出包装器函数中的参数名称与在输入端口窗格。数组中每个输入指定的输入宽度相同输入端口窗格。如果指定-1作为输入宽度,则数组的宽度由包装器函数指定u_width论点(见下文)。
Y0 y1…yN 指向包含s函数输出的数组的指针,其中N是否指定了输出端口的数量输出端口面板上的数据属性窗格。出现在输出包装器函数中的参数名称与在输出端口窗格。的每个输出指定的输出宽度输出端口窗格。如果指定-1作为输出宽度,则数组的宽度由包装器函数指定y_width论点(见下文)。使用此数组将代码计算的输出传递回Simulink引擎。万博1manbetx
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函数的输出。

输出函数需要输入

如果使用s函数输入的当前值来计算其输出,请选中此复选框。Simu万博1manbetxlink引擎使用这些信息来检测直接或间接将s函数输出连接到s函数输入所产生的代数循环。

连续导数窗格

如果s函数具有连续状态,则使用连续的衍生品窗格,以输入计算状态导数所需的代码。输入mdlDerivatives函数来计算连续状态的导数代码描述字段。当生成代码时,S-Function Builder获取此窗格中的代码并将其插入表单的包装器函数中:

void sfun_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) /*可选*/{/*您在这里插入的代码。* /}

在哪里sfun是s函数的名称。类中插入对该包装器函数的调用mdlDerivatives它为s函数生成的回调方法。Simu万博1manbetxlink引擎调用mdlDerivatives方法,在每个时间步长结束时获得连续状态的导数(参见万博1manbetxSimulink引擎与c++函数的交互).Simu万博1manbetxlink求解器对导数进行数值积分,以确定下一个时间步长的连续状态。在下一个时间步骤中,引擎将更新后的状态传递回mdlOutputs方法(参见输出窗格).

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

  • u

  • y

  • dx

  • xC

  • param0p_width0param1p_width1, ...paramNp_widthN

  • y_width

  • u_width

dx参数是指向一个数组的指针,该数组的宽度与元素中指定的连续导数的个数相同初始化窗格。您的代码应该使用这个数组来返回它所计算的导数的值。看到输出窗格其他参数的含义和用法。这些参数允许代码将导数作为s函数输入、输出和可选参数的函数来计算。类上声明的外部函数窗格。

离散更新面板

如果s函数具有离散状态,则使用离散更新窗格,以输入在当前时间步长计算下一个时间步长离散状态值的代码。

输入mdlUpdate的离散状态值代码描述字段。生成代码时,S-Function Builder将获取此窗格中的代码并将其插入表单的包装器函数中

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函数的名称。类中插入对该包装器函数的调用mdlUpdate它为s函数生成的回调方法。Simu万博1manbetxlink引擎调用mdlUpdate方法,以获得下一个时间步长的离散状态值(参见万博1manbetxSimulink引擎与c++函数的交互).在下一个时间步骤中,引擎将更新后的状态传递回mdlOutputs方法(参见输出窗格).

mdlUpdates为s函数生成的回调方法将以下参数传递给更新包装函数:

  • u

  • y

  • xD

  • param0p_width0param1p_width1, ...paramNp_widthN

  • y_width

  • u_width

看到输出窗格这些参数的含义和用法。您的代码应该使用xD(离散状态)变量返回它所计算的离散状态的值。这些参数允许代码将离散状态计算为s函数输入、输出和可选参数的函数。类上声明的外部函数窗格。

终止窗格

使用终止面板,用于编写代码以释放在开始窗格。引用的内存PWorks还能被看见吗终止,应该在这里解除分配。

构建信息窗格

使用建立信息窗格,指定用于构建s函数MEX文件的选项。此窗格包含以下字段。

编译诊断

显示S-Function Builder生成C源文件和可执行文件时的信息。

显示编译步骤

文件中记录每个构建步骤编译诊断字段。

创建一个可调试的mex文件

在生成的MEX文件中包含调试信息。

启用覆盖支持万博1manbetx

使S-Function与型号覆盖兼容。有关更多信息,请参见覆盖C和c++ s函数(万博1manbetxSimulink覆盖)在万博1manbetx仿真软件覆盖™文档。

生成包装TLC

选择此选项允许您生成TLC文件。如果您在快速加速器模式下运行模型或生成万博1manbetx仿真软件编码器™来自模型的代码。此外,虽然它不是加速器模式模拟的必要条件,但TLC文件将为s函数生成代码,从而使模型在加速器模式下运行得更快。

只保存代码

不要从生成的源代码构建MEX文件。

启用对SimStruct的访问

使SimStruct年代),可被S-Function Builder生成的包装器函数访问。这使您能够使用SimStruct中的宏和函数输出连续的衍生品,离散更新窗格。例如,启用此选项后,您可以使用宏,例如ssGetT计算s函数输出的代码:

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

额外的方法

单击此按钮可在s函数的TLC文件中包含其他TLC方法。选中要添加的方法,然后单击关闭按钮将这些方法包含在TLC文件中。有关更多信息,请参见块目标文件方法(万博1manbetx仿真软件编码器)。

示例:建模一个双输入/双输出系统

这个例子sfbuilder_example展示了如何使用S-Function Builder对具有两种状态的双输入/双输出离散状态空间系统进行建模。在这个例子中,状态空间矩阵是s函数的参数,s函数的输入和输出是向量。您可以在中找到s函数的手动编写版本dsfunc.c

请注意

您需要在运行示例模型之前构建s函数。要构建s函数,双击模型中的S-function Builder块,然后单击构建在打开的S-Function Builder对话框中。

初始化S-Function设置

初始化窗格指定离散状态的数量及其初始条件,并设置s函数的采样时间。这个例子包含两个离散状态,每个初始化为1,以及一个采样时间为1的离散采样模式。

初始化输入、输出和参数

数据属性窗格指定s函数输入和输出的维度,以及初始化状态空间矩阵。

输入端口窗格将一个s函数输入端口定义为具有两行的1-D向量。

输出端口pane类似地将一个s函数输出端口定义为具有两行的1-D向量。

参数Pane定义了四个参数,每个参数对应四个状态空间矩阵。

功能参数S-Function Builder顶部的窗格包含状态空间矩阵的实际值,以MATLAB表达式的形式输入。在这个例子中,每个状态空间参数都是一个2乘2矩阵。或者,您可以将状态空间矩阵存储在MATLAB工作空间中的变量中,并将变量名称输入到价值字段表示每个参数。

定义输出方法

输出窗格将s函数输出计算为输入和状态向量以及状态空间矩阵的函数。在输出代码中,使用定义的参数名引用s函数参数数据属性- - - - - -参数窗格。使用标量索引索引到二维矩阵,记住s函数使用从零开始的索引。例如,访问元素C (2, 1)s函数参数中C,使用C [1]在s函数码中。

输出窗格还选择输出函数需要输入(直接馈通)选项,因为此状态空间模型具有非零D矩阵。

定义离散更新方法

离散更新窗格更新离散状态。与输出代码一样,使用s函数参数名并使用标量索引索引到二维矩阵,记住s函数使用从零开始的索引。例如,访问元素(2, 1)s函数参数中一个,使用一个[1]在s函数码中。的变量xD存储离散状态的最终值。

构建状态空间示例

单击构建按钮,为这个s函数创建一个可执行文件。中包含的原始离散状态空间s函数与输出进行比较sfcndemo_dsfunc

这个话题有帮助吗?