Инициализируйте векторы состояния этой S-функции C MEX
Нет
C, C++
#define MDL_INITIALIZE_CONDITIONS
void mdlInitializeConditions(SimStruct *S)
S
SimStruct, представляющий блок S-Function.
Simulink® engine вызывает этот необязательный метод в начале симуляции. Он должен инициализировать непрерывные и дискретные состояния, если таковые имеются, этого блока S-Function. В функции MEX S на C используйте
и/или ssGetContStates
для доступа к состояниям. Этот метод может также выполнить любые другие действия инициализации, которые требуются этой S-функции.ssGetDiscStates
Примечание
Если у вас есть Simulink Coder™ и вы должны убедиться, что код инициализации в mdlInitializeConditions
функция запускается только один раз, затем перемещает этот код инициализации в mdlStart
способ. MathWorks рекомендует это изменение кода как лучшую практику.
Если эта S-функция находится в включенной подсистеме, настроенной на сброс состояний, механизм Simulink также вызывает этот метод, когда включенная подсистема перезапускает выполнение. S-функции MEX на C могут использовать ssIsFirstInitCond
макрос, чтобы определить, равно ли время, в которое вызывается mdlInitializeCondition, времени начала симуляции.
Примечание
Если у вас есть Simulink Coder, при генерации кода для неинлинфицированной S-функции C MEX, которая содержит этот метод, убедитесь, что метод не упакован в #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
The define
оператор делает mdlInitializeConditions
метод, доступный только для MATLAB® Файл MEX. Если S-функция не встроена, продукт Simulink Coder не может использовать этот метод, что приводит к ошибкам ссылки или времени выполнения.
Механизм Simulink вызывает mdlInitializeConditions
перед вычислением входных сигналов S-функции. Поэтому, поскольку значения входного сигнала еще не доступны, mdlInitializeConditions
не следует использовать значения входного сигнала для установки начальных условий. Если вашей S-функции необходимо инициализировать внутренние значения с помощью входных сигналов блока, выполните инициализацию в mdlOutputs
.
Для примера в S-функции C MEX инициализирует вектор 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.
#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