mdlInitializeSampleTimes

Задайте частоты дискретизации, с которыми работает эта S-функция C MEX

Необходимый

Да

Языки

C, C++

Синтаксис

#define MDL_INITIALIZE_SAMPLE_TIMES
void mdlInitializeSampleTimes(SimStruct *S)

Аргументы

S

SimStruct, представляющий блок S-Function.

Описание

Этот метод должен задать шаг расчета и время смещения для каждой частоты дискретизации, с которой эта S-функция работает через следующие парные макросы

ssSetSampleTime(S, sampleTimeIndex, sample_time)
ssSetOffsetTime(S, offsetTimeIndex, offset_time)

где sampleTimeIndex выполняется из 0 на единицу меньше, чем количество шагов расчета, заданное в mdlInitializeSizes через ssSetNumSampleTimes.

Если S-функция работает с одной или несколькими скоростями дискретизации, этот метод может задать любое из следующих значений шага расчета и смещения для данного шага расчета:

  • [CONTINUOUS_SAMPLE_TIME, 0.0]

  • [CONTINUOUS_SAMPLE_TIME, FIXED_IN_MINOR_STEP_OFFSET]

  • [discrete_sample_period, offset]

  • [VARIABLE_SAMPLE_TIME, 0.0]

Заглавные значения являются макросами, заданными в sl_sample_time_defs.h.

Если S-функция работает с одной скоростью, этот метод может альтернативно задать шаг расчета на одну из следующих пар времени дискретизации/смещения.

  • [INHERITED_SAMPLE_TIME, 0.0]

  • [INHERITED_SAMPLE_TIME, FIXED_IN_MINOR_STEP_OFFSET]

Если количество шагов расчета 0, Simulink® engine принимает, что S-функция наследует свой шаг расчета от блока, с которым она связана, т.е. что шаг расчета является

[INHERITED_SAMPLE_TIME,  0.0]

Поэтому этот метод может вернуться, ничего не делая.

При определении шагов расчета используйте следующие инструкции.

  • Непрерывная функция, которая изменяется во время незначительных шагов интегрирования, должна устанавливать шаг расчета на

    [CONTINUOUS_SAMPLE_TIME, 0.0]
    
  • Непрерывная функция, которая не меняется во время незначительных шагов интегрирования, должна устанавливать шаг расчета на

    [CONTINUOUS_SAMPLE_TIME, FIXED_IN_MINOR_STEP_OFFSET]
    
  • Дискретная функция, которая изменяется с заданной скоростью, должна устанавливать шаг расчета на

    [discrete_sample_period, offset]
    

    где

    discrete_sample_period > 0.0 
    

    и

    0.0 <= offset < discrete_sample_period
    
  • Дискретная функция, которая изменяется с переменной скоростью, должна устанавливать шаг расчета на

    [VARIABLE_SAMPLE_TIME, 0.0]
    

    Механизм Simulink вызывает mdlGetTimeOfNextVarHit функция, чтобы получить время следующей выборки хита для дискретной задачи с переменным шагом.

    Обратите внимание, что VARIABLE_SAMPLE_TIME требуется решатель переменного шага.

  • Чтобы работать правильно в триггируемой подсистеме или периодической системе, дискретная S-функция должна

    • Задайте один набор шага расчета в

      [INHERITED_SAMPLE_TIME, 0.0]
      
    • Использовать ssSetOptions для установки SS_OPTION_DISALLOW_CONSTANT_SAMPLE_TIME опция симуляции в mdlInitializeSizes

    • Проверьте, что ему был назначен дискретный или инициированный шаг расчета mdlSetWorkWidths:

      if (ssGetSampleTime(S, 0) == CONTINUOUS_SAMPLE_TIME) {
         ssSetErrorStatus(S, 
           "This block cannot be assigned a continuous sample 
      			time");
       }
      

    После распространения шагов расчета по всему блоку, механизм присваивает шаг расчета

    [INHERITED_SAMPLE_TIME, INHERITED_SAMPLE_TIME]
    

    к дискретным блокам, находящимся в триггируемых подсистемах.

Если эта функция не имеет внутреннего шага расчета, она должна установить время расчета на наследуемое в соответствии со следующими рекомендациями:

  • Функция, которая изменяется по мере изменения ее входа, даже во время незначительных шагов интегрирования, должна задать свой шаг расчета на

    [INHERITED_SAMPLE_TIME, 0.0]
    

    Функция, которая изменяется по мере изменения входов, но не изменяется во время незначительных шагов интегрирования (то есть удерживается во время мелких шагов), должна устанавливать шаг расчета на

    [INHERITED_SAMPLE_TIME, FIXED_IN_MINOR_STEP_OFFSET]
    

S-функция должна использовать ssIsSampleHit или ssIsContinuousTask макросы для проверки на наличие выборки хита во время выполнения (в mdlOutputs или mdlUpdate). Для примера, если первый шаг расчета блока непрерывен, функция может использовать следующий фрагмент кода для проверки на выборку попадания.

if (ssIsContinuousTask(S,tid)) {
}

Примечание

Функция получает неправильные результаты, если использует ssIsSampleHit(S,0,tid).

Если функция хочет определить, имеет ли третья (дискретная) задача хит, она может использовать следующий фрагмент кода.

if (ssIsSampleHit(S,2,tid) {
}

Примечание

Если у вас есть Simulink Coder™, при генерации кода для нелинейной S-функции, которая содержит этот метод, убедитесь, что метод не упакован в #if defined(MATLAB_MEX_FILE) оператор. Для примера:

#if defined(MATLAB_MEX_FILE) 
static void mdlInitializeSampleTimes(SimStruct *S) 
{ 
   /* Add mdlInitializeSampleTimes code here *
} 
#endif 

The define оператор делает mdlInitializeSampleTimes метод, доступный только для MATLAB® Файл MEX. Если S-функция не встроена, продукт Simulink Coder не может использовать этот метод, что приводит к ошибкам ссылки или времени выполнения.

Представлено до R2006a