exponenta event banner

mdlInitializeConditions

Инициализация векторов состояния этой S-функции C MEX

Необходимый

Нет

Языки

C, C++

Синтаксис

#define MDL_INITIALIZE_CONDITIONS
void mdlInitializeConditions(SimStruct *S)

Аргументы

S

SimStruct представляет S-функциональный блок.

Описание

Модуль Simulink ® вызывает этот дополнительный метод в начале моделирования. Он должен инициализировать непрерывные и дискретные состояния, если таковые имеются, этого S-функционального блока. В S-функции C MEX используйтеssGetContStates и/или ssGetDiscStates для доступа к штатам. Этот метод также может выполнять любые другие операции инициализации, которые требуются для этой S-функции.

Примечание

Если у вас есть Simulink Coder™ и необходимо убедиться, что код инициализации в mdlInitializeConditions функция запускается только один раз, затем перемещает этот код инициализации в mdlStart способ. MathWorks рекомендует это изменение кода в качестве передовой практики.

Если эта S-функция находится в включенной подсистеме, сконфигурированной для сброса состояний, модуль Simulink также вызывает этот метод, когда включенная подсистема перезапускает выполнение. C MEX S-функции могут использовать ssIsFirstInitCond чтобы определить, равно ли время, в которое вызывается mdlInitialityCondition, времени начала моделирования.

Примечание

При наличии Simulink Coder при создании кода для неинлинной C MEX S-функции, содержащей этот метод, убедитесь, что метод не заключен в #if defined(MATLAB_MEX_FILE) заявление. Например:

#define MDL_INITIALIZE_CONDITIONS 
#if defined(MDL_INITIALIZE_CONDITIONS) && defined(MATLAB_MEX_FILE) 
static void mdlInitializeConditions(SimStruct *S) 
{ 
   /* Add mdlInitializeConditions code here */
} 
#endif 

define оператор делает mdlInitializeConditions метод доступен только для файла MATLAB ® MEX. Если S-функция не встроена, продукт Simulink Coder не может использовать этот метод, что приводит к ошибкам связи или времени выполнения.

Вызов модуля Simulink mdlInitializeConditions перед вычислением входных сигналов S-функции. Поэтому, поскольку значения входного сигнала еще не доступны, mdlInitializeConditions не следует использовать значения входного сигнала для установки начальных условий. Если вашей S-функции требуется инициализировать внутренние значения с помощью входных сигналов блока, выполните инициализацию в mdlOutputs.

Например, в C MEX S-функции инициализирует вектор IWork с одним элементом в mdlInitializeSizes способ.

ssSetNumIWork(S, 1);

Вектор IWork содержит флаг, указывающий, были ли заданы начальные значения. Инициализируйте значение флага в mdlInitializeCondition способ.

static void mdlInitializeConditions(SimStruct *S)
{
  /* The mdlInitializeConditions method is called when the simulation
     start and every time an enabled subsystem is re-enabled.
     
     Reset the IWork flag to 1 when values need to be reinitialized.*/

  ssSetIWorkValue(S, 0, 1);
}

Проверьте значение флага вектора IWork в mdlOutputs для определения необходимости установки начальных значений. Поскольку двигатель рассчитал входные значения в этой точке моделирования, mdlOutputs метод может использовать их для инициализации внутренних значений.

static void mdlOutputs(SimStruct *S, int_T tid)
{
    // Initialize values if the IWork vector flag is true. //
    if (ssGetIWorkValue(S, 0) == 1) {
             // Enter initialization code here //
    }

    // Remainder of mdlOutputs function //
}

Для Level-2 S-функции MATLAB используйте вектор DWork вместо вектора IWork в предыдущем примере.

Пример

В этом примере инициализируется непрерывное и дискретное состояние до 1,0.

#define MDL_INITIALIZE_CONDITIONS   /*Change to #undef to remove */
                                    /*function*/
#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