В этом разделе описываются 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 документации Target Language Compiler.
Примечание
Не используйте LibGetT с этой целью. LibGetT всегда читает базовую ставку (tid 0) таймер. Если LibGetT вызывается блок, выполняемый в субрейте, считывается неправильный таймер, вызывающий серьезные ошибки.
LibGetElapseTime(system): Генерирует код, чтобы считать истекший счетчик времени для system. (system является родительской системой блока вызова.) Пример кода, сгенерированного этой функцией, см. в разделе Сгенерировать код для счетчика истекшего времени.
LibGetElapseTimeCounter(system): Генерирует код, чтобы считать целое значение прошедшего счетчика времени для system. (system является родительской системой блока вызова.) Эта функция должна использоваться в сочетании с LibGetElapseTimeCounterDtypeId и LibGetElapseTimeResolution. (См. обсуждение ssGetElapseTimeCounter выше.)
LibGetElapseTimeCounterDtypeId(system): Генерирует код, который возвращает тип данных прошедшего счетчика времени для system. (system является родительской системой блока вызова.)
LibGetElapseTimeResolution(system): Генерирует код, который возвращает разрешение прошедшего счетчика времени для system. (system является родительской системой блока вызова.)