主要内容

mdlInitializeSizes

指定C MEX s -函数的输入、输出、状态、参数和其他特性的数量

要求

是的

语言

C, c++

语法

#定义MDL_INITIAL_SIZES空白mdlInitializeSizes (SimStruct *年代)

参数

年代

表示s -功能块的SimStruct。

描述

这是Simulink的第一个s函数回调方法金宝app®引擎调用。该方法执行以下任务:

  • 使用命令指定此s函数支持的参数数量金宝appssSetNumSFcnParams

    使用ssSetSFcnParamTunable(年代,paramIdx, 0)当参数在模拟过程中不能改变时,其中paramIdx起价0.当参数被指定为不可调优时,引擎将在模拟期间(或在外部模式下使用金宝app仿真软件编码器™产品),如果试图更改参数。

  • 使用指定该函数的状态数ssSetNumContStatesssSetNumDiscStates

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

    • 指定这个s函数的输入端口的数量,使用ssSetNumInputPorts

    • 指定输入端口的尺寸。

      看到ssSetInputPortDimensionInfo为更多的信息。

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

      一个端口有直接馈通,如果输入被使用在任何mdlOutputsmdlGetTimeOfNextVarHit函数。每个输入端口的直通标志可以设置为任意一种1 =是的0 =没有.如果输入,u,用于mdlOutputsmdlGetTimeOfNextVarHit例行公事。将直接馈通标志设置为0告诉Simulink引擎金宝appu在这两个s函数例程中都不使用。违背这一点会导致不可预知的结果。

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

    如果您的s函数输出是离散的(例如,输出只取特定的值,如0、1和2),请指定SS_OPTION_DISCRETE_VALUED_OUTPUT

  • 设置块操作的采样次数(即采样率)。

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

    • 出口样品时间

    • 基于块的样品时间

    看到指定s函数的采样时间以完整地讨论示例时间问题。

    对于多速率s函数,建议采用基于端口的采样时间方法来设置采样时间。当您创建一个多速率s函数时,您必须注意验证,当较慢的任务被抢占时,您的s函数正确地管理数据,以避免竞争条件。当指定基于端口的采样时间时,块不能继承采样时间在任何港口。

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

  • 使用下面的方法设置此块实现的模拟选项ssSetOptions

    所有选项都有表单SS_OPTION_ <名称>.看到配置C/ c++ S-Function特性查阅有关每个选项的信息。使用一个位操作符来设置多个选项,如

    ssSetOptions(年代,(SS_OPTION_name1| SS_OPTION_name2))

请注意

如果你有金宝app仿真软件编码器,当为包含此方法的非线性s -函数生成代码时,请确保该方法没有封装在#如果定义(MATLAB_MEX_FILE)声明。例如:

#if define (MATLAB_MEX_FILE) static void mdlinitializesize (SimStruct *S) {/* Add mdlinitializesize code here *} #endif . php . php . php . php

定义声明中使mdlInitializeSizes方法仅对MATLAB可用®墨西哥人文件。如果s函数没有内联,则金宝app仿真软件编码器产品无法使用此方法,导致链接或运行时错误。

动态调整块大小

您可以自行设置参数NumContStatesNumDiscStatesNumInputsNumOutputsNumRWorkNumIWorkNumPWorkNumModes,NumNonsampledZCs转换为固定的非负整数,或者告诉Simulink引擎动态调整它们的大小:金宝app

  • DYNAMICALLY_SIZED——将状态、工作向量等的长度设置为从驱动块继承的值。它根据标量展开规则将宽度设置为实际的输入宽度,除非您使用mdlSetWorkWidths设置宽度。

  • 0or正数——设置长度(或宽度)为指定值。默认值是0

MATLAB s函数的初始化

MATLAB二级s函数设置方法执行与C MEX s -函数几乎相同的任务mdlInitializeSizes方法。

例子

static void mdlinitializesize (SimStruct *S) {int_T nInputPorts = 1;/*输入端口数量*/ int_T nOutputPorts = 1;/*输出端口数量*/ int_T needsInput = 1;/* direct feedthrough */ int_T inputPortIdx = 0;int_T outputPortIdx = 0;ssSetNumSFcnParams (S, 0);/*期望输入的参数个数*/ if (ssGetNumSFcnParams(S) != ssGetSFcnParamsCount(S)){/* *如果期望输入的参数个数不等于在*对话框中输入的参数个数,则返回。Simu金宝applink引擎生成一个*错误,表示存在参数不匹配。* /返回;其他}{mdlCheckParameters(年代); 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