主要内容

输入和输出端口

为C - functions创建输入端口

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

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

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

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

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

    如果输入使用,则端口具有直接馈通mdlOutputs或者mdlgettimeofnextvarhit.功能。每个输入端口的直通标志可以设置为任意一种1 =是的或者0 =没有.如果输入,它应该设置为1,u,用于mdlOutputs或者mdlgettimeofnextvarhit.例行公事。将直接馈通标志设置为0告诉Simulink金宝app®引擎u在这两个s函数例程中都不使用。违背这一点会导致不可预知的结果。

  • 输入端口的数据类型,如果不是默认的双重的

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

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

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

您可以使用其他S函数宏配置其他输入端口属性。看到输入和输出端口有关更多信息,请参阅“使用”部分的“SIMSTRUCS宏和函数”部分。

请注意

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

初始化输入端口维度

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

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

    ssSetInputPortWidth(年代,inputPortIdx w)
  • 如果输入信号必须是维度的矩阵-借-n, 用

    ssSetInputPortMatrixDimensions(s,inputportidx,m,n)
  • 否则,如果输入信号可以有一个或两个维度,则使用

    ssSetInputPortDimensionInfo(年代,inputPortIdx dimsInfo)

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

动态调整输入端口的大小

如果S函数不要求其输入信号具有特定尺寸,则可以设置输入端口的尺寸,以匹配连接到端口的信号的尺寸。

要动态维度输入端口:

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

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

    ssSetInputPortDimensionInfo(S、inputPortIdx、动态_维度)

    设置输入端口的维度。

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

    ssSetInputPortWidth(S,inputPortIdx,动态大小)

    指定输入端口的维度。

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

    ssSetInputPortMatrixDimensions(S,inputPortIdx,动态大小,动态大小)
  • 提供mdlSetInputPortDimensionInfo方法,该方法将输入端口的尺寸设置为连接到该端口的信号的大小。

    当确定连金宝app接到输入端口的信号的维度时,Simulink引擎在信号传播期间调用该方法。

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

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

示例:定义多个S功能输入端口

以下代码mdlinitializatize配置具有两个输入端口的S函数。看见输入和输出端口有关此示例中使用的Macros的更多信息,请在“使用”部分中的“Simstruct宏和函数”部分中。

如果(!ssSetNumInputPorts(年代,2))返回;For (i = 0;我< 2;i++) {/* Input has direct feedthrough */ ssSetInputPortDirectFeedThrough(S, i, 1);/* Input is a real signal */ ssSetInputPortComplexSignal(S, i, COMPLEX_NO);/* Input是一个动态大小的2d矩阵*/ ssSetInputPortMatrixDimensions(S,i, dynamically_size, dynamically_size);/* Input继承它的样本时间*/ ssSetInputPortSampleTime(S, i,INHERITED_SAMPLE_TIME);/*输入信号必须是连续的*/ sssetinputportrequiredcontinuous (S, i, 1);/*输入端口不能共享内存*/ sssetinputporttoverwritable (S, i, 0); }

在信号传播期间,Simulink引擎调用这个s函数金宝appmdlSetInputPortDimensionInfo宏初始化输入端口维度。在这个例子中,mdlSetInputPortDimensionInfo将输入尺寸设置为发动机传递给宏的候选尺寸。

#define (MATLAB_MEX_FILE) #define MDL_SET_INPUT_PORT_DIMENSION_INFO static void mdlSetInputPortDimensionInfo(SimStruct *S, int_T port, const DimsInfo_T *dimsInfo) {if(!ssSetInputPortDimensionInfo(S, port, dimsInfo))返回;} # endif

对于配置具有多个输入和输出端口的S函数的示例,请打开Simulink模型金宝appsfcndemo_sfun_multiport并检查S功能sfun_multiport.c

创建C - functions输出端口

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

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

标量扩展输入

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

一个级别的matlab®如果输入和输出端口被指定为动态大小,则S函数使用默认标量扩展规则(参见输入和参数的标量展开在里面使用Simu金宝applink).

通过标量扩展,S函数mdlinitializatize方法应指定动态调整输入和输出端口的大小。Simulink引擎使用默认方法设置输入和输出端口的尺寸。如果块有两个以上的输入,则输入信号可以是标量信号或宽信号,其中宽金宝app信号都具有相同数量的元素。在这种情况下,引擎将输出端口的尺寸设置为宽输入信号的宽度,并将任何标量输入扩展到此宽度。如果宽输入由1-D和2-D矢量驱动,则输出为2-D矢量信号,标量输入扩展为2-D矢量信号。

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

请注意

如果S函数通过在中初始化维度来指定或控制其输入和输出端口的维度,则引擎将忽略标量扩展选项mdlinitializatize,使用mdlSetInputPortWidthmdlsetoutputportwidth.,或使用mdlSetInputPortDimensionInfomdlsetoutputportdimensionsinfo., 和mdlSetDefaultPortDimensionInfo

理解如何使用标量扩展的最好方法是考虑示例。sfcndemo_sfun_multiport.此模型包含三个S功能块,每个块具有多个输入端口。S函数sfun_multiport.c在这些块中使用SS_OPTION_ALLOW_INPUT_SCALAR_EXPANSION选项在其中mdlinitializatize方法,允许对输入的标量扩展。S函数指定其输入和输出是动态尺寸的。因此,在信号传播期间,发动机将输入端口的宽度设置为连接到端口的信号的宽度,以及输出端口的宽度到任何宽输入信号的宽度。的mdlOutputs方法对输入信号逐个元素执行求和,并根据需要展开任何标量输入。

/ *计算输入信号的逐个元素和。YWIDTH是输出信号的宽度。* / for(el = 0; el 
            

屏蔽多端口S函数

如果您正在开发掩码多端口s功能块,其端口数量根据某些参数而变化,并且希望将它们放在Simulink库中,则必须指定掩码修改块的外观。金宝app要做到这一点,请执行命令

set_param(blockname,'MaskSelfModifiable','on')

在保存库之前的MATLAB命令提示下,其中blockname是块的完整路径。如果未指定遮罩修改块的外观,则意味着在加载模型或更新库链接时,模型中的块实例将恢复为库中的端口数。