exponenta event banner

Функции входного сигнала

LibBlockInputHasSymboldwidth (portIdx

)

Возвращает значение 1 (true), если указанный индекс входного порта блока имеет символьные размеры. Эта функция принимает индекс порта в качестве входного аргумента.

Посмотрите LibBlockInputHasSymbolicWidth в blkio_api.tlc.

LibBlockInputPortIndexMode (блок, pidx

)

Цель

Определяет режим индекса входного порта блока.

Аргументы

block - Запись о блокировке

pidx - Индекс порта

Прибыль

"" для неиндексного порта, и "Zero-based" или "One-based" в противном случае.

Описание

Если входной порт block устанавливается как порт индекса, а его база индексирования помечается как основанная на нуле или на единице, эта информация записывается в model.rtw файл. LibBlockInputPortIndexMode запрашивает базу индексации для перехода к другому коду в соответствии с базой индексации входного порта.

Пример

%if LibBlockInputPortIndexMode(block, pidx) == "Zero-based"
  ...
%elseif LibBlockInputPortIndexMode(block, pidx) == "One-based"
  ...
%else
  ...
%endif

Посмотрите LibBlockInputPortIndexMode в blkiolib.tlc.

Количество LibBlockInputPortIsImentedQuantity (portIdx

)

Возвращает, принимает ли входной порт сигнал совместного моделирования. Эта функция принимает индекс порта в качестве входного аргумента.

Посмотрите LibBlockInputPortIsContinuousQuantity в blkio_api.tlc.

LibBlockInputSignal (portIdx, ucv, lcv, sigIdx

)

На основе номера входного порта (portIdx), управляющую переменную пользователя (ucv), переменная управления контуром (lcv), индекс сигнала (sigIdx), и откуда поступает этот входной сигнал, LibBlockInputSignal возвращает ссылку на входной сигнал блока.

Возвращенное строковое значение является допустимым rvalue (правое значение) для выражения. Входной сигнал блока может поступать от другого блока, вектора состояния или внешнего входа, или он может быть постоянной литерала (например, 5.0).

Примечание

Не использовать LibBlockInputSignal для доступа к адресу входного сигнала.

Поскольку возвращаемое значение может быть константой литерала, использовать его не следует LibBlockInputSignal для доступа к адресу входного сигнала. Для доступа к адресу входного сигнала используйте LibBlockInputSignalAddr. Доступ к адресу сигнала через LibBlockInputSignal может привести к ссылке на литеральную константу (например, 5.0).

Например, следующее не сработает.

%assign u = LibBlockInputSignal(0, "", lcv, sigIdx)
x = &%<u>;

Если %<u> относится к инвариантному сигналу со значением 4.95, оператор (после обработки препроцессором) будет сгенерирован как

x = &4.95;

или, если входные источники сигнала на землю, оператор может выйти как

x = &0.0;

Ни один из них не будет скомпилирован.

Избегайте таких ситуаций, используя LibBlockInputSignalAddr.

%assign uAddr = LibBlockInputSignalAddr(0, "", lcv, sigIdx)
x = %<uAddr>;

Генератор кода отслеживает сигналы и параметры, к которым обращаются по их адресам, и объявляет их в адресуемой памяти.

Входные аргументы

Следующая таблица суммирует входные аргументы для LibBlockInputSignal.

Аргументы LibBlockInputSignal

АргументОписание

portIdx

Целое число, указывающее индекс входного порта (на основе нуля).

Примечание: Для некоторых встроенных блоков portIdx может быть строкой, идентифицирующей порт (например, "enable" или "trigger").

ucv

Управляющая переменная пользователя. Должно быть строкой, либо индексирующим выражением, либо "".

lcv

Переменная управления контуром. Должно быть строкой, либо индексирующим выражением, либо "".

sigIdx

Целочисленный литерал или строка формы

%<tRealPart>Integer
%<tImagPart>Integer

Например, следующее обозначает действительную часть сигнала и мнимую часть сигнала, начиная с 5:

"%<tRealPart>5"
"%<tImagPart>5"

Общее использование

Использование LibBlockInputSignal относятся к категориям, описанным ниже.

Прямая индексация.  Если ucv == "" и lcv == "", LibBlockInputSignal возвращает индексирующее выражение для элемента, указанного sigIdx.

Перекатывание/разворачивание петель.  В этом случае lcv и sigIdx генерируются системой %roll директива, и ucv должно быть "". Непустое значение для lcv допускается только при создании %roll директива и при использовании файла TLC ролика (или предоставленного пользователем файла TLC ролика, который соответствует той же самой обработке смещения переменной/сигнала). Кроме того, звонки на LibBlockInputSignal с lcv должно происходить только тогда, когда "U" или определенный входной порт (например, "u0") передается в %roll директива через аргумент rolle variables.

В следующем примере показана S-функция одного порта ввода/одного порта вывода.

%assign rollVars  = ["U", "Y", "P"]
%roll sigIdx=RollRegions, lcv=RollThreshold, block, ...
    "Roller", rollVars
  %assign u = LibBlockInputSignal( 0, "", lcv, sigIdx)
  %assign y = LibBlockOutputSignal(0, "", lcv, sigIdx)
  %assign p = LibBlockParameter(   0, "", lcv, sigIdx)
  %<y> = %<p> * %<u>;
%endroll

С помощью %roll директива, sigIdx - начальный индекс текущей области рулона и lcv является "" или индексирующую переменную. Ниже приведены примеры допустимых значений:

LibBlockInputSignal(0, "", lcv, sigIdx)    rtB.blockname[0]

LibBlockInputSignal(0, "", lcv, sigIdx)    u[i]

В первом примере: LibBlockInputSignal прибыль rtB.blockname[2] когда входной порт подключен к выходу другого блока, и

  • Переменная управления контуром (lcv), генерируемой %roll директива пуста, указывающая, что текущая область крена ниже порога крена, и sigIdx является 0.

  • Ширина входного порта равна 1, указывая, что этот порт расширяется скалярно.

    Если sigIdx ненулевое, то rtB.blockname[sigIdx] возвращается. Например, если sigIdx является 3, то rtB.blockname[3] возвращается.

Во втором примере: LibBlockInputSignal прибыль u[i] когда текущая область крена выше порога крена и ширина входного порта не является скалярной (широкой). В этом случае файл TLC ролика устанавливает локальную переменную, u, для указания на входной сигнал и код в текущем %roll директива помещена в for цикл.

В другом примере рассмотрим блок с множеством входных портов, где каждый порт имеет ширину, большую или равную 1, и, по меньшей мере, один порт имеет ширину, равную 1. Следующий код устанавливает выходной сигнал в сумму квадратов входных сигналов.

%assign y = LibBlockOutputSignal(0, "", "", 0)
%<y> = 0;

%assign rollVars = ["U"]
%foreach port = block.NumDataInputPorts - 1
  %roll sigIdx=RollRegions, lcv = RollThreshold, block, ...
    "Roller", rollVars
  %assign u = LibBlockInputSignal(port, "", lcv, sigIdx)
  %<y> += %<u> * %<u>;
  %endroll
%endforeach

Потому что первый параметр LibBlockInputSignal является 0 проиндексирован, необходимо проиндексировать foreach цикл для запуска с 0 и заканчиваются на NumDataInputPorts-1.

Обработка переменной управления пользователем (ucv).  Это расширенный режим, который обычно не требуется авторам S-функций.

Если ucv != "", LibBlockInputSignal возвращает rvalue для входного сигнала с использованием выражения индексации переменной управления пользователя. Выражение индексирования управляющих переменных имеет следующий вид:

rvalue_id[%<ucv>]%<optional_real_or_imag_part>

Получить rvalue_id, посмотрите на целую часть sigIdx. Необходимо указать sigIdx поскольку вход в этот блок может быть прерывистым, что означает, что вход может поступать из нескольких различных областей памяти (источников сигнала) и sigIdx используется для определения области, представляющей интерес для ucv. Также можно использовать sigIdx для определения, должна ли быть доступна действительная или мнимая часть сигнала.

Вы можете получить optional_real_or_imag_part из строковой части sigIdx (т.е. "re", или "im", или "").

Обратите внимание, что значение для lcv игнорируется и sigIdx должен указывать на тот же элемент во входном сигнале, на который указывает ucv первоначально точки.

Обработка ucv с LibBlockInputSignal требует ухода. Рассмотрим прерывистый входной сигнал, подаваемый на входной порт, как показано на следующей блок-схеме:

Использовать ucv надежным образом, вы должны использовать %roll директива с порогом крена 1 и Roller TLC-файл, который не имеет настройки заголовка/трейлера контура для этого входного сигнала. Кроме того, необходимо использовать ROLL_ITERATIONS для определения ширины текущей области рулона, как в следующем TLC-коде:

{
int i;

%assign rollVars  = [""]
%assign threshold = 1
  %roll sigIdx=RollRegions, lcv=threshold, block, ...
    "FlatRoller", rollVars
  %assign u = LibBlockInputSignal( 0, "i", "", sigIdx)
  %assign y = LibBlockOutputSignal(0, "i+%<sigIdx>", "", sigIdx)
  %assign p = LibBlockParameter( 0, "i+%<sigIdx>", "", sigIdx)
  for (i = 0; i < %<ROLL_ITERATIONS()>; i++) {
    %<y> = %<p> * %<u>;
  }
%endroll
}

Обратите внимание, что FlatRoller не имеет настройки заголовка/трейлера цикла (rollVars игнорируется). Его цель - пройти RollRegions блока. Кроме того, можно принудительно ввести смежный входной сигнал в блок, указав

ssSetInputPortRequiredContiguous(S, port, TRUE)

в вашей S-функции.

В этом случае код TLC упрощает

{
%assign u = LibBlockInputSignal( 0, "i", "", 0)
%assign y = LibBlockOutputSignal(0, "i", "", 0)
%assign p = LibBlockParameter(   0, "i", "", 0)

for (i = 0; i < %<LibBlockInputSignalWidth(0)>; i++) {
  %<y> = %<p> * %<u>;
  }
}

Если создается собственный ролик, и индексация не соответствует способу работы файла TLC ролика, предоставленного MathWorks, то необходимо использовать ucv вместо lcv.

Обработка входных аргументов: ucv, lcv и sigIdx

Рассмотрим следующие случаи:

Функция (варианты 1, 2, 3,4)Пример возвращаемого значения
LibBlockInputSignal(0, "i", "", sigIdx)rtB.blockname[i]
LibBlockInputSignal(0, "i", "", sigIdx)rtU.signame[i]
LibBlockInputSignal(0, "", lcv, sigIdx)u0[i1]
LibBlockInputSignal(0, "", lcv, sigIdx)rtB.blockname[0]

Возвращаемое значение зависит от того, к чему подключен входной сигнал на блок-схеме и как вызывается функция (например, в %roll или непосредственно). В приведенном выше примере

  • Случаи 1 и 2 возникают при явном вызове с помощью ucv установить в значение "i".

    Случай 1 возникает, когда sigIdx указывает на вектор ввода-вывода блока, т.е. на первый элемент, "i" начинается с. Например, при инициализации "i" начинается со смещения 5, то вы должны указать sigIdx == 5.

    Случай 2 возникает, когда sigIdx указывает на внешний входной вектор, т.е. первый элемент, который "i" начинается с. Например, при инициализации "i" для начала со смещением 20, то вы должны указать sigIdx == 20.

  • Дела 3 и 4 получают одни и те же аргументы, lcv и sigIdx; однако они дают различные возвращаемые значения.

    Случай 3 возникает, когда LibBlockInputSignal вызывается в пределах %roll директива и катится текущая область рулона (lcv != "").

    Случай 4 возникает, когда LibBlockInputSignal вызывается в пределах %roll директива и текущая область рулона не катится (lcv == "").

При вызове в пределах%roll директива, LibBlockInputSignal смотрит на ucv, lcv, и sigIdx, текущую область рулона и текущий порог рулона для определения возвращаемого значения. Переменная ucv имеет наивысший приоритет, lcv имеет следующий наивысший приоритет, и sigIdx имеет наименьший приоритет. То есть, если ucv указывается, используется (таким образом, при вызове в %roll директива обычно ""). Если ucv не указан, и если lcv и sigIdx указаны, возвращенное значение зависит от того, помещается ли текущая область рулона в for закольцовывается или расширяется. Если область рулона помещается в петлю, то lcv используется; в противном случае sigIdx используется.

Прямой вызов LibBlockInputSignal (внутри или снаружи %roll директива) использует sigIdx когда ucv и lcv указаны как "".

Для примера LibBlockInputSignal, см. sfun_multiport.tlc.

См. также blkiolib.tlc.

LibBlockInputSignalAddr (portIdx, ucv, lcv, sigIdx

)

Возвращает строку, предоставляющую адрес памяти указанного сигнала входного порта блока.

При необходимости ввода адреса сигнала необходимо использовать LibBlockInputSignalAddr вместо добавления "&"в строку, возвращенную LibBlockInputSignal. Например, LibBlockInputSignal может возвращать константу литерала, например 5 (т.е. инвариантный входной сигнал). Генератор кода отслеживает, когда LibBlockInputSignalAddr вызывается в инвариантном сигнале и объявляет сигнал как const данные (которые являются адресуемыми), вместо того, чтобы помещаться как литеральная константа в генерируемый код (который не является адресуемым).

Обратите внимание, что последний входной аргумент, sigIdx, не перегружен, в котором находится LibBlockInputSignal. Следовательно, если входной сигнал является комплексным, возвращается адрес комплексного контейнера.

Пример

Чтобы получить адрес широкого входного сигнала и передать его функции пользователя для обработки, можно использовать

%assign uAddr = LibBlockInputSignalAddr(0, "", "", 0) 
%assign y = LibBlockOutputSignal(0, "", "", 0)
%<y> = myfcn(%<uAddr>);

Посмотрите LibBlockInputSignalAddr в blkiolib.tlc.

LibBlockInputSignalAliasedThruDataTypeName
(portIdx, рейм)

Возвращает имя псевдонимированного типа данных (например, int_T, ... creal_T), соответствующий указанному входному порту блока. Укажите reim аргумент как "" (пустое), если требуется полное имя типа сигнала.

Например, если reim == "" и первый выходной порт является реальным и сложным, имя типа данных помещено в dtname является creal_T.

%assign dtname = LibBlockInputSignalDataTypeName(0,"")

Определить reim как tRealPart если требуется имя типа необработанного элемента. Например, если reim == tRealPart и первый выходной порт является реальным и сложным, возвращаемое имя типа данных real_T.

%assign dtname = LibBlockOutputSignalDataTypeName(0,tRealPart)

Посмотрите LibBlockInputSignalAliasedThruDataTypeName в blkiolib.tlc.

LibBlockInputSignalAllScalarExepr (блок, portIdx

)

Пусть входной сигнал является выражением, даже если выходной сигнал широк. Эта функция принимает запись блока и индекс порта в качестве входных аргументов. Вызовите эту функцию из BlockInstanceSetup функция.

Посмотрите LibBlockInputSignalAllowScalarExpandedExpr в blkio_api.tlc.

LibBlockInputSignalASCIIEscapedUnitExpr (portIdx

)

Возвращает удаленное имя единиц, соответствующих указанному входному порту блока. Эта функция принимает индекс порта в качестве входного аргумента.

Посмотрите LibBlockInputSignalASCIIEscapedUnitExpr в blkio_api.tlc.

LibBlockInputSignalConnected (portIdx

)

Возвращает 1, если указанный входной порт подключен к блоку, отличному от блока Ground, и 0 в противном случае.

Посмотрите LibBlockInputSignalConnected вblkio_api.tlc .

LibBlockInputSignalDataTypeId (portIdx

)

Возвращает числовой идентификатор (id), соответствующий типу данных указанного входного порта блока.

Если сигнал входного порта сложен, LibBlockInputSignalDataTypeId возвращает тип данных вещественной части (или мнимой части) сигнала.

Посмотрите LibBlockInputSignalDataTypeId в blkiolib.tlc.

LibBlockInputSignalDataTypeName (portIdx, reim

)

Возвращает имя типа данных (например, int_T, ... creal_T), соответствующий указанному входному порту блока.

Укажите reim аргумент как "" если требуется полное имя типа сигнала. Например, если reim=="" и первый выходной порт является реальным и сложным, имя типа данных помещено в dtname является creal_T.

%assign dtname = LibBlockInputSignalDataTypeName(0,"")

Укажите reim аргумент как tRealPart если требуется имя типа необработанного элемента. Например, если reim==tRealPart и первый выходной порт является реальным и сложным, возвращаемое имя типа данных real_T.

%assign dtname = LibBlockInputSignalDataTypeName(0,tRealPart)

Посмотрите LibBlockInputSignalDataTypeName в blkiolib.tlc.

LibBlockInputSignalDimensions (portIdx

)

Возвращает размерный вектор указанного входного порта блока, например, [2,3].

Посмотрите LibBlockInputSignalDimensions в blkio_api.tlc.

LibBlockInputSignalIsComplex (portIdx

)

Возвращает 1, если указанный входной порт блока является сложным, в противном случае 0.

Посмотрите LibBlockInputSignalIsComplex в blkio_api.tlc.

LibBlockInputSignalIsExpr (portIdx

)

Возвращает 1 (true), если входной сигнал является выражением (по сравнению с переменной), и 0 (false) в противном случае. Эта функция принимает индекс порта в качестве входного аргумента.

Посмотрите LibBlockInputSignalIsExpr в blkio_api.tlc.

LibBlockInputSignalIsFrameData (portIdx

)

Возвращает 1, если указанный входной порт блока основан на кадре, в противном случае - 0.

Посмотрите LibBlockInputSignalIsFrameData в blkio_api.tlc.

LibBlockInputSignalIsTrivureExpr (portIdx

)

Возвращает 1 (true), если входной сигнал является тривиальным выражением (по сравнению с переменной), и 0 (false) в противном случае. Эта функция принимает индекс порта в качестве входного аргумента.

Посмотрите LibBlockInputSignalIsTrivialExpr в blkio_api.tlc.

LibBlockInputSignalLocalSampleTimeIndex
(portIdx)

Возвращает индекс времени локальной выборки, соответствующий указанному входному порту блока.

Посмотрите LibBlockInputSignalLocalSampleTimeIndex в blkiolib.tlc.

LibBlockInputSignalNumDimensions (portIdx

)

Возвращает число размеров указанного входного порта блока.

Посмотрите LibBlockInputSignalNumDimensions в blkio_api.tlc.

LibBlockInputSignalOffsetTime (portIdx

)

Возвращает время смещения, соответствующее указанному входному порту блока.

Посмотрите LibBlockInputSignalOffsetTime в blkiolib.tlc.

LibBlockInputSignalSampleTime (portIdx

)

Возвращает время выборки, соответствующее указанному входному порту блока.

Посмотрите LibBlockInputSignalSampleTime в blkiolib.tlc.

Индекс времени SampleTimeLibBlockInputSignalIndex (portIdx

)

Возвращает индекс времени выборки, соответствующий указанному входному порту блока.

Посмотрите LibBlockInputSignalSampleTimeIndex в blkiolib.tlc.

Символьные измерения LibBlockInputSignalSymbalingDimensions (portIdx

)

Возвращает число размеров указанного входного порта блока.

Посмотрите LibBlockInputSignalSymbolicDimensions(portIdx) в blkiolib.tlc.

LibBlockInputSignalSymboldWidth (portIdx

)

Возвращает символическую ширину указанного входного порта блока.

Посмотрите LibBlockInputSignalSymbolicWidth(portIdx) в blkiolib.tlc.

LibBlockInputSignalWidth (portIdx

)

Возвращает ширину указанного индекса входного порта блока.

Посмотрите LibBlockInputSignalWidth в blkio_api.tlc.

LibBlockInputSignalUnitExpr (portIdx

)

Возвращает имя единиц измерения, соответствующих указанному входному порту блока. Эта функция принимает индекс порта в качестве входного аргумента.

Посмотрите LibBlockInputSignalUnitExpr в blkio_api.tlc.

LibBlockInputSignalUnitId (portIdx

)

Возвращает числовой идентификатор (id), соответствующий единицам указанного входного порта блока. Эта функция принимает индекс порта в качестве входного аргумента.

Посмотрите LibBlockInputSignalUnitId в blkio_api.tlc.

См. также LibBlockInputSignalUnitExp и LibBlockOutputSignalUnitId в blkio_api.tlc.

LibBlockNumInputPorts (блок

)

Возвращает количество портов ввода данных блока (исключая порты управления).

Посмотрите LibBlockNumInputPorts в blocklib.tlc.

Связанные темы