Управление формированием кода из моделей осуществляется главным образом путем написания или изменения сценариев, в которых применяются директивы 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 в отличие от if 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 должен быть типа, который можно сравнить для равенства с помощью == 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')
для установки этого флага вкл или выкл. Значение по умолчанию - Выкл. Для просмотра текущей настройки используйте
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 token, запись создается в глобальной области.
Примечание
Не следует создавать массив записей с помощью %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"для вставки указанного целевого файла в текущей точке.
%include директивы ведут себя так, как будто они находятся в глобальном контексте. Например,
%addincludepath "./sub1" %addincludepath "./sub2"
в .tlc позволяет неявно ссылаться на любую подпапку:
%include "file_in_sub1.tlc" %include "file_in_sub2.tlc"
Используйте косую черту для имен папок, поскольку они работают как в UNIX ®, так и в ПК. Однако если вы используете обратную косую черту в именах папок ПК, обязательно избегайте их, например ,"C:\\mytlc". Можно также выразить имя папки ПК как литерал, используя спецификатор формата 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, так и в ПК. Однако если вы используете обратную косую черту в именах папок ПК, обязательно избегайте их, например, "C:\\mytlc". Можно также выразить имя папки ПК как литерал, используя спецификатор формата 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
%endfunction %roll директива аналогична %foreach, за исключением того, что он итерирует идентификатор (sigIdx в этом примере) по областям крена. Области рулона вычисляются путем просмотра входных сигналов и формирования областей, где входные сигналы являются смежными. Для блоков переменная RollRegions автоматически вычисляется и помещается в Block запись. Примером вектора областей рулона является [0:19, 20:39], где имеются два смежных диапазона сигналов, проходящих через блок. Первый - 0:19 и второй - 20:39. Каждая область рулона либо помещается в тело петли (например, язык Си). for оператор) или встроенный, в зависимости от того, меньше ли длина области, чем порог крена.
Каждый раз через %roll петля, sigIdx - целое число для начала текущей области крена или смещение относительно общей ширины блока, когда текущая область крена меньше порога крена. Глобальная переменная TLC RollThreshold - общее значение для всей модели, используемое для принятия решения о том, когда поместить заданную область рулона в контур. Когда принимается решение поместить заданную область в цикл, переменная управления циклом является действительным идентификатором (например, "i"); в противном случае это "".
block параметр является текущим блоком, который катится. "Roller" параметр задает имя для внутреннего GENERATE_TYPE вызовы, выполненные %roll. Дефолт %roll обработчик - "Roller", который отвечает за настройку структур качения цикла блоков по умолчанию (например, C for цикл).
rollVars (переменные крена) передаются в "Roller" для создания структур рулона. Определенные переменные цикла относительно блока:
"U"Входы в блок. Предполагается, что вы используете LibBlockInputSignal(portIdx, "", lcv, sigIdx) для доступа к каждому входу, где portIdx начинается с 0 для первого входного порта.
"ui"Аналогично "U", за исключением конкретных входных данных, . i"u" должен быть строчным или интерпретироваться как "U" выше.
"Y"Выходы блока. Предполагается, что вы используете LibBlockOutputSignal(portIdx, "", lcv, sigIdx) для доступа к каждому выходу, где portIdx начинается с 0 для первого выходного порта.
"yi"Аналогично "Y", за исключением конкретных выходных данных, . i"y" должен быть строчным или интерпретироваться как "Y" выше.
"P"Параметры блока. Предполагается, что вы используете LibBlockParameter(name, "", lcv, sigIdx) для доступа к ним.
"<param>/name" Аналогично "P", за исключением конкретного .name
rwork RWork векторы блока. Предполагается, что вы используете LibBlockRWork(name, "", lcv, sigIdx) для доступа к ним.
"<rwork>/name" Аналогично RWork, за исключением конкретного .name
dwork DWork векторы блока. Предполагается, что вы используете LibBlockDWork(name, "", lcv, sigIdx) для доступа к ним.
"<dwork>/name" Аналогично DWork, за исключением конкретного .name
iwork IWork векторы блока. Предполагается, что вы используете LibBlockIWork(name, "", lcv, sigIdx) для доступа к ним.
"<iwork>/name" Аналогично IWork, за исключением конкретного .name
pwork PWork векторы блока. Предполагается, что вы используете LibBlockPWork(name, "", lcv, sigIdx) для доступа к ним.
"<pwork>/name"Аналогично PWork, за исключением конкретного .name
"Mode"Вектор режима. Предполагается, что вы используете LibBlockMode("",lcv,sigIdx) для доступа к нему.
"PZC"Предыдущее состояние пересечения нуля. Предполагается, что вы используете LibPrevZCState("",lcv, sigIdx) для доступа к нему.
Чтобы свернуть собственный вектор на основе областей крена блока, необходимо пройтись по указателю на вектор. Предполагая, что на ваш вектор указывает первый 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Функция 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Примечание: 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,type)
См. разделы СОЗДАНИЕ и GENERATE_TYPE функций.
%undef%undef удаляет переменную var из области применения. Если var - поле в записи, var%undef удаляет это поле из записи. Если является массивом записей, var%undef удаляет весь массив записей.
Комментарии можно размещать в любом месте целевого файла. Чтобы включить комментарии, используйте /%...%/ или %% директивы. Например:
/%
Abstract: Return the field with [width], if field is wide
%/или
%endfunction %% Outputs function
Используйте %% конструкция для комментариев на основе строк. Символы из %% до конца строки стать комментарием.
Неориентированные строки, то есть строки, которые не имеют % в качестве первого непустого символа копируются в выходной буфер. Например,
/* Initialize sysNumber */ int sysNumber = 3;
копирует обе строки в выходной буфер.
Чтобы включить комментарии к строкам, которые не начинаются с % символ, вы можете использовать /%...%/ или %% директивы по комментариям. В этих случаях комментарии не копируются в выходной буфер.
Примечание
Если в функции появляется неориентированная строка, она не копируется в выходной буфер, если функция не является выходной функцией или вы специально выбираете выходной файл с помощью %selectfile директива. Дополнительные сведения о функциях см. в разделе Функции целевого языка.
Можно использовать язык C
\ символ или последовательность MATLAB
... для продолжения строки. Если директива слишком длинна для удобного размещения на одной строке, это позволяет разделить директиву на несколько строк. Например:
%roll sigIdx = RollRegions, lcv = RollThreshold, block,\
"Roller", rollVarsили
%roll sigIdx = RollRegions, lcv = RollThreshold, block,...
"Roller", rollVarsПримечание
Использовать \ подавление линейной подачи к выходу и многоточию ... для указания продолжения строки. Обратите внимание, что \ и многоточие ... не может использоваться внутри строк.
В этой таблице показаны типы значений, которые можно использовать в контексте выражений в файлах целевого языка. Выражения в компиляторе целевого языка должны использовать эти типы.
| Строка типа значения | Пример | Описание |
|---|---|---|
1==1 | Результат сравнения или другого логического оператора. Результат будет | |
3.0+5.0i | 64-разрядное комплексное число двойной точности ( | |
3.0F+5.0Fi | 32-разрядное комплексное число одинарной точности ( | |
%openfile x | Буфер строк открыт с помощью | |
"File" | %openfile x = "out.c" | Файл открыт с помощью |
%function foo... | Определяемая пользователем функция и | |
3+5i | 32-разрядное целое воображаемое число ( | |
"Identifier" | abc | Значения идентификаторов могут отображаться только в пределах |
Matrix (3,2) [ [ 1, 2]; [3 , 4]; [ 5, 6] ] | Матрицы - это просто списки векторов. Отдельные элементы матрицы не обязательно должны быть одного типа и могут быть любого поддерживаемого типа, кроме векторов или матриц. | |
15 | Целое число ( | |
[1:5] | Диапазон целых чисел от 1 до 5 включительно. | |
"Real" | 3.14159 | Число с плавающей запятой ( |
3.14159F | 32-разрядное одинарное число с плавающей запятой ( | |
Block { ... } | Блокирующая запись. | |
FILE_EXISTS | Специальная встроенная функция, например | |
"Hello, World" | Строки символов ASCII. Во всех контекстах две строки в строке объединяются для формирования конечного значения, как в | |
<sub1> | Идентификатор подсистемы. В контексте расширения будьте осторожны, чтобы избежать разделителей на идентификаторе подсистемы, как в | |
15U | 32-разрядное беззнаковое целое число ( | |
3U+5Ui | 32-разрядное комплексное беззнаковое целое число ( | |
[1, 2] or BR Vector(2) [1, 2] | Векторы - это списки значений. Отдельные элементы вектора не обязательно должны быть одного типа и могут быть любого поддерживаемого типа, кроме векторов или матриц. |
Можно включить выражение формы
%< в целевом файле. Компилятор целевого языка заменяет expression>%< с вычисленным значением замены, основанным на типе переменных в expression>%<> оператор. Целочисленные константные выражения сворачиваются и заменяются результирующим значением; строковые константы объединяются (например, две строки в строке) "a"
"b", заменены на "ab").
%<expression> /* Evaluates the expression. * Operators include most standard C * operations on scalars. Array indexing * is required for certain parameters that * are block-scoped within the .rtw file.*/
В контексте выражения каждый идентификатор должен вычисляться как идентификатор или аргумент функции, находящийся в данный момент в области действия. Вы можете использовать %< > директива в строке для выполнения подстановки текста. Чтобы включить > символ в замене, вы должны избежать его с помощью \ персонаж. Например:
%<x \> 1 ? "ABC" : "123">
Операторы, которым требуется > ниже перечислены символы, которые должны быть сброшены:
| Оператор | Описание | Пример |
|---|---|---|
> | больше, чем | y = %<x \> 2>; |
>= | больше или равно | y = %<x \>= 3>; |
>> | правая смена | y = %<x \>\> 4>; |
В таблице Выражения целевого языка перечислены операторы, разрешенные в выражениях. В этой таблице выражения перечислены в порядке от наивысшего до низшего приоритета. Горизонтальные линии различают порядок операций.
Как и в выражениях C, условные операторы короткозамкнуты. Если выражение включает вызов функции с эффектами, эффекты замечаются, как если бы все выражение не было полностью оценено. Например:
%if EXISTS(foo) && foo == 3
Если первый член выражения имеет логическое значение false (т. е. foo не существует), второй срок (foo == 3) не оценивается.
В предстоящей таблице обратите внимание, что numeric является одним из следующих:
Boolean
Number
Unsigned
Real
Real32
Complex
Complex32
Gaussian
UnsignedGaussian
Также обратите внимание, что integral является одним из следующих:
Number
Unsigned
Boolean
Сведения о рекламных акциях, возникающих при работе компилятора целевого языка с выражениями смешанного типа, см. в разделе Рекламные акции TLC Data Promotions.
Выражения целевого языка
Примечание
Реляционные операторы ( <, =<, >, >=, !=, == ) может использоваться с нефинитными значениями.
Нет необходимости размещать выражения в %< >
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 loop, можно использовать 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 true, 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, "".
Когда компилятор целевого языка определяет, что данный блок будет вращаться, он выполняет 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Примечание
Библиотека функций компилятора целевого языка, поставляемая с генератором кода, имеет возможность извлекать ссылки на векторы блочного ввода-вывода и других генераторов кода, которые значительно упрощают тело %roll заявление. Эти функции включают LibBlockInputSignal, LibBlockOutputSignal, LibBlockParameter, LibBlockRWork, LibBlockIWork, LibBlockPWork, LibDeclareRollVars, LibBlockMatrixParameter, LibBlockParameterAddr, LibBlockContinuousState, и LibBlockDiscreteState. (См. страницы ссылок на функции в разделах Функции входного сигнала, Функции выходного сигнала, Функции параметров, Состояние блока и Функции рабочего вектора.) Эта библиотека также включает реализацию по умолчанию Roller.tlc в виде «плоского» валика.
Распространение первого примера на петлю, которая катится,
%language "C"
%assign ablock = BLOCK { Name "Hi" }
%roll Idx = [ 1:20, 21, 22, 23:25, 26:46], lcv = 10, ablock
Block[%< lcv == "" ? Idx : lcv>] *= 3.0;
%endrollЭтот код компилятора целевого языка выводит следующие данные:
{
int i;
for (i = 1; i < 21; i++)
{
Block[i] *= 3.0;
}
Block[21] *= 3.0;
Block[22] *= 3.0;
Block[23] *= 3.0;
Block[24] *= 3.0;
Block[25] *= 3.0;
for (i = 26; i < 47; i++)
{
Block[i] *= 3.0;
}
}Компилятор целевого языка обеспечивает простую объектно-ориентированную функцию. Языковые директивы:
Это средство было разработано специально для настройки кода для блоков Simulink, но может использоваться и для других целей.
%language указывает создаваемый целевой язык. Она необходима в качестве проверки согласованности для проверки файлов реализации, найденных для создаваемого языка. %language директива должна появиться до первой GENERATE или GENERATE_TYPE вызов встроенной функции. %language задает язык в виде строки. Например:
%language "C"
Блоки Simulink имеют Type параметр. Этот параметр является строкой, указывающей тип блока, например "Sin" или "Gain". Объектно-ориентированное средство использует этот тип для поиска пути к файлу, реализующему блок. По умолчанию имя файла - Type блока с .tlc добавляется, например, если Type является "Sin" компилятор будет искать "Sin.tlc" вдоль пути. Это имя файла по умолчанию можно переопределить с помощью %generatefile директива для указания имени файла, которое необходимо использовать для замены имени файла по умолчанию. Например,
%generatefile "Sin" "sin_wave.tlc"
Файлы, реализующие код, специфичный для блока, должны содержать %implements директива, указывающая как тип, так и язык реализации. Компилятор целевого языка приведет к ошибке, если %implements директива не соответствует ожидаемой. Например,
%implements "Sin" "Pascal"
приводит к ошибке, если был выбран начальный язык C.
Можно использовать один файл для реализации нескольких целевых языков путем указания нужных языков в векторе. Например,
%implements "Sin" "C"
Наконец, с помощью подстановочного знака можно реализовать несколько типов (*) для поля типа:
%implements * "C"
Примечание
Использование подстановочного знака (*) не рекомендуется, потому что это ослабляет проверку ошибок для %implements директива.
Компилятор целевого языка имеет две встроенные функции, которые отправляют объектно-ориентированные вызовы, GENERATE и GENERATE_TYPE. Функцию, появляющуюся в файле реализации (вне указанного файла), можно вызвать только с помощью GENERATE и GENERATE_TYPE специальные функции.
ГЕНЕРИРОВАТЬ. GENERATE функция принимает два или более входных аргументов. Первый аргумент должен быть допустимой областью, а второй - строкой, содержащей имя вызываемой функции. GENERATE функция передает первый блочный аргумент и любые дополнительные аргументы, указанные для вызываемой функции. Возвращаемый аргумент - это значение, если оно есть, возвращаемое вызываемой функцией. Обратите внимание, что компилятор автоматически «копирует» или добавляет первый аргумент в список искомых областей, как если бы он появился в %with строка директивы. (См. раздел Область действия переменных.) Эта область удаляется при возврате функции.
GENERATE_TYPE. GENERATE_TYPE функция принимает три или более входных аргументов. Он обрабатывает первые два аргумента идентично GENERATE вызов функции. Третьим аргументом является тип; тип, указанный в блоке Simulink, игнорируется. Эта функция используется для обработки генерации кода S-функции процессом построения. То есть тип блока: S-function, но компилятор целевого языка генерирует его как определенную S-функцию, указанную GENERATE_TYPE. Например,
GENERATE_TYPE(block, "Output", "dp_read")
указывает, что S-функция block имеет тип dp_read.
block и любые дополнительные аргументы передаются вызываемой функции. Как и GENERATE встроенная функция, компилятор автоматически определяет область первого аргумента перед GENERATE_TYPE вводится функция, а затем удаляется область при возврате.
В файле, содержащем %implementsвызовы функций сначала просматриваются в файле, а затем в глобальной области. Это позволяет использовать скрытые вспомогательные функции исключительно для текущего объекта.
Примечание
Это не ошибка для GENERATE и GENERATE_TYPE директивы на отсутствие совпадающих функций. Это необходимо для предотвращения необходимости использования пустых спецификаций для всех аспектов создания блочного кода. Используйте GENERATE_FUNCTION_EXISTS или GENERATE_TYPE_FUNCTION_EXISTS директивы для определения того, существует ли на самом деле указанная функция.
Структура управляющей конструкции выходного файла:
%openfile директива открывает файл или буфер для записи; требуемая строковая переменная становится переменной типа file. Например,
%openfile x /% Opens and selects x for writing. %/ %openfile out = "out.h" /% Opens "out.h" for writing. %/
%selectfile директива выбирает файл, указанный переменной, в качестве текущего выходного потока. Вывод в этот файл до тех пор, пока не будет выбран другой файл с помощью %selectfile. Например,
%selectfile x /% Select file x for output. %/
%closefile директива закрывает указанный файл или буфер. Если закрытый объект является текущим выбранным выходным потоком, %closefile призывает %selectfile для повторного выбора ранее выбранного выходного потока.
Есть два возможных случая, которые %closefile должен обрабатывать:
Если поток является файлом, связанная переменная удаляется, как если бы %undef.
Если поток является буфером, связанная переменная получает текст, который был выведен в поток. Например,
%assign x = "" /% Creates an empty string. %/ %openfile x "hello, world" %closefile x /% x = "hello, world\n"%/
При необходимости можно добавить в выходной файл или строку с помощью дополнительного режима. a, как в
%openfile "foo.c", "a" %% Opens foo.c for appending.
Директивами управления входными файлами являются
%include директива ищет путь к целевому файлу, указанному string и включает содержимое файла в строке в точке, где %include Появится инструкция.
%addincludepath директива добавляет дополнительный путь включения для поиска при ссылке компилятора целевого языка %include или блокировать целевые файлы. Синтаксис:
%addincludepath string
string может быть абсолютным или явным относительным путем. Например, чтобы задать абсолютный путь, используйте
%addincludepath "C:\\folder1\\folder2" (PC) %addincludepath "/folder1/folder2" (UNIX)
Чтобы указать относительный путь, путь должен явно начинаться с .. Например,
%addincludepath ".\\folder2" (PC) %addincludepath "./folder2" (UNIX)
Обратите внимание, что для ПК обратная косая черта должна быть устранена (удвоена).
Если указан явный относительный путь, папка, добавляемая в путь поиска компилятора целевого языка, создается путем объединения местоположения целевого файла, содержащего %addincludepath директива и явный относительный путь.
Компилятор целевого языка выполняет поиск целевых или включенных файлов в папках в следующем порядке:
Текущая папка.
Включить пути, указанные в %addincludepath директивы. Компилятор оценивает несколько %addincludepath директивы снизу вверх.
Включить пути, указанные в командной строке через -I . Компилятор оценивает несколько -I справа налево.
Как правило, %addincludepath директивы должны быть указаны в целевом системном файле. Несколько %addincludepath директивы будут добавлять несколько путей к пути поиска компилятора целевого языка.
Примечание
Компилятор не выполняет поиск по пути MATLAB и не находит файл, доступный только по этому пути. Компилятор выполняет поиск только описанных выше расположений.
Связанные директивы утверждения, ошибки, предупреждения и сообщения отладки:
Эти директивы выдают сообщения об ошибках, предупреждения или трассировку всякий раз, когда целевой файл обнаруживает состояние ошибки или требуется трассировка. Маркеры, следующие за директивой в строке, становятся частью сгенерированного сообщения об ошибке или предупреждения.
Компилятор целевого языка размещает сообщения, созданные %trace на stderr если и только если указан переключатель подробного режима (-v) в компилятор целевого языка. Дополнительные сведения о коммутаторах см. в разделе Аргументы командной строки.
%assert директива вычисляет выражение и создает трассировку стека, если выражение получает логическое значение false.
Примечание
Для %assert Чтобы оценить директивы, необходимо выбрать параметр «Включить утверждение TLC» в разделе процесса TLC панели «Создание кода» > «Отладка». Действие по умолчанию для %assert директивы не подлежат оценке.
%exit директива сообщает об ошибке и останавливает дальнейшую компиляцию.
В следующей таблице перечислены встроенные функции и значения, которые добавляются в список параметров, отображаемых в файл. Эти функции и значения компилятора целевого языка определяются в верхнем регистре таким образом, что они визуально отличаются от других параметров в model.rtw и, по соглашению, из пользовательских параметров.model.rtw
Встроенные функции и значения TLC
| Имя встроенной функции | Расширение |
|---|---|
Первое выражение должно быть строкой, соответствующей одному из имен типов в таблице Target Language Value Types, а второе выражение будет приведено к этому типу. Типичным использованием может быть приведение переменной к реальному формату, как в CAST("Real", variable-name) Примером этого является работа со значениями параметров для S-функций. Чтобы использовать их в коде C или C++, необходимо ввести их в | |
Если | |
Выполняет анализ в MATLAB. Например, %assign result = FEVAL("sin",3.14159) %matlab disp(2.718) Примечание.Если функция MATLAB возвращает более одного значения, TLC получает только первое значение. | |
| |
Первое выражение является | |
Возвращает массив строк, содержащих имена полей записей, связанных с записью. Поскольку он возвращает отсортированный список строк, функция | |
Возвращает содержимое указанного имени поля, если имя поля связано с записью. Функция использует хэш-поиск и, следовательно, выполняется в постоянное время. | |
Выполняет вызовы функций, сопоставленные с определенным типом записи (т.е. функции блочной записи). Например, используется для выполнения функций в | |
Для указанного типа записи выполняет | |
Возвращает потенциально многострочную строку, которая может использоваться для объявления значений Например,
дает этот код C:
| |
Определяет, существует ли данная функция блока. Первое выражение совпадает с первым аргументом для | |
Аналогично | |
То же, что и | |
Возвращает значения параметров командной строки. Поддерживаются только следующие коммутаторы: 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 приводит к ошибке, компилятор 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 | Не поддерживается |
Complex INT8,INT16,INT32 | Гауссов (скаляр или матрица) |
UINT8,UINT16,UINT32 | Unsigned (скаляр или матрица) |
Complex UINT8,UINT16,UINT32 | UnsignedGaussian (скаляр или матрица) |
Single precision | Real32 (скаляр или матрица) |
Complex single precision | Complex32 (скаляр или матрица) |
Double precision | Real (скаляр или матрица) |
Complex double precision | Complex (скаляр или матрица) |
Sparse matrix | Расширено до матрицы Doubles |
Cell array of structures | Массив записей |
Cell array of non-structures | Вектор или матрица типов, преобразованных из типов элементов |
Cell array of structures and non-structures | Преобразование не поддерживается |
Structure | Record |
Object | Преобразование не поддерживается |
Другие типы значений в настоящее время не поддерживаются.
В качестве примера этот оператор использует FEVAL встроенная функция вызова MATLAB для получения синуса входного аргумента.
%assign result = FEVAL( "sin", 3.14159 )
Переменные (идентификаторы) могут принимать следующие постоянные значения. Обратите внимание на суффикс значения.
| Константная форма | Тип TLC |
|---|---|
1.0 | "Real" |
1.0[F/f] | "Real32" |
1 | "Number" |
1[U|u] | "Unsigned" |
| 1.0i | "Complex" |
1[Ui|ui] | "UnsignedGaussian" |
1i | "Gaussian" |
1.0[Fi|fi] | "Complex32" |
Примечание
Суффикс управляет типом компилятора целевого языка, полученным из константы.
В этой таблице представлены константы компилятора целевого языка и их эквивалентные значения MATLAB.
| Константы TLC | Эквивалентное значение MATLAB |
|---|---|
rtInf, Inf, inf | +inf |
rtMinusInf | -inf |
rtNan, NaN, nan | nan |
rtInfi, Infi, infi | inf*i |
rtMinusInfi | -inf*i |
rtNaNi, NaNi, nani | nan*i |
Для значений двойной точности для бесконечных и нечисловых значений IEEE ® определены следующие значения:
rtInf, inf, rtMinusInf, -inf, rtNaN, nan
Для значений с одной точностью применяются следующие константы:
rtInfF, InfF, rtMinusInfF, rtNaNF, NaNF
Их соответствующие версии, когда сложны:
rtInfi, infi, rtMinusInfi, -infi, rtNaNi (for doubles) rtInfFi, InfFi, rtMinusInfFi, rtNaNFi, NaNFi (for singles)
Для целых значений определены следующие:
INT8MIN, INT8MAX, INT16MIN, INT16MAX, INT32MIN, INT32MAX, UINT8MAX, UINT16MAX, UINT32MAX, INTMAX, INTMIN, UINTMAX
Чтобы определить или изменить идентификаторы (переменные TLC), используйте директиву
%assign [::]expression = constant-expression
Эта директива вводит новые идентификаторы (переменные) или изменяет значения существующих. Левая сторона может быть квалифицированной ссылкой на переменную с помощью . и [] операторы, или это может быть один элемент вектора или матрицы. В случае матрицы присвоение изменяет только один элемент.
%assign директива вставляет новые идентификаторы в локальную, файловую или глобальную область. Идентификаторы, введенные в область действия функции, недоступны в вызываемых функциях и удаляются по возвращении из функции. Идентификаторы, вставленные в глобальную область, являются постоянными. Можно изменить существующие идентификаторы, полностью переназначив их. Выражения константы могут включать допустимые идентификаторы из .rtw файлы. Вы можете использовать %undef чтобы удалить идентификаторы таким же образом, как он используется для удаления макросов.
В рамках функции назначения переменных создают новые локальные переменные, если не используется :: оператор разрешения области. В этом примере присвоение создает переменную foo, локального по отношению к функции, которая исчезнет при выходе из функции.
%function ... ... %assign foo = 3 ... %endfunction
Обратите внимание, что foo создается, даже если глобальный foo уже существует.
Для создания или изменения значений в глобальной области необходимо использовать оператор разрешения области (::) устранить неоднозначность, как в
%function ... %assign foo = 3 %assign ::foo = foo ... %endfunction
Оператор разрешения области вынуждает компилятор назначать значение локальной переменной foo, 3, к глобальной переменной foo.
Примечание
Ошибка при изменении значения из файла генератора кода без отнесения его к области. В этом примере ошибка не генерируется:
%assign CompiledModel.name = "newname" %% No error
В этом примере генерируется ошибка:
%with CompiledModel %assign name = "newname" %% Error %endwith
Используйте %createrecord директива для создания новых записей в текущей области. Например, если требуется создать новую запись с именем Rec который содержит два элемента (например, Name "Name" и Type "t"), использовать
%createrecord Rec { Name "Name"; Type "t" }Используйте %addtorecord директива о добавлении новых записей в существующие записи. Например, если имеется запись с именем Rec1 который содержит запись с именем Rec2, и вы хотите добавить дополнительный Rec2 к нему, использовать
%addtorecord Rec1 Rec2 { Name "Name1"; Type "t1" }На этом рисунке показан результат добавления записи к существующей.

Если требуется получить доступ к новой записи, можно использовать
%assign myname = Rec1.Rec2[1].Name
В этом же примере, если требуется добавить две записи к существующей записи, используйте
%addtorecord Rec1 Rec2 { Name "Name1"; Type "t1" }
%addtorecord Rec1 Rec2 { Name "Name2"; Type "t2" }Это приводит к

Вы можете использовать %assign директива для добавления нового параметра к существующей записи. Например,
%addtorecord Block[Idx] N 500 /% Adds N with value 500 to Block %/ %assign myn = Block[Idx].N /% Gets the value 500 %/
добавляет новый параметр, N, в конце существующего блока с именем и текущим значением существующей переменной, как показано на этом рисунке. Возвращает значение блока.

В этом разделе описывается, как компилятор целевого языка разрешает ссылки на переменные (включая записи).
Область применения в данном документе имеет два связанных значения. Во-первых, область действия является атрибутом переменной, определяющим ее видимость и сохранение. Например, переменная, определенная в теле функции, видна только внутри этой функции и сохраняется только до тех пор, пока эта функция выполняется. Такая переменная имеет функциональную (или локальную) область действия. Каждая переменная TLC имеет одну (и только одну) область, описанную в Scopes.
Термин «область» также относится к набору или пулу переменных, имеющих одинаковую область. В данный момент выполнения программы TLC может существовать несколько областей. Например, во время выполнения функции существует область действия функции (пул переменных, локальных для функции). Во всех случаях также существует глобальный объем (пул глобальных переменных).
Чтобы разрешить ссылки на переменные, TLC поддерживает список поиска текущих областей и выполняет их поиск в хорошо определенной последовательности. Последовательность поиска описана в разделе Как TLC разрешает ссылки на переменные.
Динамическое определение области действия относится к процессу, с помощью которого TLC создает и освобождает переменные и области, в которых они существуют. Например, переменные в области действия функции существуют только во время выполнения определяющей функции.
В следующих разделах описываются возможные области, которые может иметь переменная TLC.
Глобальная область. По умолчанию переменные TLC имеют глобальную область действия. Глобальные переменные являются видимыми для кода в любом месте программы TLC и на них может ссылаться код. Глобальные переменные сохраняются на протяжении всего выполнения программы TLC. Глобальные переменные относятся к глобальному пулу.
Обратите внимание, что 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 scope, к текущему списку областей. Эта директива упрощает обращение к переменным области действия блока.
Структура %with директива -
Например, директива
%with CompiledModel.System[sysidx] ... %endwith
добавляет CompiledModel.System[sysidx] область к списку поиска. Поиск в этой области выполняется раньше всего. Затем можно сослаться на имя системы просто по
Name
вместо
CompiledModel.System[sysidx].Name
Создать область. Создание области - это особая область, используемая некоторыми встроенными функциями, предназначенными для поддержки генерации кода. Эти функции отправляют вызовы функций, которые сопоставляются с определенным типом записи. Эта возможность поддерживает тип полиморфизма, в котором различные типы записей связаны с функциями (аналогично методам) с одним и тем же именем. Как правило, эта функция используется для отображения 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 CompiledModel.System[sysidx] ... %endwith
System[sysidx] область добавляется в список поиска. Сначала выполняется поиск в этой области, как показано на этом рисунке.

Этот метод упрощает доступ к встроенным определениям. Использование %with (как и в предыдущем примере), можно ссылаться на имя системы просто по
Name
вместо
CompiledModel.System[sysidx].Name
Область действия функции. Функция имеет собственный объем. Эта область добавляется к ранее описанному списку поиска, как показано на этой схеме.

Например, в следующем фрагменте кода:
% with CompiledModel.System[sysidx] ... %assign a=foo(x,y) ... %endwith ... %function foo(a,b) ... assign myvar=Name ... %endfunction ... %<foo(1,2)>
Если Name не определен в foo, назначение использует значение Name из предыдущего объема, CompiledModel.System[SysIdx].Name.
Во вложенной функции выполняется поиск только самой внутренней области действия функции вместе с вложенной %with и глобальные области, как показано на следующей диаграмме:

Область файла. Поиск в областях файлов выполняется перед глобальной областью, как показано на следующей диаграмме.

Правило для областей вложенных файлов аналогично правилу для областей вложенных функций. В случае областей вложенных файлов выполняется поиск только самой внутренней области вложенных файлов.
Конструкция целевой языковой функции
%function identifier ( optional-arguments ) [Output | void] %return %endfunction
Функции на целевом языке являются рекурсивными и имеют собственное пространство локальных переменных. Функции целевого языка не производят вывод, если они не являются функциями вывода или явно не используют %openfile, %selectfile, и %closefile директивы.
Функция дополнительно возвращает значение с помощью %return директива. Возвращаемое значение может быть типом, определенным в таблице в поле «Типы значений целевого языка».
В этом примере функция, name, возврат x если x и y равны или возвращаются z если x и y не равны:
%function name(x,y,z) void %if x == y %return x %else %return z %endif %endfunction
Вызовы функций могут появляться в контекстах, где допустимы переменные.
%with операторы, действующие при вызове функции, доступны для функции. Вызовы других функций не включают локальный объем функции, но включают %with операторы, появляющиеся в функции.
Назначения переменным в функции создают новые локальные переменные и не могут изменять значение глобальных переменных, если не используется оператор разрешения области (::).
По умолчанию функция возвращает значение и не выдает выходные данные. Можно переопределить это поведение, указав Output и void модификаторы в строке объявления функции, как в
%function foo() Output ... %endfunction
В этом случае функция продолжает создавать выходные данные для текущего открытого файла и не обязана возвращать значение. Вы можете использовать void модификатор, указывающий, что функция не возвращает значение и не должна выдавать выходные данные, как в
%function foo() void ... %endfunction
В рамках функции левый элемент %assign по умолчанию оператор создает локальную переменную. В блоке функции в цепочке областей действия создается новая запись; это не влияет на другие записи. Пример отображается в области функций.
Это поведение по умолчанию можно переопределить с помощью %assign с оператором разрешения области (::).
При введении новых областей в функцию с помощью %withэти новые области используются во время вызовов вложенных функций, но поиск локальной области для функции не выполняется.
Если %with входит в состав функции, связанная с ней область действия переносится с вложенными вызовами функций, как показано на следующем рисунке.

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