Эти инструкции могут помочь вам применять стиль программирования в каждом конечном файле последовательно.
Идентификаторы в файле начинаются с прописной буквы. Например,
NumModelInputs 1 NumModelOutputs 2 NumNonVirtBlocksInModel 42 DirectFeedthrough yes NumContStates 10
Поскольку Name
идентификатору можно способствовать в родительский осциллограф, записи блока, которые содержат Name
идентификатор должен начать имя с прописной буквы. Например, блок может содержать
Block { : : RWork [4, 0] : NumRWorkDefines 4 RWorkDefine { Name "TimeStampA" Width 1 StartIndex 0 } }
Поскольку Name
идентификатор в RWorkDefine
запись продвинута на PrevT
в его родительском осциллографе это должно начаться с прописной буквы. Продвижение Name
идентификатор в родительскую область действия блока в настоящее время сделан для Parameter
, RWorkDefine
, IWorkDefine
, и PWorkDefine
блокируйте записи.
Директива присвоения Компилятора Выходного языка (%assign
) генерирует предупреждение, если вы присваиваете значение “неполному” идентификатору генератора кода. Например,
%assign TID = 1
производит ошибку потому что TID
идентификатор не квалифицирован Block
. Однако “квалифицированное” присвоение не генерирует предупреждение. Например,
%assign Block.TID = 1
не генерирует предупреждение, потому что присвоение содержит спецификатор. Компилятор Выходного языка поэтому принимает, что программист намеренно изменяет идентификатор.
Глобальные присвоения переменной TLC должны начаться с прописных букв. Глобальная переменная является переменной, объявленной в системном конечном файле (grt.tlc
, mdlwide.tlc
, mdlhdr.tlc
, mdlbody.tlc
, mdlreg.tlc
, или mdlparam.tlc
), или в функции, которая использует
оператор. Глобальные присвоения имеют тот же осциллограф как переменные генератора кода. Пример глобальной переменной TLC задан в mdlwide.tlc
%assign InlineParameters = 1
Пример глобальной ссылки в функции
%function foo() void %assign ::GlobalIdx = ::GlobalIdx + 1 %endfunction
Локальные присвоения переменной TLC должны начаться со строчных букв. Локальная переменная TLC является переменной, присвоенной в функции. Например,
%assign numBlockStates = ContStates[0]
Когда вы объявляете функцию в block.tlc
файл, это должно запуститься с Fcn
. Например,
%function FcnMyBlockFunc(...)
Поскольку генератор кода отслеживает использование переменных и генерирует код на основе использования, необходимо использовать стандартные программы доступа вместо того, чтобы непосредственно использовать переменную. Например, вы не должны использовать следующее в своем файле TLC:
x = %<tInf>;
Необходимо использовать
x = %<LibRealNonFinite(inf)>;
Точно так же вместо того, чтобы использовать %<tTID>
, используйте %<LibTID()>
. Для полного списка функций см. Справочное руководство по библиотеке Функции TLC в Компиляторе Выходного языка.
Глобальные переменные Simulink® Coder™ запускаются с rt
и глобальные функции Simulink Coder запускаются с
rt_
.
Постарайтесь не называть глобальные переменные в модулях, которые запускаются с rt
или rt_
потому что они могут конфликтовать с глобальными переменными Simulink Coder и функциями. Эти переменные TLC объявляются в commonsetup.tlc
.
Это соглашение создает сопоставимые переменные в конечных файлах. Например, блок Gain содержит следующий Outputs
функция.
a. | Секция кода для каждого блока начинается с комментария, задающего тип блока и имя. |
b. | Включайте пустую строку сразу после конца функции, чтобы создать сопоставимый интервал между блоками в выходном коде. |
c. | Попытайтесь остаться в рамках 80 столбцов на строку для функционального баннера. Вы можете настроить 80 строк с комментариями столбца во главе каждой функции. Как пример, смотрите |
d. | Для непротиворечивости используйте переменные |
e. | Используйте переменную |
f. | При именовании контрольных переменных цикла используйте |
Output
функция в gain.tlc
%roll sigIdx = RollRegions, lcv = RollThreshold, ... block, "Roller", rollVars
InitializeConditions
функция в linblock.tlc
%roll xidx = [0:nStates-1], xlcv = RollThreshold,... block, "Roller", rollVars
Файлы библиотеки функции Компилятора Выходного языка условно включены с защитным кодом, таким образом, можно сослаться на них многократно использование %include
не вызывая беспокойство, были ли они ранее включены. Примените эту практику для файлов библиотеки TLC, которые вы создаете.
Соглашение состоит в том, чтобы использовать переменную с тем же именем как основное имя файла, верхний регистр и с символами нижнего подчеркивания, присоединенными в обоих концах. Так, файл с именем customlib.tlc
должен иметь переменную _CUSTOMLIB_
защита его.
Как пример, основная библиотека функции Компилятора Выходного языка, funclib.tlc
, содержит этот код TLC, чтобы предотвратить несколько включение:
%if EXISTS("_FUNCLIB_") == 0 %assign _FUNCLIB_ = 1 . . . %endif %% _FUNCLIB_
Когда код, который генерирует ваш TLC, мог использоваться в моделях, на которые ссылаются, в непредсказуемых контекстах, не принимайте слишком много о пространствах имен. Например, при записи кода TLC для блока и добавлении typedef
, охраняйте его с if/def
, когда следующий пример иллюстрирует:
%openfile tmpBuff #ifndef RESOLUTION_TYPEDEF typedef enum { LO_RES, HI_RES } Resolution; typedef struct { Resolution res; int8_T value; } Data; #define RESOLUTION_TYPEDEF #endif /* RESOLUTION_TYPEDEF */ %closefile tmpBuff %<LibCacheTypedefs(tmpBuff)>;