文档

输入输出接口

为C - s函数创建输入端口

要创建和配置输入端口mdlInitializeSizes方法应首先指定s函数输入端口的数量,使用ssSetNumInputPorts.然后,对于每个输入端口,该方法应该指定

  • 输入端口的尺寸(参见初始化输入端口尺寸

    如果您希望s函数从它所连接的端口继承其维度,则应该指定端口的动态大小mdlInitializeSizes(见动态调整输入端口的大小).

  • 输入端口是否允许输入的标量扩展(参见输入的标量展开

  • 输入端口是否有直接馈通,使用ssSetInputPortDirectFeedThrough

    如果一个端口的输入用于mdlOutputsmdlGetTimeOfNextVarHit功能。每个输入端口的直接馈通标志可以设置为任意一个1 =是的0 =没有.它应该设置为1,如果输入,u,用于mdlOutputsmdlGetTimeOfNextVarHit例行公事。将直接馈通标志设置为0告诉Simulink万博1manbetx®引擎,u在这两个s函数例程中都没有使用。违反这一点会导致不可预测的结果。

  • 输入端口的数据类型(如果不是默认的)

    使用ssSetInputPortDataType设置输入端口的数据类型。如果希望端口的数据类型依赖于它所连接的端口的数据类型,请将数据类型指定为DYNAMICALLY_TYPED.在这种情况下,您必须提供mdlSetInputPortDataTypemdlSetDefaultPortDataTypes方法,以便在信号传播期间正确设置数据类型。

  • 输入端口的数字类型,如果端口接受复值信号

    使用ssSetInputPortComplexSignal设置输入端口的数字类型。如果希望端口的数字类型依赖于它所连接的端口的数字类型,请将数字类型指定为COMPLEX_INHERITED.在这种情况下,您必须提供mdlSetInputPortComplexSignalmdlSetDefaultPortComplexSignals方法,以便在信号传播期间正确设置数字类型。

您可以使用其他S-function宏配置其他输入端口属性。看到输入输出接口在“SimStruct宏和函数按用法列出”一节中了解更多信息。

请注意

mdlInitializeSizes方法必须在设置任何属性之前指定端口数。如果它试图设置不存在的端口的属性,则它正在访问无效内存并发生分段冲突。

初始化输入端口尺寸

您可以使用以下宏之一设置输入端口尺寸:

  • 如果输入信号必须是一维的,并且输入端口宽度为w,使用

    ssSetInputPortWidth(S, inputPortIdx, w)
  • 如果输入信号必须是有维数的矩阵——- - - - - -n,使用

    ssSetInputPortMatrixDimensions(S, inputPortIdx, m, n)
  • 否则,如果输入信号可以有一维或二维,则使用

    ssSetInputPortDimensionInfo(S, inputPortIdx, dimsInfo)

    您可以使用此函数来完全或部分初始化端口尺寸(请参阅下一节)。

动态调整输入端口的大小

如果你的s函数不要求它的输入信号有特定的维度,你可以设置输入端口的维度来匹配连接到它们的信号的维度。

动态定义输入端口的尺寸:

  • 将输入端口的部分或全部尺寸指定为动态大小mdlInitializeSizes

    如果输入端口可以接受任何维度的信号,则使用

    ssSetInputPortDimensionInfo(S, inputporttidx, DYNAMIC_DIMENSION)

    设置输入端口的维度。

    如果输入端口只能接受矢量(1-D)信号,但信号可以是任何大小,则使用

    sssetinputporttwidth (S, inputporttidx, dynamally_size)

    指定输入端口的维度。

    如果输入端口只能接受矩阵信号,但可以接受任何行或列的大小,使用

    ssSetInputPortMatrixDimensions(S, inputporttidx, dynamically_size, dynamically_size)
  • 提供一个mdlSetInputPortDimensionInfo方法,该方法将输入端口的尺寸设置为连接到它的信号的大小。

    当Sim万博1manbetxulink引擎确定连接到输入端口的信号的维数时,它在信号传播期间调用此方法。

  • 提供一个mdlSetDefaultPortDimensionInfo方法,该方法将块的端口的尺寸设置为默认值。看到sfun_dynsize.c为实现此宏的示例。

    当引擎无法确定连接到部分或全部块输入端口的信号的维度时,在信号传播期间调用此方法。例如,如果输入端口未连接,则可能发生这种情况。如果s函数不提供此方法,则信号传播例程将块的端口维度设置为1-D标量。

示例:定义多个S-Function输入端口

中的以下代码mdlInitializeSizes配置带有两个输入端口的s函数。看到输入输出接口在“按用法列出的SimStruct宏和函数”一节中获取有关本示例中使用的宏的更多信息。

如果(!ssSetNumInputPorts(S, 2))返回;For (i = 0;I < 2;i++){/*输入有直接馈通*/ ssSetInputPortDirectFeedThrough(S, i, 1);/*输入为实信号*/ ssSetInputPortComplexSignal(S, i, COMPLEX_NO);/*输入是一个动态大小的二维矩阵*/ ssSetInputPortMatrixDimensions(S,i, dynamically_size, dynamically_size);/*输入继承采样时间*/ ssSetInputPortSampleTime(S, i,INHERITED_SAMPLE_TIME);/*输入信号必须连续*/ sssetinputportrequiredconsecuous (S, i, 1);/*输入端口不能共享内存*/ sssetinputporttoverwritable (S, i, 0); }

在信号传播过程中,Simulink引擎调用这个s函数万博1manbetxmdlSetInputPortDimensionInfo初始化输入端口尺寸的宏。在这个例子中,mdlSetInputPortDimensionInfo将输入维度设置为引擎传递给宏的候选维度。

#定义MDL_SET_INPUT_PORT_DIMENSION_INFO静态无效mdlSetInputPortDimensionInfo(SimStruct *S, int_T端口,const DimsInfo_T *dimsInfo) {if(!ssSetInputPortDimensionInfo(S, port, dimsInfo))返回;} # endif

对于配置具有多个输入和输出端口的s函数的示例,打开Simulink模型万博1manbetxsfcndemo_sfun_multiport并检查s函数sfun_multiport.c

创建2级MATLAB s函数的输入端口

要创建和配置输入端口设置方法应首先使用运行时对象指定s函数输入端口的数量NumInputPorts财产。接下来,如果所有输入端口都从其输入信号继承其功能属性(数据类型、维度、复杂度和采样模式),则在设置方法:

block.SetPreCompInpPortInfoToDynamic;

然后,对于每个输入端口设置方法可以指定

  • 输入端口的尺寸,使用块。InputPort (n).维

    若要单独指定输入端口的尺寸是动态大小的,请赋值为1到维度。在这种情况下,您可以实现SetInputPortDimensions方法在信号传播期间设置尺寸。

  • 输入端口是否有直接馈通,使用块。InputPort (n).DirectFeedthrough

    如果一个端口的输入用于输出函数来计算输出或下一个样本时间命中。每个输入端口的直接馈通标志可以设置为任意一个1 =是的0 =没有.将直接馈通标志设置为0告诉Simulink万博1manbetx引擎u不用于计算输出或下一次采样时间命中。违反这一点会导致不可预测的结果。

  • 输入端口的数据类型,使用块。InputPort (n).DatatypeID.的解释DatatypeID的财产万博1manbetx仿真软件。BlockData获取有效数据类型id列表的数据对象引用页。

    如果希望端口的数据类型依赖于它所连接的端口的数据类型,请将数据类型指定为1.在这种情况下,您可以实现SetInputPortDataType方法在信号传播期间设置数据类型。

  • 输入端口的数字类型,如果端口接受复值信号,使用块。InputPort (n).复杂性

    如果希望端口的数字类型依赖于它所连接的端口的数字类型,请将数字类型指定为“继承”.在这种情况下,您可以实现SetInputPortComplexSignal方法在信号传播期间设置数值类型。

对于配置Level-2 MATLAB的示例®s功能具有多个输入输出端口,打开模型sldemo_msfcn_lms并检查s函数adapt_lms.m

为C - s函数创建输出端口

要创建和配置输出端口,mdlInitializeSizes方法应首先指定s函数输出端口的数量,使用ssSetNumOutputPorts.然后,对于每个输出端口,该方法应该指定

看到为C - s函数创建输入端口以获取如何初始化s函数输入端口的示例。您可以使用相同的过程初始化s函数输出端口,但是使用相应的输出端口宏。

为二级MATLAB s函数创建输出端口

为2级MATLAB s函数创建输出端口设置方法应首先使用运行时对象指定s函数输出端口的数量NumOutputPorts财产。接下来,如果所有输出端口都继承了它们的功能属性(数据类型、维度、复杂度和采样模式),则在设置方法:

block.SetPreCompOutPortInfoToDynamic;

配置输出端口与配置输入端口完全相同。看到创建2级MATLAB s函数的输入端口对于可以为每个输出端口指定的属性列表,替换为OutputPortInputPort在对运行时对象的每次调用中。

输入的标量展开

输入的标量扩展在概念上是指将标量输入信号扩展到与连接到其他s函数输入端口的宽输入信号相同的维度的过程。这是通过将扩展信号的每个元素设置为标量输入的值来完成的。

当标量展开时,s函数mdlInitializeSizes方法应指定输入和输出端口的大小是动态的。Simu万博1manbetxlink引擎使用默认方法来设置输入和输出端口的尺寸。如果块有两个以上的输入,则输入信号可以是标量信号或宽信号,其中宽信号都具有相同数量的元素。在这种情况下,引擎将输出端口的尺寸设置为宽输入信号的宽度,并将任何标量输入扩展为该宽度。如果宽输入由1-D和2-D矢量驱动,则输出为2-D矢量信号,标量输入扩展为2-D矢量信号。

如果未开启标量展开,则引擎假定所有端口(输入和输出端口)必须具有相同的尺寸,并将所有端口尺寸设置为其中一个驱动块指定的相同尺寸。

请注意

如果s函数通过初始化中的维度来指定或控制其输入和输出端口的维度,则引擎将忽略标量展开选项mdlInitializeSizes,使用mdlSetInputPortWidthmdlSetOutputPortWidth,或使用mdlSetInputPortDimensionInfomdlSetOutputPortDimensionInfo,mdlSetDefaultPortDimensionInfo

理解如何使用标量展开的最佳方法是考虑这个示例sfcndemo_sfun_multiport.该模型包含三个s功能模块,每个模块都有多个输入端口。的功能sfun_multiport.c在这些块中使用设置SS_OPTION_ALLOW_INPUT_SCALAR_EXPANSION它的选项mdlInitializeSizes方法,允许输入的标量展开。s函数指定它的输入和输出是动态大小的。因此,在信号传播过程中,引擎将输入端口的宽度设置为连接到该端口的信号的宽度,将输出端口的宽度设置为任何宽输入信号的宽度。的mdlOutputs方法对输入信号逐元素求和,根据需要展开任何标量输入。

/*计算输入信号的逐个元素和。yWidth是输出信号的宽度。*/ for (el = 0;el < yWidth;{int_T端口;real_T sum = 0.0;For (port = 0;port < nInputPorts;port++){/*获取输入信号值*/ InputRealPtrsType uPtrs = ssGetInputPortRealSignalPtrs(S,port);if (el < ssgetinputporttwidth (S,port)){/*输入为宽信号。 Use specific element */ sum = sum + ((real_T)signs[port] * (*uPtrs[el])); } else { /* Use the scalar value to expand the signal */ sum = sum + ((real_T)signs[port] * (*uPtrs[0])); } } }

屏蔽多端口s功能

如果您正在开发端口数量根据某些参数而变化的掩码多端口s函数块,并且希望将它们放置在Simulink库中,则必须指定掩码修改块的外观。万博1manbetx为此,执行以下命令

set_param (blockname“MaskSelfModifiable”,“上”)

在MATLAB命令提示符下保存库,其中blockname是通往街区的完整路径。如果不能指定掩码修改块的外观,则意味着无论何时加载模型或更新库链接,模型中的块实例都会恢复为库中的端口数。

这个话题有帮助吗?