CANoe使用教程

Posted 嵌入式悦翔园

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CANoe使用教程相关的知识,希望对你有一定的参考价值。

CANoe使用教程

前言

CANoe是德国Vector公司为汽车总线的开发而设计的一款总线开发环境,全称叫CAN open environment。同Vspy一样,CANoe集合了网络监控、数据获取/记录、节点仿真、诊断、自动测试等功能;其丰富的功能和配置选项使其也是常见于汽车电子行业。接下来针对CANoe的常用操作进行介绍,具体分为以下几点:

  1. CANoe工程的新建;
  2. 通过Trace工具查看交互的报文内容;
  3. 通过Logging保存日志文件;
  4. 创建IG发送报文;
  5. 通过Graphics界面抓取信号波形;
  6. 加载cdd文件;
  7. 过滤报文ID的接收;
  8. 其他;

新建工程

打开CANoe软件,在工具栏的File中点击New,双击选择创建的模板 ,再保存创建的cfg工程文件。如下:

总线拓扑结构图

系统变量

系统变量是一种特殊的变量,用来描述某种特殊状态或者记录测量数据。一般有系统定义和用户定义两种,他们的作用于都是在各自的命令空间内。功能上两者没有区别,都相当于全局变量,方便软件数据交互;优先使用系统变量

一、系统变量的创建

1、首先点击Environment下的System Variable

2、在弹出窗口点击New System Variable


3、在弹出页面创建系统变量需要的参数

注意:

  • Namespace:定义了系统变量组的名称。如果需要在大的系统变量组里新建次级的系统变量组,则需要使用到Name1::Name2格式。
  • Name:系统变量的具体名称,后续的使用会直接引用该名称。
  • Data type:选择需要的类型,下拉菜单中支持的所有类型均在截图中可以看到。
  • Location:该系统变量组存放的路径、名称和格式。我所在的项目中使用到了XML/vsysvar两种格式。
  • Values:初始值、最小值、最大值、单位、值表。

4、定义好命名空间和变量名选择 32 bit signed类型,点击ok即可

5、通过copy完成其他变量的创建


6、通过双击可以对复制的变量进行编辑

二、系统变量的使用

在系统变量被定义好了之后,相当于我们定义了一个全局变量。具体如何来使用,我们可以通过CAPL内自带的函数来完成使用。

1、创建一个新的Network Node

依次点击Simulation–> simulation setup–>找到simulation setup窗体–>右键Network Node选择Insert Network Node

2、创建一个test.can文件用于写代码



这样我们就可以直接在test.can编写我们的代码了。

创建DBC文件

1、依次点击tools --> CANdb++ Editor

2、在弹出窗口点击File–>Create Database...

3、在弹出窗口选择如图CANTemplate.dbc,点击OK

4、给文件起个名字,并将文件存储在想要存储的位置

5、点击MyMsg,右键选择New

6、配置NameID

7、在Signals下面创建一个信号BusSwitch,信号设置如下图所示,单击ok保存。


8、将BusSwitch拖动到MyMsg下面,这样BusSwitch就变成报文MyMsg的一条信号

9、至此数据库就建立完毕了,直接保存退出

10、将我们的数据库导入进来,右键Databases点击add

CANoe配置

CANoe硬件的配置主要是波特率和协议的选择。具体操作主要在Hardware中的Network Hardware中。


如果还想要从硬件层直接过滤掉非目标帧的报文,可在设置中增加过滤器。可以从DBC中选择,也可以直接手动填入。

Mask表示CAN控制器中过滤器的掩码,在这里不做过多的阐述。如想深入了解,请自行查询Vectore Hardware手册。

如果工程已经创建的CAN 网络数量不满足当下的使用需求,可以自行添加。具体的添加路径在下图。添加的数量不能超过CANoe自身最大的通道数。

添加过滤器

在方框上右键选择 Insert Event Filter->CAN

配置后如下:

配置过滤器

1、双击CFB

2、添加要滤出ID Pass filter(显示的ID),可以通过ID或数据库进行选择。

注意右侧的对应的通道

参考文章

使用 Python 在 CANoe 中运行测试模块

【中文标题】使用 Python 在 CANoe 中运行测试模块【英文标题】:Running Test Modules in CANoe Using Python 【发布时间】:2020-09-12 00:56:25 【问题描述】:

我开发了一个基于 Python 的 CANOE 自动化代码,其中我启动 CANOE,打开配置并加载测试规范并运行它。

现在我想等到测试模块执行完成来记录判决。但不确定如何去做。任何帮助将不胜感激。

"""Execute XML Test Cases without a pass verdict"""
from time import sleep
import win32com.client as win32
import configparser
import time
from pandas.core.computation.expressions import set_test_mode
import pythoncom


testComplete = False

class TestModuleEvents(object):
    def OnReportGenerated(self,Success, SourceFullName, GeneratedFullName):
        print("Report Generated")
        testComplete = True
    def OnStop(self, value):
        print("Test Module Stopped")
        testComplete = True

    def OnStart(self):
        print("Test Module Started")
        testComplete = True

class TestConfigurationEvents(object):
    def OnStart(self):
        print("Measurement Started")
        testComplete = False

    def OnStop(self):
        print("Measurement Stopped")
        testComplete = True

config = configparser.RawConfigParser()
config.read('usecase02_configuration.properties')
configurationPath = config.get('TESTCONFIGURATION', 'configurationpath')
testspec = config.get('TESTCONFIGURATION', 'testspecification')

CANoe = win32.DispatchEx("CANoe.Application")
CANoe.Open(configurationPath)

testSetup = CANoe.Configuration.TestSetup
testSetup.TestEnvironments.Add(testspec)
test_env = testSetup.TestEnvironments.Item('Test Environment')
test_env = win32.CastTo(test_env, "ITestEnvironment2")


print(report.FullName)

# Get the XML TestModule (type <TSTestModule>) in the test setup
test_module = test_env.TestModules.Item('Tester')
CANoe.Measurement.Start()
sleep(5)   # Sleep because measurement start is not instantaneous

win32.WithEvents(test_module, TestModuleEvents)
test_module.Start()

# sleep(60)

while test_module.Verdict==0:
    time.sleep(1)

# test_module.Stop()
print(test_module.Verdict)

【问题讨论】:

您的问题到底是什么?您已经有了启动测试模块的代码以及等待测试模块完成的代码。那么你的问题到底是什么? 感谢您查看代码。如果您查看 while 循环 while test_module.Verdict==0: time.sleep(1) 我假设默认情况下的判定为 0,通过或失败将变为 1 或 2。但它并没有在 while 中等待,因为默认情况下判定为 1。然后我尝试更改 while 如下所示while not testComplete: time.sleep(1) 希望当 testmodule 运行完成时,它会在 TestModuleEvents 中调用 onStop 并设置 testCompleted=true。但这也没有发生。在调用 onStop 和终止 while 时需要支持。 【参考方案1】:

你已经准备好了所有的部分。我认为唯一的问题是对全局变量在 python 中的工作方式的误解。

您在 python 文件的全局范围内声明 testComplete。在TestModuleEvents.OnStop 内部,您声明了另一个名为testComplete 的变量。此实例与全局范围内的变量完全无关。

将您的 OnStop-handler(以及其他人)更改为如下内容:

    def OnStop(self, value):
        global testComplete
        print("Test Module Stopped")
        testComplete = True

这会将全局变量导入到您的作用域中,并将其设置为True,而不是创建一个新变量。

完成之后,将你的 while 循环更改为:

while not testComplete:
    time.sleep(1)

【讨论】:

以上是关于CANoe使用教程的主要内容,如果未能解决你的问题,请参考以下文章

如何看懂UDS诊断报文

会“充电”的CANoe来了

从代码角度看CAN网络层协议 ISO 15765-2

基于CAN总线的汽车诊断协议UDS(ECU底层模块移植开发)

汽车总线系统

汽车总线系统