输入输出接口
为C - s函数创建输入端口
要创建和配置输入端口mdlInitializeSizes
方法应首先指定s函数输入端口的数量,使用ssSetNumInputPorts
.然后,对于每个输入端口,该方法应该指定
输入端口的尺寸(参见初始化输入端口尺寸)
如果您希望s函数从它所连接的端口继承其维度,则应该指定端口的动态大小
mdlInitializeSizes
(见动态调整输入端口的大小).输入端口是否允许输入的标量扩展(参见输入的标量展开)
输入端口是否有直接馈通,使用
ssSetInputPortDirectFeedThrough
如果一个端口的输入用于
mdlOutputs
或mdlGetTimeOfNextVarHit
功能。每个输入端口的直接馈通标志可以设置为任意一个1 =是的
或0 =没有
.它应该设置为1,如果输入,u
,用于mdlOutputs
或mdlGetTimeOfNextVarHit
例行公事。将直接馈通标志设置为0告诉Simulink万博1manbetx®引擎,u
在这两个s函数例程中都没有使用。违反这一点会导致不可预测的结果。输入端口的数据类型(如果不是默认的)
双
使用
设置输入端口的数据类型。如果希望端口的数据类型依赖于它所连接的端口的数据类型,请将数据类型指定为ssSetInputPortDataType
DYNAMICALLY_TYPED
.在这种情况下,您必须提供
和mdlSetInputPortDataType
方法,以便在信号传播期间正确设置数据类型。mdlSetDefaultPortDataTypes
输入端口的数字类型,如果端口接受复值信号
使用
设置输入端口的数字类型。如果希望端口的数字类型依赖于它所连接的端口的数字类型,请将数字类型指定为ssSetInputPortComplexSignal
COMPLEX_INHERITED
.在这种情况下,您必须提供
和mdlSetInputPortComplexSignal
方法,以便在信号传播期间正确设置数字类型。mdlSetDefaultPortComplexSignals
您可以使用其他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 (
.的解释DatatypeID的财产n
).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
.然后,对于每个输出端口,该方法应该指定
输出端口尺寸
您可以使用以下宏之一设置输出端口的尺寸:
如果您希望端口的尺寸依赖于块连接,请将尺寸设置为
DYNAMIC_DIMENSIONS
当使用ssSetOutputPortDimensionInfo
或DYNAMICALLY_SIZED
对于所有其他宏。s函数必须提供
和mdlSetOutputPortDimensionInfo
方法,以确保在代码生成中将输出端口尺寸设置为正确的值。mdlSetDefaultPortDimensionInfo
输出端口的数据类型
使用
设置输出端口的数据类型。如果您希望端口的数据类型依赖于块连接,请将数据类型指定为ssSetOutputPortDataType
DYNAMICALLY_TYPED
.在这种情况下,您必须提供
和mdlSetOutputPortDataType
方法,以便在信号传播期间正确设置数据类型。mdlSetDefaultPortDataTypes
如果输出端口输出复值信号,则输出端口的数字类型
使用
设置输出端口的数字类型。如果希望端口的数字类型依赖于它所连接的端口的数字类型,请将数字类型指定为ssSetOutputPortComplexSignal
COMPLEX_INHERITED
.在这种情况下,您必须提供
和mdlSetOutputPortComplexSignal
方法,以便在信号传播期间正确设置数字类型。mdlSetDefaultPortComplexSignals
看到为C - s函数创建输入端口以获取如何初始化s函数输入端口的示例。您可以使用相同的过程初始化s函数输出端口,但是使用相应的输出端口宏。
为二级MATLAB s函数创建输出端口
为2级MATLAB s函数创建输出端口设置
方法应首先使用运行时对象指定s函数输出端口的数量NumOutputPorts
财产。接下来,如果所有输出端口都继承了它们的功能属性(数据类型、维度、复杂度和采样模式),则在设置
方法:
block.SetPreCompOutPortInfoToDynamic;
配置输出端口与配置输入端口完全相同。看到创建2级MATLAB s函数的输入端口对于可以为每个输出端口指定的属性列表,替换为OutputPort
为InputPort
在对运行时对象的每次调用中。
输入的标量展开
输入的标量扩展在概念上是指将标量输入信号扩展到与连接到其他s函数输入端口的宽输入信号相同的维度的过程。这是通过将扩展信号的每个元素设置为标量输入的值来完成的。
如果输入和输出端口被指定为动态大小,则二级MATLAB s函数使用默认的标量展开规则(参见输入和参数的标量展开在使用仿真软件万博1manbetx).
一个cmex s函数
mdlInitializeSizes
方法启用输入的标量展开SS_OPTION_ALLOW_INPUT_SCALAR_EXPANSION
选项,使用ssSetOptions
.
当标量展开时,s函数mdlInitializeSizes
方法应指定输入和输出端口的大小是动态的。Simu万博1manbetxlink引擎使用默认方法来设置输入和输出端口的尺寸。如果块有两个以上的输入,则输入信号可以是标量信号或宽信号,其中宽信号都具有相同数量的元素。在这种情况下,引擎将输出端口的尺寸设置为宽输入信号的宽度,并将任何标量输入扩展为该宽度。如果宽输入由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 (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
是通往街区的完整路径。如果不能指定掩码修改块的外观,则意味着无论何时加载模型或更新库链接,模型中的块实例都会恢复为库中的端口数。