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

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.

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 через аргумент переменных списка.

Следующий пример показывает один вход / одну 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 returns 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 и Ролика файл 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/O, т.е. первый элемент, с которого запускается "i" . Например, если вы инициализируете "i", чтобы запустить при смещении 5, затем необходимо задать sigIdx == 5.

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

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

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

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

Когда названо в рамках a%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, reim)

Возвращает имя искаженного через тип данных (например, 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.

LibBlockInputSignalConnected (portIdx)

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

Смотрите LibBlockInputSignalConnected в blkiolib.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 в blkiolib.tlc.

LibBlockInputSignalIsComplex (portIdx)

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

Смотрите LibBlockInputSignalIsComplex в blkiolib.tlc.

LibBlockInputSignalIsFrameData (portIdx)

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

Смотрите LibBlockInputSignalIsFrameData в blkiolib.tlc.

LibBlockInputSignalLocalSampleTimeIndex
(portIdx)

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

Смотрите LibBlockInputSignalLocalSampleTimeIndex в blkiolib.tlc.

LibBlockInputSignalNumDimensions (portIdx)

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

Смотрите LibBlockInputSignalNumDimensions в blkiolib.tlc.

LibBlockInputSignalOffsetTime (portIdx)

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

Смотрите LibBlockInputSignalOffsetTime в blkiolib.tlc.

LibBlockInputSignalSampleTime (portIdx)

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

Смотрите LibBlockInputSignalSampleTime в blkiolib.tlc.

LibBlockInputSignalSampleTimeIndex (portIdx)

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

Смотрите LibBlockInputSignalSampleTimeIndex в blkiolib.tlc.

LibBlockInputSignalSymbolicDimensions (portIdx)

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

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

LibBlockInputSignalSymbolicWidth (portIdx)

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

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

LibBlockInputSignalWidth (portIdx)

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

Смотрите LibBlockInputSignalWidth в blkiolib.tlc.

LibBlockNumInputPorts (блок)

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

Смотрите LibBlockNumInputPorts в blocklib.tlc.

Похожие темы