TLC(Target Language Compiler)是一种为转换为目标语言而存在的额解释性语言,其目的就是将模型中编译出来的rtw文件转换为目标代码(C/C++等)。与M语言类似,既可以写成脚本文件,也能够作为函数存在,都是解释性语言,更相似的是它们都提供具有强大功能的内建函数库。
18.1 TLC的作用
- 支持模型针对通用或特定目标硬件的代码生成功能;
- 为S函数模块提供代码生成功能,可以让用户自己增加支持代码生成的模块;
- 在代码生成过程中,生成不依赖S函数模块的自定义过程代码。
Simulink中提供了很多既有TLC文件,如果擅自修改可能导致Simulink Coder功能性错误,故Mathworks提倡用户尽量不要修改TLC。但是如果能熟练掌握TLC的运行机制和编写方法,不仅不会伤害SImulink的功能,还可以巧妙利用TLC语言实现更多的自动化代码生成功能。
18.2 TLC的语法
TLC是一种以单个%打头的关键字为命令,空格之后跟参数的脚本语言,自身包含了流控制语法、内建函数、关键字和常用命令。
18.2.1 基本语法
- [text|%<expression>]*
text表示字符串,将原原本本地展开到输出流中。在%<>之中的是TLC变量,通过%<>作用将变量的执行结果显示到输出流中。
- %keyword[arguement1,arguement2,...]
%keyword表示TLC语言中的命令符,[arguement1,arguement2,...]则表示这个命令符所操作的参数。
如:
% assign Str = "Hello World"
%warning、%error、%trace命令可以将其后的变量或字符串的内容输出。
>> tlc text.tlc Warning: Simulink User
>> tlc text.tlc Error: Simulink User Main program: ==> [00] text.tlc:<NONE>(1) 错误使用 tlc_new Error: Errors occurred - aborting 出错 tlc (line 88) tlc_new(varargin{:});
若用%trace命令代替%warning命令显示信息,只有在执行TLC文件时在最后增加-v或者-v1才能将%trace后的信息显示出来。
TLC语言有两个内建宏TLC_TRUE=1和TLC_FALSE=0,在TLC语言的编写中会经常用到。
18.2.2 常用指令
注释
单行注释:双百分号%%
多行注释:/% comment %/
变量内容扩展
即通过%<>操作符将其内容扩展到输出流中。
%%text.tlc %assign input1 = 3 %assign input2 = 5 %warning %<input1> + %<input2> = %<input1 + input2>
>> tlc text.tlc Warning: 3 + 5 = 8
注意:%<>不能嵌套使用。
条件分支
%if expression %elseif expression %else %endif
例:
%%text.tlc %assign var = 2 %if ISEQUAL(var,1) %warning evering is OK. %else %warning var should be 1 but now there is something wrong. %endif
>> tlc text.tlc Warning: var should be 1 but now there is something wrong.
在内建函数ISEQUAL中不需要使用%<>。
开关分支
%switch expression %case expression %break %default %break %endswitch
每个%case分支后必须跟%break才能起到真正的选择作用,否则将执行下一个%case语句。
%%text.tlc %assign data = [1,2,3,4,5] %switch TYPE(data) %case "Number" %warning Type is Number. %break %case "String" %warning Type is String. %break %case "Vector" %warning Type is Vector. %break %case "Matrix" %warning Type is Matrix. %break %endswitch
>> tlc text.tlc Warning: Type is Vector.
循环
含%foreach、%roll、%for 3种常用方式。
(1)%foreach
%foreach loopIdx = iterNum xxxxx %endforeach
上述语句将loopIdx作为循环体句柄变量控制循环进行,从0开始,每次增加1,一直循环到iterMum-1为止。每个%foreach需要使用%endforeach来终止。
在循环体中可以使用%continue终止当前循环进入下一个循环,或者使用%break直接跳出循环。
%%text.tlc %assign data = [1,2,3,4,5] %foreach idx = 5 %if ISEQUAL(idx,1) %continue %elseif ISEQUAL(idx,4) %break %endif %warning data[%<idx>] = %<data[idx]> %endforeach
>> tlc text.tlc Warning: data[0] = 1 Warning: data[2] = 3 Warning: data[3] = 4
(2)%roll
%roll %endroll
%%text.tlc %assign data = [1,2,3,4,5] %foreach idx = 5 %if ISEQUAL(idx,1) %continue %elseif ISEQUAL(idx,4) %break %endif %warning data[%<idx>] = %<data[idx]> %endforeach