Возвращает 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
Возвращается, принимает ли входной порт сигнал co-симуляции. Эта функция берет индекс порта в качестве входного параметра.
Смотрите LibBlockInputPortIsContinuousQuantity
в blkio_api.tlc
.
На основе номера входного порта (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
Аргумент | Описание |
---|---|
| Целое число, задающее (основанный на нуле) индекс входного порта. Примечание: Для определенных встроенных блоков, |
| Переменная контроля за работой пользователей. Должна быть строка, или выражение индексации или |
| Контрольная переменная цикла. Должна быть строка, или выражение индексации или |
| Или целочисленный литерал или строка формы %<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"
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
вместо того, чтобы добавить “&
” к строке, возвращенной 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
inblkio_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
.