mdlInitializeConditions

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

Необходимый

Нет

Языки

C, C++

Синтаксис

#define MDL_INITIALIZE_CONDITIONS
void mdlInitializeConditions(SimStruct *S)

Аргументы

S

SimStruct, представляющий Блок s-function.

Описание

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

Примечание

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

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

Примечание

Если у вас есть Simulink Coder при генерации кода для невстроенной S-функции MEX C, которая содержит этот метод, убедитесь, что метод не перенесен в оператор #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 доступным только для файла MEX MATLAB®. Если S-функция не встраивается, продукт Simulink Coder не может использовать этот метод, приводящий к ссылке или ошибкам времени выполнения.

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

Например, в S-функции MEX C, инициализирует вектор 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 //
}

Для Уровня 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