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

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" startsWith. Например, если вы инициализируете "i" запускать при смещении 5, затем необходимо задать sigIdx == 5.

    Случай 2 происходит когда sigIdx точки к внешнему входному вектору, т.е. первый элемент, что "i" startsWith. Например, если вы инициализируете "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.

Похожие темы