主要内容

mdlInitializeConditions

初始化这个C MEX s函数的状态向量

要求

没有

语言

C, c++

语法

#定义MDL_INITIALIZE_CONDITIONS(SimStruct *S)

参数

年代

SimStruct表示一个S-Function块。

描述

的仿真软金宝app件®引擎在模拟开始时调用此可选方法。它应该初始化这个S-Function块的连续和离散状态(如果有的话)。在C MEX s函数中,使用ssGetContStates和/或ssGetDiscStates访问各州。此方法还可以执行此s函数所需的任何其他初始化活动。

请注意

如果你有金宝app仿真软件编码器™并且需要确保初始化代码在mdlInitializeConditions函数只运行一次,然后将此初始化代码移动到mdlStart方法。MathWorks建议将此代码更改作为最佳实践。

如果此s函数驻留在已启用的配置为重置状态的子系统中,则当已启用的子系统重新执行时,Simulink引擎也会调用此方法。金宝appC MEX s功能可以使用ssIsFirstInitCond宏来确定mdlInitializeCondition被调用的时间是否等于模拟开始时间。

请注意

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

#定义MDL_INITIALIZE_CONDITIONS #if defined(MDL_INITIALIZE_CONDITIONS) && defined(MATLAB_MEX_FILE) static void mdlInitializeConditions(SimStruct *S){/*在这里添加mdlInitializeConditions代码*/}#endif

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

Simu金宝applink引擎调用mdlInitializeConditions然后再计算s函数的输入信号。因此,由于输入信号值还不可用,mdlInitializeConditions不应使用输入信号值来设置初始条件。如果你的s函数需要初始化内部值使用块的输入信号,在mdlOutputs

例如,在C MEX s -函数中,用一个元素初始化IWork向量mdlInitializeSizes方法。

ssSetNumIWork (S, 1);

IWork向量包含一个标志,指示是否已经指定了初始值。中初始化标志的值mdlInitializeCondition方法。

static void mdlInitializeConditions(SimStruct *S){/*当模拟开始时和每次启用的子系统被重新启用时,mdlInitializeConditions方法被调用。当值需要重新初始化时,将IWork标志重置为1。*/ ssSetIWorkValue(S, 0,1);}

中IWork向量标志的值mdlOutputs方法,以确定是否需要设置初始值。由于引擎已经在模拟的这一点上计算了输入值,因此mdlOutputs方法可以使用它们初始化内部值。

static void mdlOutputs(SimStruct *S, int_T tid){//如果IWork vector标志为真,则初始化值。// if (ssGetIWorkValue(S, 0) == 1){//在这里输入初始化代码//}// mdlOutputs函数的余数//}

对于二级MATLAB s函数,在前面的例子中使用DWork向量而不是IWork向量。

例子

这个示例将连续和离散状态初始化为1.0。

#define MDL_INITIALIZE_CONDITIONS /*更改为#undef删除*/ /*函数*/ #if defined(MDL_INITIALIZE_CONDITIONS) static void mdlInitializeConditions(SimStruct *S) {int i;real_T *xcont = ssGetContStates(S);int_T nCStates = ssGetNumContStates(S);real_T *xdisc = ssGetRealDiscStates(S);int_T nDStates = ssGetNumDiscStates(S);For (i = 0;i < nCStates;i++) {*xcont++ = 1.0;} for (i = 0;i < nDStates; i++) { *xdisc++ = 1.0; } } #endif /* MDL_INITIALIZE_CONDITIONS */

有关仅初始化连续状态的另一个示例,请参见resetint.c

版本历史

R2006a之前介绍