mdlInitializeSizes
指定 C MEX S-Function 的输入、输出、状态、参数和其他特性的数量
必需
是
语言
C、C++
语法
#define MDL_INITIAL_SIZES
void mdlInitializeSizes(SimStruct *S)
参量
S表示 S-Function 模块的 SimStruct。
描述
这是 Simulink® 引擎调用的第一个 S-Function 回调方法。此方法执行以下任务:
使用
ssSetNumSFcnParams指定此 S-Function 支持的参数数量。当参数在仿真中无法改变时使用
ssSetSFcnParamTunable(S,paramIdx, 0),其中paramIdx从0开始。当某个参数被指定为不可调时,如果尝试更改该参数,引擎会在仿真期间(或在使用 Simulink Coder™ 产品时的外部模式下)发出错误。使用
ssSetNumContStates和ssSetNumDiscStates指定此函数具有的状态数。配置模块的输入端口,包括:
使用
ssSetNumInputPorts指定此 S-Function 具有的输入端口数量。指定输入端口的维度。
有关详细信息,请参阅
ssSetInputPortDimensionInfo。对于每个输入端口,使用
ssSetInputPortDirectFeedThrough指定它是否具有直接馈通。如果输入用于
mdlOutputs或mdlGetTimeOfNextVarHit函数,则端口具有直接馈通。每个输入端口的直接馈通标志可以设置为1=yes或0=no。如果输入u在mdlOutputs或mdlGetTimeOfNextVarHit例程中使用,则应将其设置为 1。将直接馈通标志设置为 0 会告诉 Simulink 引擎u未在这些 S-Function 例程中使用。违反此规定会导致不可预测的结果。
配置模块的输出端口,包括:
使用
ssSetNumOutputPorts模块具有的输出端口数量。指定输出端口的维度。
有关详细信息,请参阅
mdlSetOutputPortDimensionInfo。
如果您的 S-Function 输出是离散的(例如,输出仅采用特定值,如 0、1 和 2),请指定
SS_OPTION_DISCRETE_VALUED_OUTPUT。设置模块运行的采样次数(即采样率)。
指定采样时间有两种方法:
基于端口的采样时间
基于模块的采样时间
有关采样时间问题的完整讨论,请参阅Specify S-Function Sample Times。
对于多速率 S-Function,建议的设置采样时间的方法是通过基于端口的采样时间方法。创建多速率 S-Function 时,必须小心验证当较慢的任务被抢占时,S-Function 是否能够正确管理数据,以避免出现竞争条件。当指定基于端口的采样时间时,该模块不能在任何端口继承
Inf的采样时间。设置块工作向量的大小,使用
ssSetNumRWork、ssSetNumIWork、ssSetNumPWork、ssSetNumModes、ssSetNumNonsampledZCs。使用
ssSetOptions设置此模块实现的仿真选项。所有选项均采用
SS_OPTION_<name>形式。有关每个选项的信息,请参阅配置 C/C++ S-Function 功能。使用按位OR运算符设置多个选项,例如ssSetOptions(S, (SS_OPTION_name1 | SS_OPTION_name2))
注意
如果您有 Simulink Coder,则在为包含此方法的非内联 S-Function 生成代码时,请确保该方法未包装在 #if defined(MATLAB_MEX_FILE) 语句中。例如:
#if defined(MATLAB_MEX_FILE)
static void mdlInitializeSizes(SimStruct *S)
{
/* Add mdlInitializeSizes code here *
}
#endif define 语句使 mdlInitializeSizes 方法仅适用于 MATLAB® MEX 文件。如果 S-Function 未内联,则 Simulink Coder 产品无法使用此方法,从而导致链接或运行时错误。
动态模块特性
您可以将参数 NumContStates、NumDiscStates、NumInputs、NumOutputs、NumRWork、NumIWork、NumPWork、NumModes 和 NumNonsampledZCs 设置为固定的非负整数,或者告诉 Simulink 引擎动态调整它们的大小:
DYNAMICALLY_SIZED- 将状态长度、工作向量等设置为从驱动模块继承的值。它根据标量扩展规则将宽度设置为实际输入宽度,除非您使用mdlSetWorkWidths来设置宽度。0或正数 - 将长度(或宽度)设置为指定值。默认值为0。
MATLAB S-Function 的初始化
2 级 MATLAB S-Function setup 方法执行的任务与 C MEX S-Function mdlInitializeSizes 方法几乎相同。
示例
static void mdlInitializeSizes(SimStruct *S)
{
int_T nInputPorts = 1; /* number of input ports */
int_T nOutputPorts = 1; /* number of output ports */
int_T needsInput = 1; /* direct feedthrough */
int_T inputPortIdx = 0;
int_T outputPortIdx = 0;
ssSetNumSFcnParams(S, 0); /* Number of expected parameters */
if (ssGetNumSFcnParams(S) != ssGetSFcnParamsCount(S)) {
/*
* If the number of expected input parameters is not
* equal to the number of parameters entered in the
* dialog box, return. The Simulink engine generates an
* error indicating that there is aparameter mismatch.
*/
return;
}else {
mdlCheckParameters(S);
if (ssGetErrorStatus(S) != NULL)
return;
}
ssSetNumContStates( S, 0);
ssSetNumDiscStates( S, 0);
/*
* Configure the input ports. First set the number of input
* ports.
*/
if (!ssSetNumInputPorts(S, nInputPorts)) return;
/*
* Set input port dimensions for each input port index
* starting at 0.
*/
if(!ssSetInputPortDimensionInfo(S, inputPortIdx,
DYNAMIC_DIMENSION)) return;
/*
* Set direct feedthrough flag (1=yes, 0=no).
*/
ssSetInputPortDirectFeedThrough(S, inputPortIdx, needsInput);
/*
* Configure the output ports. First set the number of
* output ports.
*/
if (!ssSetNumOutputPorts(S, nOutputPorts)) return;
/*
* Set output port dimensions for each output port index
* starting at 0.
*/
if(!ssSetOutputPortDimensionInfo(S,outputPortIdx,
DYNAMIC_DIMENSION)) return;
/*
* Set the number of sample times. */
ssSetNumSampleTimes(S, 1);
/*
* Set size of the work vectors.
*/
ssSetNumRWork(S, 0); /* real vector */
ssSetNumIWork(S, 0); /* integer vector */
ssSetNumPWork(S, 0); /* pointer vector */
ssSetNumModes(S, 0); /* mode vector */
ssSetNumNonsampledZCs(S, 0); /* zero crossings */
ssSetOptions(S, 0);
} /* end mdlInitializeSizes */
版本历史记录
在 R2006a 之前推出