Определяет режим индексации входного порта блока.
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
На основе номера входного порта (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
и при использовании Ролика файл 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
.
Рассмотрите следующие случаи:
Функция (Случай 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
вместо того, чтобы добавить “&
” к строке, возвращенной 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
.
Возвращается 1, если заданный входной порт соединяется с блоком кроме блока Ground и 0 в противном случае.
Смотрите LibBlockInputSignalConnected
в blkiolib.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
в blkiolib.tlc
.
Возвращается 1, если заданный входной порт блока является комплексным, 0 в противном случае.
Смотрите LibBlockInputSignalIsComplex
в blkiolib.tlc
.
Возвращается 1, если заданный входной порт блока является базирующимся кадром, 0 в противном случае.
Смотрите LibBlockInputSignalIsFrameData
в blkiolib.tlc
.
Возвращает локальный индекс шага расчета, соответствующий заданному входному порту блока.
Смотрите LibBlockInputSignalLocalSampleTimeIndex
в blkiolib.tlc
.
Возвращает количество размерностей заданного входного порта блока.
Смотрите LibBlockInputSignalNumDimensions
в blkiolib.tlc
.
Возвращает время смещения, соответствуя заданному входному порту блока.
Смотрите LibBlockInputSignalOffsetTime
в blkiolib.tlc
.
Возвращает шаг расчета, соответствующий заданному входному порту блока.
Смотрите LibBlockInputSignalSampleTime
в blkiolib.tlc
.
Возвращает индекс шага расчета, соответствующий заданному входному порту блока.
Смотрите LibBlockInputSignalSampleTimeIndex
в blkiolib.tlc
.
Возвращает количество размерностей заданного входного порта блока.
Смотрите LibBlockInputSignalSymbolicDimensions(portIdx)
в blkiolib.tlc
.
Возвращает символьную ширину заданного входного порта блока.
Смотрите LibBlockInputSignalSymbolicWidth(portIdx)
в blkiolib.tlc
.
Возвращает ширину заданного индекса входного порта блока.
Смотрите LibBlockInputSignalWidth
в blkiolib.tlc
.
Возвращается количество портов ввода данных блока (исключает порты управления).
Смотрите LibBlockNumInputPorts
в blocklib.tlc
.