InitializeConditions

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

Необходимый

Нет

Язык

MATLAB

Синтаксис

InitializeConditions(s)

Аргументы

s

Экземпляр класса Simulink.MSFcnRunTimeBlock, представляющего Уровень 2 Блок s-function MATLAB.

Описание

Механизм Simulink® вызывает этот дополнительный метод в начале моделирования. Это должно инициализировать непрерывные и дискретные состояния, если таковые имеются, этого Блока s-function. На Уровне 2 S-функция MATLAB используйте ContStates или методы объекта периода выполнения Dwork, чтобы получить доступ к непрерывным и дискретным состояниям. Этот метод может также выполнить любые другие действия инициализации, которых требует эта S-функция.

Примечание

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

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

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

Например, в 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. Уровень 2 S-функции MATLAB хранят дискретные состояния в своих векторах DWork.

function InitializeConditions(s)

s.ContStates.Data(1) = 1;
s.Dwork(1).Data      = 1;

% endfunction

Представленный в R2012b

Была ли эта тема полезной?