Инициализируйте векторы состояния этой 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
Start
, Outputs
, Simulink.RunTimeBlock
, Simulink.MSFcnRunTimeBlock
, mdlInitializeConditions