Эта тема описывает API, которые позволяют вашим S-функциям использовать в своих интересах КПД, предлагаемые абсолютными и прошедшими таймерами. Макросы SimStruct обеспечиваются для использования в симуляции, и функции TLC предоставляются встроенной генерации кода. Обратите внимание на то, что
Чтобы сгенерировать и использовать новые таймеры, аналогичные описанному выше, ваши S-функции должны указать потребность использовать абсолютный или прошедший таймер путем вызова ssSetNeedAbsoluteTime или ssSetNeedElapseTime \in 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 документации 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 Function Library Reference документации Компилятора Выходного языка.
Примечание
Не использовать LibGetT с этой целью. LibGetT всегда читает базовую ставку (tid 0) таймер. Если LibGetT называется для блока, выполняющегося на подуровне, неправильный таймер читается, вызывая серьезные ошибки.
LibGetElapseTime(system): Генерирует код, чтобы считать счетчик прошедшего времени для systemсистема родительская система блока вызова.) Видят, Генерируют Код для Счетчика Прошедшего времени для примера кода, сгенерированного этой функцией.
LibGetElapseTimeCounter(system): Генерирует код, чтобы считать целочисленное значение счетчика прошедшего времени для systemсистема родительская система блока вызова.) Эта функция должна использоваться в сочетании с LibGetElapseTimeCounterDtypeId и LibGetElapseTimeResolution. (См. обсуждение ssGetElapseTimeCounter выше.)
LibGetElapseTimeCounterDtypeId(system): Генерирует код, который возвращает тип данных счетчика прошедшего времени для systemсистема родительская система блока вызова.)
LibGetElapseTimeResolution(system): Генерирует код, который возвращает разрешение счетчика прошедшего времени для systemсистема родительская система блока вызова.)