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

LibBlockInputHasSymbolicWidth (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.

LibBlockInputPortIsContinuousQuantity (portIdx)

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

Смотрите LibBlockInputPortIsContinuousQuantity в blkio_api.tlc.

LibBlockInputSignal (portIdx, ucv, lcv, sigIdx)

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

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

Примечание

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

Поскольку возвращенное значение может быть литеральной константой, вы не должны использовать LibBlockInputSignal получить доступ к адресу входного сигнала. Чтобы получить доступ к адресу входного сигнала, используйте LibBlockInputSignalAddr. Доступ к адресу сигнала через LibBlockInputSignal может привести к ссылке на литеральную константу (e.g., 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.

LibBlockInputSignalAllowScalarExpandedExpr (блок, portIdx)

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

Смотрите LibBlockInputSignalAllowScalarExpandedExpr в blkio_api.tlc.

LibBlockInputSignalASCIIEscapedUnitExpr (portIdx)

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

Смотрите LibBlockInputSignalASCIIEscapedUnitExpr в blkio_api.tlc.

LibBlockInputSignalConnected (portIdx)

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

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

LibBlockInputSignalIsTrivialExpr (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.

LibBlockInputSignalSampleTimeIndex (portIdx)

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

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

LibBlockInputSignalSymbolicDimensions (portIdx)

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

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

LibBlockInputSignalSymbolicWidth (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.

Похожие темы