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