exponenta event banner

mdlInitializeSampleTimes

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

Необходимый

Да

Языки

C, C++

Синтаксис

#define MDL_INITIALIZE_SAMPLE_TIMES
void mdlInitializeSampleTimes(SimStruct *S)

Аргументы

S

SimStruct представляет S-функциональный блок.

Описание

Этот метод должен указывать время выборки и время смещения для каждой частоты выборки, при которой эта 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) {
}

Примечание

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

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

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

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