CAN总线自BOSCH公司发明以来,在汽车通信网络中的应用得到了广泛认可。随着汽车电子技术的发展,车上的电子模块越来越多,汽车内部的CAN总线节点也随之增多。
一般汽车内部CAN节点少则10个,多则30-40个,在对这些CAN节点进行测试的时候,工作内容复杂,且对测试人员技术要求较高。如何在保证产品质量的同时,快速推出产品,是OEM亟待解决的难题。因此,自动化测试技术作为汽车产品质量验证的重要手段变得至关重要。
针对上述问题,怿星科技自研的Neptune CAN总线自动化测试系统提供了有效的解决方案,下面跟着小编详细了解一下。
CAN总线测试内容
首先,简单介绍一下CAN总线测试内容。通常情况下CAN总线测试分为物理层测试、数据链路层测试、应用层测试、容错性测试几个部分。
01
物理层测试主要有以下内容,其中位时间、信号跳变斜率、电阻测试关注较多,也比较容易出问题。在后文详细介绍位时间和信号跳变斜率测试。
| 测试点 | 测试目的 | 测试条件 |
| 显隐性电平 | CAN总线对逻辑信号的识别依赖于信号电平,若CANH和CANL线上电平过高或过低,都会影响总线状态的判断,则需要验证在显性、隐性状态时,CANH 和 CANL 线上电平是否满足设计要求 | 示波器 |
| 信号跳变斜率 | 验证DUT的 CAN电平信号上升/下降斜率是否满足设计要求 | 示波器 |
| 高低压通信范围 | 验证DUT的高压和低压通信工作范围是否满足设计要求 |
_ |
| 位时间 | 总线波特率与位时间成反比,位时间由波特率确定,要求误差±0.5%,测试验证DUT的位时间是否满足设计要求 | 示波器 |
| 终端电阻 | ISO11898-2要求在高速CAN总线两端接终端电阻(一般为120Ω)以消除反射,对低速CAN没有端接要求。因此,需要验证DUT终端电阻和非终端电阻配置是否符合设计要求 | 万用表 |
| 地偏移 | 验证DUT在地电压发生偏移时,通信是否正常 | 地漂电源 |
▷ 位时间测试
在介绍位时间测试之前,先简单回顾一下CAN数据帧格式,如下图所示:

测试目的
主要验证DUT发送报文的位时间精度以及DUT对接收到的报文的位时间精度容错能力。
测试方法
通常选取DUT发送的其中1个CAN标准数据帧,使用示波器抓取整帧报文波形,计算从测试起始位到测试结束位的间隔时间,然后求平均值。测试起始位和结束位可以是帧起始位、仲裁段位、控制段位、数据段位、CRC段位、ACK段、帧结束位等。
测试结果
下面是使用示波器自动抓取的测试截图(从SOF起始位到ID段的结束位,测量方式为差分信号输入):

▷ 跳变斜率测试
测试目的
主要验证DUT的CAN总线信号上升斜率和下降斜率是否满足要求。
测试方法
通常选取DUT发送的其中1个CAN标准数据帧,使用示波器抓取整帧报文波形(包括CANH、CANL以及CANH和CANL之间差分信号波形),然后分析计算仲裁段或数据段内的所有跳变沿变化时间(信号从10%上升到90%或者从90%下降到10%间隔时间)。
测试结果
下面是使用示波器自动抓取的测试截图(测量方式为差分信号输入):

02
数据链路层测试主要有以下内容,其中采样点、BusOff测试关注较多,在后文详细介绍采样点测试。
| 测试点 | 测试目的 | 测试条件 |
| 采样点 | 验证DUT的采样点设置是否满足设计要求 | VH6501干扰仪 |
| ACK应答 | 验证开启/关闭总线ACK应答时,DUT通信处理机制是否满足设计要求 |
_ |
| 报文重发 | 验证DUT产生发送错误后,能否立即重发该报文 | VH6501干扰仪 |
| BusOff | 验证DUT快恢复策略是否满足设计要求 | VH6501干扰仪 |
| 高负载 | 验证在总线高负载情况下,DUT是否会出现丢帧现象 |
_ |
| 最大填充位报文 | 验证在总线上仿真发送最大填充位报文,DUT通信是否正常 |
_ |
▷ 采样点测试
测试目的
主要验证DUT的采样点设置范围是否满足要求。
测试方法
通常是使用测试工具在CAN总线上发送特定干扰报文,然后检测DUT是否会发送错误帧。本文中选取的测试方法是使用Vector的VH6501设备进行干扰,周期发送高优先级报文,在每个周期,微调CRC_DEL位长度,使其缩短1个VH6501时钟长度,并同时将后一位ACK_Slot位长度增加1个VH6501时钟长度。
由于CRC_DEL位固定位隐性位,ACK_Slot位固定位显性位,当ACK_Slot显性位移到DUT采样点位置时,就会被DUT采样到并判定CRC_DEL位为显性位,DUT检测为格式错误,就会向总线发送错误帧,测试工具检测到DUT发送的错误帧时,则结束测试,并记录调整的次数为n,然后根据调整次数计算出DUT的采样点。
具体计算方法如下:
以CAN总线500Kbps速率为例,一个位时间为2000ns(1/500K),VH6501时钟频率为160MHZ,每个VH6501时钟长度为6.25ns(1/160M),则DUT采样点:Sample = (2000 - 6.25 * n) / 2000。
测试结果
VH6501干扰过程,如下图所示:

03
▷ 应用层测试主要有以下内容,在后文详细介绍报文周期测试。
| 测试点 | 测试目的 | 测试条件 |
| 消息标识符 | CAN总线通过ID仲裁,发送数据,因此,需要验证DUT所有发送报文ID与数据库定义是否一致 | 解析数据库 |
| 数据长度 | 验证DUT所有发送报文DLC与数据库定义是否一致 | 解析数据库 |
| 报文周期偏移 | 验证DUT所有发送周期报文的周期偏移是否满足设计要求 | 解析数据库 |
| 信号初始值 | 验证DUT发送的报文信号初始值和数据库是否一致 | 解析数据库 |
| 未使用位填充 | 验证DUT发送的报文未使用位填充数据值和数据库是否一致 | 解析数据库 |
| 接收报文 | 验证仿真数据库定义的接收节点为DUT的所有报文,DUT通信是否正常 | 解析数据库 |
▷ 报文周期偏移测试
测试目的
主要验证在单节点测试环境下,DUT发送的周期报文偏移是否在±10%以内。
测试方法
待DUT通信稳定后,使用CANoe持续监控总线一段时间(至少是10分钟),记录在此期间接收到的所有周期报文的发送时间,然后计算每个周期报文的发送间隔最小值、最大值、平均值。
测试结果
判断每个周期报文发送间隔最小值、最大值、平均值的周期偏移误差均在数据库定义周期的±10%以内。
04
▷ 容错性测试主要有以下内容:
| 测试点 | 测试目的 | 测试条件 |
| CANH/L短电源 | 验证DUT在CANH/L对电源短路时处理机制是否满足要求,并确认通信恢复时间参数是否满足设计要求 | 容错性测试环境 |
| CANH/L短地 | 验证DUT在CANH/L对地短路时处理机制是否满足要求,并确认通信恢复时间参数是否满足设计要求 | 容错性测试环境 |
| CANH与CANL短路 | 验证DUT在CANH与CANL短路时处理机制是否满足要求,并确认通信恢复时间参数是否满足设计要求 | 容错性测试环境 |
| CANH/L断路 | 验证DUT在CANH/L断路时处理机制是否满足要求,并确认通信恢复时间参数是否满足设计要求 | 容错性测试环境 |
| DUT掉电源 | 验证DUT在与电源断开时处理机制是否满足要求,并确认通信恢复时间参数是否满足设计要求 | 容错性测试环境 |
| DUT掉地 | 验证DUT在与地断开时处理机制是否满足要求,并确认通信恢复时间参数是否满足设计要求 | 容错性测试环境 |
CAN总线自动化测试系统架构
为保证测试的高效执行,自动化测试执行是必要的,我们的CAN总线自动化测试系统由测试软件、测试硬件系统、DUT被测系统组成。

测试软件:
自动化测试操作管理软件,用户可以进行测试参数配置、测试用例选择、测试执行、测试报告管理和Log记录及分析等。
测试硬件系统:
主要功能是模拟硬件测试环境,进行DUT电源控制、I/O信号控制及仿真、报文监控及仿真、CAN总线故障注入、CAN总线信号采集、CAN总线干扰等。一次可同时部署多个DUT,程序自动切换测试,实现高效便捷操作。
DUT被测系统:
被测CAN总线节点,符合ISO11898标准的CAN/CANFD节点。
这套怿星自研的Neptune CAN总线自动化测试系统不但能提高测试覆盖度,自适应不同测试环境,大幅减少测试工作量,而且操作简单,对测试人员的技术要求较低,同时还具备其他特点:
集成多种测试功能,CANFD节点通信测试、LIN主/从节点通信测试、Autosar CAN网络管理测试、CAN/CANFD/LIN诊断、刷写、通信路由、诊断路由测试等
支持二次开发功能,提供了丰富的API接口,支持Excel/LDF/DBC/ARXML文件解析等
对此,感兴趣的小伙伴可以联系我们进行咨询!
↓↓↓↓↓↓↓
喜欢此篇文章欢迎评论、收藏、分享支持小编~
更多技术干货,行业前沿动态,请关注上海怿星科技官方公众号:怿星科技eplanet

我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/