mdlInitializeSampleTimes

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

Необходимый

Да

Языки

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® принимает, что 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 

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

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