Вы управляете, как код сгенерирован из моделей в основном посредством записи или изменения скриптов, которые применяют директивы TLC и встроенные функции. Используйте следующие разделы в качестве своей первичной ссылки на синтаксис и формат построений выходного языка, а также
саму команду MATLAB® tlc
.
Директива выходного языка должна быть первым незнаком пробела на строке и начинается с символа %
. Строки, начинающиеся с %%
, являются комментариями TLC и не передаются потоку вывода. Строки, начинающиеся с /*
, являются комментариями C и передаются потоку вывода.
Файл выходного языка состоит из серии операторов любой формы:
[text | %<expression>]*
Буквенный текст передается потоку вывода, неизмененному, и выражения, заключенные в %< >
, выполнены прежде чем быть записанным в выходной (лишенный %< >
).
%keyword [argument1, argument2, ...]
%keyword
представляет одну из директив Компилятора Выходного языка, и [argument1, argument2, ...]
представляет выражения, которые задают обязательные параметры. Например, оператор
%assign sysNumber = sysIdx + 1
использует директиву %assign
, чтобы задать или изменить значение параметра sysNumber
.
Остальная часть этого раздела показывает полный набор Директив компилятора Выходного языка и описывает каждую директиву подробно.
%% text
Однострочный комментарий, где text
является комментарием.
/% text%/
Один (или мультилиния) комментируют, где text
является комментарием.
%matlab
Вызывает функцию MATLAB, которая не возвращает результат. Например, %matlab disp(2.718)
.
%<expr>
Выражения выходного языка, которые выполнены. Например, если у вас будет переменная TLC, которая была создана через %assign varName = "foo"
, затем %<varName>
расширится до foo
. Выражения могут также быть вызовами функции, как в %<FcnName(param1,param2)>
. На направляющих строках выражения TLC не должны быть помещены в синтаксисе %<>
. Выполнение так вызывает двойную оценку. Например, %if %<x> == 3
обрабатывается путем создания скрытой переменной для оцененного значения переменной x. Оператор %if
затем оценивает эту скрытую переменную и сравнивает ее с 3. Эффективный способ сделать эту операцию состоит в том, чтобы записать %if x == 3
. В обозначении MATLAB это приравнялось бы к записи если eval('x') == 3
в противоположность если x = 3
. Исключение к этому во время %assign
для управления форматом, как в
%assign str = "value is: %<var>"
Примечание: Вложенные выражения анализа (например, %<foo(%<expr>)>
) не поддержаны.
Нет штрафа скорости за оценки в строках, такой как
%assign x = "%<expr>"
Избегайте оценок вне строк, таких как следующий пример.
%assign x = %<expr>
%if expr
%elseif expr
%else
%endif
Условное включение, где константное выражение
должен оценить к целому числу. Например, следующий код проверяет, имеет ли параметр, expr
k
, числовое значение 0.0 путем выполнения библиотечной функции TLC, чтобы проверять на равенство.
%if ISEQUAL(k, 0.0) <text and directives to be processed if k is 0.0> %endif
В этом и других директивах, вы не должны расширять переменные или выражения с помощью обозначения %<expr>
, если expr
не появляется в строке. Например,
%if ISEQUAL(idx, "my_idx%<i>")
, где idx
и i
являются оба строками.
Как на других языках, логические оценки делают короткую схему (остановлены, когда результат известен).
%switch expr
%case expr
%break
%default
%break
%endswitch
Директива %switch
подобна оператору switch
языка C. expr
выражения должен иметь тип, который может быть сравнен для равенства с помощью the == operator
. Если %break
не будет включен после оператора %case
, то он упадет до следующего оператора.
%with
%endwith
%with recordName
является оператором определения объема. Используйте его, чтобы принести именованную запись в текущий осциллограф, остаться, пока с соответствующим %endwith
не сталкиваются (директивы %with
могут быть вложены, как желаемый).
Обратите внимание на то, что на левой стороне операторов %assign
, содержавших в блоке %with
/ %endwith
, ссылки на поля записей должны быть полностью определены (см. Значения Присвоения к Полям Записей), как в следующем примере.
%with CompiledModel %assign oldName = name %assign CompiledModel.name = "newname" %endwith
%setcommandswitch string
Изменяет значение переключателя командной строки, как задано строкой аргумента. Только следующие переключатели поддерживаются:
v, m, p, O, d, r, I, a
Следующий пример устанавливает уровень многословия на 1.
%setcommandswitch "-v1"
См. также Параметры командной строки.
%assert expr
Тестирует значение Булевого выражения. Если выражение оценивает ко лжи, TLC выдает ошибку сообщение, трассировка стека и выход; в противном случае выполнение обычно продолжается. Чтобы включить оценку утверждений вне среды генератора кода, используйте параметр командной строки -da
. При создании из генератора кода проигнорирован этот флаг, когда это заменяется флажком Enable TLC assertion на разделе TLC process Code Generation> панель Debug. Чтобы управлять обработкой утверждения из Окна Команды MATLAB, использовать
set_param(model, 'TLCAssertion', 'on|off')
установить этот флаг на или прочь. Значение по умолчанию Выключено. Чтобы видеть, что ток устанавливает, использовать
get_param(model, 'TLCAssertion')
%error
%warning
%trace
%exit
Директивы управления потоками:
%error tokens
расширен и отображен.tokens
%warning tokens
расширен и отображен.tokens
%trace tokens
расширен и отображен только, когда многословный выходной параметр командной строки tokens
-v
или -v1
задан.
%exit tokens
расширен, отображен, и выходы TLC.tokens
При создании отчетов об ошибках используйте следующую команду, если ошибка производится неправильной настройкой, которую пользователь должен зафиксировать в модели.
%exit Error Message
Если вы добавляете, утверждают код (то есть, код, который никогда не должен достигаться), использовать
%setcommandswitch "-v1" %% force TLC stack trace %exit Assert message
%assign
Создает идентификаторы (переменные). Общая форма
%assign [::]variable = expression
::
указывает, что создаваемая переменная является глобальной переменной; в противном случае это - локальная переменная в текущем осциллографе (т.е. локальная переменная в функции).
Если необходимо отформатировать переменную, скажем, в строке, основанной на других переменных TLC, то необходимо выполнить двойную оценку, как в
%assign nameInfo = "The name of this is %<Name>"
или поочередно
%assign nameInfo = "The name of this is " + Name
Чтобы присвоить значение полю записи, необходимо использовать квалифицированное переменное выражение. Смотрите Значения Присвоения к Полям Записей.
%createrecord
Создает записи в памяти. Эта команда принимает список одной или нескольких спецификаций записи (например, { foo 27 }
). Каждая спецификация записи содержит список нуля или большего количества пар "имя-значение" (например, foo 27
), которые становятся членами создаваемой записи. Сами значения могут быть спецификациями записи, когда следующее иллюстрирует.
%createrecord NEW_RECORD { foo 1 ; SUB_RECORD {foo 2} } %assign x = NEW_RECORD.foo /* x = 1 */ %assign y = NEW_RECORD.SUB_RECORD.foo /* y = 2 */
Если больше чем одна спецификация записи следует за данным именем записи, набор спецификаций записи составляет массив записей.
%createrecord RECORD_ARRAY { foo 1 } ... { foo 2 } ... { bar 3 } %assign x = RECORD_ARRAY[1].foo /* x = 2 */ %assign y = RECORD_ARRAY[2].bar /* y = 3 */
Обратите внимание на то, что можно создать и индексировать массивы подзаписей путем определения %createrecord
с тождественно именованными подзаписями, можно следующим образом:
%createrecord RECORD_ARRAY { SUB_RECORD { foo 1 } ... SUB_RECORD { foo 2 } ... SUB_RECORD { foo 3 } } %assign x = RECORD_ARRAY.SUB_RECORD[1].foo /* x = 2 */ %assign y = RECORD_ARRAY.SUB_RECORD[2].foo /* y = 3 */
Если оператор разрешения области видимости (::
) является первой лексемой после того, как лексема %createrecord
, запись будет создана в глобальной области видимости.
Вы не должны создавать массив записи при помощи %createrecord
в цикле.
%addtorecord
Добавляют поля к существующей записи. Новые поля могут быть парами "имя-значение" или псевдонимами к уже существующим записям.
%addtorecord OLD_RECORD foo 1
Если новое добавляемое поле является записью, то %addtorecord
делает псевдоним к той записи вместо глубокой копии. Чтобы сделать глубокую копию, используйте %copyrecord
.
%createrecord NEW_RECORD { foo 1 } %addtorecord OLD_RECORD NEW_RECORD_ALIAS NEW_RECORD
%mergerecord
Добавляет (или слияния) одну или несколько записей в другого. Первая запись будет содержать результаты слияния первой записи плюс содержимое других записей, заданных командой. Содержимое второго (и последующий) записи глубоко копируются в первое (т.е. они не ссылки).
%mergerecord OLD_RECORD NEW_RECORD
Если дублирующиеся поля существуют в объединяемых записях, поля исходной записи не перезаписываются.
%copyrecord
Делает глубокую копию существующей записи. Это создает новую запись подобным способом к %createrecord
кроме компонентов записи, глубоко копируются с существующей записи. Псевдонимы заменяются копиями.
%copyrecord NEW_RECORD OLD_RECORD
%realformat
Задает, как отформатировать действительные переменные. К формату в экспоненциальном представлении с 16 цифрами точности использовать
%realformat "EXPONENTIAL"
К формату без потери точности и минимального количества символов, использовать
%realformat "CONCISE"
При встраивании S-функций формат установлен в concise
. Вы можете переключиться на exponential
, но должны переключить его назад на concise
, когда сделано.
%language
Это должно появиться перед первым GENERATE
или вызовом функции GENERATE_TYPE
. Это задает имя языка как строка, которая генерируется как в %language "C"
. Обычно это добавляется к вашему системному конечному файлу.
Единственным допустимым значением является C
, который включает поддержку C
и генерации кода C++
, как задано параметром конфигурации TargetLang
(см. Язык для получения дополнительной информации).
%implements
Помещенный в файле .tlc
для определенного типа записи, когда сопоставлено через %generatefile
. Синтаксисом является %implements "Type" "Language"
. При встраивании S-функции в C или C++, это должно быть первой строкой некомментария в файле, как в
%implements "s_function_name" "C"
Следующие строки некомментария будут директивами %function
, задающими функциональность S-функции.
Смотрите, что %language
и GENERATE
функционируют описания для получения дополнительной информации.
%generatefile
Обеспечивает отображение между Type
записи и функциями, содержавшимися в файле. Каждая запись может иметь функции того же имени, но различного содержимого, сопоставленного с ним (т.е. полиморфизм). Обычно это используется, чтобы сопоставить запись Block
Type
с файлом .tlc
, который реализует функциональность блока, как в
%generatefile "Sin" "sin_wave.tlc"
%filescope
Ограничивает осциллограф переменных к файлу, в котором они заданы. Директива %filescope
где угодно в файле объявляет, что переменные в файле видимы только в том файле. Обратите внимание на то, что это ограничение также применяется к вставленным файлам, с помощью директивы %include
, в файл, содержащий директиву %filescope
.
Вы не должны использовать директиву %filescope
в функциях GENERATE
или функциях.
%filescope
полезен в сохранении памяти. Переменные, осциллограф которых ограничивается %filescope
, выходят из осциллографа, когда выполнение файла, содержащего их, завершается. Это освобождает память выделенный таким переменным. В отличие от этого, глобальные переменные сохраняются в памяти в течение осуществления программы.
%include
Используйте %include "file.tlc"
, чтобы вставить заданный конечный файл в текущей точке.
Директивы %include
ведут себя, как будто они были в глобальном контексте. Например,
%addincludepath "./sub1" %addincludepath "./sub2"
в .tlc
файл позволяет любой подпапке ссылаться неявно:
%include "file_in_sub1.tlc" %include "file_in_sub2.tlc"
Используйте наклонные черты вправо для имен папок, когда они работают и над UNIX® и над системами PC. Однако, если вы действительно используете наклонные черты влево на имена папок PC, убедиться выйти из них, например, "C:\\mytlc"
. Также можно выразить имя папки PC как литерал с помощью спецификатора формата L, как в L"C:\mytlc"
.
%addincludepath
Используйте %addincludepath "folder"
, чтобы добавить дополнительные пути, которые будут искаться. Могут появиться несколько директив %addincludepath
. Компилятор оценивает несколько директив %addincludepath
с самого начала.
Используя %addincludepath
директивы устанавливает глобальный контекст. Например,
%addincludepath "./sub1" %addincludepath "./sub2"
в .tlc
файл позволяет любой подпапке ссылаться неявно:
%include "file_in_sub1.tlc" %include "file_in_sub2.tlc"
Используйте наклонные черты вправо для имен папок, когда они работают и над UNIX и над системами PC. Однако, если вы действительно используете наклонные черты влево на имена папок PC, убедиться выйти из них, например, "C:\\mytlc"
. Также можно выразить имя папки PC как литерал с помощью спецификатора формата L, как в L"C:\mytlc"
.
%roll
%endroll
Несколько включение плюс внутренний цикл, прокручивающийся основанный на заданном пороге. Эта директива может использоваться большинством блоков Simulink®, которые имеют концепцию полного блока width, который обычно является шириной сигнала, проходящего через блок.
Этот пример директивы %roll
для операции усиления, y=u*k
:
%function Outputs(block, system) Output /* %<Type> Block: %<Name> */ %assign rollVars = ["U", "Y", "P"] %roll sigIdx = RollRegions, lcv = RollThreshold, block,... "Roller", rollVars %assign y = LibBlockOutputSignal(0, "", lcv, sigIdx) %assign u = LibBlockInputSignal(0, "", lcv, sigIdx) %assign k = LibBlockParameter(Gain, "", lcv, sigIdx) %<y> = %<u> * %<k>; %endroll %endfunction
Директива %roll
подобна %foreach
, за исключением того, что это выполняет итерации идентификатора (sigIdx
в этом примере) по областям списка. Прокрутитесь области вычисляются путем рассмотрения входных сигналов и генерации областей, где входные параметры непрерывны. Для блоков переменная RollRegions
автоматически вычисляется и помещается в запись Block
. Примером вектора областей списка является [0:19, 20:39]
, где существует две непрерывных области значений сигналов, проходящих через блок. Первым является 0:19
и второй is 20:39
. Каждая область списка или помещается в тело цикла (например, оператор for
языка C) или встраивается, в зависимости от того, является ли длина области меньше, чем порог списка.
Каждый раз через цикл %roll
, sigIdx
является целым числом для запуска текущей области списка или смещения относительно полного блока width, когда текущая область списка является меньше, чем порог списка. Глобальная переменная TLC RollThreshold
является общим значением всей модели, раньше решала, когда поместить данную область списка в цикл. Когда решение принято, чтобы поместить данную область в цикл, контрольная переменная цикла является допустимым идентификатором (например, "i
"); в противном случае это - ""
.
Параметр block
является текущим блоком, который прокручивается. Параметр "Roller"
задает имя для внутренних вызовов GENERATE_TYPE
, выполненных %roll
. Обработчиком %roll
по умолчанию является "Roller"
, который ответственен за подготовку структур прокрутки цикла блока по умолчанию (например, цикл for
C).
rollVars
(переменные списка) передается функциям "Roller"
, чтобы создать структуры списка. Заданные переменные цикла относительно блока
"U"
Входные параметры к блоку. Это принимает, что вы используете LibBlockInputSignal(portIdx, "", lcv, sigIdx)
, чтобы получить доступ к каждому входу, где portIdx
запускается в 0 для первого входного порта.
"ui"
Подобно "U"
, кроме только для определенного входа,
. i
"u"
должен быть нижним регистром, или это будет интерпретировано как "U"
выше.
"Y"
Выходные параметры блока. Это принимает, что вы используете LibBlockOutputSignal(portIdx, "", lcv, sigIdx)
, чтобы получить доступ к каждому выводу, где portIdx
запускается в 0 для первого выходного порта.
"yi"
Подобно "Y"
, кроме только для определенного вывода,
. i
"y"
должен быть нижним регистром, или это будет интерпретировано как "Y"
выше.
"P"
Параметры блока. Это принимает, что вы используете LibBlockParameter
(name, "", lcv, sigIdx)
, чтобы получить доступ к ним.
"<param>/name"
Подобно "P"
, кроме специфичного для определенного
.name
rwork
Векторы RWork
блока. Это принимает, что вы используете LibBlockRWork
(name, "", lcv, sigIdx)
, чтобы получить доступ к ним.
"<rwork>/name"
Подобно RWork
, за исключением определенного
.name
dwork
Векторы DWork
блока. Это принимает, что вы используете LibBlockDWork
(name, "", lcv, sigIdx)
, чтобы получить доступ к ним.
"<dwork>/name"
Подобно DWork
, за исключением определенного
.name
iwork
Векторы IWork
блока. Это принимает, что вы используете LibBlockIWork
(name, "", lcv, sigIdx)
, чтобы получить доступ к ним.
"<iwork>/name"
Подобно IWork
, за исключением определенного
.name
pwork
Векторы PWork
блока. Это принимает, что вы используете LibBlockPWork
(name, "", lcv, sigIdx)
, чтобы получить доступ к ним.
"<pwork>/name"
Подобно PWork
, за исключением определенного
.name
"Mode"
Вектор режима. Это принимает, что вы используете LibBlockMode
("",lcv,sigIdx)
, чтобы получить доступ к нему.
"PZC"
Предыдущее состояние пересечения нулем. Это принимает, что вы используете LibPrevZCState
("",lcv, sigIdx)
, чтобы получить доступ к нему.
К roll ваш собственный вектор, основанный на областях списка блока, необходимо обойти указатель на вектор. На принятие вашего вектора указывает первый PWork
, названный name
,
datatype *buf = (datatype*)%<LibBlockPWork(name,"","",0) %roll sigIdx = RollRegions, lcv = RollThreshold, block, ... "Roller", rollVars *buf++ = whatever; %endroll
Примечание: В вышеупомянутом примере, sigIdx
и lcv
локальны для тела цикла.
%breakpoint
Устанавливает точку останова для отладчика TLC. См. %breakpoint Директиву.
%function
%return
%endfunction
Функция, которая возвращает значение, задана как
%function name(optional-arguments) %return value %endfunction
Пустая функция не производит вывод и не требуется, чтобы возвращать значение. Это задано как
%function name(optional-arguments) void %endfunction
Функция, которая производит выходные параметры для текущего потока и не требуется, чтобы возвращать значение, задана как
%function name(optional-arguments) Output %endfunction
Для конечных файлов блока можно добавить во встроенный файл .tlc
следующие функции, которые вызваны конечными файлами всей модели во время генерации кода.
%function
BlockInstanceSetup
(block,system) void
Требовавшийся каждый экземпляр блока в модели.
%function
BlockTypeSetup
(block,system) void
Названный однажды для каждого типа блока, который существует в модели.
%function
Enable
(block,system) Output
Используйте это, если блок помещается в активированной подсистеме и должен принять определенные меры, когда подсистема включена. Место в подсистеме включает стандартную программу.
%function
Disable
(block,system) Output
Используйте это, если блок помещается в отключенной подсистеме и должен принять определенные меры, когда подсистема отключена. Место в подсистеме отключает стандартную программу.
%function
Start
(block,system) Output
Включайте эту функцию, если ваш блок имеет код инициализации запуска, который должен быть помещен в MdlStart
.
%function
InitializeConditions
(block,system) Output
Используйте эту функцию, если ваш блок имеет состояние, которое должно быть инициализировано в начале выполнения и когда активированная подсистема сбрасывает состояния. Поместите в MdlStart
и/или стандартных программах инициализации подсистемы.
%function
Outputs
(block,system) Output
Первичная функция вашего блока. Поместите в MdlOutputs
.
%function
Update
(block,system) Output
Используйте эту функцию, если ваш блок имеет действия, которые будут выполняться однажды на цикл симуляции, такой как обновление дискретных состояний. Поместите в MdlUpdate
.
%function
Derivatives
(block,system) Output
Используйте эту функцию, если ваш блок имеет производные.
%function
ZeroCrossings
(block,system) Output
Используйте эту функцию, если ваш блок делает обнаружение пересечения нулем и имеет действия, которые будут выполняться в MdlZeroCrossings
.
%function
Terminate
(block,system) Output
Используйте эту функцию, если ваш блок имеет действия, которые должны быть в MdlTerminate
.
%foreach
%endforeach
Несколько включение, которое выполняет итерации от 0
до upperLimit-1
постоянного целого выражения. Каждый раз через цикл, loopIdentifier
, (например, x
) присвоен текущее значение итерации.
%foreach loopIdentifier = upperLimit %break -- use this to exit the loop %continue -- use this to skip the following code and continue to the next iteration %endforeach
Примечание: выражение upperLimit
брошено к целочисленному значению TLC. loopIdentifier
локален для тела цикла.
%for
Несколько директива включения с синтаксисом
%for ident1 = const-exp1, const-exp2, ident2 = const-exp3 %body %break %continue %endbody %endfor
Первый фрагмент директивы %for
идентичен оператору %foreach
. %break
и директивы %continue
действуют то же самое, как они делают в директиве %foreach
. const-exp2
является Булево выражение, которое указывает, должен ли цикл быть прокручен (см. %roll
выше).
Если const-exp2
оценивает к TRUE
, ident2
присвоен значение const-exp3
. В противном случае ident2
присвоен пустая строка.
Примечание: ident1
и ident2
выше локальны для тела цикла.
%openfile
%selectfile
%closefile
Они используются, чтобы управлять файлами, которые создаются. Синтаксис
%openfile streamId="filename.ext" mode {open for writing} %selectfile streamId {select an open file} %closefile streamId {close an open file}
Обратите внимание на то, что "filename.ext
" является дополнительным. Если имя файла не задано, переменная (буфер строки) названный streamId
создается содержащий вывод. Аргумент режима является дополнительным. Если задано, это может быть "a"
для добавления или "w"
для записи.
Обратите внимание на то, что специальная строка streamIdNULL_FILE
не задает вывода. Специальная строка streamIdSTDOUT
задает вывод к терминалу.
Чтобы создать буфер текста, использовать
%openfile buffer text to be placed in the 'buffer' variable. %closefile buffer
Теперь buffer
содержит расширенный текст, заданный между директивами %closefile
и %openfile
.
%generate
%generate blk fn
эквивалентен GENERATE
.(blk,fn)
%generate blk fn type
эквивалентен GENERATE
.(blk,fn,type)
Смотрите ГЕНЕРИРУЮТ и функции GENERATE_TYPE.
%undef
удаляет переменную %undef var
из осциллографа. Если var
является полем в записи, var
%undef
удаляет то поле из записи. Если
является массивом записи, var
%undef
удаляет целый массив записи.
Можно поместить комментарии куда угодно в конечном файле. Чтобы включать комментарии, используйте директивы %%
или /%...%/
. Например:
/% Abstract: Return the field with [width], if field is wide %/
или
%endfunction %% Outputs function
Используйте построение %%
для основанных на строке комментариев. Символы от %%
в конец строки становятся комментарием.
Ненаправленные строки, то есть, строки, которые не имеют %
как их первого незнака пробела, скопированы в буфер вывода дословно. Например,
/* Initialize sysNumber */ int sysNumber = 3;
копирует обе строки к буферу вывода.
Чтобы включать комментарии к строкам, которые не начинаются с символа %
, можно использовать /%...%/
или директивы комментария %%
. В этих случаях комментарии не копируются в буфер вывода.
Если ненаправленная строка появляется в функции, она не копируется в буфер вывода, если функция не является выходной функцией, или вы в частности выбираете выходной файл с помощью директивы %selectfile
. Для получения дополнительной информации о функциях, смотрите Функции Выходного языка.
Можно использовать язык C символ \
или последовательность MATLAB ...
, чтобы продолжить строку. Если директива является слишком длинной, чтобы соответствовать удобно на одной строке, это позволяет вам разделять директиву на несколько строк. Например:
%roll sigIdx = RollRegions, lcv = RollThreshold, block,\ "Roller", rollVars
или
%roll sigIdx = RollRegions, lcv = RollThreshold, block,... "Roller", rollVars
Используйте \
, чтобы подавить переводы строки к выводу и замещающему знаку ...
, чтобы указать на продолжение строки. Обратите внимание на то, что \
и замещающий знак ...
не могут использоваться в строках.
Эта таблица показывает типы значений, которые можно использовать в контексте выражений в файлах выходного языка. Выражения в Компиляторе Выходного языка должны использовать эти типы.
Строка типа значения | Пример | Описание |
---|---|---|
1==1 | Результат сравнения или другого булева оператора. Результатом будет | |
3.0+5.0i | 64-битное комплексное число с двойной точностью ( | |
3.0F+5.0Fi | 32-битное комплексное число с одинарной точностью ( | |
%openfile x | Буфер строки открыт с | |
"File" | %openfile x = "out.c" | Файл открыт с |
%function foo ... | Пользовательская функция и | |
3+5i | 32-битное целочисленное мнимое число ( | |
"Identifier" | abc | Значения идентификатора могут появиться только в |
Matrix (3,2) [ [ 1, 2]; [3 , 4]; [ 5, 6] ] | Матрицы являются просто списками векторов. Отдельные элементы матрицы не должны быть тем же типом и могут быть любым поддерживаемым типом кроме векторов или матриц. Текст | |
15 | Целое число ( | |
[1:5] | Область значений целых чисел между 1 и 5, включительно. | |
"Real" | 3.14159 | Число с плавающей запятой ( |
3.14159F | 32-битное число с плавающей запятой с одинарной точностью ( | |
Block { ... } | Запись блока. | |
FILE_EXISTS | Специальная встроенная функция, такая как | |
"Hello, World" | Символьные строки ASCII. Во всех контекстах две строки подряд конкатенированы, чтобы сформировать окончательное значение, как в | |
<sub1> | Идентификатор подсистемы. В контексте расширения, стараться выйти из разделителей на идентификаторе подсистемы, как в | |
15U | 32-битное беззнаковое целое ( | |
3U+5Ui | 32-битное комплексное беззнаковое целое ( | |
[1, 2] or BR Vector(2) [1, 2] | Векторы являются списками значений. Отдельные элементы вектора не должны быть тем же типом и могут иметь любой поддерживаемый тип кроме векторов или матриц. |
Можно включать выражение формы
в конечном файле. Компилятор Выходного языка заменяет %<expression>
на расчетное заменяющее значение, основанное на типе переменных в операторе %<expression>
%<>
. Целочисленные константные выражения свернуты и заменяются результирующим значением; строковые константы конкатенированы (например, две строки подряд "a"
"b"
, заменяются "ab"
).
%<expression> /* Evaluates the expression. * Operators include most standard C * operations on scalars. Array indexing * is required for certain parameters that * are block-scoped within the .rtw file.*/
В контексте выражения каждый идентификатор должен оценить к идентификатору или аргументу функции в настоящее время в осциллографе. Можно использовать директиву %< >
по строке, чтобы выполнить текстовую замену. Чтобы включать символ >
в замене, необходимо выйти из него с символом \
. Например:
%<x \> 1 ? "ABC" : "123">
Операторы, которым нужен символ >
, которого оставят, следующие:
Оператор | Описание | Пример |
---|---|---|
> | больше, чем | y = %<x \> 2>; |
>= | больше, чем или равный | y = %<x \>= 3>; |
>> | сдвиг вправо | y = %<x \>\> 4>; |
Таблица Target Language Expressions перечисляет операторы, которые позволены в выражениях. В этой таблице выражения перечислены по порядку от самого высокого до самого низкого приоритета. Горизонтальные строки отличают порядок операций.
Как в выражениях C, закорачиваются условные операторы. Если выражение включает вызов функции с эффектами, эффекты замечены, как будто целое выражение не было полностью выполнено. Например:
%if EXISTS(foo) && foo == 3
Если первый срок выражения оценивает к булевой лжи (т.е. foo
не существует), второй срок (foo == 3
) не оценен.
В предстоящей таблице обратите внимание, что numeric
является одним из следующего:
Boolean
Number
Unsigned
Real
Real32
Complex
Complex32
Gaussian
UnsignedGaussian
Кроме того, обратите внимание, что integral
является одним из следующего:
Number
Unsigned
Boolean
См. Продвижения Данных TLC для получения информации о продвижениях, которые заканчиваются, когда Компилятор Выходного языка работает со смешанными типами выражений.
Выражения выходного языка
Операторы отношения (<, =<, >, >=, !=, ==
) могут использоваться с неличными значениями.
Вы не должны помещать выражения в формат eval
%< >
, когда они появляются на направляющих строках. Выполнение так вызывает двойную оценку.
Когда Компилятор Выходного языка работает со смешанными типами выражений, он продвигает результаты общие типы, обозначенные в следующей таблице.
Таблица использует следующие сокращения:
| Булевская переменная |
| Номер |
| Без знака |
| Real32 |
| Действительный |
| Гауссов |
| UnsignedGaussian |
| Complex32 |
| Комплекс |
Верхняя строка (полужирным) и первый столбец (полужирным) показывают типы выражения, используемого в операции. Пересечение строки и столбца показывает получившийся тип выражений.
Например, если операция включит Булево выражение (B
) и выражение без знака (U
), результатом будет выражение без знака (U
).
Типы данных, следующие из выражений смешанного типа
B | N | U | F | D | G | UG | C32 | C | |
---|---|---|---|---|---|---|---|---|---|
B | B | N | U | F | D | G | UG | C32 | C |
N | N | N | U | F | D | G | UG | C32 | C |
U | U | U | U | F | D | UG | UG | C32 | C |
F | F | F | F | F | D | C32 | C32 | C32 | C |
D | D | D | D | D | D | C | C | C | C |
G | G | G | UG | C32 | C | G | UG | C32 | C |
UG | UG | UG | UG | C32 | C | UG | UG | C32 | C |
C32 | C32 | C32 | C32 | C32 | C | C32 | C32 | C32 | C |
C | C | C | C | C | C | C | C | C | C |
По умолчанию, числа с плавающей запятой Выходов компилятора Выходного языка в экспоненциальном представлении с 16 цифрами точности. Чтобы заменить значение по умолчанию, используйте директиву
Если
является string
"EXPONENTIAL"
, стандартное экспоненциальное представление с 16 цифрами точности используется. Если
является string
"CONCISE"
, компилятор использует внутреннюю эвристику, чтобы вывести значения в большем количестве удобочитаемой формы при поддержании точности. Директива %realformat
устанавливает формат по умолчанию для номера Real
вывод к выбранному стилю для остатка от обработки или пока это не сталкивается с другой директивой %realformat
.
%if constant-expression %else %elseif constant-expression %endif %switch constant-expression %case constant-expression %break %default %endswitch
constant-expression
должен оценить к целому выражению. Это управляет включением следующих строк, пока это не сталкивается с %else
, %elseif
или директивой %endif
. Если constant-expression
оценивает к 0
, строки после директивы не включены. Если constant-expression
оценивает к целочисленному значению кроме 0
, строки после директивы %if
включены до %endif
, %elseif
или директивы %else
.
Когда компилятор сталкивается с директивой %elseif
и никакая предшествующая директива %if
или %elseif
оценила к ненулевому, компилятор выполняет выражение. Если значение 0, строки после директивы %elseif
не включены. Если значение является ненулевым, строки после директивы %elseif
включены до последующего %else
, %elseif
или директивы %endif
.
Директива %else
начинает включение исходного текста, если предыдущие операторы %elseif
или исходный оператор %if
оценивают к 0
; в противном случае это предотвращает включение последующих строк до и включая следующий %endif
.
constant-expression
может содержать любое выражение, заданное в Выражениях Выходного языка.
Оператор %switch
выполняет константное выражение и сравнивает его с выражениями, появляющимися на селекторах %case
. Если соответствие найдено, тело %case
включено; в противном случае %default
включен.
Тела %case ... %default
текут вместе, как в C, и %break
должен использоваться, чтобы выйти из оператора switch. %break
выходит из самого близкого включения %switch
, %foreach
или цикл %for
, в котором это появляется. Например,
%switch(type) %case x /* Matches variable x. */ /* Note: Any valid TLC type is allowed. */ %case "Sin" /* Matches Sin or falls through from case x. */ %break /* Exits the switch. */ %case "gain" /* Matches gain. */ %break %default /* Does not match x, "Sin," or "gain." */ %endswitch
В целом это - больше удобочитаемой формы для конструкции %if/%elseif/%else
.
Синтаксис %foreach
несколько директива включения
constant-expression
должен оценить к целому выражению, которое затем определяет число раз, чтобы выполнить цикл foreach
. identifier
постепенно увеличивается от 0
до меньше, чем конкретное количество. В цикле foreach
можно использовать x
, где x
является идентификатором, чтобы получить доступ к переменной идентификатора. %break
и %continue
являются дополнительными директивами, чтобы можно было включать в директиву %foreach
:
Используйте %break
, чтобы выйти из самого близкого включения %for
, %foreach
или оператор %switch
.
Используйте %continue
, чтобы начать следующую итерацию цикла.
Директива %for
функциональна, но она не рекомендуется. Вместо этого используйте %roll
, который предусматривает ту же возможность более открытым способом. Генератор кода не использует построение %for
.
Синтаксис %for
несколько директива включения
Первый фрагмент директивы %for
идентичен оператору %foreach
, в котором это заставляет цикл выполняться от 0
до времен N-1
по телу цикла. В нормальном случае это включает только строки между %body
и %endbody
, и строки между %for
и %body
, и игнорирует строки между %endbody
и %endfor
.
%break
и директивы %continue
действуют то же самое, как они делают в директиве %foreach
.
const-exp2
является Булево выражение, которое указывает, должен ли цикл быть прокручен. Если const-exp2
верен, ident2
получает значение const-exp3
; в противном случае это получает пустую строку. Когда цикл прокручивается, строки между %for
и %endfor
включены в вывод точно одно время. ident2
задает идентификатор, который будет использоваться для тестирования, был ли цикл прокручен в теле. Например,
%for Index = <NumNonVirtualSubsystems>3, rollvar="i" { int i; for (i=0; i< %<NumNonVirtualSubsystems>; i++) { %body x[%<rollvar>] = system_name[%<rollvar>]; %endbody } } %endfor
Если количество невиртуальных подсистем (NumNonVirtualSubsystems
) больше, чем или равно 3, цикл прокручивается, заставляя код в цикле быть сгенерированным точно однажды. В этом случае, Index = 0
.
Если цикл не прокручивается, текст до и после тела цикла проигнорирован, и тело является сгенерированными временами NumNonVirtualSubsystems
.
Этот механизм передает каждому отдельному управлению циклом, должно ли это быть прокручено.
Синтаксис %roll
несколько директива включения
%roll ident1 = roll-vector-exp, ident2 = threshold-exp, ... block-exp [, type-string [,exp-list] ] %break %continue %endroll
Этот оператор использует roll-vector-exp
, чтобы расширить тело оператора %roll
многократно как в операторе %foreach
. Если спектр будет предоставлен в roll-vector-exp
, и та область значений больше, чем выражение threshold-exp
, цикл прокрутится. То, когда цикл прокручивается, тело цикла расширено однажды, и идентификатор (ident2
) предусмотрел пороговое выражение, установлено в имя контрольной переменной цикла. Если никакая область значений не больше, чем заданный порог прокрутки, этот оператор идентичен оператору %foreach
. Например,
%roll Idx = [ 1 2 3:5, 6, 7:10 ], lcv = 10, ablock %endroll
В этом случае тело оператора %roll
расширяется 10 раз, как в операторе %foreach
, потому что нет никаких областей, больше, чем или равны 10. количества Idx
от 1 до 10, и lcv
установлены в пустую строку, ""
.
Когда Компилятор Выходного языка решает, что данный блок прокрутится, это выполняет вызов функции GENERATE_TYPE
вывести различные части цикла (кроме тела). Используемым типом по умолчанию является Roller
; можно заменить этот тип со строкой, которую вы задаете. Дополнительные аргументы, переданные оператору %roll
, предоставляются в качестве аргументов этим функциям специального назначения. Вызванная функция является одной из этих четырех функций:
RollHeader(block, ...)
. Эта функция вызвана однажды на первом разделе этого вектора списка, который на самом деле прокрутится. Это должно возвратить строку, которая присвоена lcv
в теле оператора %roll
.
LoopHeader(block, StartIdx, Niterations, Nrolled, ...)
. Эта функция вызвана однажды для каждого раздела, который прокрутится до тела оператора %roll
.
LoopTrailer(block, Startidx, Niterations, Nrolled, ...)
. Эта функция вызвана однажды для каждого раздела, который прокрутится после тела оператора %roll
.
RollTrailer(block, ...)
. Эта функция вызвана однажды в конце оператора %roll
, если какая-либо из областей значений вызвала прокрутку цикла.
Эти функции должны вывести специфичные для языка объявления, код цикла, и так далее как требуется, чтобы сгенерировать код для цикла.
Пример файла Roller.tlc
%implements Roller "C" %function RollHeader(block) Output { int i; %return ("i") %endfunction %function LoopHeader(block,StartIdx,Niterations,Nrolled) Output for (i = %<StartIdx>; i < %<Niterations+StartIdx>; i++) { %endfunction %function LoopTrailer(block,StartIdx,Niterations,Nrolled) Output } %endfunction %function RollTrailer(block) Output } %endfunction
Библиотека функции Компилятора Выходного языка, которой предоставляют генератор кода, имеет возможность извлечь ссылки на блок I/O и другие векторы генератора кода, которые значительно упрощают тело оператора %roll
. Эти функции включают LibBlockInputSignal
, LibBlockOutputSignal
, LibBlockParameter
, LibBlockRWork
, LibBlockIWork
, LibBlockPWork
, LibDeclareRollVars
, LibBlockMatrixParameter
, LibBlockParameterAddr
, LibBlockContinuousState
и LibBlockDiscreteState
. (См. страницы ссылки на функцию в Функциях Входного сигнала, Функциях Выходного сигнала, Функциях Параметра, и Вектор-функциях работы и Состоянии блока.) Эта библиотека также включает реализацию по умолчанию Roller.tlc
как “плоский” ролик.
Расширение бывшего примера к циклу, который прокручивается,
%language "C" %assign ablock = BLOCK { Name "Hi" } %roll Idx = [ 1:20, 21, 22, 23:25, 26:46], lcv = 10, ablock Block[%< lcv == "" ? Idx : lcv>] *= 3.0; %endroll
Этот код Компилятора Выходного языка производит этот вывод:
{ int i; for (i = 1; i < 21; i++) { Block[i] *= 3.0; } Block[21] *= 3.0; Block[22] *= 3.0; Block[23] *= 3.0; Block[24] *= 3.0; Block[25] *= 3.0; for (i = 26; i < 47; i++) { Block[i] *= 3.0; } }
Компилятор Выходного языка предоставляет простую объектно-ориентированную услугу. Директивы языка
Это средство было специально разработано для настройки кода для блоков Simulink, но может использоваться для других целей также.
Директива %language
задает сгенерированный выходной язык. Это требуется как проверка на непротиворечивость проверить файлы реализации, найденные для сгенерированного языка. Директива %language
должна появиться до первого GENERATE
или вызова встроенной функции GENERATE_TYPE
. %language
задает язык как строку. Например:
%language "C"
Блоки Simulink имеют параметр Type
. Этот параметр является строкой, которая задает тип блока, например, "Sin"
или "Gain"
. Объектно-ориентированное средство использует этот тип, чтобы искать путь файл, который реализует блок. По умолчанию именем файла является Type
блока с добавленным .tlc
, так например, если бы Type
является "Sin"
, Компилятор искал бы "Sin.tlc"
вдоль пути. Можно заменить это имя файла по умолчанию с помощью директивы %generatefile
, чтобы задать имя файла, которое вы хотите использовать, чтобы заменить имя файла по умолчанию. Например,
%generatefile "Sin" "sin_wave.tlc"
Файлы, которые реализуют специфичный для блока код, должны содержать директиву %implements
указание и тип и реализовываемый язык. Компилятор Выходного языка произведет ошибку, если директива %implements
не будет соответствовать как ожидалось. Например,
%implements "Sin" "Pascal"
вызывает ошибку, если начальным выбором языка был C.
Можно использовать один файл, чтобы реализовать больше чем один выходной язык путем определения желаемых языков в векторе. Например,
%implements "Sin" "C"
Наконец, можно реализовать несколько типов с помощью подстановочного знака (*
) для поля типа:
%implements * "C"
Использование подстановочного знака (*
) не рекомендуется, потому что это ослабляет проверку ошибок на директиву %implements
.
Компилятор Выходного языка имеет две встроенных функции, которые диспетчеризируют объектно-ориентированные вызовы, GENERATE
и GENERATE_TYPE
. Можно вызвать функцию, появляющуюся в файле реализации (снаружи заданного файла) только при помощи GENERATE
и GENERATE_TYPE
специальные функции.
СГЕНЕРИРОВАТЬ. Функция GENERATE
берет два или больше входных параметра. Первый аргумент должен быть допустимым осциллографом и вторым строка, содержащая имя функции, чтобы вызвать. Функция GENERATE
передает первый аргумент блока и любые дополнительные аргументы, заданные к вызванной функции. Возвращаемый аргумент является значением, если таковые имеются, возвращенный в вызванную функцию. Обратите внимание на то, что компилятор автоматически “определяет объем” или добавляет первый аргумент в список осциллографов, искавших, как будто это появляется на направляющей строке %with
. (См. Переменное Определение объема.) Этот осциллограф удален, когда функция возвращается.
GENERATE_TYPE. Функция GENERATE_TYPE
берет три или больше входных параметра. Это обрабатывает первые два аргумента тождественно к вызову функции GENERATE
. Третий аргумент является типом; тип, заданный в блоке Simulink, проигнорирован. Это средство используется, чтобы обработать генерацию кода S-функции процессом сборки. Таким образом, типом блока является S-function
, но Компилятор Выходного языка генерирует его как определенную S-функцию, заданную GENERATE_TYPE
. Например,
GENERATE_TYPE(block, "Output", "dp_read")
указывает, что S-функция block
имеет тип dp_read
.
Аргумент block
и любые дополнительные аргументы передаются вызванной функции. Как встроенная функция GENERATE
, компилятор автоматически определяет объем первого аргумента, прежде чем функция GENERATE_TYPE
будет введена и затем удалит осциллограф по возврату.
В файле, содержащем %implements
, вызовы функции ищутся сначала в файле и затем в глобальной области видимости. Это позволяет скрыть функции помощника, используемые исключительно текущим объектом.
Это не ошибка для GENERATE
и директив GENERATE_TYPE
, чтобы не искать функции соответствия. Это должно предотвратить требующие пустые спецификации для всех аспектов генерации блочного кода. Используйте GENERATE_FUNCTION_EXISTS
или директивы GENERATE_TYPE_FUNCTION_EXISTS
, чтобы определить, существует ли заданная функция на самом деле.
Структура построения управления выходным файлом
Директива %openfile
открывает файл или буфер для записи; необходимая строковая переменная становится переменной типа file
. Например,
%openfile x /% Opens and selects x for writing. %/ %openfile out = "out.h" /% Opens "out.h" for writing. %/
Директива %selectfile
выбирает файл, заданный переменной как поток текущей производительности. Выведите переходит к тому файлу, пока другой файл не выбран с помощью %selectfile
. Например,
%selectfile x /% Select file x for output. %/
Директива %closefile
закрывает заданный файл или буфер. Если закрытая сущность является в настоящее время выбранным потоком вывода, %closefile
вызывает %selectfile
к повторному выбору ранее выбранный поток вывода.
Существует два возможных случая, которые должен обработать %closefile
:
Если поток является файлом, связанная переменная удалена как будто %undef
.
Если поток является буфером, связанная переменная получает текст, который был выведен к потоку. Например,
%assign x = "" /% Creates an empty string. %/ %openfile x "hello, world" %closefile x /% x = "hello, world\n"%/
При желании можно добавить к выходному файлу или строке при помощи дополнительного режима, a
, как в
%openfile "foo.c", "a" %% Opens foo.c for appending.
Входные директивы управления файлом
Директива %include
ищет путь конечный файл, заданный string
, и включает содержимое файла, встроенного в точке, где оператор %include
появляется.
Директива %addincludepath
добавляет, что дополнительное включает путь, который будет искаться, когда Справочники по компилятору Выходного языка %include
или блокируют конечные файлы. Синтаксис
%addincludepath string
string
может быть абсолютным путем или явным относительным путем. Например, чтобы задать абсолютный путь, использовать
%addincludepath "C:\\folder1\\folder2" (PC) %addincludepath "/folder1/folder2" (UNIX)
Чтобы задать относительный путь, путь должен явным образом запуститься с .
. Например,
%addincludepath ".\\folder2" (PC) %addincludepath "./folder2" (UNIX)
Обратите внимание на то, что для PC, наклонных черт влево нужно оставить (удвоенные).
Когда явный относительный путь задан, папка, которая добавляется к пути поиска файлов Компилятора Выходного языка, создается путем конкатенации местоположения конечного файла, который содержит директиву %addincludepath
и явный относительный путь.
Компилятор Выходного языка ищет папки в следующем порядке цель, или включайте файлы:
Текущая папка.
Включайте пути, заданные в директивы %addincludepath
. Компилятор оценивает несколько директив %addincludepath
с самого начала.
Включайте пути, заданные в командную строку через -I
. Компилятор оценивает несколько опций -I
справа налево.
Как правило, директивы %addincludepath
должны быть заданы в вашем системном конечном файле. Несколько директив %addincludepath
добавят разнообразные пути к пути поиска файлов Компилятора Выходного языка.
Компилятор не ищет путь MATLAB и не найдет файл, который доступен только на том пути. Компилятор ищет только местоположения, описанные выше.
Связанные утверждают, ошибка, предупреждение, и директивы сообщения отладки
Эти директивы производят ошибку, предупреждение, или прослеживают сообщения каждый раз, когда конечный файл обнаруживает состояние ошибки, или трассировка желаема. Лексемы после директивы по строке становятся частью сгенерированной ошибки или предупреждающего сообщения.
Компилятор Выходного языка помещает сообщения, сгенерированные %trace
на stderr
, если и только если вы задаете многословный переключатель режима (-v
) к Компилятору Выходного языка. Смотрите Параметры командной строки для получения дополнительной информации о переключателях.
Директива %assert
выполняет выражение и производит трассировку стека, если выражение оценивает к булеву false
.
Для директив %assert
, которые будут оценены, Enable TLC assertion должен быть выбран в разделе TLC process Code Generation> панель Debug. Действие по умолчанию для директив %assert
, которые не будут оценены.
Директива %exit
сообщает об ошибке и останавливает дальнейшую компиляцию.
В следующей таблице перечислены встроенные функции и значения, которые добавляются к списку параметров, которые появляются в файле
. Эти функции Компилятора Выходного языка и значения заданы в верхнем регистре так, чтобы они были визуально отличны от других параметров в model.rtw
файле
, и, условно, от пользовательских параметров.model.rtw
Встроенные функции TLC и значения
Имя встроенной функции | Расширение |
---|---|
Первое выражение должно быть строкой, которая соответствует одним из имен типов в таблице Target Language Value Types, и второе выражение будет брошено к тому типу. Типичное использование может быть должно бросить переменную к действительному формату как в CAST("Real", variable-name) Пример этого находится в работе со значениями параметров для S-функций. Чтобы использовать их в C или Коде С++, необходимо преобразовать тип их к | |
Если идентификатор | |
Выполняет оценку в MATLAB. Например, %assign result = FEVAL("sin",3.14159) Директива %matlab disp(2.718) Примечание: Если функция MATLAB возвращает больше чем одно значение, TLC получает первое значение только. | |
| |
Первое выражение является значением | |
Возвращает массив строк, содержащих имена полей записи, сопоставленные с записью. Поскольку это возвращает отсортированный список строк, функцией является | |
Возвращает содержимое заданного имени поля, если имя поля сопоставлено с записью. Функциональный поиск хеша использования, и поэтому выполняется в постоянное время. | |
Выполняет вызовы функции, сопоставленные с определенным типом записи (т.е. функции записи блока). Например, используйте это, чтобы выполнить функции в файлах | |
Для заданного типа записи существует файл | |
Возвращает потенциально многострочную строку, которая может использоваться, чтобы объявить значение (значения) Например,
урожаи этот код С:
| |
Определяет, существует ли данная функция блока. Первое выражение совпадает с первым аргументом к | |
Подобно | |
То же самое как | |
Возвращает значения переключателей командной строки. Только следующие переключатели поддерживаются: v, m, p, O, d, dr, r, I, a | |
| |
Возвращает мнимую часть комплексного числа. | |
127 | |
-128 | |
32767 | |
-32768 | |
2147483647 | |
-2147483648 | |
Минимальное целочисленное значение на хост-машине. | |
Максимальное целочисленное значение на хост-машине. | |
Возвращает | |
Где типы данных обоих выражений являются числовыми: возвращает Где тип данных или выражения является нечисловым (например, строка или запись): возвращает | |
Возвращает | |
Возвращает | |
Возвращает | |
Возвращает | |
Возвращает | |
| Возвращает булево значение, указывающее, является ли его аргумент ссылкой на параметр Simulink или нет. Эта функция поддерживает параметр, совместно использующий с Simulink; использование его может сохранить память и время во время генерации кода. Например, %if !ISSLPRMREF(param.Value) assign param.Value = CAST("Real", param.Value) %endif |
Предопределенный файл ни для какого вывода, который можно использовать в качестве аргумента к | |
Количество конечных файлов, используемых к настоящему времени в расширении. | |
Возвращает количество строк, которые были записаны в в настоящее время выбранный файл или буфер. Не работает на | |
Возвращает действительную часть комплексного числа. | |
Удаляет заданное поле из содержимого записи. Возвращает | |
Возвращает число раз, текущие области списка являются цикличным выполнением или | |
Устанавливает содержимое имени поля, сопоставленного с записью. Возвращает | |
Вычисляет размер первого выражения и генерирует двухэлементный вектор - строку. Если второй операнд задан, он используется в качестве целочисленного индекса в этот вектор - строку; в противном случае целый вектор - строка возвращен. [1,<number of blocks>] | |
Форматирует данные в переменной | |
Предопределенный файл для | |
Расширяет выражение в строку; символов | |
Принимает вектор значений ASCII и возвращает строку, которая создается путем обработки каждого элемента как кода ASCII для отдельного символа. Используемый, в основном, для строковых параметров S-функции. | |
Ищет специально отформатированные строки формы %<sysname("<sub>/Gain")> возвращается ["sub","Gain"] В записях | |
Возвращает вектор, содержащий имена конечных файлов, включенных к настоящему времени в расширение. Абсолютные пути используются. См. также | |
Булева константа, которая равняется отрицательному выполненному Булевому выражению. | |
Булева константа, которая равняется положительному выполненному Булевому выражению. | |
Дата и время компиляции. | |
Версия и дата Компилятора Выходного языка. | |
Оценивает | |
| |
| |
| |
Максимальное значение беззнаковых целых чисел на хост-машине. | |
Принимает строку и возвращается 1, если строка содержит только пробельные символы ( | |
Первое выражение является вектором списка, и второе выражение является порогом списка. Эта функция возвращает |
Встроенная функция FEVAL
вызывает функции файла MATLAB и MEX-функции. Структура
%assign result = FEVAL( matlab-function-name, rhs1, rhs2, ... rhs3, ... );
Только один аргумент левой стороны позволен, когда вы используете FEVAL
.
Если ваша оценка функции MATLAB приводит к ошибке, компилятор TLC не отключает, но продолжает выполнение. Директива FEVAL возвращает пустое значение к TLC.
Эта таблица показывает преобразования, которые сделаны, когда вы используете FEVAL
.
Преобразования MATLAB
Тип TLC | Тип MATLAB |
---|---|
"Boolean" | Boolean (скаляр или матрица) |
"Number" | Double (скаляр или матрица) |
"Real" | Double (скаляр или матрица) |
"Real32" | Double (скаляр или матрица) |
"Unsigned" | Double (скаляр или матрица) |
"String" | String |
"Vector" | Если вектор является гомогенным, он преобразован в вектор MATLAB. Если вектор неоднороден, он преобразован в массив ячеек MATLAB. |
"Gaussian" | Complex (скаляр или матрица) |
"UnsignedGaussian" | Complex (скаляр или матрица) |
"Complex" | Complex (скаляр или матрица) |
"Complex32" | Complex (скаляр или матрица) |
"Identifier" | String |
"Subsystem" | String |
"Range" | Расширенный вектор Doubles |
"Idrange" | Расширенный вектор Doubles |
"Matrix" | Если матрица является гомогенной, она преобразована в матрицу MATLAB. Если матрица неоднородна, она преобразована в массив ячеек MATLAB. (Массивы ячеек могут быть вложены.) |
"Scope" или "Record" | Структура с элементами |
Scope или псевдоним Record | Строка, содержащая полностью определила имя псевдонима |
Scope или массив Record | Массив ячеек структур |
Другой тип, не упомянутый выше | Преобразование, не поддержанное |
Когда значения возвращены из MATLAB, они преобразованы как показано в этой таблице. Обратите внимание на то, что преобразование матриц больше чем с двумя размерностями не поддержано, ни является преобразованием или удрученный из 64-битных целочисленных значений.
Больше преобразований
Тип MATLAB | Тип TLC |
---|---|
String | String |
Vector of Strings | Вектор строк |
Boolean (scalar or matrix) | Boolean (скаляр или матрица) |
INT8, INT16, INT32 | Number (скаляр или матрица) |
INT64 | Не поддерживаемый |
UINT64 | Не поддерживаемый |
Объедините INT8, INT16, INT32 | Гауссов (скаляр или матрица) |
UINT8, UINT16, UINT32 | Unsigned (скаляр или матрица) |
Объедините UINT8, UINT16, UINT32 | UnsignedGaussian (скаляр или матрица) |
Single precision | Real32 (скаляр или матрица) |
Complex single precision | Complex32 (скаляр или матрица) |
Double precision | Real (скаляр или матрица) |
Complex double precision | Complex (скаляр или матрица) |
Sparse matrix | Расширенный до матрицы Doubles |
Cell array of structures | Массив записи |
Cell array of non-structures | Вектор или матрица типов преобразованы от типов элементов |
Cell array of structures and non-structures | Преобразование, не поддержанное |
Structure | Record |
Object | Преобразование, не поддержанное |
Другие типы значения в настоящее время не поддержаны.
Как пример, этот оператор использует встроенную функцию FEVAL
, чтобы вызвать MATLAB, чтобы взять синус входного параметра.
%assign result = FEVAL( "sin", 3.14159 )
Переменные (идентификаторы) могут взять следующие постоянные значения. Отметьте суффикс на значении.
Постоянная форма | Тип TLC |
---|---|
1.0 | "Real" |
1.0[F/f] | "Real32" |
1 | "Number" |
1[U|u] | "Unsigned" |
1.0i | "Complex" |
1[Ui|ui] | "UnsignedGaussian" |
1i | "Gaussian" |
1.0[Fi|fi] | "Complex32" |
Суффикс управляет типом Компилятора Выходного языка, полученным из константы.
Эта таблица показывает константы Компилятора Выходного языка и их эквивалентные значения MATLAB.
Константы TLC | Эквивалентное значение MATLAB |
---|---|
rtInf , Inf , inf | +inf |
rtMinusInf | -inf |
rtNan , NaN , nan | nan |
rtInfi , Infi , infi | inf*i |
rtMinusInfi | -inf*i |
rtNaNi , NaNi , nani | nan*i |
Для значений с двойной точностью следующее задано для бесконечного и не числа значения IEEE®:
rtInf, inf, rtMinusInf, -inf, rtNaN, nan
Для значений с одинарной точностью применяются эти константы:
rtInfF, InfF, rtMinusInfF, rtNaNF, NaNF
Их соответствующие версии, когда комплекс:
rtInfi, infi, rtMinusInfi, -infi, rtNaNi (for doubles) rtInfFi, InfFi, rtMinusInfFi, rtNaNFi, NaNFi (for singles)
Для целочисленных значений задано следующее:
INT8MIN, INT8MAX, INT16MIN, INT16MAX, INT32MIN, INT32MAX, UINT8MAX, UINT16MAX, UINT32MAX, INTMAX, INTMIN, UINTMAX
Чтобы задать или изменить идентификаторы (переменные TLC), используйте директиву
%assign [::]expression = constant-expression
Эта директива вводит новые идентификаторы (переменные) или изменяет значения из существующих единиц. Левая сторона может быть полной ссылкой к переменной с помощью .
и операторов []
, или это может быть один элемент вектора или матрицы. В случае матрицы только один элемент изменяется присвоением.
Директива %assign
вставляет новые идентификаторы в осциллограф локальной функции, осциллограф функции файла, сгенерируйте осциллограф файла, или в глобальную область видимости. Идентификаторы, введенные в функциональный осциллограф, не доступны в функциях, вызванных, и удалены по возврату из функции. Идентификаторы, вставленные в глобальную область видимости, являются персистентными. Можно изменить существующие идентификаторы путем завершенного переопределения их. Константные выражения могут включать легальные идентификаторы из файлов .rtw
. Можно использовать %undef
, чтобы удалить идентификаторы таким же образом, что вы используете его, чтобы удалить макросы.
В рамках функции переменные присвоения создают новые локальные переменные, если вы не используете оператор разрешения области видимости ::
. В этом примере присвоение создает переменную foo
, локальную для функции, которая исчезнет, когда функция выйдет.
%function ... ... %assign foo = 3 ... %endfunction
Обратите внимание на то, что foo
создается, даже если уже существует глобальный foo
.
Чтобы создать или изменить значения в глобальной области видимости, необходимо использовать оператор разрешения области видимости (::
), чтобы снять неоднозначность, как в
%function ... %assign foo = 3 %assign ::foo = foo ... %endfunction
Оператор разрешения области видимости обеспечивает компилятор, чтобы присвоить значение локальной переменной foo
, 3, к глобальной переменной foo
.
Это - ошибка изменить значение из файла генератора кода, не квалифицируя его с осциллографом. Этот пример не генерирует ошибку:
%assign CompiledModel.name = "newname" %% No error
Этот пример генерирует ошибку:
%with CompiledModel %assign name = "newname" %% Error %endwith
Используйте директиву %createrecord
, чтобы создать новые записи в текущем осциллографе. Например, если вы хотите создать новую запись под названием Rec
, который содержит два элемента (например, Name "Name"
и Type "t"
), использовать
%createrecord Rec { Name "Name"; Type "t" }
Используйте директиву %addtorecord
, чтобы добавить новые записи на существующие записи. Например, если у вас есть запись под названием Rec1
, который содержит запись под названием Rec2
, и вы хотите добавить дополнительный Rec2
в него, использовать
%addtorecord Rec1 Rec2 { Name "Name1"; Type "t1" }
Эти данные показывают результат добавления записи на существующую.
Если вы хотите получить доступ к новой записи, можно использовать
%assign myname = Rec1.Rec2[1].Name
В этом том же примере, если вы хотите добавить две записи на существующую запись, использование
%addtorecord Rec1 Rec2 { Name "Name1"; Type "t1" } %addtorecord Rec1 Rec2 { Name "Name2"; Type "t2" }
Это производит
Можно использовать директиву %assign
, чтобы добавить новый параметр в существующую запись. Например,
%addtorecord Block[Idx] N 500 /% Adds N with value 500 to Block %/ %assign myn = Block[Idx].N /% Gets the value 500 %/
добавляют новый параметр, N
, в конце существующего блока с именем и текущим значением существующей переменной, как показано в этой фигуре. Это возвращает значение блока.
В этом разделе рассматриваются, как Компилятор Выходного языка разрешает ссылки на переменные (включая записи).
Scope, в этом документе, имеет два связанных значения. Во-первых, осциллограф является атрибутом переменной, которая задает ее видимость и персистентность. Например, переменная, заданная в теле функции, видима только в этой функции, и это сохраняется только, пока эта функция выполняется. Такая переменная имеет function (or local) scope. Каждая переменная TLC имеет один (и только один) осциллографов, описанных в Осциллографах.
Термин осциллограф также относится к набору или pool, переменных, которые имеют тот же осциллограф. В данной точке в осуществлении программы TLC могут существовать несколько осциллографов. Например, во время выполнения функции, функциональный осциллограф (пул переменных, локальных для функции), существует. Во всех случаях также существует глобальная область видимости (пул глобальных переменных).
Чтобы разрешить ссылки на переменную, TLC ведет поисковый список текущих осциллографов и ищет их в четко определенной последовательности. Поисковая последовательность описана в Как Ссылки на переменную Твердости TLC.
Dynamic scoping относится к процессу, которым TLC создает и освобождает переменные и осциллографы, в которых они существуют. Например, переменные в функциональном осциллографе существуют только, в то время как функция определения выполняется.
Следующие разделы описывают возможные осциллографы, которые может иметь переменная TLC.
Глобальная область видимости. По умолчанию переменные TLC имеют глобальную область видимости. Глобальные переменные видимы к и могут быть сосланы, код где угодно в программе TLC. Глобальные переменные сохраняются в течение осуществления программы TLC. Глобальные переменные, как говорят, принадлежат global pool.
Обратите внимание на то, что запись CompiledModel
файла
имеет глобальную область видимости. Поэтому можно получить доступ к этой структуре от функций TLC или файлов.model.rtw
Можно использовать оператор разрешения области видимости (::
), чтобы явным образом сослаться или создать глобальные переменные из функции. Смотрите Оператор разрешения области видимости для примеров.
Обратите внимание на то, что можно использовать директиву %undef
, чтобы освободить память используемый глобальными переменными.
Осциллограф файла. Переменные с осциллографом файла видимы только в файле, в котором они создаются. Чтобы ограничить осциллограф переменных таким образом, используйте директиву %filescope
где угодно в файле определения.
В следующем фрагменте кода переменные fs1
и fs2
имеют осциллограф файла. Обратите внимание на то, что директива %filescope
не должна быть расположена перед операторами, которые создают переменные.
%assign fs1 = 1 %filescope %assign fs2 = 3
Переменные, осциллограф которых ограничивается %filescope
, выходят из осциллографа, когда выполнение файла, содержащего их, завершается. Это позволяет вам освободить память выделенный таким переменным.
Функциональный (Локальный) Осциллограф. Переменные, заданные в теле функции, имеют функциональный осциллограф. Таким образом, они видимы в и локальны для функции определения. Например, в следующем фрагменте кода, переменная localv
локальна для функционального foo
. Переменная x
является глобальной переменной.
%assign x = 3 %function foo(arg) %assign localv = 1 %return x + localv %endfunction
Локальная переменная может иметь то же имя как глобальная переменная. Чтобы относиться, в функции, к тождественно именованным локальным и глобальным переменным, необходимо использовать оператор разрешения области видимости (::
), чтобы снять неоднозначность ссылок на переменную. Смотрите Оператор разрешения области видимости для примеров.
Сами функции (в противоположность переменным, заданным в функциях), имеют глобальную область видимости. Существует одно исключение: функции, определяемые в генерируют осциллограф, локальны для того осциллографа. Смотрите Генерируют Осциллограф.
Осциллограф %with. Директива %with
добавляет новый осциллограф, называемый %with scope
, к текущему списку осциллографов. Эта директива облегчает относиться к ограниченным по объему блоком переменным.
Структура директивы %with
Например, директива
%with CompiledModel.System[sysidx] ... %endwith
добавляет осциллограф the CompiledModel.System[sysidx]
к поисковому списку. Этот осциллограф ищется перед чем-либо еще. Можно затем обратиться к имени системы просто
Name
вместо
CompiledModel.System[sysidx].Name
Сгенерируйте Осциллограф. Generate scope является специальным осциллографом, используемым определенными встроенными функциями, которые разработаны, чтобы поддержать генерацию кода. Эти функции диспетчеризируют вызовы функции, которые сопоставлены с определенным типом записи. Эта возможность поддерживает тип полиморфизма, в котором различные типы записи сопоставлены с функциями (аналогичный методам) того же имени. Как правило, эта функция используется, чтобы сопоставить записи Block
на функции, которые реализуют функциональность различных типов блока.
Функции, которые используют, генерируют осциллограф, включают GENERATE
, GENERATE_TYPE
, GENERATE_FUNCTION_EXISTS
и GENERATE_TYPE_FUNCTION_EXISTS
. Смотрите ГЕНЕРИРУЮТ и Функции GENERATE_TYPE. В этом разделе рассматриваются, генерируют осциллограф с помощью встроенной функции GENERATE
в качестве примера.
Синтаксис функции GENERATE
GENERATE(blk,fn)
Первый аргумент (blk
) к GENERATE
является допустимым именем записи. Второй аргумент (fn
) является именем функции, которая будет диспетчеризирована. Когда функция диспетчеризируется через вызов GENERATE
, TLC автоматически добавляет blk
в список осциллографов, который ищется, когда ссылки на переменную разрешены. Таким образом запись (blk
) видима к диспетчеризированной функции, как будто неявная директива %with <blk>... %endwith
существовала в диспетчеризированной функции.
В этом контексте запись под названием blk
, как говорят, находится в, генерируют осциллограф.
Три файла TLC, иллюстрируя использование генерируют осциллограф, описаны ниже. Файл polymorph.tlc
создает две записи, представляющие два гипотетических типа блока, MyBlock
и YourBlock
. Каждый тип записи имеет присоединенную функцию под названием aFunc
. Специфичные для блока реализации aFunc
содержатся в файлах MyBlock.tlc
и YourBlock.tlc
.
Используя вызовы GENERATE
, polymorph.tlc
отправляет функции для каждого типа блока. Заметьте, что реализации aFunc
могут относиться к полям MyBlock
и YourBlock
, потому что эти записи находятся в, генерируют осциллограф.
Следующий листинг показывает polymorph.tlc
:
%% polymorph.tlc %language "C" %%create records used as scopes within dispatched functions %createrecord MyRecord { Type "MyBlock"; data 123 } %createrecord YourRecord { Type "YourBlock"; theStuff 666 } %% dispatch the functions thru the GENERATE call. %% dispatch to MyBlock implementation %<GENERATE(MyRecord, "aFunc")> %% dispatch to YourBlock implementation %<GENERATE(YourRecord, "aFunc")> %% end of polymorph.tlc
Следующий листинг показывает MyBlock.tlc
:
%%MyBlock.tlc %implements "MyBlock" "C" %% aFunc is invoked thru a GENERATE call in polymorph.tlc. %% MyRecord is in generate scope in this function. %% Therefore, fields of MyRecord can be referenced without %% qualification %function aFunc(r) Output %selectfile STDOUT The value of MyRecord.data is: %<data> %closefile STDOUT %endfunction %%end of MyBlock.tlc
Следующий листинг показывает YourBlock.tlc
:
%%YourBlock.tlc %implements "YourBlock" "C" %% aFunc is invoked thru a GENERATE call in polymorph.tlc. %% YourRecord is in generate scope in this function. %% Therefore, fields of YourRecord can be referenced without %% qualification %function aFunc(r) Output %selectfile STDOUT The value of YourRecord.theStuff is: %<theStuff> %closefile STDOUT %endfunction %%end of YourBlock.tlc
Вызов и вывод polymorph.tlc
, как отображено в Окне Команды MATLAB, показывают ниже:
tlc -v polymorph.tlc The value of MyRecord.data is: 123 The value of YourRecord.theStuff is: 666
Функции, определяемые в генерируют осциллограф, локальны для того осциллографа. Это - исключение к этим функциям общего правила, имеют глобальную область видимости. В вышеупомянутом примере, например, ни одна из реализаций aFunc
не имеет глобальную область видимости.
Оператор разрешения области видимости (::
) используется, чтобы указать, что глобальная область видимости должна искаться, когда функция TLC ищет ссылку на переменную. Оператор разрешения области видимости часто используется, чтобы изменить значение глобальных переменных (или даже создать глобальные переменные) из функций.
При помощи оператора разрешения области видимости можно разрешить неоднозначности, которые возникают когда ссылки на функцию тождественно названные локальные и глобальные переменные. В следующем примере глобальная переменная создается foo
. Кроме того, функциональный myfunc
создает и инициализирует локальную переменную под названием foo
. Функциональный myfunc
явным образом ссылается на глобальную переменную foo
при помощи оператора разрешения области видимости.
%assign foo = 3 %% this variable has global scope . . . %function myfunc(arg) %assign foo = 3 %% this variable has local scope %assign ::foo = arg %% this changes the global variable foo %endfunction
Можно также использовать оператор разрешения области видимости в функции, чтобы создать глобальные переменные. Следующая функция создает и инициализирует глобальную переменную:
%function sideffect(arg) %assign ::theglobal = arg %% this creates a global variable %endfunction
В этом разделе рассматриваются, как Компилятор Выходного языка ищет существующие осциллографы, чтобы разрешить ссылки на переменную.
Глобальная область видимости. В самом простом случае Компилятор Выходного языка разрешает ссылку на переменную путем поиска глобального пула (включая структуру CompiledModel
).
Осциллограф %with. Можно изменить поисковый список и искать последовательность при помощи директивы %with
. Например, когда вы добавляете следующее построение,
%with CompiledModel.System[sysidx] ... %endwith
осциллограф System[sysidx]
добавляется к поисковому списку. Этот осциллограф ищется сначала, как показано этим изображением.
Этот метод делает более простым получить доступ к встроенным определениям. Используя построение %with
(как в предыдущем примере), можно обратиться к имени системы просто
Name
вместо
CompiledModel.System[sysidx].Name
Функциональный Осциллограф. Функция имеет свой собственный осциллограф. Тот осциллограф добавляется к ранее описанному поисковому списку, как показано в этой схеме.
Например, в следующем фрагменте кода,
% with CompiledModel.System[sysidx] ... %assign a=foo(x,y) ... %endwith ... %function foo(a,b) ... assign myvar=Name ... %endfunction ... %<foo(1,2)>
Если Name
не задан в foo
, присвоение использует значение Name
от предыдущего осциллографа, CompiledModel.System[SysIdx].Name
.
Во вложенной функции только самый внутренний функциональный осциллограф ищется, вместе с включением %with
и глобальные области видимости, как показано в следующей схеме:
Осциллограф файла. Осциллографы файла ищутся перед глобальной областью видимости, как показано в следующей схеме.
Правило для вложенных осциллографов файла подобно этому для осциллографов вложенной функции. В случае вложенных осциллографов файла только ищется самый внутренний вложенный осциллограф файла.
Построение функции выходного языка
%function identifier ( optional-arguments ) [Output | void] %return %endfunction
Функции на выходном языке являются рекурсивными и имеют свой собственный пробел локальной переменной. Функции выходного языка не производят вывод, если они не выходные функции или явным образом используют %openfile
, %selectfile
и директивы %closefile
.
Функция опционально возвращает значение с директивой %return
. Возвращенное значение может быть типом, заданным в таблице в Типах Значения Выходного языка.
В этом примере функция, name
, возвращает x
, если x
и y
равны, или возвращает z
, если x
и y
не равны:
%function name(x,y,z) void %if x == y %return x %else %return z %endif %endfunction
Вызовы функции могут появиться в контекстах, где переменные позволены.
Операторы %with
, которые являются в действительности, когда функция вызвана, доступны функции. Вызовы других функций не включают локальный осциллограф функции, но действительно включают операторы %with
, появляющиеся в функции.
Присвоения на переменные в функции создают новые локальные переменные и не могут изменить значение глобальных переменных, если вы не используете оператор разрешения области видимости (::
).
По умолчанию функция возвращает значение и не производит вывод. Можно заменить это поведение путем определения Output
и модификаторов void
на строке объявления функции, как в
%function foo() Output ... %endfunction
В этом случае функция продолжает производить вывод для в настоящее время открытого файла и не требуется, чтобы возвращать значение. Можно использовать модификатор void
, чтобы указать, что функция не возвращает значение и не должна производить вывод, как в
%function foo() void ... %endfunction
В функции, левом члене оператора %assign
значения по умолчанию к созданию локальной переменной. Новая запись создается в блоке функции в цепочке осциллографа; это не влияет на другие записи. Пример появляется в Функциональном Осциллографе.
Можно заменить это поведение по умолчанию при помощи %assign
с оператором разрешения области видимости (::
).
При вводе новые осциллографы в функции, с помощью %with
, эти новые осциллографы используются во время вызовов вложенной функции, но локальный осциллограф для функции не ищется.
Если %with
включен в функции, ее связанный осциллограф несут с вызовами вложенной функции, как показано в следующей фигуре.
Оператор %return
закрывает все операторы %with
, появляющиеся в текущей функции. В этом примере автоматически закрывается оператор %with
, когда с оператором %return
сталкиваются, удаляя осциллограф из списка искавших осциллографов:
%function foo(s) %with s %return(name) %endwith %endfunction
Оператор %return
не требует значения. Можно использовать %return
, чтобы возвратиться из функции без возвращаемого значения.