Инициализируйте векторы состояния этой S-функции MATLAB
Нет
MATLAB
InitializeConditions(s)
s
Экземпляр Simulink.MSFcnRunTimeBlock
класс, представляющий блок Level-2 MATLAB S-function.
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
Start
, Outputs
, Simulink.RunTimeBlock
, Simulink.MSFcnRunTimeBlock
, mdlInitializeConditions