主要内容

mdlInitializeConditions

初始化此C MEX S函数的状态向量

要求的

语言

C, c++

语法

#定义MDL_初始化_条件空白mdlInitializeConditions (SimStruct *年代)

参数

年代

表示s -功能块的SimStruct。

描述

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

请注意

如果你有金宝appSimulink编码器™的初始化代码需要确保mdlInitializeConditions函数只运行一次,然后将此初始化代码移到mdlStartMathWorks建议将此代码更改作为最佳实践。

如果这个s函数驻留在已启用的、配置为重置状态的子系统中,那么当已启用的子系统重新启动执行时,Simulink引擎也会调用这个方法。金宝appC MEX s -函数可以使用ssIsFirstInitCond宏,以确定调用mdlinitializeconcondition的时间是否等于模拟开始时间。

请注意

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

#定义MDL_INITIALIZE_条件#如果已定义(MDL_INITIALIZE_条件)和已定义(MATLAB_MEX_文件)静态无效MDLinilizeConditions(SimStruct*S){/*在此处添加MDLinilizeConditions代码*/}#

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

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

例如,在C MEX s -函数中,使用中密度方法

ssSetNumIWork (S, 1);

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

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

检查中IWork vector标志的值mdlOutputs方法,以确定是否需要设置初始值。由于发动机已在模拟的此时计算了输入值mdlOutputs方法可以使用它们初始化内部值。

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

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

例子

本例将连续和离散状态初始化为1.0。

#define MDL_INITIALIZE_CONDITIONS /*更改为#undef来删除*/ /*function*/ #if define (MDL_INITIALIZE_CONDITIONS) static void mdlinitializconditions (SimStruct *S) {int i;real_T * xcontstates = ssGetContStates(S);int_T nCStates = ssGetNumContStates(S); / /设置多个状态real_T *xdisc = ssGetRealDiscStates(S);int_T nDStates = ssGetNumDiscStates(S); / /指定数据For (i = 0;我< nCStates;I ++) {*xcont++ = 1.0;} for (i = 0;我< nDStates; i++) { *xdisc++ = 1.0; } } #endif /* MDL_INITIALIZE_CONDITIONS */

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

在R2006a之前引入