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 h.

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

  • [INHERITED_SAMPLE_TIME, 0.0]

  • [INHERITED_SAMPLE_TIME, FIXED_IN_MINOR_STEP_OFFSET]

Если количество частот дискретизации 0, механизм Simulink® принимает, что S-функция наследовала свою частоту дискретизации от блока, до которого это соединяется, i. e., то, что частота дискретизации

[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]
    

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

    [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

Была ли эта тема полезной?