当前位置: 首页 > news >正文

【CANOE】【学习】【诊断功能】正响应抑制

在这里插入图片描述


文章目录

  • 一、正响应抑制是什么?
  • 二.什么背景下产生
  • 三.作用
  • 四.如何实现
  • 五.capl代码如何实现
  • 总结
  • diagGetSuppressRes 相关函数
      • **Function Description**
      • **Syntax**
      • **Method (Dynamic)**
      • **Functionality**
      • **Parameters**
      • **Return Values**
      • **Availability**
      • **Example**
      • **Note**

一、正响应抑制是什么?

正响应抑制功能(Suppress Positive Response)是汽车诊断通信(如 UDS,统一诊断服务)中的一种机制,用于抑制或阻止 ECU(电子控制单元)在收到诊断请求后发送正响应的功能。

二.什么背景下产生

在正常情况下,ECU 接收到诊断请求后,会返回两种可能的响应:

正响应:表示请求已成功处理。
负响应:表示请求未能成功处理,通常伴随有错误码。
比如发送 10 01 接收到 50 01 是正响应

然而,在某些场景下,正响应抑制功能允许发送方要求 ECU 不返回正响应消息,而是保持静默,只在遇到问题时返回负响应(比如符合NRC,就回响应的NRC CODE)。这种机制通过设置 UDS 请求中的一个标志位来实现,称为 Suppress Positive Response Indication Bit。

三.作用

  • 1提高通信效率:在批量发送请求时,不需要每个请求都返回正响应,从而减少通信开销
  • 2节省带宽:对于一些无关紧要的操作,可以选择不让 ECU 返回确认,减少网络负载
  • 3减少不必要的信息:某些诊断操作无需得到每次的确认,可以通过抑制正响应来简化处理

四.如何实现

  • 1 在 UDS 服务请求中,有一个位称为 Suppress Positive Response Bit,如果设置了该位,ECU 会抑制正响应消息的发送
  • 2 如果请求成功且该位被设置,ECU 将不发送正响应消息
  • 3 如果请求失败,即使设置了该位,ECU 仍会返回负响应,告知诊断工具操作失败的原因。

五.capl代码如何实现

diagRequest myRequest; // 创建一个诊断请求对象
myRequest.SetSuppressResp(1); // 设置抑制正响应 通过这个就会发送出现了

举例:

UDS 协议中的正响应抑制功能通过在请求消息的 子功能字节 上设置最高位(bit 7)来实现。这个位被称为 Suppress Positive Response Bit,当它被设置为 1 时,表示请求 ECU 抑制正响应。

0x01 是只功能,把他的最高位的自己bit 7 置为1 ,就标识 ECU 抑制正响应。bit7   bit0
0x01 = 0000 0001
0x81=  1000 0001

在做正响应抑制的时候,需要参考 诊断调差表

  • 1.如果是不支持正响应抑制的,发送会报NRC的错误
  • 2.各个厂商可能不一样。

总结

这边写一个脚本实现对应正响应抑制支持的脚本capl:


//测试10 01 的正响应抑制
testcase testSpres1(){diagRequest ECU.DefaultSession_Start SendRequest;//定义一个报文 10 01diagResponse * Response;//定义一个诊断接收long ReturnNRC=0x00; //nrc 返回结果testCaseTitle("Case","10 01正响应抑制功能测试");//testCaseDescription("发送10 81的正响应 然后不应该接收到任何响应");//DisplayStepComment("发送10 81的正响应 然后不应该接收到任何响应",0);SendRequest.SetSuppressResp(1); // 设置抑制正响应 发出来是10 83testReportWriteDiagObject(SendRequest);//将发送的内容打印出来,方便后续分析ret=SendRequest.SendRequest();//发送响应//获取是否有正响应抑制// 检查是否成功设置了抑制正响应位if (diagGetSuppressResp(SendRequest) == 1) {write("抑制正响应位已成功设置");} else {write("未设置抑制正响应位");}p2Timeout=diagGetP2Timeout(2);p2Timeout_extend=diagGetP2Extended(2);//获取系统定义的参数值testWaitForTimeout(50);//延时50ms再发送请求,以免频繁发送造成问题ret=SendRequest.SendRequest();//发送报文ret=testWaitForDiagRequestSent(SendRequest,500);//最多等500毫秒,诊断发送if(0==ret){testStepFail("Result","诊断发送超时");}else{ret=testWaitForDiagResponse(SendRequest,DiagResponseTimeout);//等待超时时间
//      DisplayStepComment("诊断请求已经发出,并开始等待相应的响应,如有,并检测响应的类型",0);if(ret){Response.GetLastResponse();//获取响应诊断数据testReportWriteDiagObject(Response);ReturnNRC=Response.GetResponseCode();if(Response.IsPositiveResponse())//如果为正响应即失败{testStepFail("Result","正响应抑制,但收到对应的正响应回应与预期不符");}else//如果收到负响应 是符合预期的,但需人工介入检查反回是否符合要求{testStepPass("Result","正响应抑制,但收到对应的正响应回应与预期相符");}   }else//超时没有收到响应,即为正常情况{testStepPass("Result","正响应抑制,超时未收到响应,符合预期");}}}

diagGetSuppressRes 相关函数

以下是你提供的 diagSetSuppressRespdiagGetSuppressResp 函数的详细解析,以富文本格式呈现:


Function Description

diagGetSuppressRespdiagSetSuppressResp 函数用于在 UDS(统一诊断服务)协议中操作 suppressPosRspMsgIndicationBit(抑制正响应消息指示位)。在某些诊断请求中,可以设置该位来抑制 ECU 的正响应。如果设置了该位,接收方不会发送正响应。通过这些函数,可以查询或设置该位。


Syntax

long diagGetSuppressResp (diagRequest req);long diagSetSuppressResp (diagRequest req, long flag);

Method (Dynamic)

diagRequest::GetSuppressResp ();diagRequest::SetSuppressResp (long flag);

Functionality

  • diagGetSuppressResp:查询指定的诊断请求 req 中的抑制正响应位是否已设置。
  • diagSetSuppressResp:设置或清除指定诊断请求 req 中的抑制正响应位。

Parameters

  • req:诊断请求对象。
  • flag
    • 0:清除抑制正响应位。
    • 非 0 值:设置抑制正响应位。

Return Values

  • diagGetSuppressResp

    • 1:表示抑制正响应位已设置。
    • 0:表示该位未使用或未设置。
  • diagSetSuppressResp

    • 返回值为 1 表示成功设置,返回值为 0 表示该请求不使用该位或未成功设置。

Availability

  • 5.1 版本以来,在 测量设置仿真/测试设置 中可用,且在 在线模式 下使用。
  • 7.0 SP5 版本以来支持 动态方法
  • diagGetSuppressResp9.0 版本中可用。

Example

没有具体的例子提供,但可以参考以下示例来使用 diagSetSuppressRespdiagGetSuppressResp

// 发送带抑制正响应的诊断请求
diagRequest req;
diagSetSuppressResp(req, 1);  // 设置抑制正响应位// 查询该请求的抑制正响应位是否已设置
if (diagGetSuppressResp(req) == 1) {write("抑制正响应位已设置");
} else {write("未设置抑制正响应位");
}

Note

调用 diagSetSuppressResp 函数后,诊断对象的大小会被重置为诊断描述中定义的大小。因此,如果需要,应该在调用 diagSetSuppressResp 后调用 diagResize 函数来调整对象的大小。



http://www.mrgr.cn/news/67797.html

相关文章:

  • 前端 Canvas 绘画 总结
  • 【系统架构设计师(第2版)】七、系统架构设计基础知识
  • 数据结构模拟题[九]
  • 2024.11.6:艾灸
  • C6.【C++ Cont】cout的格式输出
  • C语言 | Leetcode C语言题解之第538题把二叉搜索树转换为累加树
  • Excel 无法打开文件
  • 【推荐】python、django、drf学习博客网址推荐
  • I.MX6U 裸机开发3. GPIO操作控制LED灯
  • 什么是进销存与供应链管理?进销存与供应链有什么区别?
  • [JAVAEE] 网络基础
  • 文件系统和日志管理
  • C++之SET容器
  • 大规模地图构建的细粒度高分辨率卫星数据集OpenSatMap(3787张高分辨率卫星图像)0.15-0.3m
  • 线上3D展厅能实现哪些交互效果?
  • vue2 pdf 链接地址打开
  • 数据结构——双链表
  • 双11疯狂凑单:累坏买家,坑惨卖家
  • 基于TRIZ的教育机器人功能创新
  • 动漫风格大模型和lora推荐
  • 基于 ESP AT 固件使用 BLE 静态配对码完成安全连接和通信
  • 《清宫辞Ⅱ》开机:陈欣予旗装惊艳回归 重新演绎宫闱传奇
  • 树状数组浅谈
  • 论文阅读:基于语义分割的非结构化田间道路场景识别
  • 100种算法【Python版】第55篇——Delaunay三角剖分之Bowyer-Watson算法
  • SSH实验3拒绝root用户远程登录