系列文章目录
车载网络测试实操源码_使用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校验码进行实时监控,希望对大家有所帮助。各位可根据本文的示例,结合自己的需求,进行完善和二次开发。