资讯动态

基于Vector工具链的整车OTA测试实现与自动化实践

发布时间:2026/9/15 13:27:10 来源:尧图企业网站定制
做了几年总线测试一个越来越明显的趋势是OTA已经不能算新增功能而是新车型交付的基本盘。用户不跑4S店就能升级固件听起来很美好但对测试工程师来说意味着原本在线下完成的刷写验证、异常断电验证、版本回滚验证全部要挪到台架上提前做掉。而做OTA测试绕不开一套趁手的工具链Vector这套东西我前后用了不少时间今天把基于Vector工具链的OTA测试实现思路完整拆一遍。这篇文章适合三类人看一是正准备搭OTA台架测试环境的测试工程师二是被分配了OTA相关自动化任务但还不熟悉CANoe和vTESTstudio的同行三是想了解OTA测试用例设计和常见坑的Tier1或整车厂技术人员。内容以实际可落地的方案为主我会把链路设计、数据库准备、CAPL脚本框架、自动化工程组织这些环节全部串起来讲清楚。1. OTA升级测试难在哪先理清楚要解决什么问题1.1 一次完整的OTA升级网络上是这样流转的很多人以为OTA测试就是发几个UDS报文把固件刷进去真上手才会发现整车OTA是一条从云端到车端再到ECU的完整链路。以目前常见的先下载后刷写策略为例云端推送升级包TBOX或者中央网关先接收并存储整个下载过程走以太网或者蜂窝网络下载完成后再由TBOX或网关作为转发节点通过CAN、CANFD或车载以太网把固件数据分发给目标ECU目标ECU执行擦除、写入和校验最后完成激活和复位。所以在台架上做OTA测试至少需要模拟两个层面的行为远端服务器的下发逻辑以及TBOX/网关的转发逻辑。如果用Vector工具链来做CANoe天然可以承担总线节点模拟这个角色你可以让CANoe既当Tester诊断仪直接对ECU发起刷写也可以让CANoe模拟TBOX作为刷写的发起方和转发方被测ECU在这条链路的末端响应诊断请求。另一个容易忽视的点是OTA升级不是只有刷写这一个动作。刷写之前通常要上报当前软件版本、检查整车条件电压、挡位、车速等刷写过程中要动态控制DTC的使能与抑制刷写完成后要执行校验、例程控制和ECU复位。测试方案如果只盯着34/36/37这几个服务漏掉外围的通信控制、会话管理和网络管理配合大概率会在实车上翻车。1.2 测试工程师面对的三个核心挑战动手搭环境之前建议先把OTA测试的难点想清楚这决定了你在工具选型和用例设计上的投入方向。我总结下来OTA测试主要有三个挑战。第一是场景的复合性。OTA舱内测试不会像单ECU刷写那样只有一条干净的总线台架上经常同时跑着多个ECU节点诊断是UDS over CAN或者UDS over DoIP网络管理报文还在周期性发送。任何一个环节没有配合好刷写就会中断而且这种中断往往不是ECU本身的问题而是测试环境引入了干扰。第二是异常注入的难度。OTA测试的重点不在正常升级成功而在升级到一半断了怎么办。实车测试里断电报、拔总线、拔天线都是高风险操作台架上需要可控地注入这类异常。Vector工具链在这块有个天然优势通过CAPL脚本可以精确地在指定报文序号、指定时间点断开传输或者发送错误帧这一点比单纯用真实TBOX测试要容易复现得多。第三是自动化程度。OTA测试数据量大一次完整的升级包从几MB到几百MB都有一个版本升级测试跑下来要重复很多遍固件版本、参数标定可能每周都在变。靠人工点鼠标发诊断报文效率根本跟不上版本迭代速度。测试方案必须一开始就考虑自动化执行、自动判据和数据驱动。1.3 为什么Vector工具链适合干这件事市面上做总线测试的工具不少但OTA测试这块Vector的生态相对最完整。CANoe自不必说诊断部分有Diagnostics模块和CANdela Studio可以制作诊断描述文件CAPL语言可以做精细的总线级操作和故障注入vTESTstudio则把测试用例从CANoe工程里抽离出来形成独立的、可维护的自动化工程。再加上Vector还有针对AUTOSAR体系比如Davinci的工具链整套东西从ECU开发到测试验证是打通的。我自己感受最深的是Vector工具链的“诊断协议栈”封装得很实在。CANoe的Diagnostics模块内置了UDS和KWP2000协议栈配置好诊断描述文件之后CAPL代码只需要调用对应接口就能发起诊断请求不用自己拼一帧一帧的报文。这对刚入门的同事尤其友好可以先把关注点放在测试场景设计上而不是去手抠诊断协议栈的底层字节。当然用Vector这套东西也有学习成本文档量大配置项多如果没有人指路光是把诊断数据库导入CANoe、让CAPL脚本正确跑起来折腾一两天很正常。这篇文章后面几章就把我实际搭环境的过程和思路梳理出来照着做能省不少弯路。2. 测试环境搭建从电脑到ECU的完整链路2.1 硬件连接与通道配置OTA测试的硬件链路核心是把电脑跑CANoe和被测ECU连起来。常规做法是使用VN系列接口卡比如VN1640、VN5610、VN8900这类设备。接口卡的选择取决于被测ECU支持的物理层如果被测ECU只有一路CAN或者CANFD一块VN1640就够了如果被测ECU带以太网接口DoIP刷写那就要选带以太网口的设备比如VN5610或VN5000系列。连接方式并不复杂把VN设备用USB接到电脑VN设备对应的通道用线束连接到ECU的CAN/CANFD总线如果是以太网刷写则从VN设备以太网口出来接到ECU的以太网口。需要注意总线终端电阻CAN总线在物理上要保证两端或至少一端有120欧终端电阻不然信号反射会直接影响通讯质量出现过不少同事刷写偶尔失败、最后排查到是忘了接终端电阻的情况。硬件连接完后CANoe工程里要新建工程并配置ORuntime。在这个界面里需要把接口卡型号、通道号码与物理总线对应起来以太网通道特别要注意IP地址的规划要让PC侧的IP和ECU侧的IP在同一个网段并且要设置好端口号15000——这是DoIP协议默认的诊断端口。做OTA测试时我习惯把CAN通道和以太网通道放在同一个CANoe工程里这样在分析总线交互时可以同时看到CAN和以太网的报文方便定位是下载链路还是刷写链路出了问题。2.2 数据库与诊断描述文件的准备硬件连好之后下一步就是准备软件层面的“数据库”。OTA测试至少需要两个文件DBC或者是ARXML描述总线信号以及CDD或者PDX描述诊断服务和DID信息。DBC文件一般由整车或ECU的通信设计团队提供。如果你在公司里通常不需要自己画DBC。但问题在于测试用的DBC和开发用的DBC可能不是同一版本信号定义、报文周期、默认值都有差异。所以我建议拿到DBC后先在CANoe里做一次快速检查确认被测ECU的application报文、网络管理报文都能正常解析再往下推进。如果DBC缺失也可以直接用CANdb新建一个简单的DBC只保留地址码和必要的应用报文测试重点是诊断服务DBC层面不需要太全。诊断描述文件CDD用CANdela Studio来制作或者查看。一个比较实用的小技巧如果暂时没有CDD文件也可以直接用CANoe里的Diagnostics/ISO TP配置来手动定义诊断寻址和物理请求ID。实际刷写场景下物理寻址一般使用功能性地址之前先确认ECU的物理请求ID比如0x7E0和响应ID比如0x7E8以及ISO TP的CAN ID映射关系。为了保险起见我拿到一个新的ECU之后会先用CANoe的Diagnostic Console手动发一条0x22读取版本信息能正常返回就说明ISO TP和寻址配置都对了。配置诊断数据库时还有一个容易踩的坑OBD诊断的DID通常是标准化的但OTA升级过程中会涉及很多厂商自定义的DID和RID这些在标准诊断协议里根本查不到。如果CDD里没有定义就要自己在CDD文件或者CAPL代码里补充。我的做法是在CDD里把会用到的DID、服务、例程都提前建好宁可多建也不能临时用CAPL去拼报文因为vTESTstudio里的 Diagnostic Service 调用依赖于CDD的定义建得越完整自动化写起来越顺。2.3 用CAPL模拟TBOX与网关节点OTA测试环境的关键环节在于如何模拟TBOX。前面说了整车OTA通常由TBOX扮演下载和转发角色。在台架环境里如果被测的是目标ECU你完全可以不接真实的TBOX而是用CANoe里的CAPL节点来模拟TBOX行为。模拟TBOX的核心逻辑是CAPL节点周期性地发送网络管理报文并在收到上位机指令后按照OTA主流程作为诊断Tester去和目标ECU交互。这个CAPL节点需要同时处理两条“逻辑链路”一条是与测试上位机的指令交互一条是与目标ECU的诊断交互。实际工程中我用过两种方案一种是用CANoe的“Interaction Layer”简化模拟另一种是自己写CAPL的定时发报和诊断请求代码。如果只是验证ECU端刷写逻辑前一种就够用如果还要验证TBOX的策略逻辑比如断点续传、失败重试那就必须自己写CAPL。模拟TBOX还有一个细节延迟与超时控制。真实TBOX转发不是瞬时完成的脚本里如果收到下载请求立即转发到总线上反而不会暴露ECU的真实鲁棒性问题。我通常在CAPL里给转发动作加一个50到200毫秒的随机延迟这样刷写过程中的超时处理才能被真实测试到。2.4 基于DoIP的车载以太网OTA环境随着域控制器上车基于以太网的DoIP刷写越来越普遍。DoIP环境下的OTA测试和CAN环境相比需要注意的点不太一样。首先是连接管理DoIP有完整的连接建立过程包括车辆识别、路由激活、诊断连接开始这些动作要在刷写之前做好。CANoe里提供了DoIP IL层配置好之后会在网络上自动响应以太网报文配合在vTESTstudio或CAPL里发起请求。其次要关注以太网报文的数据包大小。UDS over DoIP不需要ISO TP分包但TCP分段是底层的CAPL脚本里一般不需要手动处理但是测试时要注意观察网络层的握手和PCAP日志。Vector工具链里的Ethernet Packet Builder可以用来构造和发送以太网报文不过做OTA测试时我主要还是用Diagnostics模块因为诊断服务层面CAN和DoIP的接口是统一的。很多时候整理故障、分析埋点时单独把以太网日志导出来看并不是很方便。我的习惯是让CANoe同时记录CAN和以太网通道然后在数据分析界面里把两个通道按时间同步排列。做完一次刷写测试后用CANoe的日志窗口快速定位到刷写失败的时间点再交叉检查以太网TLS握手、DoIP路由激活和UDS响应基本能把问题锁定得八九不离十。3. 核心测试场景的设计与实现3.1 正常刷写流程的测试用例设计场景设计是做OTA测试的核心测试用例不是散乱地发一堆UDS服务而是要按照刷写流程组织成一条链路。以我实际用的一个AUTOSAR ECU刷写流程为例正常升级大致是先检查前置条件比如总线上电是否正常、ECU版本信息能否读到然后通过0x10 02或者0x10 03切换到扩展会话或编程会话接着发送0x27请求安全访问解锁刷写权限再调用0x2E或者0x31写入指纹信息、设置刷写状态随后进入下载环节用0x34请求下载、0x36传输数据、0x37退出传输有可能还有0x31执行校验例程最后是0x11复位ECU。测试用例的划分也可以照着这个流程走前置条件检查、会话切换、安全访问、下载、校验、激活、复位一个阶段一个Case。每个Case里把输入条件、操作步骤和预期结果写清楚。这里有个经验正常流程序列不要急着全串起来先每个阶段单独验证等单段都稳定了再串成完整链路不然出了问题很难定位到底是哪一步失败。正常流程里我特别想强调“前置条件”的设计。OTA刷写不是任何时候都能进行的整车条件下电压、挡位、车速都要满足约束BCM等节点也会参与协调。台架测试时前置条件要在CAPL脚本里模拟出来。比如可以通过发送特定的CAN网络管理报文让被测ECU认为整车处于安全状态否则ECU可能直接拒绝进入编程会话。很多同事在台架上发现ECU不响应刷写请求查了一圈物理层没问题结果就是少了前置条件的模拟。3.2 版本校验与程序激活测试OTA整包里不光有固件还有元数据——包含版本号、硬件兼容列表、校验信息等。测试时要验证ECU的版本读取和匹配逻辑即刷写前检查版本是否兼容、刷写后检查版本是否正确。这一块我通常用0x22服务读取软件版本DID比如0xF1 0x00软件版本、0xF1 0x50ECU硬件版本等等。读取到的版本号要在测试报告里自动记录同时与期望值做比较。注意版本号的存储格式有的ECU用ASCII存字符串有的是二进制编码测试脚本判定时格式必须严格匹配。我在项目中遇到过一次脚本里版本判断一直失败最后发现ECU返回的是“V1.2.3”期望值却是“1.2.3”多了个V这类问题很容易被忽视。程序激活测试主要针对AUTOSAR的“活动slot”概念。现在的ECU基本都有A/B分区一个slot是当前运行的老版本另一个slot是待激活的新版本刷写过程中还可能涉及回滚分区。一个典型的测试用例是在刷写完成后不恢复默认会话、也不复位而是直接读取当前活动分区对应的数据标识确认新的分区已经激活。如果ECU设计成重启后切换分区那么就要在CAPL里复位ECU后等待一段时间再读取状态这个时序测试如果写得不严谨很容易把“还没有激活”误判成“激活失败”。3.3 异常场景与鲁棒性测试OTA测试的价值大部分体现在异常场景上。异常类型可以从这几个维度去穷举断电、通信中断、无效数据、时序异常、条件不满足。断电是OTA最核心的异常场景。实车环境不可能随意断电台架上可以用可控电源或者继电器在刷写过程中人为切断。测试时要在刷写流程不同阶段设置断电点比如在0x34阶段断电、在0x36传输部分数据后断电、在0x37之后断电、在0x11复位前断电。每个断电点都关系到ECU的恢复策略断电后重新上电ECU能不能正常回到App版本能不能重新进入编程会话Bootloader能不能识别之前中断的升级记录。我曾经在测试中遇到一个ECU在0x37之后、应用区擦写完成后断电居然出现了分区标记没有写入的问题这类问题只有靠多断电点测试才能暴露。通信中断测试怎么注入在CAPL里可以通过停止周期性应用报文、关闭诊断通道、切换网络管理状态等方式模拟。比较激进的做法是在发送的CAN帧中直接修改数据长度码把正常的诊断帧变成错误帧看ECU会不会错误处理、会不会卡死。这里注意错误帧注入后ECU的诊断服务可能进入异常所以每次异常注入后都要有恢复流程不能污染下一个测试用例。无效数据测试方面重点要检查ECC校验、CRC校验、分块长度校验。可以人为修改一帧0x36传输的数据比如把最后一个字节改掉或者把块序列号改乱验证ECU端是否能够正确报错。还有一个很值得做的场景是fuzz测试用随机或半随机数据填充0x34/0x36服务的参数观察ECU是否有异常复位、内存错误或看门狗复位现象。异常场景用例里“恢复性验证”往往比“异常本身”更重要。也就是说中断之后能不能恢复恢复后系统是否还能正常工作。所以每一个异常测试用例的末尾我都会设计恢复操作与验证步骤重启总线、重新进入编程会话、重发刷写请求确认升级任务可以重新开始。3.4 安全访问与诊断控制服务测试安全访问测试容易被低估但在OTA链路里它是刷写能否顺利进行的前提。UDS的0x27服务涉及Seed和Key被测ECU要做到“没有解锁就拒绝刷写”和“密钥错误立即失败”。测试用例要覆盖正确的密钥能通过错误的密钥次数过多后ECU触发延时锁定锁定期间任何解锁尝试都会被拒绝等待锁定时间结束后又能正常解锁。CAPL脚本里要调用安全访问怎么动态计算Key是个问题。很多厂商的Security Access算法是保密的工具链层面的解决办法是提供一个AU或者DLL库给测试方调用。比如把算法编译成DLL再在CAPL里用extern函数方式去调用。如果没有现成的DLL可以让开发同事提供一个Seed和Key对照表测试脚本查表实现。我建议安全访问这个步骤一定要做成可插拔的模块因为项目不同算法就不同改动时尽量不动主流程代码。诊断控制服务里0x28通信控制和0x85DTC设置控制是OTA测试高频用到的。刷写过程中ECU的某些应用报文可能干扰诊断响应所以很多ECU会在刷写前被要求进入“静默模式”即停止发送通信报文。测试用例需要验证ECU在收0x28 03 02指令后的行为确认通信报文确实停止了刷写完成后0x28 00能把报文恢复。DTC设置控制0x85则是刷写过程中要抑制故障码记录防止把临时故障误存为非易失故障。一个常见的测试遗漏是刷写完成后没有恢复DTC功能导致ECU一直处于不记录DTC的异常状态。4. 用CAPL和vTESTstudio把OTA测试跑起来4.1 搭一个自动化刷写脚本的基本框架环境搭好、用例设计完接下来要解决的就是“让脚本替我干活”。CAPL是CANoe的原生脚本语言也是做OTA自动化最直接的入口。最基本的刷写脚本框架可以拆成几个函数连接配置函数、前置条件模拟函数、进入会话并在安全解锁辅助函数、固件下载函数、校验激活函数、结果上报函数。在实际工程里不太建议把完整刷写流程写成一个巨大的主函数维护成本极高。更好的做法是把每个诊断步骤封装成独立函数比如SetSession()、SecurityUnlock()、RequestDownload()、TransferBlock()、ExitTransfer()、ExecuteRoutine()、ReadVersion()然后在主函数里顺序调用。以RequestDownload为例CAPL代码用诊断服务接口调用起来很简洁核心逻辑是通过cdd文件里定义的Diagnostic Service对象发出请求并检查响应码。这样的封装底层报文如何组包、响应的服务ID和参数结构如何解析都由CANoe的诊断层处理脚本保持业务可读性。TransferBlock是刷写过程中的高频步骤这个函数里面用循环完成分块发送。其中一个关键参数是当前块序号每次发送后序号加1。需要注意块序号是从1开始周期循环的不能直接从0开始。实测中有不少ECU对块序号首包是否为1很敏感如果首包发0或者循环时从非1的序号重新开始ECU会直接拒绝。刷写时数据分包的大小决定了一次刷写的总交互次数也直接影响整车刷写耗时。以2048字节一块为例如果固件包是100MB那需要约51200次0x36请求——这个交互量对总线稳定性和脚本稳定性都是考验。脚本里要特别处理超时与重试单块0x36发送后等待ECU肯定响应的超时时间不能设置太短我一般设500毫秒左右如果连续多个块发送超时脚本主动中断记录失败位置而不是傻傻地重试整个固件包。4.2 检查点断言与测试报告自动化测试的价值在于可信的“通过/失败”判定。OTA测试里判定标准不能只看最终结果“升级成功”过程节点都要有检查点。我通常在每个关键服务响应后立刻做一次断言判断0x10会话切换后检查响应中的子功能值是否为0x02或0x030x27解锁后检查响应码是否为0x67 0x020x34请求下载后检查响应中返回的maxNumberOfBlockLength是不是期望值0x36的每一块响应后检查响应码是否为0x76。任何一个断言失败立即定位到失败步骤与上下文。在CANoe的原生方案里检查点可以用TestWaitForDiagnosticResponse配合检查响应数据的函数实现。如果配合vTESTstudio检查点的概念更加直观测试用例每一步都对应一个检查点图标双击就能配置判定条件比如校验响应参数等于某值、单个响应时间是否满足阈值。报告生成也交给vTESTstudio统一处理最终输出HTML或PDF报告非常方便归档和回查。有一点需要提醒断言不要只看“有没有收到响应”还要校验响应码和响应参数。我就遇到过不少ECU虽然响应了但返回的是NRC 0x31请求超出范围/请求序列错误如果你只判断“有响应”就视为通过那这种错误会一直隐藏下去。4.3 从手动到自动化vTESTstudio的工程组织vTESTstudio是Vector提供的测试用例编辑环境它和CANoe的结合方式更贴近工程化的测试流程。简单来说vTESTstudio负责“写测试用例和逻辑”CANoe负责“执行和与总线交互”。用vTESTstudio做OTA自动化建议这样组织工程结构建一个Test Unit叫“OTA_TestSuite”下面按刷写阶段或者异常类型建多个Test Case文件。每个TestCase里可以通过Test Table图形化配置也可以通过CAPL或C#脚本实现。我习惯用Test Table来表示用例流程流程清晰评审时也容易读。但遇到异常注入有复杂计算逻辑时就直接写CAPL函数。vTESTstudio和CANoe之间的数据通路核心是报告库和诊断服务调用。vTESTstudio工程被编译后嵌入到CANoe测试模块中运行时逐条执行测试用例并把结果写回报告系统。此外vTESTstudio支持参数化数据和数据源绑定这个特性在做OTA多版本测试时特别有用。你可以把固件版本、期望版本、刷写超时时间这些参数放在CSV或Excel表格里工程启动时自动读取跑一遍就能完成多个版本的矩阵测试再配合CI系统自动触发效果更明显。4.4 关键参数的计算与选择OTA测试执行过程中有很多参数需要计算这里集中说几个高频的。刷写下载的块长度是传输效率的核心参数。0x34请求里的addressAndLengthFormatIdentifier高四位表示地址长度减1低四位表示存储长度减1。比如0x10表示地址长度1字节、存储长度1字节0x24表示地址长度3字节、存储长度5字节——虽然规范如此但实际响应中要遵照ECU的实现来解析。块长度大小maxNumberOfBlockLength由ECU在0x34的肯定响应里返回单位是字节通常是4的倍数。选择分包大小时要综合考虑ECU接收缓冲区大小、CAN FD vs CAN的带宽约束和总线上其它报文占用情况。在CAN上我一般选256或512字节在CANFD或以太网上可以选1024或2048字节。不要盲目追求大块因为单块出错后重传的代价也更高。刷写总耗时的估算也很有意义可以在测试报告中自动计算并做上下阈值判定。估算公式很简单总字节数除以块长度乘上每块交互的时间。每块交互时间可以通过实测得出一般为两个诊断响应周期加上CAPL脚本处理开销。实测下来CAN上2048字节的场景单块交互时间大约在30到60毫秒之间一次100MB的升级大约需要25~50分钟。这样算下来前端测试如果设计200个用例执行时间成本就要提前规划好。还有一个参数容易被忽略DTC抑制期间的超时。0x85设为抑制DTC记录后如果刷写过程异常卡住ECU会一直不记录故障这对最终功能安全分析是有影响的。测试参数里要设置一个合理的刷写总超时比如20或30分钟超时后自动执行恢复动作把DTC设置恢复、退出编程会话防止ECU处于“带病运行”的状态被带到下一轮测试。5. OTA测试上线后遇到的坑5.1 刷写超时的常见原因我在实际项目里见过太多刷写超时的报错这里把典型原因罗列一下。第一个是物理层质量。CAN上没有接终端电阻、线束过长、使用了劣质转接头都会让总线信号不稳定。排查方法是看CANoe里error frame计数是否正常如果错误帧率高先把物理层捋顺。以太网DoIP刷写超时也一样先抓包看TCP握手是否成功TLS握手是否超时。第二个是服务时序太紧。很多ECU的擦写操作耗时较长表现是0x36或0x31请求发出后ECU迟迟不给响应。这属于ECU端处理慢不是链路问题。测试脚本里如果超时时间设得比ECU内部擦写时间长就会误报超时。解决办法是先通过实测或咨询开发确认各阶段的最长响应时间再在脚本里设置合理的超时窗口。第三个是程序逻辑错误比如0x36块序号不一致、0x34下载器被上一个会话残留状态阻塞、安全访问超时导致后续服务被拒绝。这类问题通过看ECU返回的NRC就能识别比如0x24禁止请求、0x31请求错误、0x33安全访问拒绝。5.2 程序校验失败的排查路径程序校验失败是OTA测试里最头疼的问题之一。常见的原因有三个方向。第一传输完整性被破坏。可能是CAN错误帧导致部分数据块丢失也可能是以太网丢包还有可能是脚本逻辑错误导致某块数据重复或错位。先抓总线日志看看失败块附近有没有错误帧、超时、重传记录。第二ECU端地址管理或存储范围不对。0x34请求下载时如果给的地址与分区映射不符ECU虽然接受请求但写入后校验必然失败。排查方法很直接用诊断仪读取ECU支持的分区地址表与测试脚本参数对比。第三固件包本身有问题。OTA升级包在版本构建时如果没生成正确的元数据或校验值刷写后ECU也校验不通过。这种问题在集成阶段很常见。应对办法是测试环境里单独做一个“已知正常”的固件包基准每次打包系统变更后先跑一遍基准用例排除测试环境问题。5.3 网络管理与诊断服务的冲突很多台架OTA测试失败的根源是网络管理与诊断服务“打架”了。ECU处于网络管理模式时诊断服务才能正常响应一旦总线上NM静默ECU可能进入休眠或者低功耗模式诊断请求就没响应了。模拟TBOX或网关的CAPL节点必须周期性发送NM报文来维持网络的唤醒状态。很多同事刚开始做台架测试时没有认真配置NM报文导致刷写中途ECU就“睡着”了。一旦发现刷写过程中诊断无响应要先在Trace窗口里确认NM报文是否持续在发。另外一个冲突点网络管理报文的周期和诊断响应时序可能相互干扰特别是当总线负载过高时。我的建议是OTA测试的总线负载率控制在一定范围内比如CAN通道控制在50%以下至少保证刷写阶段不会因为总线拥塞导致超时。如果发现负载偏高可以把无关的周期应用报文暂时停掉或者把NM报文周期适当放宽。5.4 日志分析技巧OTA测试的排障很多时候拼的是日志分析的效率。我的习惯是每次跑完用例后固定导出三类日志总线日志CANoe的BLF日志、诊断日志Diagnostics模块的会话日志和vTESTstudio的测试报告。定位问题的时候先看测试报告确定是哪个用例的哪一步失败然后打开诊断日志找到失败步骤对应的请求和响应最后回到总线日志看物理层和网络管理状态。这个顺序能帮你快速判断问题到底出在应用层诊断逻辑、传输层ISO TP/DoIP还是物理层。诊断日志里有个小技巧关注响应时间戳。正常刷写时ECU对0x36的响应时间通常稳定如果某一块响应时间突然大幅增大极有可能是ECU内部正在做垃圾回收或剩余空间整理也可能是总线负载瞬时升高。时间戳的异常往往是隐性故障的预警信号比单纯看NRC码更有价值。另外我习惯在CAPL脚本里加自己的日志输出比如每完成10%的传输打印一条进度日志。万一脚本中途神秘失败进度日志能准确告诉你断在了哪个块。这个习惯帮我解决过不少“复现不出来”的疑难杂症强烈建议你也在自己的工程里加上。写在最后把整套OTA测试链路在Vector工具链上跑通之后我个人的最大体会是OTA测试本质上是一场设计有节奏的破坏。如果把所有用例都堆在发数据、看响应这个层面你会一直被ECU的怪异行为追着跑但如果你真的把刷写阶段、校验阶段、异常注入、恢复验证编排好了再配合CAPL和vTESTstudio把它自动化起来这套东西就能在版本迭代里持续发挥作用越用越稳。最后再分享一个小技巧遇到难以定位的OTA问题时顺手把0x34之前和之后的诊断通信数据都导出成文本对比很多时候问题藏在前后两段请求的差异里。OTA测试是个细致活环境规范、用例严谨、日志完整做到这三点就不会太慌。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价