目录[-]
目录:
- 总线测量:Trace、Graphics、Data
- 发送报文:CANIG 、CAPL
- 记录/回放日志:logging
- 制作面板:Panel
- 自动化测试脚本(基于CAPL语言)
—————————————————————————————————————————————
详细解释:
1、CANOE根据CAN总线,对数据进行测量
2、台架测试某些ECU或中控仪表等,需要向被测项发送报文
3、记录回放日志,需要用到logging模块
4、制作面板,带有测开性质
5、使用CAPL语言,编写自动化测试脚本
————
1、Trace、Graphics、Data,三个窗口
1.1、Trace窗口
红框中的信号,VCU_VehSpd,车速信号,显示60km/h
————
1.2、Graphics窗口
可以直观的观察到,信号从0递增到150,再从150递减到0。

————
1.3、Data窗口
也可以轻易观察到信号的数值变化

————
2、发送报文
2.1 CANIG模块(报文交互式生成器)
第一步,在CAN总线上添加CANIG模块

第二步:添加信号,比如已经添加了报文“VCU_1”和它手下的5个信号,其中VCU_VehSpd是我们需要调整的,Generator Type列,改成Range of value,将其改成周期性的变动。

第三步:点击暂停、终止右侧的设置按钮,在设置页
1、Value 1:初始值
2、Value 2:最大值
3、Step Size:每次递增/递减的值
4、Hold time:遍历间隔时长
5、Direction:方向,现在选的第三个 Alternate,也就是先上升后下降

第四步:执行CANIG,并观察Trace
Graphics窗口:
1、原有的CAPL脚本,发送到是从0到150km/h,再从150km/h到0,每隔100ms递增/递减10
2、CANIG,发送的是0到150,每隔100ms递增/递减50
3、可以看到车速不断跳动,但一定会有一个50km/h的值,这个是CANIG发送的

————
3、记录/回放日志:logging
日志保存设置:
1.Analysis—Measurement Setup 窗口,默认Offline实时监听模式,点击右侧Logging,在弹出窗,显示日志保存的位置和日志名称,如下图,默认保存的名字是:Logging.blf(需要注意的是,每次运行都会存储日志,并且每次都会覆盖保存)

2.Analysis—Logging 窗口,需要在未录制时点击,点击右侧按钮,进入配置页面

常用配置解释,没有特殊需要,保持默认:
1)、Destination folder:
用于选择Logging文件的保存位置
2)、Destination file:
指定要保存的Logging文件的文件名
3)、Field Codes:
帮助用户按需求生成文件名
4)、File format:
指定logging file的格式
5)、Advanced Settings
a、Warn before overwriting logging file:选择是否在新的测量Logging文件与原文件重名时弹出覆盖已有文件警告窗口
b、Show error message on data loss:选择是否在数据丢失时提醒用户
c、View logging file after measurement stop :选择是否在测量结束后自动打开已经记录的logging文件
d、Global format settings:单击Settings按钮进入Option对话框
6)、Logging Filter
a、Log bus events:选择是否记录总线事件(如:报文、数据帧)
b、Log System and environment variables:选择是否记录环境变量或系统变量事件
c、Log trigger events :选择是否记录Start/Stop触发事件
d、Log test events:选择是否记录Test Modules 和Test Units 的信息
e、Log internal events:选择是否记录内部程序事件
f、Log statistics events : 选择是否记录数据统计相关的系统变量的信息
g、Log CAPL events:选择是否记录CAPL函数write To Log 和CAPL程序中的说明
h、Log diagnostic events:选择是否记录诊断相关信息
————
日志回放
假设现在已经存在可以运行的CANOE程序,可以回放的日志一般有2个格式:asc、blf,回放步骤
- Analysis—Measurement Setup 窗口,左侧默认两种监听模式,Online实时监听、Offline回放模式,先点击这个按钮,切换到“回放模式”

2.点击Offline左侧的文件夹,然后加入要回放的log日志

3.加入后的样式

4.点击右侧Graphics的按钮

5.再点击左上角的"Start"按钮,执行就可以看到Graphics的结果了
6.也可以在Trace窗口,import引入这个日志,这样也可以看到日志信息

————
4、制作面板 Panel
Panel为测试工程师提供更多可能性,自动化测试如果设计得当,可靠性比手动测试要高,当一个功能迭代1次,10次,100次,手动点击从时间上来讲,不可能覆盖每一条用例,而如果设计一套优质的panel和对应的capl代码。
只要车企不更改脚本涉及到的报文和信号,那么就是可靠的。
制作方式:
- 进入一个项目,点击 Home—Panel—Add Panel(如果已经创建过,可以选择已有项目)

2.在Panel页面,点击右侧的 Toolbox 可以选择需要的控件,比如,我们需要一个仪表盘,就用第一项:Analog Gauge ,挡位设计,我们采用了一个 Group Box 和4个 radio button,还有一个像是开关,它是 Switch/Indicator ,我们假设一个场景,踩油门、踩刹车,在真实物理层面,是通过按压触发传感器从而触发can协议信号,进而使车速增加/减少,我们这里的开关,就可以模拟,踩和松开,两种状态。

3.仪表盘设计:有一点最重要,就是绑定信号/环境变量,这里使用的信号绑定,在CAPL代码里,传递这个字段的信息。用最简单的方式写一段代码,当信号的速度值变更时,仪表盘随之变动。
4.开关按钮设计:它的实现是用系统变量/环境变量,那么环境变量在哪里创建?

回到canoe首页,点击主菜单 Enviroment — System Variables

如图所示,创建了3个环境变量,这里用的是 SwitchBtn(这是个名字,没有特殊意义,取什么名字都可以),3个环境变量的根目录是test,这个test是它们的命名空间,放在一起后续CAPL代码可以规范化书写。

运行后的效果是这样的,点击按钮后,按钮处于被按下的状态,并且打印一行。

代码如下
/*@!Encoding:65001*/
includes
{
}
variables
{
float speed=0;
msTimer tmr1;
message VCU_1 msg_vcu_1;
int currentGear=0;
}
on timer tmr1{
if(currentGear==2){
// D挡:加速到150后减速循环
speed += 10;
if(speed >= 150) speed = 0;
if(speed == 100) write("速度100km/h");
}
else if(speed > 0){
// 其他挡位:平滑减速
write("切换到非前进挡,开始减速");
speed -= 10;
if(speed < 0) speed = 0;
if(speed == 0) write("已停止");
}
// 发送速度报文
msg_vcu_1.VCU_VehSpd = (long)speed;
write("速度: %.0f km/h", speed);
output(msg_vcu_1);
}
on sysvar test::GearPosition
{
currentGear = @test::GearPosition;
// 0 N挡空挡,1倒车,2前进,3P挡,其他错误
switch(currentGear){
case(0):
write("切换到挡位:N挡,值是:%d",currentGear);
break;
case(1):
write("切换到挡位:R挡,值是:%d",currentGear);
break;
case(2):
write("切换到挡位:D挡,值是:%d",currentGear);
break;
case(3):
write("切换到挡位:P挡,值是:%d",currentGear);
break;
default:
write("未知挡位,值是:%d",currentGear);
}
// write("切换到挡位: %d", currentGear);
}
on sysvar_update test::SwitchBtn
{
if (@test::SwitchBtn == 1) {
write("执行状态1的功能:ON");
} else {
write("执行状态0的功能:OFF");
}
}
on start{
setTimerCyclic(tmr1,1000);
// @test::GearPosition = 0;
}
补充说明(为什么制作面板推荐使用环境变量)?
|
特性 |
Signal(信号) |
环境变量 |
|
稳定性(关键因素) |
依赖报文收发,容易丢帧 |
始终可用,不受总线影响 |
|
数据源 |
来自总线报文 |
来自CANoe内部存储 |
|
时序问题 |
严重,需等待报文 |
无,立即响应 |
|
依赖关系 |
强依赖DBC文件 |
弱依赖,独立定义 |
|
调试难度 |
复杂,需抓报文 |
简单,直接监控变量 |
|
变更影响 |
DBC改动直接崩溃 |
数据库变更无影响 |
|
使用场景 |
底层通信、协议处理 |
面板控制、状态管理 |
————
5、自动化测试脚本
CAPL自动化测试是基于CANoe平台,利用CAPL脚本语言实现的车辆网络系统自动验证方案。
1、它是什么?
- 一套通过编写测试脚本,替代人工操作的自动化验证体系
- 模拟真实场景下的ECU行为、报文交互和故障注入
- 自动执行测试用例并生成标准化测试报告
2、能解决什么问题?
- 重复性测试任务(如:100次开关测试)
- 复杂时序场景(如:整车唤醒—工作—休眠流程)
- 边界条件验证(如:信号极限、异常情况)
- 回归测试
————
下面解释一下,如何创建一个canoe的测试用例,这里用panel作为示例
1、测试准备:
- canoe 工程 :一个可执行的工程(本文使用 first.cfg)
- capl代码:一个稳定的功能脚本(本文使用 test.can)
- db++:数据库文件(本文使用 test.dbc)
- panel:成功绑定环境变量和功能脚本对应(本文使用 Panel1.xvp)
2、进入 canoe 页面,切换到主菜单 Test ,重点关注 Test Modules 的三个按钮,主要是前两个按钮

3、点击 Test Setup 默认是空白的,需要创建一个“Environment”

4、在空白出,鼠标右键,点击第一项 “New Test Environment”

5、创建后,在这个环境文件夹下,点击鼠标右键,选择 “Insert CAPL Test Module”,增加一个节点,这里起名字叫 “auto_test ”

6、鼠标右键,点击 “auto_test” ,点击第一项 “Configuration”,可以配置这个节点的名称,包括使用什么capl脚本,如下图

7、Module name,可以修改节点名称,重要的是下面的Test script,只能单选1条用例,这里要选中的是capl的功能脚本,也就是上面写的那段代码。

8、鼠标左键,双击节点 “auto_test”,下一步就是添加 “测试用例”,下面的一排按钮,点击第2个按钮,它会自动跳转 CAPL 工具,并新建一个空文件

9.编写下面代码
/*@!Encoding:65001*/
void MainTest()
{
// 主测试:按顺序执行所有测试
write("********** 开始自动化测试 **********");
GearPositionTest();
SwitchButtonTest();
write("********** 所有测试完成 **********");
}
testcase GearPositionTest()
{
// 测试挡位切换功能
write("=== 开始测试挡位切换 ===");
// 测试倒挡(1)
@test::GearPosition = 1;
testWaitForTimeout(2000);
// 测试N挡(0)
@test::GearPosition = 0;
testWaitForTimeout(2000);
// 测试D挡(2)
@test::GearPosition = 2;
testWaitForTimeout(3000);
// 再次测试N挡(0)
@test::GearPosition = 0;
testWaitForTimeout(2000);
// 测试P挡(3)
@test::GearPosition = 3;
testWaitForTimeout(2000);
// 测试其他挡位
@test::GearPosition = 5;
testWaitForTimeout(2000);
write("=== 挡位切换测试完成 ===");
}
testcase SwitchButtonTest()
{
// 测试开关功能
write("=== 开始测试开关功能 ===");
// 测试开关ON
@test::SwitchBtn = 1;
testWaitForTimeout(1000);
// 测试开关OFF
@test::SwitchBtn = 0;
testWaitForTimeout(1000);
write("=== 开关功能测试完成 ===");
}
10.保存后,回到 canoe 主页面,点击左上角的 “Start” 启动工程,工程启动后,原本置灰的 “播放” 按钮变成红色可点击状态,点击后,就会开始执行 auto_test.can“测试用例”

11.开始测试, 我们先从N挡(值是0)切换到R挡、接着是D挡、N挡、P挡,其中,0到3这四个挡位的切换正常

再看这条异常的挡位信息,也测试到了

12.点击最右侧这个彩色的按钮,跳转测试报告页面

13.测试报告界面

————
END