You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CANoe与CAPL诊断应用问题:无法触发on diagResponse函数

诊断响应捕获失败的CAPL问题排查与解决

我尝试通过CAPL发送模拟诊断响应,随后捕获该响应并进行后续处理。已在Trace窗口中确认响应发送成功,但on diagResponse事件始终未触发。以下是相关代码:

模拟诊断响应发送代码

on key 'z'
{
  byte rawData[5] = {0x62, 0xFE, 0x58, 0x01, 0x01};
  diagResponse TestECU.* resp;       
  diagResize(resp, elCount(rawData));
  diagSetPrimitiveData(resp, rawData, elCount(rawData));      
  diagSendResponse(resp); 

  write("response sent: %x, %x, %x, %x, %x", rawData[0], rawData[1],rawData[2],rawData[3],rawData[4]);
}

诊断响应捕获代码

on diagResponse TestECU.*
{
  byte data[4096];
  long size;
  diagResponse * resp; // declare response with no concrete interpretation
  size=this.GetPrimitiveSize(); // get length of response
  this.GetPrimitiveData(data, elcount(data)); // copy actual response from "on diagResponse *" into data array
  write("response from on diagResponse is %x, %x, %x, %x, %x", data[0], data[1], data[2], data[3], data[4], data[5]);
}

已尝试的操作:

  • 将两段代码分至不同网络节点
  • 使用不带ECU限定符的on diagResponse *捕获所有诊断响应

当前环境:使用GenericUDS.cdd文件实现基础诊断功能,所有网络节点位于同一CAN通道,未使用Test节点及相关功能,仅使用常规网络节点与基础CAPL。


解决方案

  1. 显式指定响应目标节点
    diagSendResponse默认可能不会将响应路由到本地诊断事件栈,需在发送前指定目标请求节点:
    修改发送代码,添加resp.SetTarget("请求节点名称");(替换为实际请求节点的名称),确保响应被定向到正确节点的诊断处理逻辑:

    on key 'z'
    {
      byte rawData[5] = {0x62, 0xFE, 0x58, 0x01, 0x01};
      diagResponse TestECU.* resp;       
      diagResize(resp, elCount(rawData));
      diagSetPrimitiveData(resp, rawData, elCount(rawData));
      resp.SetTarget("RequestNode"); // 替换为实际请求节点名称
      diagSendResponse(resp); 
    
      write("response sent: %x, %x, %x, %x, %x", rawData[0], rawData[1],rawData[2],rawData[3],rawData[4]);
    }
    
  2. 检查节点诊断配置

    • 打开Diagnostic Console,确认目标节点已正确关联GenericUDS.cdd文件,且诊断协议状态为激活
    • 检查节点的CAN接口配置,确保与发送节点在同一通道,且诊断报文ID(物理/功能寻址)被正确映射到诊断栈
  3. 调整捕获事件的范围
    使用全局诊断响应捕获事件,确保不会因ECU限定符不匹配导致漏触发:

    on diagResponse *
    {
      byte data[4096];
      long size = this.GetPrimitiveSize();
      this.GetPrimitiveData(data, elcount(data));
      write("捕获到诊断响应: %x, %x, %x, %x, %x", data[0], data[1], data[2], data[3], data[4]);
    }
    

    同时确认这段代码所在的节点能接收到该CAN报文(可通过Trace窗口检查节点是否收到对应报文)。

  4. 验证响应格式合规性
    模拟响应需符合UDS规范:

    • 确认响应ID是对应请求ID的正确值(物理寻址下通常为请求ID + 0x8)
    • 检查服务ID、数据长度是否符合规范,避免因格式错误被诊断栈自动丢弃

内容的提问来源于stack exchange,提问作者VhD

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 13:25:02