В этом разделе описываются интерфейсы API, которые позволяют S-функциям использовать преимущества эффективности, обеспечиваемой абсолютными и истекшими таймерами. Макросы SimStruct предоставляются для использования в моделировании, а функции TLC - для генерации встроенного кода. Обратите внимание, что
Для генерации и использования новых таймеров, как описано выше, S-функции должны зарегистрировать необходимость использования абсолютного или истекшего таймера путем вызова ssSetNeedAbsoluteTime или ssSetNeedElapseTime в mdlInitializeSampleTime.
Существующие S-функции, считывающие абсолютное время, но не регистрируемые с помощью этих макросов, продолжают работать так, как ожидалось, но генерируют менее эффективный код.
Макросы SimStruct, описанные в этом разделе, предоставляют доступ к абсолютным и истекшим таймерам для S-функций во время моделирования.
В следующих функциях: SimStruct *S аргумент является указателем на simstruct вызывающей S-функции.
void ssSetNeedAbsoluteTime(SimStruct *S, boolean b): если b является TRUE, регистрирует, что вызывающая S-функция требует данных абсолютного времени, и назначает счетчик абсолютного времени для скорости, с которой S-функция выполняет (если такой счетчик еще не был назначен).
int ssGetNeedAbsoluteTime(SimStruct *S): возвращает 1, если S-функция зарегистрировала, что для нее требуется абсолютное время.
double ssGetTaskTime(SimStruct *S, tid): чтение абсолютного времени для данной задачи с идентификатором задачи tid. ssGetTaskTime работает прозрачно, независимо от того, используете ли вы новые функции таймера. ssGetTaskTime задокументировано в главе SimStruct Functions документации Simulink ®.
void ssSetNeedElapseTime(SimStruct *S, boolean b): если b является TRUE, регистрирует, что вызывающей S-функции требуются данные прошедшего времени, и назначает счетчик прошедшего времени для запускаемой подсистемы, в которой выполняется S-функция (если такой счетчик еще не был назначен). См. также Счетчики времени в запускаемых подсистемах.
int ssGetNeedElapseTime(SimStruct *S): возвращает 1, если S-функция зарегистрировала, что ей требуется прошедшее время.
void ssGetElapseTime(SimStruct *S, (double *)elapseTime): возврат в расположение, на которое указывает elapseTime, значение (как double) счетчика прошедшего времени, связанного с S-функцией.
void ssGetElapseTimeCounterDtype(SimStruct *S, (int *)dtype): возвращает тип данных счетчика прошедшего времени, связанного с S-функцией, в расположение, на которое указывает dtype. Эта функция предназначена для использования с ssGetElapseTimeCounter функция (см. ниже).
void ssGetElapseResolution(SimStruct *S, (double *)resolution): возвращает разрешение (то есть время выборки) счетчика прошедшего времени, связанного с S-функцией, в местоположение, на которое указывает resolution. Эта функция предназначена для использования с ssGetElapseTimeCounter функция (см. ниже).
void ssGetElapseTimeCounter(SimStruct *S, (void *)elapseTime)Эта функция предназначена для использования блоков, для которых требуются значения времени для вычислений с фиксированной точкой. ssGetElapseTimeCounter возвращается в расположение, на которое указывает elapseTimeцелочисленное значение счетчика прошедшего времени, связанного с S-функцией. Если размер счетчика равен 64 битам, то значение возвращается в виде массива из двух 32-разрядных слов, причем слово низкого порядка хранится по нижнему адресу.
Чтобы определить способ доступа к возвращаемому значению счетчика, получите тип данных счетчика путем вызова ssGetElapseTimeCounterDtype, как в следующем коде:
int *y_dtype;
ssGetElapseTimeCounterDtype(S, y_dtype);
switch(*y_dtype) {
case SS_DOUBLE_UINT32:
{
uint32_T dataPtr[2];
ssGetElapseTimeCounter(S, dataPtr);
}
break;
case SS_UINT32:
{
uint32_T dataPtr[1];
ssGetElapseTimeCounter(S, dataPtr);
}
break;
case SS_UINT16:
{
uint16_T dataPtr[1];
ssGetElapseTimeCounter(S, dataPtr);
}
break;
case SS_UINT8:
{
uint8_T dataPtr[1];
ssGetElapseTimeCounter(S, dataPtr);
}
break;
case SS_DOUBLE:
{
real_T dataPtr[1];
ssGetElapseTimeCounter(S, dataPtr);
}
break;
default:
ssSetErrorStatus(S, "Invalid data type for elaspe time
counter");
break;
}Если вы хотите использовать фактическое прошедшее время, выполните вызов ssGetElapseTime для непосредственного доступа к истекшему времени. Вам не нужно получать значение счетчика и вычислять прошедшее время.
double *y_elapseTime; . . . ssGetElapseTime(S, elapseTime)
Следующие функции TLC поддерживают счетчики времени в сгенерированном коде при встраивании S-функций путем написания для них сценариев TLC.
LibGetTaskTimeFromTID(block): Создает код для считывания абсолютного времени для задачи, в которой block выполняется.
LibGetTaskTimeFromTID задокументирован с другими временными функциями-образцами на справочных страницах библиотеки функций TLC в документации компилятора целевого языка.
Примечание
Не использовать LibGetT с этой целью. LibGetT всегда считывает базовую ставку (tid 0) таймер. Если LibGetT вызывается для блока, выполняющегося на субскоростях, считывается неверный таймер, что приводит к серьезным ошибкам.
LibGetElapseTime(system): Создает код для считывания счетчика прошедшего времени для system. (system - родительская система вызывающего блока.) Пример кода, сгенерированного этой функцией, см. в разделе Создание кода для счетчика прошедшего времени.
LibGetElapseTimeCounter(system): Создает код для считывания целочисленного значения счетчика прошедшего времени для system. (system - родительская система вызывающего блока.) Эта функция должна использоваться совместно с LibGetElapseTimeCounterDtypeId и LibGetElapseTimeResolution. (См. обсуждение ssGetElapseTimeCounter выше.)
LibGetElapseTimeCounterDtypeId(system): Создает код, возвращающий тип данных счетчика прошедшего времени для system. (system - родительская система вызывающего блока.)
LibGetElapseTimeResolution(system): Создает код, возвращающий разрешение счетчика прошедшего времени для system. (system - родительская система вызывающего блока.)