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