目录
获取CAN总线报文信息
静态访问报文信息
动态访问报文信息
静态访问数据库信息
DBLookup(Access Message & Signal)
1、报文类型信息
2、类型信息
3、节点信息
获取CAN总线报文信息
我们在做CAN网络管理或者通信的测试的过程中,第一步我们需要获取的就是通过CAPL获取CAN总线的报文及其相关信息,然后与我们预期的信息比较,另外一种就是通过CAPL获取dbc的信息与CAN总线信息对比,保证通信一致性,因此这两块都是相对比较重要的内容,我就重点介绍一下。
CAN 和 LIN 报文帧特定属性:
> ID
> DLC
> Transmitter
> Attributes defined the database of these objects.
这里的信息访问可以是静态的或动态的。
Object | Message, LIN Message | FlexRay Frame | |||
Attribute | ID | DLC | Transmitter | Attributes | frFrame Attributes* |
Static | * | * | * | * | — |
Dynamic | * | * | 1 | 1 | * |
1:只能通过 DBLookup 进行动态访问。
*:FR_SlotID、FR_Cycle、类型、FR_PayloadLength、FR_Flags、FR_HeaderCRC、FR_Segment、FR_Status、DIR、模拟。
静态访问报文信息
静态访问是对已知对象的访问。 因此,可以直接或通过使用局部变量来完成访问;这里也是我们使用非常多的一种访问方式,比如常见的报文ID、周期、DLC等信息
variables
{
message EngineData msg;
}
void Get_CAN_Msg_ID()
{
int myID;
// 表达方式1,直接访问消息ID
myID = EngineData.ID;
// 表达方式2,间接访问消息ID
myID = msg.ID;
}
动态访问报文信息
动态访问是在不知道对象名称的情况下访问属性。 这对于使用通配符选择器的事件过程来说很常见,例如 在消息*上。
on message *
{
//使用关键字this,通过on message直接访问总线上的报文ID
myID = this.ID;
}
//动态访问 CAN 消息的 DLC
on message *
{
int currentDLC;
currentDLC = this.DLC;
}
//动态访问总线上特定报文
void foo( message * msg)
{
if (msg.id == 0x100)
{
write("CAN总线上出现报文0x100");
}
}
静态访问数据库信息
对数据库属性的直接静态访问
variables
{
message EngineData msg;
}
void foo ()
{
int cycleTime;
cycleTime = EngineData.GenMsgCycleTime;
}
void foo( int id)
{
if (id == msg.id)
{
// do something
}
}
DBLookup(Access Message & Signal)
DBLookup函数可以访问的信息主要有报文类型、信号信息、节点信息;
1、报文类型信息
Selector | Description | Return Type | Message Type |
Name | Message name | char [] | message, pg, linFrame, frFrame |
DLC | The size of the data field in bytes defined by the DLC | long | message, linFrame, frFrame |
Transmitter | Send nodes of the message; empty string if the number of send nodes is zero or more than one | char [] | message, linFrame, frFrame |
AttributeName | Name of a self-defined database attribute | char [] for string attribute, otherwise float | message, linFrame/2、 |
2、类型信息
Selector | Description | Return Type | Signals | Service Signals |
bitstart | Start bit of the signals in the message | dword | • | — |
bitcount | Number of bits in the signal | dword | • | • |
offset | Offset for conversion raw value -> physical value | float | • | • |
factor | Factor for conversion raw value -> physical value | float | • | • |
unit | Unit of the signal | char [] | • | — |
minimum | Minimum of the signal | float, 0, if not defined | • | • |
maximum | Maximum of the signal | float, signal size * physical value (factor) + offset | • | • |
dbtype | Signal definition from the database | dbSig * | • | — |
AttributeName | Name of self-defined database attribute | char [] for string attribute, otherwise float | • | — |
DefaultValue | Default value of the signal, | int64 | • | — |
FlexRay specific | ||||
NotValidLowerLimit | Not valid value of the signal | int64 | • | — |
Note: This selector is only available in FIBEX databases. | ||||
NotValidUpperLimit | Not valid value of the signal | int64 | • | — |
Note: This selector is only available in FIBEX databases. | ||||
signalgroup | Name of the assigned signal group; | char [] | • | — |
empty string if the signal belongs to no group. | ||||
txpdu | Name of the send node; with multiple senders a sender list will be returned. | char [] | • | — |
Note: This selector is only supported for FlexRay PDUs. | ||||
frameID | ID of the frame that contains the signal. | dword | • | — |
Note: This selector is not supported for PDUs. |
3、节点信息
Selector | Description | Return Type |
Name | Name of database object | char [] |
AttributeName | Name of a self-defined database attribute | char [] for string attribute, otherwise float |
要在指定的数据库中查找message/signal,就需要使用DBLookup(variable),通过这个函数我们去访问dbc数据库中特定报文的特定信息。通过该函数查找类型为 dbNode、dbMsg、dbPDU、dbFrFrame和dbFrPDU等数据库属性。