主要内容

输入和输出端口

为C S-Functions创建输入端口

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

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

    如果你想让你的s函数继承其维度从它连接的端口,您应该指定端口是动态的mdlInitializeSizes(见动态分级的输入端口)。

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

  • 输入端口是否有直接的引线,使用ssSetInputPortDirectFeedThrough

    一个港口直接引线如果输入的使用mdlOutputsmdlGetTimeOfNextVarHit功能。为每个输入端口直接引线国旗可以设置为1 =是的0 =没有。应该设置为1,如果输入,u中使用mdlOutputsmdlGetTimeOfNextVarHit例行公事。直接引线标记设置为0告诉仿真软件金宝app®引擎,u不是用在这两种功能的例程。违反这将导致不可预知的结果。

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

    使用ssSetInputPortDataType设置输入端口的数据类型。如果你想要的数据类型端口的数据类型取决于它连接的端口,指定数据类型DYNAMICALLY_TYPED。在这种情况下,您必须提供的实现mdlSetInputPortDataTypemdlSetDefaultPortDataTypes方法使数据类型被正确地设置在信号传播。

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

    使用ssSetInputPortComplexSignal设置输入端口的数值类型。如果你想要的数值类型端口的数值类型取决于它连接端口,指定数值类型COMPLEX_INHERITED。在这种情况下,您必须提供的实现mdlSetInputPortComplexSignalmdlSetDefaultPortComplexSignals方法,使信号传播期间要正确设置数值类型。

您可以配置额外的输入端口属性使用其他功能宏。看到输入和输出端口列出在“SimStruct宏和函数使用”部分获得更多信息。

请注意

mdlInitializeSizes方法前必须指定数量的端口设置任何属性。如果它试图设置一个属性不存在的一个港口,这是访问无效的内存和分割违反发生。

初始化输入口尺寸

你可以设置输入端口尺寸使用的宏:

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

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

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

    ssSetInputPortDimensionInfo(年代,inputPortIdx dimsInfo)

    你可以使用这个函数来全部或部分初始化端口尺寸(见下一节)。

动态分级的输入端口

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

动态尺寸输入端口:

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

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

    ssSetInputPortDimensionInfo (S inputPortIdx DYNAMIC_DIMENSION)

    设置输入端口的维度。

    如果输入端口只能接受向量(一维)信号,但信号可以是任何大小,使用

    ssSetInputPortWidth (S inputPortIdx DYNAMICALLY_SIZED)

    指定维数的输入端口。

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

    ssSetInputPortMatrixDimensions (S inputPortIdx DYNAMICALLY_SIZED DYNAMICALLY_SIZED)
  • 提供一个mdlSetInputPortDimensionInfo方法,集输入端口的尺寸大小的信号连接到它。

    仿真软件金宝app引擎调用这个方法在信号传播时确定信号的维数与输入端口。

  • 提供一个mdlSetDefaultPortDimensionInfo方法,组块的尺寸的港口一个默认值。看到sfun_dynsize.c例如,它实现了这个宏。

    引擎调用这个方法在信号传播时不能确定信号的维数与部分或所有块的输入端口。这可能发生,例如,如果一个输入端口是无关的。如果功能不提供这个方法,信号传播程序集的维数块一维标量的港口。

例如:定义多个函数的输入端口

下面的代码在mdlInitializeSizes配置两个输入端口的功能。看到输入和输出端口在“SimStruct宏和函数列使用”部分的更多信息在本例中使用的宏。

如果(!ssSetNumInputPorts(年代,2))返回;(我= 0;我< 2;我+ +){/ *输入直接引线* / ssSetInputPortDirectFeedThrough(年代,我,1);/ *输入是一个真正的信号* / ssSetInputPortComplexSignal (S, i, COMPLEX_NO);/ *输入是一种动态的二维矩阵* / ssSetInputPortMatrixDimensions (S, i, DYNAMICALLY_SIZED DYNAMICALLY_SIZED);/ *输入继承采样时间* / ssSetInputPortSampleTime (S, i, INHERITED_SAMPLE_TIME);/ *输入信号必须连续* / ssSetInputPortRequiredContiguous(年代,我,1);/ *输入端口不能共享内存* / ssSetInputPortOverWritable(年代,我,0); }

在信号传播过程中,仿真软件引擎调用这个函数金宝appmdlSetInputPortDimensionInfo宏初始化输入端口尺寸。在这个例子中,mdlSetInputPortDimensionInfo设置输入维度候选人尺寸传递到宏观的引擎。

#如果定义(MATLAB_MEX_FILE) # define MDL_SET_INPUT_PORT_DIMENSION_INFO静态空mdlSetInputPortDimensionInfo (SimStruct *年代,int_T港口,const DimsInfo_T * dimsInfo){如果!ssSetInputPortDimensionInfo(年代,端口、dimsInfo))返回;}# endif

例如,配置一个s函数具有多个输入和输出端口,打开仿真软件模型金宝appsfcndemo_sfun_multiport和检查功能sfun_multiport.c

为C S-Functions创建输出端口

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

看到为C S-Functions创建输入端口为一个例子,演示如何初始化一个功能的输入端口。您使用相同的过程来初始化函数输出端口,但相应的输出端口宏。

标量扩展的输入

标量扩展输入概念上是指扩大标量的过程输入信号相同的尺寸宽输入信号连接到其他功能输入端口。这是通过设置扩展信号的每个元素的值输入标量。

一个2级MATLAB®s函数使用默认的标量扩展规则如果输入和输出端口指定为动态大小(见标量扩展输入和参数使用仿真软件金宝app)。

与标量扩展功能mdlInitializeSizes方法应该指定大小的动态输入和输出端口。仿真软件金宝app引擎使用一个默认的方法来设置输入和输出端口的尺寸。如果块有超过两个输入,输入信号可以是标量或宽信号,在宽信号都有相同数量的元素。在这种情况下,发动机输出端口的尺寸设置为宽输入信号的宽度和扩展任何标量输入宽度。如果宽输入是由一维、二维向量,输出信号是一个二维向量,标量输入扩展到二维矢量信号。

如果不是标量扩张,引擎假定所有端口(输入和输出端口)必须具有相同的维度,并将所有端口尺寸设置为相同的维数规定驾驶街区之一。

请注意

引擎忽略了标量扩展选项如果s函数指定或控制其输入和输出端口的尺寸通过初始化维度mdlInitializeSizes,使用mdlSetInputPortWidthmdlSetOutputPortWidth,或者使用mdlSetInputPortDimensionInfo,mdlSetOutputPortDimensionInfo,mdlSetDefaultPortDimensionInfo

了解如何使用标量扩张的最好方法是考虑的例子sfcndemo_sfun_multiport。这个模型包含三个功能模块,每个都有多个输入端口。的功能sfun_multiport.c用于这些块设置SS_OPTION_ALLOW_INPUT_SCALAR_EXPANSION选择在其mdlInitializeSizes方法,允许输入的标量扩张。s函数指定它的输入和输出都是动态的。因此,在信号传播过程中,输入端口的引擎设置宽度的宽度信号连接到端口,和输出端口的宽度的宽度宽输入信号。的mdlOutputs方法执行一个输入信号中的元素数目,扩大任何标量输入,根据需要。

/ *计算中的元素输入信号之和。yWidth是输出信号的宽度。* / (el = 0;el < yWidth;el + +) {int_T端口;real_T金额= 0.0;(端口= 0;港< nInputPorts;端口+ +){/ *获取输入信号值* / InputRealPtrsType uPtrs = ssGetInputPortRealSignalPtrs(年代,端口);如果(el < ssGetInputPortWidth(年代,端口)){/ *输入是一个广泛的信号。 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-Functions

如果您正在开发了多端口功能块的数量的端口不同基于一些参数,并想把它们在一个模型库,您必须指定的掩模修改块的外观。金宝app为此,执行命令

set_param (blockname“MaskSelfModifiable”,“上”)

在MATLAB命令提示符之前保存库,在那里blockname是块的完整路径。未能指定的掩模修改外观块意味着块在一个模型的一个实例恢复端口的数量在图书馆当你加载模型或更新库链接。