主要内容

mdlinitialsizes

指定C MEX S函数的输入,输出,状态,参数和其他特征

必需的

是的

语言

C,C ++

句法

#define mdl_initial_sizesvoid mdlinitializizes(Simstruct *s)

参数

s

代表S功能块的SIMSTRUCT。

描述

这是Simulink的第一个S功能回调方法万博1manbetx®引擎电话。此方法执行以下任务:

  • 指定此S函数支持的参数数量万博1manbetxsssetnumsfcnparams

    利用ssetsetfcnparamtunable(s,paramidx,0)当参数在模拟过程中无法更改时Paramidx开始于0。当将参数指定为不可调节时,引擎在模拟过程中发出错误(或在使用外部模式时万博1manbetxSimulink Coder™产品)如果尝试更改参数。

  • 指定此功能具有的状态数量sssetnumcontstatessssetnumdiscstates

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

    • 指定此S函数具有的输入端口的数量sssetNumInputports

    • 指定输入端口的尺寸。

      sssetInputportDimensionInfo了解更多信息。

    • 对于每个输入端口,指定它是否具有直接进料,使用sssetInputportDirectFeedThrough

      如果在mdlOutputs或者mdlgetTimeofnextvarhit功能。每个输入端口的直接进料标志都可以设置为1 =是或者0 =否。如果输入,应将其设置为1,在mdlOutputs或者mdlgetTimeofnextvarhit常规。将直接进料标记设置为0告诉Simulink引擎万博1manbetx在这两个S功能例程中均未使用。违反这会导致不可预测的结果。

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

    如果您的s功能输出是离散的(例如,输出仅采用特定值,例如0、1和2),则指定SS_OPTION_DISCRETE_VALUED_OUTPUT

  • 设置块运行的样品时间(即样品速率)的数量。

    有两种指定样本时间的方法:

    • 基于端口的样本时间

    • 基于块的样本时间

    指定S功能样本时间有关样本时间问题的完整讨论。

    对于多条S函数,设置样品时间的建议方法是通过基于端口的样本时间方法。当您创建多次S功能时,您必须注意确认,当较慢的任务被抢占较慢时,您的S功能可以正确管理数据,以避免种族条件。当指定基于端口的样本时间时,该块不能继承inf在任何港口。

  • 使用块的工作向量的大小,使用SSSETNUMRWORK,,,,SSSETNUMIWORK,,,,sssetnumpwork,,,,sssetNummodes,,,,Sssetnumnonsmpledzcs

  • 设置该块实施的仿真选项,使用Ssetoptions

    所有选项都有表格ss_option_ <名称>。看配置C/C ++ S功能功能有关每个选项的信息。使用位或者操作员设置多个选项,如

    sssetoptions(s,(ss_option_)name1|ss_option_name2))

笔记

如果你有万博1manbetxSimulink编码器,当生成包含此方法的非线s函数的代码时,请确保该方法未包装在一个#如果定义(matlab_mex_file)陈述。例如:

#if定义(matlab_mex_file)static void mdlinitializizes(simStruct * s){ / *在此处 *添加mdlinitializes code *} #endif

定义声明使得mdlinitialsizes仅可用于MATLAB的方法®MEX文件。如果未嵌入s功能,万博1manbetxSimulink编码器产品无法使用此方法,从而导致链接或运行时错误。

动态尺寸的块功能

您可以设置参数numcontstates,,,,numdiscstates,,,,numInputs,,,,numOutputs,,,,数字,,,,数字,,,,数字,,,,nummodes, 和numnonsmpledzcs到固定的非负整数或告诉Simulink引擎动态尺寸:万博1manbetx

  • 动态式尺寸- 设置状态的长度,工作向量等,以从驾驶块继承的值。根据标量扩展规则,它将宽度设置为实际输入宽度,除非您使用mdlsetworkwidths设置宽度。

  • 0或正数 - 将长度(或宽度)设置为指定值。默认值为0

MATLAB S功能的初始化

2级MATLAB S功能设置方法执行与C MEX S功能几乎相同的任务mdlinitialsizes方法。

例子

静态void mdlinitializizes(simstruct *s){int_t ninputports = 1;/ *输入端口的数量 */ int_t noutputports = 1;/ *输出端口的数量 */ int_t需求输入= 1;/ *直接馈电 */ int_t inputportIdx = 0;int_t outputportIdx = 0;sssetnumsfcnparams(s,0);/ *预期参数的数量 * /if(ssgetNumsfcnParams(s)!= ssgetSfcnParamscount(s)){ / * *如果预期输入参数的数量不等于 *对话框中输入的参数数量,则返回。Simu万博1manbetxlink引擎会生成一个 *错误,表明存在Aparameter不匹配。*/ 返回;} 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 */

也可以看看

设置,,,,mdlinitializeSampletimes

在R2006a之前引入