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

LibBlockInputHasSymbolicWidth (portIdx

)

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

См. LibBlockInputHasSymbolicWidth в blkio_api.tlc.

LibBlockInportPortIndexMode (блок, пидкс

)

Цель

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

Аргументы

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

)

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

См. 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 директива и при использовании файла Roller TLC (или предоставленного пользователем файла Roller TLC, который соответствует той же переменной/обработке смещения сигнала). В сложение звонки на LibBlockInputSignal с lcv должно происходить только тогда, когда "U" или конкретный входной порт (например "u0") передается в %roll директива через аргумент переменных 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 возвращает u[i] когда текущая область крена выше порога крена, и ширина входа порта нескаляра (широкая). В этом случае файл Roller 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>;
  }
}

Если вы создаете свой собственный ролик, и индексация не соответствует тому, как работает файл Roller 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, 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.

Lib Block Input Signal Allow Scalar Expand Expr (блок, port Idx

)

Позволять, чтобы входной сигнал был выражением, даже когда выход сигнал широк. Эта функция принимает запись блока и индекс порта как входные параметры. Вызовите эту функцию из 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.

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.

LibBlockNumInportPorts (блок

)

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

См. LibBlockNumInputPorts в blocklib.tlc.

Похожие темы