创建和配置输入端口,mdlInitializeSizes
方法应首先指定s函数输入端口的数量,使用ssSetNumInputPorts
.然后,对于每个输入端口,方法应该指定
输入端口的尺寸(参见初始化输入端口尺寸)
如果您希望s函数从它所连接的端口继承它的维数,您应该指定端口是动态大小的mdlInitializeSizes
(见动态调整输入端口大小).
输入端口是否允许输入的标量扩展(请参见输入的标量展开)
输入端口是否有直通,使用ssSetInputPortDirectFeedThrough
端口有直接馈通,如果输入被使用在mdlOutputs
或mdlGetTimeOfNextVarHit
功能。每个输入端口的直接馈通标志可以设置为任意一个1 =是的
或0 =没有
.如果输入,它应该设为1,u
,用于mdlOutputs
或mdlGetTimeOfNextVarHit
例行公事。将直接馈通标志设置为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标量。
中的以下代码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
.
创建和配置输出端口,mdlInitializeSizes
方法应首先指定s函数输出端口的数量,使用ssSetNumOutputPorts
.然后,对于每个输出端口,方法应该指定
输出端口尺寸
您可以使用以下宏之一设置输出端口尺寸:
如果希望端口的尺寸依赖于块连接,请将尺寸设置为DYNAMIC_DIMENSIONS
当使用ssSetOutputPortDimensionInfo
或DYNAMICALLY_SIZED
对于所有其他宏。s函数必须提供
而且mdlSetOutputPortDimensionInfo
方法来确保在代码生成中将输出端口尺寸设置为正确的值。mdlSetDefaultPortDimensionInfo
输出端口的数据类型
使用
设置输出端口的数据类型。如果希望端口的数据类型依赖于块连接,请将数据类型指定为ssSetOutputPortDataType
DYNAMICALLY_TYPED
.类的实现
而且mdlSetOutputPortDataType
方法,以使在信号传播期间能够正确设置数据类型。mdlSetDefaultPortDataTypes
如果端口输出复值信号,则输出端口的数字类型
使用
设置输出端口的数字类型。如果希望端口的数字类型依赖于所连接端口的数字类型,请将数字类型指定为ssSetOutputPortComplexSignal
COMPLEX_INHERITED
.类的实现
而且mdlSetOutputPortComplexSignal
方法来启用在信号传播期间正确设置数值类型。mdlSetDefaultPortComplexSignals
看到为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函数块,其端口数量根据某些参数而变化,并且希望将它们放在Simulink库中,则必须指定掩码修改块的外观。金宝app为此,执行命令
set_param (blockname“MaskSelfModifiable”,“上”)
在MATLAB命令提示符下,然后保存库,其中blockname
是块的完整路径。如果未能指定掩码修改块的外观,则意味着每当加载模型或更新库链接时,模型中的块实例将恢复到库中的端口数量。