Инициализация векторов состояния этой S-функции MATLAB
Нет
MATLAB
InitializeConditions(s)
s
Экземпляр Simulink.MSFcnRunTimeBlock класс, представляющий Уровень 2 MATLAB S-Function block.
Модуль Simulink ® вызывает этот дополнительный метод в начале моделирования. Он должен инициализировать непрерывные и дискретные состояния, если таковые имеются, этого S-функционального блока. В Level-2 MATLAB S-функции используйте ContStates или Dwork методы объекта времени выполнения для доступа к непрерывному и дискретному состояниям. Этот метод также может выполнять любые другие операции инициализации, которые требуются для этой S-функции.
Примечание
Если у вас есть Simulink Coder™, и необходимо убедиться, что код инициализации в InitializeConditions функция запускается только один раз, затем перемещает этот код инициализации в Start способ. MathWorks рекомендует это изменение кода в качестве передовой практики.
Если эта S-функция находится в включенной подсистеме, сконфигурированной для сброса состояний, модуль Simulink также вызывает этот метод, когда включенная подсистема перезапускает выполнение.
Вызов модуля Simulink InitializeConditions перед вычислением входных сигналов S-функции. Поэтому, поскольку значения входного сигнала еще не доступны, InitializeConditions не следует использовать значения входного сигнала для установки начальных условий. Если вашей S-функции требуется инициализировать внутренние значения с помощью входных сигналов блока, выполните инициализацию в Outputs.
Например, в 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. Level-2 S-функции MATLAB сохраняют дискретные состояния в векторах DWork.
function InitializeConditions(s) s.ContStates.Data(1) = 1; s.Dwork(1).Data = 1; % endfunction