Вы управляете тем, как код генерируется из моделей, в основном, путем написания или изменения скриптов, которые применяют директивы TLC и встроенные функции. Используйте следующие разделы в качестве основной ссылки на синтаксис и формат конструкций целевого языка, а также MATLAB®
tlc сама команда.
Директива целевого языка должна быть первым непустым символом на линию и начинаться с % символ. Линии, начинающиеся с %% являются комментариями TLC и не передаются в выходной поток. Линии, начинающиеся с /* являются комментариями C и передаются в выходной поток.
Файл целевого языка состоит из ряда операторов любой формы:
[text | %<expression>]*
Буквенный текст передается в выходной поток без изменений, и выражения заключаются в %< > оцениваются перед записью в выход (отменяется %< >).
%keyword [argument1, argument2, ...]
The %keyword представляет одну из директив Target Language Compiler, и [argument1, argument2, ...] представляет выражения, которые определяют требуемые параметры. Для примера, заявление
%assign sysNumber = sysIdx + 1
использует %assign директива для определения или изменения значения sysNumber параметр.
Остальная часть этого раздела показывает полный набор директивы Target Language Compiler и подробно описывает каждую директиву.
%% 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. The %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>
%, если expr% elseif expr%else%endifУсловное включение, где постоянное выражение необходимо вычислить целое число. Например, следующий код проверяет, является ли параметр, exprk, имеет числовое значение 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 %endswitchThe %switch директива подобна языку C switch оператор. Выражение expr должен быть типа, который можно сравнить для равенства с помощью == 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Проверяет значение логического выражения. Если выражение вычисляется как false, TLC выдает сообщение об ошибке, трассировку стека и выход; в противном случае выполнение продолжается нормально. Чтобы включить оценку утверждений вне окружения генератора кода, используйте опцию командной строки -da. При построении из генератора кода этот флаг игнорируется, так как он заменяется флажком Enable TLC assertion в TLC process разделе панели Code Generation > Debug. Для управления обработкой утверждений из Командного окна MATLAB используйте
set_param(model, 'TLCAssertion', 'on|off')
установить этот флаг на или off. Default is Off. Чтобы увидеть текущую настройку, используйте
get_param(model, 'TLCAssertion')
%error %warning
%trace %exitДирективы по регулированию потока:
% error tokensThe развернуты и отображены.tokens
% предупреждающих tokensThe развернуты и отображены.tokens
% trace tokens The развернуты и отображаются только при опции подробного выхода в командной строке tokens-v или -v1 задан.
% выход tokensThe развертываются, отображаются и выходы TLC.tokens
При сообщении об ошибках используйте следующую команду, если ошибка вызвана неправильным строением, которую пользователь должен исправить в модели.
%exit Error Message
Если вы добавляете код assert (то есть код, который никогда не должен быть достигнут), используйте
%setcommandswitch "-v1" %% force TLC stack trace %exit Assert message
%assignСоздает идентификаторы (переменные). Общая форма
%assign [::]variable = expression
The :: указывает, что создаваемая переменная является глобальной переменной; в противном случае это локальная переменная в текущих возможностях (т.е. локальная переменная в функции).
Если вам нужно форматировать переменную, скажем, в строке, основанной на других переменных 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Ограничивает возможности переменных файлом, в котором они определены. A %filescope директива в любом месте файла объявляет, что переменные в файле видны только в этом файле. Обратите внимание, что это ограничение также относится к файлам, вставленным через %include директива, в файл, содержащий %filescope директива.
Вы не должны использовать %filescope директива в функциях или GENERATE функций.
%filescope полезно при сохранении памяти. Переменные, возможности которых ограничены %filescope выйти из возможностей, когда выполнение файла, содержащего их, завершится. Это освобождает память, выделенную таким переменным. Напротив, глобальные переменные сохраняются в памяти на протяжении всего выполнения программы.
%includeИспользование %include "file.tlc"чтобы вставить указанный целевой файл в текущую точку.
The %include директивы ведут себя так, как будто они находятся в глобальном контексте. Для примера,
%addincludepath "./sub1" %addincludepath "./sub2"
в .tlc Файл позволяет неявно ссылаться на любую подпапку:
%include "file_in_sub1.tlc" %include "file_in_sub2.tlc"
Используйте косые черты для имен папок, так как они работают в обоих UNIX® и систем ПК. Однако, если вы используете обратные косые черты в именах папок ПК, не забудьте их избежать, например "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 системах. Однако, если вы используете обратные косые черты в именах папок ПК, не забудьте их избежать, например "C:\\mytlc". Кроме того, вы можете выразить имя папки PC как литерал с помощью спецификатора L формата, как в L"C:\mytlc".
%roll %endrollМногократное включение плюс прокатка внутреннего цикла на основе заданного порога. Эта директива может использоваться большинством Simulink® блоки, которые имеют понятие полной ширины блока, которая обычно является шириной сигнала, проходящего через блок.
Этот пример %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
%endfunctionThe %roll директива подобна %foreach, за исключением того, что он итерирует идентификатор (sigIdx в этом примере) по областям крена. Области крена вычисляются путем просмотра входных сигналов и генерирования областей, где входы смежны. Для блоков переменная RollRegions автоматически вычисляется и помещается в Block запись. Примером вектора областей крена является [0:19, 20:39], где существуют две смежные области значений сигналов, проходящих через блок. Первый из них 0:19 а второе - 20:39. Каждая область крена либо помещается в тело цикла (например, язык C for оператор) или встроенный, в зависимости от того, меньше ли длина области, чем порог крена.
Каждый раз через %roll цикл, sigIdx является целым числом для начала текущей области крена или смещением относительно полной ширины блока, когда текущая область крена меньше порога крена. Глобальная переменная TLC RollThreshold - общее значение всей модели, используемое, чтобы решить, когда поместить заданную область крена в цикл. Когда принято решение поместить заданную область в цикл, переменная управления циклом является допустимым идентификатором (например, "i"); в противном случае это "".
The block параметр является текущим блоком, который прокатывается. The "Roller" параметр задает имя для внутреннего GENERATE_TYPE вызовы, выполняемые %roll. Значение по умолчанию %roll обработчик "Roller", который отвечает за настройку блока по умолчанию цикла прокатных конструкций (например, C for цикл).
The rollVars (крен) передаются в "Roller" функции для создания структур крена. Заданные переменные цикла относительно блока
"U"Входы в блок. Предполагается, что вы используете LibBlockInputSignal(portIdx, "", lcv, sigIdx) для доступа к каждому входу, где portIdx начинается с 0 для первого входного порта.
"u i"Подобно "U", за исключением только определенного входа, . The i"u" должен быть строчным или будет интерпретирован как "U" выше.
"Y"Выходные выходы блока. Предполагается, что вы используете LibBlockOutputSignal(portIdx, "", lcv, sigIdx) для доступа к каждому выходу, где portIdx начинается с 0 для первого выходного порта.
"y i"Подобно "Y", за исключением определенного выхода, . The i"y" должен быть строчным или будет интерпретирован как "Y" выше.
"P"Параметры блока. Это предполагает, что вы используете LibBlockParameter(name, "", lcv, sigIdx) для доступа к ним.
"< парам >/ name" Подобно "P", за исключением конкретного .name
rworkThe RWork векторы блока. Это предполагает, что вы используете LibBlockRWork(name, "", lcv, sigIdx) для доступа к ним.
"< rwork >/ name" Подобно RWork, за исключением определенного .name
dworkThe DWork векторы блока. Это предполагает, что вы используете LibBlockDWork(name, "", lcv, sigIdx) для доступа к ним.
"< dwork >/ name" Подобно DWork, за исключением определенного .name
iworkThe IWork векторы блока. Это предполагает, что вы используете LibBlockIWork(name, "", lcv, sigIdx) для доступа к ним.
"< iwork >/ name" Подобно IWork, за исключением определенного .name
pworkThe PWork векторы блока. Это предполагает, что вы используете LibBlockPWork(name, "", lcv, sigIdx) для доступа к ним.
"< свинина >/ name"Подобно PWork, за исключением определенного .name
"Mode"Вектор 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. См. Директива о точках останова%.
%function %return
%endfunctionФункция, которая возвращает значение, определяется как
%function name(optional-arguments)
%return value
%endfunctionФункция void не выдает выход и не требуется возвращать значение. Он определяется как
%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Примечание: The upperLimit выражение приведено к целому значению TLC. The loopIdentifier является локальным по отношению к телу цикла.
%forМножественная директива включения с синтаксисом
%for ident1 = const-exp1, const-exp2, ident2 = const-exp3
%body
%break
%continue
%endbody
%endforПервый фрагмент %for директива идентична %foreach оператор. The %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 создается, содержащая выходы. Аргумент mode необязателен. Если задано, это может быть "a" для добавления или "w" для письма.
Обратите внимание, что специальная строка streamIdNULL_FILE не задает выход. Специальная строка streamIdSTDOUT указывает выход на клемму.
Чтобы создать буфер текста, используйте
%openfile buffer text to be placed in the 'buffer' variable. %closefile buffer
Теперь buffer содержит расширенный текст, заданный между %openfile и %closefile директивы.
%generate%generate blk fn эквивалентно GENERATE(.blk, fn)
%generate blk fn type эквивалентно GENERATE(.blk, fn, type)
Смотрите GENERATE и 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] ] | Матрицы являются просто списками векторов. Отдельные элементы матрицы не должны быть совпадающими типами и могут быть любым поддерживаемым типом, кроме векторов или матриц. The | |
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>; |
В таблице «Выражения на целевом языке» перечислены операторы, которые разрешены в выражениях. В этой таблице выражения перечислены в порядке от наивысшего до самого низкого приоритета. Горизонтальные линии различают порядок операций.
Как и в выражениях C, условные операторы замыкаются. Если выражение включает вызов функции с эффектами, эффекты замечаются так, как если бы выражение полностью не оценивалось. Для примера:
%if EXISTS(foo) && foo == 3
Если первый член выражения вычисляется как Boolean false (т.е. foo не существует), второй термин (foo == 3) не оценивается.
В предстоящей таблице обратите внимание, что numeric является одним из следующих:
Boolean
Number
Unsigned
Real
Real32
Complex
Complex32
Gaussian
UnsignedGaussian
Кроме того, обратите внимание, что integral является одним из следующих:
Number
Unsigned
Boolean
Для получения информации об рекламных акциях, которые происходят при работе компилятора целевого языка с смешанными типами выражений, см. раздел «Рекламные акции Данных TLC».
Выражения на целевом языке
Примечание
Реляционные операторы (<, =<, >, >=, !=, == ) может использоваться с нефинитными значениями.
Вы не должны помещать выражения в %< >
eval формат, когда они появляются в директивных линиях. Это приводит к двойной оценке.
Когда Target Language Compiler работает с смешанными типами выражений, он продвигает результаты к общим типам, указанным в следующей таблице.
В таблице используются следующие сокращения:
| Булев |
| Число |
| Неподписанный |
| 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"компилятор использует внутреннюю эвристику, чтобы вывести значения в более читаемой форме с сохранением точности. The %realformat директива устанавливает формат по умолчанию для Real выход числа в выбранный стиль для оставшейся части обработки или до тех пор, пока он не встретится с другим %realformat директива.
%if constant-expression %else %elseif constant-expression %endif %switch constant-expression %case constant-expression %break %default %endswitch
The constant-expression необходимо вычислить целочисленное выражение. Он управляет включением следующих линий, пока не встретится со %else, %elseif, или %endif директива. Если на constant-expression вычисляет, чтобы 0, следующие линии директивы не включены. Если на constant-expression вычисляет целое значение, отличное от 0, следующими линиями %if директива включаются до тех пор, пока %endif, %elseif, или %else директива.
Когда компилятор встречается с %elseif директива, и никаких предварительных %if или %elseif директива была оценена как ненулевая, компилятор оценивает выражение. Если значение 0, линии, следующие за %elseif директива не включена. Если значение ненулевое, линии, следующие за %elseif директива включается до следующих %else, %elseif, или %endif директива.
The %else директива начинает включать исходный текст, если предыдущий %elseif операторы или исходные %if оператор вычисляет 0; в противном случае он препятствует включению последующих линий вплоть до следующих %endif.
The constant-expression может содержать любое выражение, заданное в выражениях на целевом языке.
The %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 несколько директивы включения является
The constant-expression необходимо вычислить целочисленное выражение, которое затем определяет количество раз, чтобы выполнить foreach цикл. The identifier шаги от 0 на единицу меньше заданного числа. В пределах foreach цикл, можно использовать x, где x - идентификатор для доступа к переменной идентификатора. %break и %continue являются необязательными директивами, которые можно включить в %foreach директива:
Использование %break выход из ближайшего ограждающего %for, %foreach, или %switch оператор.
Использование %continue чтобы начать следующую итерацию цикла.
Примечание
The %for директива является функциональной, но она не рекомендуется. Вместо этого используйте %roll, который обеспечивает ту же возможность более открытым способом. Генератор кода не использует %for конструировать.
Синтаксис %for несколько директивы включения является
Первый фрагмент %for директива идентична %foreach оператор в том, что он заставляет цикл выполняться из 0 на N-1 время по телу цикла. В нормальном случае он включает только линии между %body и %endbody, и линии между %for и %body, и игнорирует линии между %endbody и %endfor.
The %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 установлено значение null string, "".
Когда Target Language Compiler определяет, что данный блок будет рулонным, он выполняет 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Примечание
Библиотека функций Target Language Compiler, поставляемая с генератором кода, имеет возможность извлечь ссылки на блок ввод-вывод и другие векторы генератора кода, которые значительно упрощают тело %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, но может использоваться и в других целях.
The %language директива определяет генерируемый целевой язык. В качестве проверки согласованности необходимо проверить файлы реализации, найденные для создаваемого языка. The %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"
Наконец, можно реализовать несколько типов с помощью подстановочного знака (*) для поля type:
%implements * "C"
Примечание
Использование подстановочного знака (*) не рекомендуется, потому что он расслабляет проверку ошибок для %implements директива.
Target Language Compiler имеет две встроенные функции, которые отправляют объектно-ориентированные вызовы, GENERATE и GENERATE_TYPE. Вы можете вызвать функцию, появляющуюся в файле реализации (из-за пределов указанного файла), только используя GENERATE и GENERATE_TYPE специальные функции.
СГЕНЕРИРУЙТЕ. GENERATE функция принимает два или более входные параметры. Первый аргумент должен быть допустимыми возможностями, а второй - строкой, содержащей имя функции. GENERATE функция передает первый аргумент блока и любые дополнительные аргументы, заданные вызываемой функции. Возвращаемым аргументом является значение, если оно имеется, возвращаемое вызываемой функцией. Обратите внимание, что компилятор автоматически «просматривает» или добавляет первый аргумент в список возможностей, как если бы он появился на %with директивная линия. (См. Раздел «Область переменных».) Эти возможности удаляются, когда функция возвращается.
GENERATE_TYPE. GENERATE_TYPE функция принимает три или более входные параметры. Он обрабатывает первые два аргумента аналогично GENERATE вызов функции. Третьим аргументом является тип; тип, заданный в блоке Simulink, игнорируется. Это средство используется для обработки генерации кода S-функции процессом сборки. То есть тип блока S-function, но Target Language Compiler генерирует его как конкретную S-функцию, заданную как GENERATE_TYPE. Для примера,
GENERATE_TYPE(block, "Output", "dp_read")
задает, что S-функция block имеет тип dp_read.
The block аргумент и любые дополнительные аргументы передаются вызываемой функции. Как и GENERATE встроенная функция, компилятор автоматически масштабирует первый аргумент перед GENERATE_TYPE функция вводится, а затем удаляет возможности после возврата.
В файле, содержащем %implementsВызовы функций просматриваются сначала в файле, а затем в глобальных возможностях. Это позволяет иметь скрытые вспомогательные функции, используемые исключительно текущим объектом.
Примечание
Это не ошибка для GENERATE и GENERATE_TYPE директивы, чтобы не найти совпадающих функций. Это должно предотвратить требование пустых спецификаций для всех аспектов генерации блочного кода. Используйте GENERATE_FUNCTION_EXISTS или GENERATE_TYPE_FUNCTION_EXISTS директивы, чтобы определить, существует ли указанная функция на самом деле.
Структура выхода управления файлами конструкции
The %openfile директива открывает файл или буфер для записи; необходимая строковая переменная становится переменной типа file. Для примера,
%openfile x /% Opens and selects x for writing. %/ %openfile out = "out.h" /% Opens "out.h" for writing. %/
The %selectfile директива выбирает файл, заданный переменной, в качестве текущего выходного потока. Выход переходит к этому файлу, пока другой файл не будет выбран с помощью %selectfile. Для примера,
%selectfile x /% Select file x for output. %/
The %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.
Директивы управления входным файлом:
The %include директива ищет путь к целевому файлу, заданному string и включает содержимое файла в строке в точке, где %include появляется оператор.
The %addincludepath директива добавляет дополнительный путь включения для поиска при ссылках на компилятор целевого языка %include или блокировать целевые файлы. Синтаксис:
%addincludepath string
The string может быть абсолютным или явным относительным путем. Для примера, чтобы задать абсолютный путь, используйте
%addincludepath "C:\\folder1\\folder2" (PC) %addincludepath "/folder1/folder2" (UNIX)
Чтобы задать относительный путь, путь должен явно начинаться с .. Для примера,
%addincludepath ".\\folder2" (PC) %addincludepath "./folder2" (UNIX)
Обратите внимание, что для ПК обратные косые черты должны быть устранены (удвоены).
Когда задан явный относительный путь, папка, которая добавляется в путь поиска файлов Target Language Compiler, создается путем конкатенации местоположения целевого файла, содержащего %addincludepath директива и явный относительный путь.
Компилятор целевого языка ищет папки в следующем порядке для целевых файлов или включать файлы:
Текущая папка.
Включите пути, указанные в %addincludepath директивы. Компилятор оценивает несколько %addincludepath директивы снизу вверх.
Включите пути, заданные в командной строке через -I . Компилятор оценивает несколько -I опции справа налево.
Как правило, %addincludepath директивы должны быть указаны в целевом файле системы. Несколько %addincludepath директивы добавят несколько путей к пути поиска файлов компилятора целевого языка.
Примечание
Компилятор не ищет путь MATLAB и не найдет файл, доступный только по этому пути. Компилятор ищет только местоположения, описанные выше.
Соответствующие директивы assert, error, warning и debug message:
Эти директивы приводят к ошибкам, предупреждениям или трассировкам сообщений всякий раз, когда целевой файл обнаруживает условие ошибки или требуется трассировка. Лексемы, следующие директиве на линии, становятся частью сгенерированного сообщения об ошибке или предупреждения.
Компилятор целевого языка помещает сообщения, сгенерированные %trace на stderr если и только если вы задаете переключатель с подробным режимом (-v) к целевому языковому компилятору. Дополнительные сведения о коммутаторах см. в разделе Аргументы командной строки.
The %assert директива оценивает выражение и создает трассировку стека, если выражение вычисляется как логическое false.
Примечание
В порядке %assert директивы, которые будут оценены, Enable TLC assertion должны быть выбраны в TLC process разделе панели Code Generation > Debug. Действие по умолчанию предназначено для %assert директивы, которые не должны быть оценены.
The %exit директива сообщает об ошибке и останавливает дальнейшую компиляцию.
В следующей таблице перечислены встроенные функции и значения, которые добавляются в список параметров, появляющихся в файл. Эти функции и значения компилятора целевого языка заданы в верхнем регистре, так что они визуально отличаются от других параметров в model.rtw файл, и, по соглашению, из пользовательских параметров.model.rtw
Встроенные функции и значения TLC
| Имя встроенной функции | Расширение |
|---|---|
Первое выражение должно быть строкой, которая соответствует одному из имен типов в таблице Типы значений целевого языка, и второе выражение будет приведено к этому типу. Типичным использованием может быть приведение переменной к реальному формату, как в CAST("Real", variable-name) Примером этого является работа со значениями параметров для S-функций. Чтобы использовать их в код C or C++, необходимо набрать их, чтобы | |
Если на | |
Выполняет оценку в MATLAB. Для примера, %assign result = FEVAL("sin",3.14159)The %matlab disp(2.718) Примечание.Если функция MATLAB возвращает более одного значения, TLC получает только первое значение. | |
| |
Первое выражение является | |
Возвращает массив строк, содержащий имена полей записей, сопоставленных с записью. Поскольку он возвращает отсортированный список строк, функция | |
Возвращает содержимое указанного имени поля, если имя поля связано с записью. Функция использует хэш-поиск, и поэтому выполняется за постоянное время. | |
Выполняет вызовы функций, сопоставленные с определенным типом записи (то есть с функциями записи блоков). Для примера используйте это для выполнения функций в | |
Для заданного типа записи делает | |
Возвращает потенциально многострочную строку, которая может использоваться, чтобы объявить значение (значения) Для примера,
приводит к следующему коду С:
| |
Определяет, существует ли данная функция блока. Первое выражение совпадает с первым аргументом | |
Подобно | |
То же, что и | |
Возвращает значения переключателей командной строки. Поддерживаются только следующие коммутаторы: v, m, p, O, d, dr, r, I, a | |
| |
Возвращает мнимую часть комплексного числа. | |
| |
| |
| |
| |
| |
| |
Минимальное целое значение на хост-машине. | |
Максимальное целое значение на хост-машине. | |
Возвращает | |
Где типы данных обоих выражений числовые: возвращает Где тип данных любого выражения является нечисловым (например, строка или запись): возвращает | |
Возвращает | |
Возвращает | |
Возвращает | |
Возвращает | |
Возвращает | |
| Возвращает логическое значение, указывающее, является ли его аргумент ссылкой на параметр 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 приводит к ошибке, компилятор не завершает работу, но продолжает выполнение. Директива 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" |
Примечание
Суффикс управляет типом Target Language Compiler, полученным из константы.
В этой таблице показаны константы компилятора целевого языка и их эквивалентные значения 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
Эта директива вводит новые идентификаторы (переменные) или изменяет значения существующих таковых. Левая сторона может быть квалифицированной ссылкой на переменную с помощью . и [] операторы, или это может быть один элемент массива вектора или матрицы. В случае матрицы присвоение изменяет только один элемент.
The %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 имеет одну (и только одну) из возможностей, описанных в Возможности.
Термин scope также относится к набору или 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
Локальная переменная может иметь то же имя что и глобальная переменная. Чтобы обратиться в функции к локальным и глобальным переменным с одинаковыми именами, необходимо использовать оператор разрешения возможностей (::), чтобы изменить неоднозначность ссылок переменных. См. примеры Оператора Разрешения Возможностей.
Примечание
Сами функции (в отличие от переменных, определенных в функциях) имеют глобальные возможности. Существует одно исключение: функции, определенные в generate возможностей, локальны по отношению к этим возможностям. См. «Сгенерировать возможности».
% с возможностями . The %with директива добавляет новые возможности, называемую %with scope, к текущему списку возможностей. Эта директива облегчает обращение к переменным с разбиением на блоки.
Структура %with директива является
Для примера - директива
%with CompiledModel.System[sysidx] ... %endwith
добавляет CompiledModel.System[sysidx] возможности в список поиска. Эти возможности просматриваются раньше всего. Затем вы можете ссылаться на имя системы просто
Name
вместо
CompiledModel.System[sysidx].Name
Сгенерируйте возможности. Generate scope является специальными возможностями, используемой определенными встроенными функциями, которые предназначены для поддержки генерации кода. Эти функции отправляют вызовы функции, которые сопоставлены с определенным типом записи. Эта возможность поддерживает тип полиморфизма, в котором различные типы записей связаны с функциями (аналогичными методам) с одним и тем же именем. Как правило, эта функция используется для сопоставления Block записи в функции, реализующие функциональность различных типов блоков.
Функции, которые используют, генерируют возможности включают GENERATE, GENERATE_TYPE, GENERATE_FUNCTION_EXISTS, и GENERATE_TYPE_FUNCTION_EXISTS. Смотрите GENERATE и 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
В этом разделе рассматривается, как целевой компилятор языка ищет существующие возможности, чтобы разрешить ссылки переменных.
Глобальные возможности. В самом простом случае Target Language Compiler разрешает ссылку переменной путем поиска в глобальном пуле (включая CompiledModel структура).
% с возможностями . Вы можете изменить список поиска и последовательность поиска с помощью %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 директива. Возвращенное значение может быть типом, заданным в таблице в Target Language Value Types.
В этом примере функция, name, возвращает x если x и y равны, или возвращаются z если x и y не равны:
%function name(x,y,z) void %if x == y %return x %else %return z %endif %endfunction
Вызовы функций могут появиться в контекстах, где разрешены переменные.
The %with операторы, которые эффекты при вызове функции, доступны для функции. Вызовы других функций не включают локальные возможности функции, но включают %with операторы, появляющиеся в функции.
Назначения переменным внутри функции создают новые локальные переменные и не могут изменять значение глобальных переменных, если вы не используете оператор разрешения возможностей видимости (::).
По умолчанию функция возвращает значение и не выдает выход. Можно переопределить это поведение, задав Output и void модификаторы в линии объявления функции, как в
%function foo() Output ... %endfunction
В этом случае функция продолжает выдавать выход в открытый на данный момент файл, и не требуется возвращать значение. Можно использовать void модификатор, чтобы указать, что функция не возвращает значение и не должна выдавать выход, как в
%function foo() void ... %endfunction
Внутри функции, левый представитель %assign оператор по умолчанию создает локальную переменную. Новая запись создается в блоке функции в цепи возможностей; это не влияет на другие значения. Пример появляется в Возможности.
Можно переопределить поведение по умолчанию при помощи %assign с оператором разрешения возможностей (::).
Когда вы вводите новые возможности внутри функции, используя %withЭти новые области используются во время вложенных вызовов функций, но локальные возможности для функции не просматривается.
Если a %with включена в функцию, связанная с ней область переносится с вложенными вызовами функций, как показано на следующем рисунке.

The %return оператор закрывает все %with операторы, появляющиеся в текущей функции. В этом примере %with оператор автоматически закрывается, когда %return обнаружен оператор, удаляющий возможности из списка просматриваемых возможностей:
%function foo(s)
%with s
%return(name)
%endwith
%endfunctionThe %return оператор не требует значения. Можно использовать %return чтобы вернуться из функции без возврата значения.