Возвращает 1 (true), если заданный индекс входного порта блока имеет символические размерности. Эта функция принимает индекс порта как входной параметр.
См. LibBlockInputHasSymbolicWidth
в blkio_api.tlc
.
Определяет режим индекса входного порта блока.
block
- Запись блока
pidx
- Индекс порта
""
для неиндексного порта и "Zero-based"
или "One-based"
в противном случае.
Если вход порт block
задается как порт индекса и его основа индексации помечена как основанная на нуле или основанная на одной, эта информация записывается в
файл. model
.rtwLibBlockInputPortIndexMode
запрашивает основу индексации для перехода к другому коду в соответствии с входом индексации портов основы.
%if LibBlockInputPortIndexMode(block, pidx) == "Zero-based" ... %elseif LibBlockInputPortIndexMode(block, pidx) == "One-based" ... %else ... %endif
См. LibBlockInputPortIndexMode
в
.blkiolib.tlc
Возвращает, принимает ли входной порт сигнал ко-симуляции. Эта функция принимает индекс порта как входной параметр.
См. LibBlockInputPortIsContinuousQuantity
в blkio_api.tlc
.
На основе номера порта входа (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
Аргумент | Описание |
---|---|
| Целое число, задающее индекс входного порта (на нуле). Примечание: Для определенных встроенных блоков, |
| Переменная управления пользователем. Должна быть строкой, либо индексирующим выражением, либо |
| Контурная переменная управления. Должна быть строкой, либо индексирующим выражением, либо |
| Либо целочисленный литерал, либо строка формы %<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
.
Рассмотрим следующие случаи:
Функция (случаи 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
вместо добавления "&
"в строку, возвращенную LibBlockInputSignal
. Для примера, LibBlockInputSignal
может вернуть буквальную константу, такую как 5
(т.е. инвариантный входной сигнал). Генератор кода отслеживает, когда LibBlockInputSignalAddr
вызывается инвариантный сигнал и объявляет сигнал следующим const
данные (который адресуемый), вместо того, чтобы помещаться как буквальная константа в сгенерированный код (который не адресуемый).
Обратите внимание, что последний входной параметр, sigIdx
, не перегружен, в котором находится LibBlockInputSignal
. Следовательно, если входной сигнал является комплексным, возвращается адрес комплексного контейнера.
Чтобы получить адрес широкого входного сигнала и передать его пользовательской функции для обработки, вы могли бы использовать
%assign uAddr = LibBlockInputSignalAddr(0, "", "", 0) %assign y = LibBlockOutputSignal(0, "", "", 0) %<y> = myfcn(%<uAddr>);
См. LibBlockInputSignalAddr
в blkiolib.tlc
.
Возвращает имя псевдонима типа данных (например 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
.
Позволять, чтобы входной сигнал был выражением, даже когда выход сигнал широк. Эта функция принимает запись блока и индекс порта как входные параметры. Вызовите эту функцию из BlockInstanceSetup
функция.
См. LibBlockInputSignalAllowScalarExpandedExpr
в blkio_api.tlc
.
Возвращает сброшенное имя модулей, соответствующего указанному блоку входа порту. Эта функция принимает индекс порта как входной параметр.
См. LibBlockInputSignalASCIIEscapedUnitExpr
в blkio_api.tlc
.
Возвращает 1, если указанный входной порт соединяется с блоком, отличным от блока Ground, и 0 в противном случае.
См. LibBlockInputSignalConnected
в blkio_api.tlc
.
Возвращает числовой идентификатор (id
), соответствующий типу данных заданного блока входного порта.
Если входной сигнал порта комплексный, LibBlockInputSignalDataTypeId
возвращает тип данных действительной части (или мнимой части) сигнала.
См. LibBlockInputSignalDataTypeId
в blkiolib.tlc
.
Возвращает имя типа данных (например 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
.
Возвращает вектор размерностей заданного входного порта блока, например [2,3]
.
См. LibBlockInputSignalDimensions
в blkio_api.tlc
.
Возвращает 1, если указанный входной порт блока комплексен, 0 в противном случае.
См. LibBlockInputSignalIsComplex
в blkio_api.tlc
.
Возвращает 1 (true), если входной сигнал является выражением (от переменной), и 0 (false) в противном случае. Эта функция принимает индекс порта как входной параметр.
См. LibBlockInputSignalIsExpr
в blkio_api.tlc
.
Возвращает 1, если заданный входной порт блока основан на системе координат, 0 в противном случае.
См. LibBlockInputSignalIsFrameData
в blkio_api.tlc
.
Возвращает 1 (true), если входной сигнал является тривиальным выражением (от переменной), и 0 (false) в противном случае. Эта функция принимает индекс порта как входной параметр.
См. LibBlockInputSignalIsTrivialExpr
в blkio_api.tlc
.
Возвращает локальный индекс шага расчета, соответствующий указанному входному порту блока.
См. LibBlockInputSignalLocalSampleTimeIndex
в blkiolib.tlc
.
Возвращает количество размерностей указанного входного порта блока.
См. LibBlockInputSignalNumDimensions
в blkio_api.tlc
.
Возвращает время смещения, соответствующее указанному входному порту блока.
См. LibBlockInputSignalOffsetTime
в blkiolib.tlc
.
Возвращает значение шага расчета, соответствующее указанному входному порту блока.
См. LibBlockInputSignalSampleTime
в blkiolib.tlc
.
Возвращает индекс шага расчета, соответствующий указанному входному порту блока.
См. LibBlockInputSignalSampleTimeIndex
в blkiolib.tlc
.
Возвращает количество размерностей указанного входного порта блока.
См. LibBlockInputSignalSymbolicDimensions(portIdx)
в blkiolib.tlc
.
Возвращает символическую ширину указанного входного порта блока.
См. LibBlockInputSignalSymbolicWidth(portIdx)
в blkiolib.tlc
.
Возвращает ширину указанного входа порта блока.
См. LibBlockInputSignalWidth
в blkio_api.tlc
.
Возвращает имя модулей, соответствующего указанному блоку входа порту. Эта функция принимает индекс порта как входной параметр.
См. LibBlockInputSignalUnitExpr
в blkio_api.tlc
.
Возвращает числовой идентификатор (id), соответствующий модулям указанного входного порта блока. Эта функция принимает индекс порта как входной параметр.
См. LibBlockInputSignalUnitId
в blkio_api.tlc
.
См. также LibBlockInputSignalUnitExp
и LibBlockOutputSignalUnitId
в blkio_api.tlc
.
Возвращает количество входных портов данных блока (исключает порты управления).
См. LibBlockNumInputPorts
в blocklib.tlc
.