在使用CANoe的过程中,我们不可避免的会跟Message打交道。对于一个初学者了来说,message有什么属性,我们要怎么用好这个message在实现自动化的过程中还是很重要的。
- .can 定义接收帧的传输通道或通道。具体的使用例子如下。例子定义了message 0x100的通道为CAN 1.
message 0x100 msg = {dlc = 2, word(0) = 0x1234};
on key '1' {
write("sende via CAN 1");
msg.CAN = 1;
output(msg);
}
- .ID 定义了Message的ID 编号。如何使用ID 编号见例子。例子中说明了,当我们收到Message ID 为0x600的时候,write窗口打印一行文字并进入trigger()函数。
on message * {
if (this.ID == 0x600) {
write("message 0x600 received; triggering logging...");
trigger();
}
}
-
.name 我们只有读取的权限,并不能对message的名称进行更改,因为name属性已经被数据库定义好且只有读取的权限。
-
.DIR 定义传输方向。可能存在的值为Rx,Tx,TXREQUEST。其中TXREQUEST并不明白是一种怎样的传输类型,所以无法展开。使用的例子如下。例子中定义,如果0x100的DIR属性是RX,则打印message 0x100 received;如果0x100的DIR属性是TX,则打印message 0x100 sent。
on message 0x100 {
if (this.DIR == Rx) {
write("message 0x100 received");
}
if (this.DIR == Tx) {
write("message 0x100 sent");
}
}
这里通过查阅资料找到对于三种状态的描述
- .RTR 定义了远程传输请求的状态。可能存在的状态时0(无远程传输请求)和1(远程传输请求)。使用例子如下。
message 0x100 rmsg;
rmsg.RTR = 1;
output(rmsg);
- .type DIR和RTR结合使用可进行有效评估。具体的评估方法为: (TYPE = (RTR << 8) | DIR )。使用的例子如下。
message 0x100 resp_msg = {dlc = 2, word(0) = 0x1234};
on message 0x100 {
if (this.TYPE == RXREMOTE) {
// remote frame 0x100 received
output(resp_msg);
}
}
关于Type具体存在哪些情况,请看下面的说明。
- .dlc 定义了message的长度。具体的使用例子如下。但是因为现在协议的不同,所以每种协议下的dlc属性是不一样的。例如CAN的数据长度就为8 bytes,CAN FD的数据长度为64 bytes。
on message OneByteMessage {
if (this.DLC != 1) {
write("error: OneByteMessage has DLC != 1");
stop();
}
}