Инициализируйте векторы состояния этой S-функции MEX C
Нет
C, C++
#define MDL_INITIALIZE_CONDITIONS
void mdlInitializeConditions(SimStruct *S)
S
SimStruct, представляющий Блок s-function.
Механизм Simulink® вызывает этот дополнительный метод в начале симуляции. Это должно инициализировать непрерывные и дискретные состояния, если таковые имеются, этого Блока s-function. В S-функции MEX C используйте
и/или ssGetContStates
, чтобы получить доступ к состояниям. Этот метод может также выполнить любые другие действия инициализации, которых требует эта S-функция.ssGetDiscStates
Если у вас есть 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
.
mdlStart
, mdlOutputs
, ssIsFirstInitCond
, ssGetContStates
, ssGetDiscStates
, ssGetTStart
, ssGetT
, InitializeConditions