Simulink代码生成(二十三)——TSP开发之tlc文件编写
一、tlc文件解读
以ds18b20为例编写的tlc内容如下
%% File : sfunar_7sec.tlc
%%
%% Description:
%% Code generation file for sfunar_7sec
%% Copyright 2015- Hyowinner, Inc.
%implements sfunar_ds18b20 "C"
%include "block_common_includes.tlc"
%% Function: BlockTypeSetup ===============================================
%function BlockTypeSetup(block, system) void
%assign mdlname = LibGetMdlSrcBaseName()
%assign cfile = LibCreateSourceFile("Source","Simulink",mdlname)
%assign t_device_index = SFcnParamSettings.r_device_index
%assign t_pin = SFcnParamSettings.r_pin
%% Ensure required header files are included
%<ArduinoCommonBlockTypeSetup(block, system)>
%openfile buf
#include "OneWire.h"
#include "DallasTemperature.h"
%closefile buf
%<LibSetSourceFileSection(cfile, "Includes", buf)>
%openfile buf
#define ONE_WIRE_BUS %<t_pin>
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors_%<t_device_index>(&oneWire);
%closefile buf
%<LibSetSourceFileSection(cfile, "Defines", buf)>
%endfunction
%function BlockInstanceSetup(block, system) void
%%
%<LibBlockSetIsExpressionCompliant(block)>
%endfunction
%function Start(block, system) Output
%% Initialize DS18B20 Sensor
%assign t_device_index = SFcnParamSettings.r_device_index
// Initialize device index: %<t_device_index>
sensors_%<t_device_index>.begin();
%endfunction
%% Function: Outputs ======================================================
%%
%function Outputs(block, system) Output
%assign t_device_index = SFcnParamSettings.r_device_index
%assign y = LibBlockOutputSignal(0, "", "", 0)
sensors_%<t_device_index>.requestTemperatures();
%<y> = sensors_%<t_device_index>.getTempCByIndex(%<t_device_index>);
%endfunction
%% [EOF]
- %implements sfunar_ds18b20 “C” 这个必须包含,固定格式
- block_common_includes.tlc的内容如下。这里%include "block_common_includes.tlc"相当于把这个文件里面的内容直接内联进来了,通过查看文件,一般不用外部模式,所以这个的作用通常就是增加Arduino.h到文件
%<LibAddToCommonIncludes(“Arduino.h”)>- function BlockTypeSetup(block, system) void
相当于配置,一般设置头文件,宏定义,数据结构等,无论存在一个或者多个模块,这个函数只运行一次。
这里的block表示模块,system表示模型- %function BlockInstanceSetup(block, system) void
这个表示实例,每个模块相当于一个实例,如果要为每个模块生成一个实例,就需要在这里设计,如果只有一个模块则不需要。这里暂时不用修改。- %assign mdlname = LibGetMdlSrcBaseName()
%assign cfile = LibCreateSourceFile(“Source”,“Simulink”,mdlname)
%assign t_device_index = SFcnParamSettings.r_device_index
%assign t_pin = SFcnParamSettings.r_pin
这里
mdlname = LibGetMdlSrcBaseName()表示获取模型的名字
LibCreateSourceFile(“Source”,“Simulink”,mdlname)创建一个以模型名字命名的.c文件
后面两句表示获取C Mex Sfunction中的两个参数,一个是r_device_index,另一个是r_pin,在tlc文件中一般以t_xx格式- %% Ensure required header files are included
%<ArduinoCommonBlockTypeSetup(block, system)>
%openfile buf
#include “OneWire.h”
#include “DallasTemperature.h”
%closefile buf
%<LibSetSourceFileSection(cfile, “Includes”, buf)>
这里<ArduinoCommonBlockTypeSetup(block, system)>相当于添加了#include “Arduino.h”
%<LibSetSourceFileSection(cfile, “Includes”, buf)>是将buf中的两个Include放到mldname.c的Includes部分- %openfile buf
#define ONE_WIRE_BUS %<t_pin>
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors_%<t_device_index>(&oneWire);
%closefile buf
%<LibSetSourceFileSection(cfile, “Defines”, buf)>
同理,这里是放在Defines部分,也可以将宏定义放在define部分,将其他的放在declearation部分,这里是为了方便。- %function Start(block, system) Output
这个相当于Init,会把生成的代码放到Init部分,注意这里用的Output,而BlockTypeSetup用的是void,这里的Output的意思是将内容输出到特定的位置,而用void则需要自己用LibSetSourceFileSection去限定- %assign t_device_index = SFcnParamSettings.r_device_index
// Initialize device index: %<t_device_index>
sensors_%<t_device_index>.begin();
这个生成的代码就是一条注释,加上sensors_0.begin();
-%function Outputs(block, system) Output
%assign t_device_index = SFcnParamSettings.r_device_index
%assign y = LibBlockOutputSignal(0, “”, “”, 0)
sensors_%<t_device_index>.requestTemperatures();
% = sensors_%<t_device_index>.getTempCByIndex(%<t_device_index>);
同理,这里生成的代码会到step中, LibBlockOutputSignal的解释如下,一般只用设置用第一个和第四个数据,中间两个用双引号替代。最后生成的代码为:sensors_0.requestTemperatures(); out = sensors_0.getTempCByIndex(0);
%% File: block_common_includes.tlc
%%
%% Copyright 2002-2014 The MathWorks, Inc.
%function SLibCodeGenForSim() void
%if (CompiledModel.TargetStyle=="SimulationTarget")
%return 1
%else
%return 0
%endif
%endfunction
%function ArduinoCommonBlockTypeSetup(block, system) void
%if EXISTS(::_DONE_COMMON_BLOCK_TYPE_SETUP_) == 0
%assign ::_DONE_COMMON_BLOCK_TYPE_SETUP_ = 1
%if !SLibCodeGenForSim()
%if ExtMode
%% Remove double re-definition in Integer-only case
%<LibAddToCommonIncludes("remDouble.h")>
%endif
%<LibAddToCommonIncludes("Arduino.h")>
%if ::GenCPP==0
%<LibAddToCommonIncludes("io_wrappers.h")>
%endif
%endif
%endif
%endfunction