目录[-]

目录:

  1. 总线测量:Trace、Graphics、Data
  2. 发送报文:CANIG 、CAPL
  3. 记录/回放日志:logging
  4. 制作面板:Panel
  5. 自动化测试脚本(基于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,回放步骤

  1. 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代码。

只要车企不更改脚本涉及到的报文和信号,那么就是可靠的。

制作方式:

  1. 进入一个项目,点击 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