主要内容

输入输出接口

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

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

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

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

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

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

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

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

    使用ssSetInputPortDataType设置输入端口的数据类型。如果希望端口的数据类型依赖于所连接端口的数据类型,请将数据类型指定为DYNAMICALLY_TYPED.类的实现mdlSetInputPortDataType而且mdlSetDefaultPortDataTypes方法,以使在信号传播期间能够正确设置数据类型。

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

    使用ssSetInputPortComplexSignal设置输入端口的数字类型。如果希望端口的数字类型依赖于所连接端口的数字类型,请将数字类型指定为COMPLEX_INHERITED.类的实现mdlSetInputPortComplexSignal而且mdlSetDefaultPortComplexSignals方法来启用在信号传播期间正确设置数值类型。

您可以使用其他s函数宏配置其他输入端口属性。看到输入输出接口详见“SimStruct宏和按用法列出的函数”部分。

请注意

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

初始化输入端口尺寸

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

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

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

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

    ssSetInputPortDimensionInfo(S, inputPortIdx, dimsInfo)

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

动态调整输入端口大小

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

动态测量输入端口:

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

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

    ssSetInputPortDimensionInfo(S, inputPortIdx, DYNAMIC_DIMENSION)

    设置输入端口的尺寸。

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

    ssSetInputPortWidth(S, inputPortIdx, dynamically_size)

    来指定输入端口的尺寸。

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

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

    当Sim金宝appulink引擎确定了连接到输入端口的信号的维数时,它将在信号传播过程中调用此方法。

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

    当引擎无法确定连接到部分或所有块输入端口的信号的维数时,它会在信号传播过程中调用此方法。例如,如果输入端口未连接,就会发生这种情况。如果s函数没有提供这种方法,信号传播例程将块端口的维度设置为1-D标量。

示例:定义多个s函数输入端口

中的以下代码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);/*输入信号必须连续*/ sssetinputportrequired毗连(S, i, 1);/*输入端口不能共享内存*/ ssSetInputPortOverWritable(S, i, 0); }

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

#if defined(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 - s函数创建输出端口

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

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

输入的标量展开

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

二级MATLAB®如果输入和输出端口被指定为动态大小,则S-function使用默认的标量扩展规则(请参阅输入和参数的标量展开使用仿真软件金宝app).

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

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

请注意

如果s函数通过初始化中的尺寸来指定或控制其输入和输出端口的尺寸,则引擎将忽略标量展开选项mdlInitializeSizes,使用mdlSetInputPortWidth而且mdlSetOutputPortWidth,或使用mdlSetInputPortDimensionInfo,mdlSetOutputPortDimensionInfo,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(端口= 0;端口< nInputPorts;port++){/*获取输入信号值*/ InputRealPtrsType uPtrs = ssGetInputPortRealSignalPtrs(S,port);if (el < ssGetInputPortWidth(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库中,则必须指定掩码修改块的外观。金宝app为此,执行命令

set_param (blockname“MaskSelfModifiable”,“上”)

在MATLAB命令提示符下,然后保存库,其中blockname是块的完整路径。如果未能指定掩码修改块的外观,则意味着每当加载模型或更新库链接时,模型中的块实例将恢复到库中的端口数量。