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 之前推出