Задайте частоты дискретизации, с которыми работает эта S-функция C MEX
Да
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® engine принимает, что 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
The define
оператор делает mdlInitializeSampleTimes
метод, доступный только для MATLAB® Файл MEX. Если S-функция не встроена, продукт Simulink Coder не может использовать этот метод, что приводит к ошибкам ссылки или времени выполнения.