车载网络测试实操源码_使用CAPL脚本对CAN报文的Counter和CRC进行实时监控

系列文章目录

车载网络测试实操源码_使用CAPL脚本解析hex、S19、vbf文件
车载网络测试实操源码_使用CAPL脚本对CAN报文的Counter和CRC进行实时监控
车载网络测试实操源码_使用CAPL脚本模拟发送符合协议要求的Counter和CRC的CAN报文
车载网络测试实操源码_使用CAPL脚本实现安全访问解锁
车载网络测试实操源码_使用CAPL脚本进行DTC自动化测试
车载网络测试实操源码_使用CAPL脚本进行UDS刷写及其自动化测试
车载网络测试实操源码_使用CAPL脚本进行UDS协议测试
粉丝问题解答系列文章… …
其他持续更新中… …



前言

在车载软件开发和测试过程中,我们经常会需要监控CAN报文的Counter和校验码(比如CRC、checksum等),以确定相应CAN报文是否持续有效。今天我们就来讲一下如何使用CAPL脚本对CAN报文的Counter和CRC进行实时监控。


一、CAPL简介

CAPL(Communication Access Programming Language)是一种基于C语言开发的编程语言,专门用于CANalyzer和CANoe工具环境。CAPL语言的主要特点包括:
语法结构:CAPL具有类C语言的语法结构,支持多种数据类型,如变量、常量、函数、结构和数组。但CAPL简化了C语言,移除了复杂的指针概念和一些不常用的关键字,同时融入了一些C++的概念,如函数重载等。
特性:CAPL语言支持在对象和图像之间使用可编程语言,可以在PC上进行测试,支持脚本语言,使用可复用的模块,实时诊断和控制,以及丰富的图形和可视化效果等。这些特性使得CAPL在系统开发中更加容易、高效、可靠和安全。
编译过程:CAPL的编译过程简洁高效,因为CAPL浏览器仅对单个文件进行编译,无需进行复杂的链接操作。与C语言编程相比,CAPL的开发过程更为直接和易于上手。在编译阶段,任何语法或语义的错误都会被检测出来,并在CANalyzer和CANoe的专用“write窗口”中报告运行时错误,从而提高了调试的效率。
应用领域:CAPL特别适用于制动系统、压缩机、气体机械和其他复杂的实时控制系统应用程序。同时,由于CAPL语言的简洁和高效,它也被广泛应用于各种测试和分析任务中。
脚本执行:CAPL脚本是基于事件驱动的,没有main函数和程序入口。任何时间都有可能触发CAPL脚本的执行,如按键事件、定时器事件、执行测试等。如果没有事件发生,那么CAPL程序是“闲置的”。

二、CAPL脚本示例

针对CAN报文的Counter和CRC进行实时监控的CAPL脚本示例如下:

/*@!Encoding:936*/
includes
{
  
}

variables
{

}

/*CRC8 校验算法*/
byte crc_sae_j1850_zero(byte dataArry[] ,int length)
{
  byte crc;
  byte poly;
  int  i = 0;
  int  j = 0;
  crc  = 0x00;
  poly = 0x1D;//可根据算法需要修改多项式

  for(i =0 ; i < length; i++)
  {
    crc = crc ^ dataArry[i];
    
    for(j =0 ; j < 8; j++)
    {
      if ((crc & 0x80) != 0)
      {
        crc = (crc << 1) ^ poly;
      }      
      else
      {
        crc = (crc << 1);
      }    
    }       
    crc &= 0xFF;
  }
  crc = crc ^ 0x00;
  return crc;
}

/*CRC8 校验预处理*/
byte CRCChecksum_calc(message * msg,byte crc_byte_idx,byte len)
{
  byte dataArray[64] ;
  byte crc;
  byte i;
  msg.byte(crc_byte_idx) = 0;//初始化CRC为0
  for(i = 0; i < len; i++)
  {
    dataArray[i] = msg.byte(len-1-i);//颠倒字节序(按需)
  }

  crc = crc_sae_j1850_zero(dataArray,len);
  return crc;
}

on message can1.0x123//以CAN通道1的0x123报文举例,可根据需要修改
{
  byte msg_CRC;
  byte msg_Counter_now;
  byte msg_Counter_last;
  byte CRC_calculate;
  byte i;
  message can1.0x123 CONST_msgCAN1_123;
  message can1.0x123 TMP_msgCAN1_123;
  
  CONST_msgCAN1_123 = this;
  TMP_msgCAN1_123 = this;
  
  msg_CRC = CONST_msgCAN1_123.byte(7);//假定byte7为CRC,可根据需要修改
  msg_Counter_now = CONST_msgCAN1_123.byte(6);//假定byte6为Counter,可根据需要修改
  
  //write("msgCAN1_123:counter = 0x%x, msg_CRC = 0x%x",msg_Counter_now,msg_CRC);

  if((msg_Counter_now - msg_Counter_last == 1) || (msg_Counter_now == 0 && msg_Counter_last == 0xF))//假定Counter范围为0~0xF,可根据需要修改
  {
    //write("msgCAN1_123:Counter RIGHT! msg_Counter_now = 0x%x, msg_Counter_last = 0x%x",msg_Counter_now,msg_Counter_last);
  }
  else
  {
    for(i = 0;i < 8;i++)
    {
      write("msgCAN1_123:msg[%d] = 0x%x",i,CONST_msgCAN1_123.byte(i));
    }
    write("msgCAN1_123:Counter ERROR!!!!!! msg_Counter_now = 0x%x, msg_Counter_last = 0x%x",msg_Counter_now,msg_Counter_last);
  }
  
  CRC_calculate = CRCChecksum_calc(TMP_msgCAN1_123,7,8);
  if(CRC_calculate == msg_CRC)
  {
    //write("msgCAN1_123:CRC RIGHT! msg_CRC = 0x%x, CRC_calculate = 0x%x",msg_CRC,CRC_calculate);
  }
  else
  {
    for(i = 0;i < 8;i++)
    {
      write("msgCAN1_123:msg[%d] = 0x%x",i,CONST_msgCAN1_123.byte(i));
    }
    write("msgCAN1_123:CRC ERROR!!!!!! msg_CRC = 0x%x, CRC_calculate = 0x%x",msg_CRC,CRC_calculate);
  }
  
  msg_Counter_last = CONST_msgCAN1_123.byte(6);
}

以上是针对CAN报文的Counter和CRC校验码进行实时监控的CAPL脚本示例,可根据需要修改CRC校验算法,或者改为checksum校验和算法等。实时监控过程中,如果Counter没有连续递增,或者CRC校验码错误时,会在canoe的write窗口中进行打印输出,以便定位问题。效果如下:
在这里插入图片描述


总结

本文简单介绍了如何使用CANoe+CAPL脚本对CAN报文的Counter和CRC校验码进行实时监控,希望对大家有所帮助。各位可根据本文的示例,结合自己的需求,进行完善和二次开发。

  • 25
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MrxMyx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值