Capl中报文的使用

报文的使用

在CAPL编程语言中,消息是在CAN总线上以一个或多个数据帧传输的数据块。CAPL函数使用四种不同的CAN帧类型中的三种(如下所示):

  • Data
  • Error
  • Remote
  • Overload帧不受CAPL编程语言的支持。

注意:在数据块(有时称为包)大于一个CAN数据帧的情况下,通常实现一个传输协议来处理这个多包消息,本文只集中讨论单帧消息。

在CAPL中使用数据库声明消息

CAPL中的消息是对象;因此,在使用它们之前必须声明它们(类似于变量)。如果要在CAPL程序中使用数据库定义的消息,则不必再次定义它。

只需使用以下语法声明它:message <message identifier or name> <variable name>

//已在数据库定义了EngineSpeed的报文
message EngineSpeed msg1;   //声明名字
message 0x100 msg1;          //声明ID

在数据库的帮助下,消息在定义时被赋予一个符号标识符ID。此ID可以在CAPL程序中使用数字标识符的任何地方使用。当声明已经在数据库中定义的消息时,CAPL自动知道诸如数字标识符、数据长度代码(DLC)和信号列表等结构信息。

在CAPL中声明没有数据库的消息

如果消息没有在数据库中定义,则通常需要花更多的时间进行编程。

例如,CANalyzer和CANoe在默认情况下接收Intel (little-endian)格式的消息。如果消息中的数据字节使用Motorola(大端序)格式,则必须使用CAPL交换字节。消息属性和关联必须在CAPL程序中定义。

//如果数据库中没有定义消息,则只能使用数字标识符声明消息。例:
message 0x100 msg1;

//定义消息数据长度 例:
message 0x100 msg1={DLC=8};

//定义后引用:
msg1.DLC=8;


//如果您不确定标识符是什么,请将标识符替换为“*”。在发送消息之前,必须使用ID选择器建立标识符。
message * msg1 = { DLC = 8};
//在程序的另一部分中,建立标识符:
message.ID = 0x100;



消息选择器

消息对象不仅包含有关其信号的信息,而且还包含有关一些称为选择器的属性和组件的信息。

这些选择器在传输和接收消息中都是可访问的。对于大多数应用程序,不需要显式地设置它们,但在某些情况下它们可能是有用的。

例如,TIME选择器可以用于仲裁测试。

要将传输通道从1(默认)更改为2,可以使用CAN选择器。

要确定消息是传输的消息还是接收的消息,将使用DIR选择器。

详情参见下表的CAPL消息选择器

DIR和TYPE选择器都提供了预定义的常量,可用于使CAPL程序更具可读性。

TYPE选择器是作为一个单元来评估其他选择器的有效方法。

TYPE = (RTR << 8) | DIR

下面列出了用TYPE选择器访问的常量。

messagename.CAN = 2;       // 将此消息的发送通道设置为2
value = messagename.TIME;  // 检索消息最后一次传输或接收的时间戳
messagename.ID = 100;      //  将消息标识符设置为十进制100

消息传输

消息主要是在CAPL浏览器的全局变量部分声明的,因此在整个程序中都可以全局访问它们。发送信息很简单,只需在任何事件过程或用户定义函数中调用output()函数。

// 声明消息
message 0x100 msg1 = {dlc = 8}; 
// 发送设置数据字段
msg1.byte(0) = 0x12;           
msg1.long(1) = 0x90785634;
// 假设CarSpeed占用最后三个字节
msg1.CarSpeed = 100;          
msg1.CAN = 2;
// 发送消息
output(msg1);                

信息接收

在CAPL中,只有当从CAN总线接收到消息并为该消息定义了事件过程时,才会发生消息接收过程。如果从CAN总线接收到一个特定的消息,而CAPL程序没有针对它的事件,CAPL程序将忽略该消息。

应该注意的是,这个属性导致CAPL程序的行为很像CANalyzer/CANoe停止过滤器。一旦接收到消息,相应的消息事件过程将执行。on消息事件过程必须有一个参数来指定消息。只需将<newMessage>字符串替换为数字或符号标识符。

下面展示了可以声明的各种接收消息事件的示例:

在每个消息事件中使用this关键字来访问接收到的消息的属性(通过选择器)和信号。可以将其视为指向该事件的消息成员的指针。这个关键字允许您从消息中检索任何有效的信息,并且它只允许只读访问。禁止分配this关键字指向的对象。

以下是使用this的示例:

on message ABSdata
{
if (this.DIR == RX)
{
write(“Message ID = %d is received from channel %d”, this.ID, this.CAN);
write(“The signal value of car speed is %d”, this.CarSpeed);
}
}

将从CAN通道1接收到的ABSdata消息发送到CAN通道2

on message CAN1.ABSdata
{
message * gatewayMsg;
gatewayMsg = this;
gatewayMsg.CAN = 2;
output(gatewayMsg);
}

or

on message CAN1.ABSdata
{
message CAN2.* gatewayMsg;
gatewayMsg = this;
output(gatewayMsg);
}

错误帧

CAN协议控制器能够检测消息错误,并将通过在消息帧内传输错误标志向网络发出错误警报。发现包含错误的CAN消息被称为错误帧,并被所有总线接收端丢弃。

错误帧事件

错误帧由工具的CAN硬件检测,可以通过使用on errorFrame事件进行处理。

on errorFrame事件类似于on message事件,不同之处在于它在总线接收到错误帧时发生。该事件通常用于统计错误帧的数量和时间。

例如,下面的错误帧事件过程可以用于分析CAPL节点中的总线错误(频率,事件期间的活动等)

on errorFrame
{
if (this.can == 1 && (timeNow() – pretime) < 100000)
write(“Error frames received less than one second apart on channel 1.”);
}

 timeNow()描述提供当前模拟时间(最大时间:2^32 * 10微秒= 11小时55分钟49秒672毫秒96微秒)

注意:timeNow()函数和time选择器返回的系统时间以10微秒为单位。

  • 4
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值