Задайте частоты дискретизации, на уровне которых действует эта 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 не может использовать этот метод, приводящий к ссылке или ошибкам времени выполнения.