Customize Generated ASAP2 File
You can customize the fields of an ASAP2 file by using the code generator in any of these ways:
Customize ASAP2 Fields by Using Base Class
Create an object from the base class.
obj = coder.asap2.UserCustomizeBase;
Modify the object fields.
obj.HeaderComment = 'Header comment'; obj.ModParComment = 'Mod Par comment'; obj.ModCommonComment = 'Mod Common comment'; obj.ASAP2FileName = 'File name'; obj.ByteOrder = 'BYTEORDER MSB_LAST';
Pass the object to the function that generates the ASAP2 file.
coder.asap2.export(
modelName
,CustomizationObject=obj);
Customize ASAP2 Sections by Deriving from Base Class
Derive from the base class
coder.asap2.UserCustomizeBase
. You can place the derived file anywhere on the MATLAB path.To edit the Header section, use the
writeHeader
function.Use the
writeHardwareInterface
function to edit the hardware interface section consisting of theMOD_PAR
andMOD_COMMON
fields of the ASAP2 file.To add text at the beginning of the ASAP2 file, use the
writeFileHead
function.To add text at the end of the ASAP2 file, use the
writeFileTail
function.For example, the code for generating a derived class
TestASAP2Customization
might look like this code:classdef TestASAP2Customization < coder.asap2.UserCustomizeBase % Customization class for asap2 file methods function header = writeHeader(obj) header = sprintf([' /begin HEADER ' 'test Header text' '\n',... 'header test comments from user\n',... ' /end HEADER']); end function hardwareInterface = writeHardwareInterface(obj) hardwareInterface = sprintf([' /begin MOD_PAR "' 'UserDefined' '"\n',... ' test comments from user\n',... ' /end MOD_PAR\n\n',... ' /begin MOD_COMMON "' 'UserDefined MOD_COMMON' '"\n',... ' user defined values for MOD_COMMON\n',... ' ' obj.ByteOrder '\n',... ' /end MOD_COMMON']); end function fileTail = writeFileTail(obj) fileTail = sprintf(['/* This File can be used for ' ,... 'calibration .*/\n'... '/* EOF ',obj.ASAP2FileName, '*/']); end function fileHeader = writeFileHead(obj) fileHeader = sprintf(['/******************************************************************************\n',... ' This is a a2l file which can be used for calibration with INCA or CANAPE\n',... ' ******************************************************************************/' ]); end end end
Create an object from the derived class. For example, this command creates an object from
TestASAP2Customization
.obj = TestASAP2Customization;
Pass the object to the function that generates the ASAP2 file.
coder.asap2.export(
modelName
,CustomizationObject=obj);
Customize Computation Method Names
In generated ASAP2 files, computation methods translate the electronic control unit (ECU) internal representation of measurement and calibration quantities into a physical model-oriented representation. Using Simulink® Coder™ software, you can customize the names of computation methods. You can provide names that are more intuitive, enhancing ASAP2 file readability, or names that meet organizational requirements.
To customize computation method names, use the MATLAB® function getCompuMethodName
, which is defined in
.matlabroot
/toolbox/rtw/targets/asap2/asap2/user/getCompuMethodName.m
The getCompuMethodName
function constructs a computation
method name. The function prototype is:
cmName = getCompuMethodName(dataTypeName, cmUnits)
where
is the name of the data type associated with the computation method.dataTypeName
are the units as specified in thecmUnits
Unit
property of aSimulink.Parameter
orSimulink.Signal
object (for example,rpm
orm/s
).
returns the constructed computation method name.cmName
The default constructed name returned by the function has the format:
<localPrefix><datatype>_<cmUnits>
where
<local_Prefix>
is a local prefix,CM_
, defined in
.matlabroot
/toolbox/rtw/targets/asap2/asap2/user/getCompuMethodName.m<datatype>
and<cmUnits>
are the arguments that you specified to thegetCompuMethodName
function.
Special characters in
are
not supported in the computation method name in ASAP2 file. The special characters
are converted as shown in this table.cmUnits
Special Character | Conversion |
---|---|
% | _percent_ |
- | _dash_ |
/ | _per_ |
* | _into_ |
° | _deg_ |
For example, if you call the getCompuMethodName
function by
using the
argument
dataTypeName
'int16'
and the
argument
cmUnits
'm/s'
, and then generate an ASAP2 file for a model named
myModel
, the computation method name appears in the generated
file:
/begin COMPU_METHOD /* Name of CompuMethod */ myModel_CM_int16_m_per_s /* Units */ "m/s" ... /end COMPU_METHOD
Export Characteristics and Measurement Objects in Groups
Starting in R2021b, you can group the characteristic and measurement objects in
the ASAP2 file based on their properties. By default, the generated ASAP2 file
contains GROUPS
and SUB_GROUPS
based on the
subsystems present in the model.
Open the
sldemo_fuelsys
model.open_system("sldemo_fuelsys")
Build the model.
Generate the ASAP2 file by using the
Generate Calibration Files
tool or by using this command:coder.asap2.export("sldemo_fuelsys")
The data elements are grouped based on the model architecture. The top model is referred to as
GROUP
and subsystems in the model are referred to asSUB_GROUPS
. The generated file contains these lines:/begin GROUP /* Name */ sldemo_fuelsys /* Long identifier */ "sldemo_fuelsys" /* Root */ ROOT /begin SUB_GROUP rtB.es_o sldemo_fuelsys_Dashboard sldemo_fuelsys_Engine_Gas_Dynamics sldemo_fuelsys_Throttle_Command sldemo_fuelsys_To_Controller sldemo_fuelsys_To_Plant sldemo_fuelsys_fuel_rate_control /end SUB_GROUP /end GROUP
To group the
scalar
objects into a group namedGROUP_TYPE_SCALAR
in the ASAP2 file, use this command:coder.asap2.export("sldemo_fuelsys",CustomizeGroupsBy={'SCALAR'})
You can also group the objects of type array
, and lookup tables
into MAP
, CURVE
, CUBOID
,
CUBE_4
, and CUBE_5
based on dimensions of
the table.
Generate Record Layouts
Open the
sldemo_fuelsys
model.open_system("sldemo_fuelsys")
Build the model.
Generate the ASAP2 file by using this command:
coder.asap2.export("sldemo_fuelsys",IncludeAllRecordLayouts=true)
The
RecordLayouts.a2l
file is generated according to the version of the ASAP2 file. In the ASAP2 file, verify this line:/include "RecordLayouts.a2l"
The generated
RecordLayouts.a2l
file contains the record layouts of the data types present in the model.Note
The
RecordLayouts.a2l
file is required to be in the same folder as the ASAP2 file.coder.asap2.export("sldemo_fuelsys",IncludeAllRecordLayouts=false)
does not generate separate record layouts file, but includes the record layouts of the data types of exported data objects in the ASAP2 file./begin RECORD_LAYOUT Scalar_FLOAT32_IEEE FNC_VALUES 1 FLOAT32_IEEE COLUMN_DIR DIRECT /end RECORD_LAYOUT /begin RECORD_LAYOUT Scalar_FLOAT64_IEEE FNC_VALUES 1 FLOAT64_IEEE COLUMN_DIR DIRECT /end RECORD_LAYOUT ...
Tip
In the ASA2P file, to preserve the shape of a lookup table that is used as a
model argument, make sure that the LookUp Table block is in the
referenced model. Pass the Lookup table object
from the top
model as an instance parameter value.
Exclude Structures and 64-Bit Integers
Starting in R2022a, you can exclude the structure elements and 64-bit integers in the generated A2L file. By default, structures and 64-bit integers are included in the A2L file.
Open the
sldemo_fuelsys
model.open_system("sldemo_fuelsys")
Build the model.
Generate the ASAP2 file by using this command:
coder.asap2.export("sldemo_fuelsys", SupportStructureElements=false, ... Support64bitIntegers=false)
The generated ASAP2 file does not have 64-bit integers and structure elements in it.
Note
Starting in R2022a, the pointer variables will not be generated in the ASAP2 file.
Generate ASAP2 Containing Default Event List
Starting in R2022a, for a multirate model, the ASAP2 file contains the
IF_DATA
section that has the
DEFAULT_EVENT_LIST
, enabling you to view the respective
raster values for the data elements in the calibration tools.
Open the
sldemo_fuelsys
model.open_system("sldemo_fuelsys")
Build the model.
Generate the ASAP2 file by using
Generate Calibration Files
tool or by using this command:coder.asap2.export("sldemo_fuelsys")
The model has a single rate of
0.01
. The generated file defines measurements as:/begin MEASUREMENT /* Name */ rtB.es_o.throttle /* Long identifier */ "" /* Data type */ FLOAT32_IEEE /* Conversion method */ sldemo_fuelsys_CM_single /* Resolution (Not used) */ 0 /* Accuracy (Not used) */ 0 /* Lower limit */ -3.4E+38 /* Upper limit */ 3.4E+38 ECU_ADDRESS 0x0000 /* @ECU_Address@rtB.es_o.throttle@ */ /end MEASUREMENT
Convert the model into multirate model by using this command:
blockName = ['sldemo_fuelsys' '/EGO Fault Switch']; set_param(blockName, 'SampleTime', '0.02');
Build the model.
Generate the ASAP2 file by using this command:
coder.asap2.export("sldemo_fuelsys")
The generated file now defines the measurements as:
/begin MEASUREMENT /* Name */ rtB.es_o.throttle /* Long identifier */ "" /* Data type */ FLOAT32_IEEE /* Conversion method */ sldemo_fuelsys_CM_single /* Resolution (Not used) */ 0 /* Accuracy (Not used) */ 0 /* Lower limit */ -3.4E+38 /* Upper limit */ 3.4E+38 ECU_ADDRESS 0x0000 /* @ECU_Address@rtB.es_o.throttle@ */ /begin IF_DATA XCP /begin DAQ_EVENT VARIABLE /begin DEFAULT_EVENT_LIST EVENT 0x0001 /end DEFAULT_EVENT_LIST /end DAQ_EVENT /end IF_DATA /end MEASUREMENT
Specify ECU Address Extension
Starting in R2022a, you can specify additional address information in the ASAP2
file by specifying an integer value for the EcuAddressExtension
property. By default, no additional address information is provided.
Open the
sldemo_fuelsys
model.open_system("sldemo_fuelsys")
Build the model.
Generate the ASAP2 file by using this command:
coder.asap2.export("sldemo_fuelsys",EcuAddressExtension=4)
The
ECU_ADDRESS_EXTENSION
key word for the characteristics, measurements, and axis points are in the ASAP2 file, enabling you to specify additional address information./begin MEASUREMENT /* Name */ rtB.MinMax /* Long identifier */ "" /* Data type */ FLOAT64_IEEE /* Conversion method */ sldemo_fuelsys_CM_double /* Resolution (Not used) */ 0 /* Accuracy (Not used) */ 0 /* Lower limit */ -1.7E+308 /* Upper limit */ 1.7E+308 ECU_ADDRESS 0x0000 /* @ECU_Address@rtB.MinMax@ */ ECU_ADDRESS_EXTENSION 4 /end MEASUREMENT