Вы управляете, как код сгенерирован из моделей в основном посредством записи или изменения скриптов, которые применяют директивы 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Условное включение, где константное выражение должен оценить к целому числу. Например, следующий код проверяет ли параметр, 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 %endswitch%switch директива похожа на язык C switch оператор. Выражение 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. Каждая область списка или помещается в тело цикла (например, язык C for оператор) или встроенный, в зависимости от того, меньше ли длина области порога списка.
Каждый раз через %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) получить доступ к ним.
"<параметрический усилитель>/name" Подобно "P", кроме специфичного для определенного .name
rworkRWork векторы блока. Это принимает, что вы используете LibBlockRWork(name, "", lcv, sigIdx) получить доступ к ним.
"<rwork>/name" Подобно RWork, за исключением определенного .name
dworkDWork векторы блока. Это принимает, что вы используете LibBlockDWork(name, "", lcv, sigIdx) получить доступ к ним.
"<dwork>/name" Подобно DWork, за исключением определенного .name
iworkIWork векторы блока. Это принимает, что вы используете LibBlockIWork(name, "", lcv, sigIdx) получить доступ к ним.
"<iWork>/name" Подобно IWork, за исключением определенного .name
pworkPWork векторы блока. Это принимает, что вы используете 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 содержит расширенный текст, заданный между %openfile и %closefile директивы.
%generate%generate blk fn эквивалентно GENERATE(.blk, fn)
%generate blk fn type эквивалентно GENERATE(.blk, fnВвод)
Смотрите ГЕНЕРИРУЮТ и функции 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 для получения информации о продвижениях, которые заканчиваются, когда Компилятор Выходного языка работает со смешанными типами выражений.
Выражения выходного языка
Выражение | Определение |
|---|---|
| Постоянное значение параметров. Значение может быть вектором или матрицей. |
| Допустимое имя переменной в осциллографе, включая осциллограф локальной функции, если таковые имеются, и глобальную область видимости. |
| Используемый в функции, чтобы указать, что функциональный осциллограф проигнорирован, когда переменная ищется. Это получает доступ к глобальной области видимости. |
| Индексируйте в параметр массива. Индексы массива лежат в диапазоне от |
| Вызов функции или макрорасширение. Выражение вне круглых скобок является функциональным/макро-именем; выражения внутри являются аргументами к функции или макросу. Примечание: Макросы основаны на тексте; они не могут использоваться в рамках того же выражения в качестве других операторов. |
| Первое выражение должно иметь допустимый осциллограф; второе выражение является названием параметра в том осциллографе. |
| Использование |
| Логическое отрицание (генерирует |
| Унарный минус инвертирует выражение. Аргумент должен быть числовым. |
| Никакой эффект; операнд должен быть числовым. |
| Поразрядное отрицание операнда. Аргумент должен быть целым числом. |
| Умножает эти два выражения; операнды должны быть числовыми. |
| Делит эти два выражения; операнды должны быть числовыми. |
| Берет целое число по модулю выражений; операнды должны быть целыми числами. |
| Работы над числовыми типами, строками, векторами, матрицами и записями можно следующим образом: Числовые типы: Добавьте эти два выражения; операнды должны быть числовыми. Строки: строки конкатенированы. Векторы: Если первый аргумент является вектором, и вторым является скаляр, скаляр добавлен к вектору. Матрицы: Если первый аргумент является матрицей, и вторым является вектор той же ширины столбца как матрица, вектор добавлен как другая строка в матрице. Записи: Если первый аргумент является записью, второй аргумент добавляется как идентификатор параметра (с его текущим значением). Обратите внимание на то, что оператор сложения ассоциативен. |
| Вычитает эти два выражения; операнды должны быть числовыми. |
| Сдвиги влево левый операнд суммой равняются правильному операнду; аргументы должны быть целыми числами. |
| Сдвиги вправо левый операнд суммой равняются правильному операнду; аргументы должны быть целыми числами. |
| Тесты, больше ли первое выражение второго выражения; аргументы должны быть числовыми. |
| Тесты, меньше ли первое выражение второго выражения; аргументы должны быть числовыми. |
| Тесты, больше ли первое выражение или равно второму выражению; аргументы должны быть числовыми. |
| Тесты, меньше чем или равно ли первое выражение второму выражению; аргументы должны быть числовыми. |
| Тесты, равны ли эти два выражения. |
| Тесты, не ли эти два выражения равны. |
| Выполняет побитовое И этих двух аргументов; аргументы должны быть целыми числами. |
| Выполняет побитовое исключающее ИЛИ этих двух аргументов; аргументы должны быть целыми числами. |
| Выполняет побитовое ИЛИ этих двух аргументов; аргументы должны быть целыми числами. |
| Выполняет логический AND этих двух аргументов и возвращает |
| Выполняет логический OR этих двух аргументов и возвращает |
| Тестирует первое выражение на |
| Возвращает значение второго выражения. |
Операторы отношения (<, =<, >, >=, !=, == ) может использоваться с неличными значениями.
Вы не должны помещать выражения в %< >
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 \times.
Этот механизм передает каждому отдельному управлению циклом, должно ли это быть прокручено.
Синтаксис
%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"%/
При желании можно добавить к выходному файлу или строке при помощи дополнительного режима, aasin
%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 or 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 |
|---|---|
rtInfInfInf | +inf |
rtMinusInf | -inf |
rtNanNaNNaN | 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Выбор File, и %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 возвратиться из функции без возвращаемого значения.