主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

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),其中 paramIdx0 开始。当某个参数被指定为不可调时,如果尝试更改该参数,引擎会在仿真期间(或在使用 Simulink Coder™ 产品时的外部模式下)发出错误。

  • 使用 ssSetNumContStatesssSetNumDiscStates 指定此函数具有的状态数。

  • 配置模块的输入端口,包括:

    • 使用 ssSetNumInputPorts 指定此 S-Function 具有的输入端口数量。

    • 指定输入端口的维度。

      有关详细信息,请参阅 ssSetInputPortDimensionInfo

    • 对于每个输入端口,使用 ssSetInputPortDirectFeedThrough 指定它是否具有直接馈通。

      如果输入用于 mdlOutputsmdlGetTimeOfNextVarHit 函数,则端口具有直接馈通。每个输入端口的直接馈通标志可以设置为 1=yes0=no。如果输入 umdlOutputsmdlGetTimeOfNextVarHit 例程中使用,则应将其设置为 1。将直接馈通标志设置为 0 会告诉 Simulink 引擎 u 未在这些 S-Function 例程中使用。违反此规定会导致不可预测的结果。

  • 配置模块的输出端口,包括:

    如果您的 S-Function 输出是离散的(例如,输出仅采用特定值,如 0、1 和 2),请指定 SS_OPTION_DISCRETE_VALUED_OUTPUT

  • 设置模块运行的采样次数(即采样率)。

    指定采样时间有两种方法:

    • 基于端口的采样时间

    • 基于模块的采样时间

    有关采样时间问题的完整讨论,请参阅Specify S-Function Sample Times

    对于多速率 S-Function,建议的设置采样时间的方法是通过基于端口的采样时间方法。创建多速率 S-Function 时,必须小心验证当较慢的任务被抢占时,S-Function 是否能够正确管理数据,以避免出现竞争条件。当指定基于端口的采样时间时,该模块不能在任何端口继承 Inf 的采样时间。

  • 设置块工作向量的大小,使用 ssSetNumRWorkssSetNumIWorkssSetNumPWorkssSetNumModesssSetNumNonsampledZCs

  • 使用 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 产品无法使用此方法,从而导致链接或运行时错误。

动态模块特性

您可以将参数 NumContStatesNumDiscStatesNumInputsNumOutputsNumRWorkNumIWorkNumPWorkNumModesNumNonsampledZCs 设置为固定的非负整数,或者告诉 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 之前推出