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

embedded/2024/11/9 0:56:18/

在这里插入图片描述


文章目录

  • 一、正响应抑制是什么?
  • 二.什么背景下产生
  • 三.作用
  • 四.如何实现
  • 五.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.ppmy.cn/embedded/136035.html

相关文章

物理验证Calibre LVS | SMIC Process过LVS时VNW和VPW要如何做处理?

SMIC家工艺的数字后端实现PR chipfinish写出来的带PG netlist如下图所示。我们可以看到标准单元没有VNW和VPW pin的逻辑连接关系。 前几天小编在社区星球上分享了T12nm ananke_core CPU低功耗设计项目的Calibre LVS案例,就是关于标准单元VPP和VBB的连接问题。 目前…

云轴科技ZStack助力新远科技开启化工行业智能制造新篇章

新远科技基于云轴科技ZStack Cube超融合和ZStack Zaku容器云平台打造了灵活高效的IT基础设施,实现了IaaS和PaaS层的全面覆盖,优化了资源利用率,降低了硬件成本和运维复杂性,同时强化了数据安全和业务连续性。 化工行业的数字化先…

jmeter基础02_下载安装jmeter

(安装包windows、mac、Linux通用) Step1. 官网下载 官网地址:https://jmeter.apache.org/download_jmeter.cgi 官网可见最新版本的jmeter和要求的jdk版本,先说结论:建议下载Binaries-zip格式包即可。 安装包有2大类&am…

Proteus中单片机IO口外接LED输出低电平时,引脚却一直保持高电平的问题(已解决)

文章目录 前言解决方法后记 前言 一个排阻接八个 LED,方便又省事,但出现了P1端口输出低电平后,仿真引脚却一直显示红色保持高电平不变,用电压表测量显示 2V 左右。 这是仿真的问题,在用开发板时是不会遇到的&#xff…

在暗处执着生长,终有一日馥郁传香

总有人说很孤独,一个人吃饭,一个人上班,一个人逛街; 总有人又说享受孤独,面对时间,迎接苦难,战胜痛苦; 可没人说这些的大前提是你要有信念支撑啊,如果干完了上面的所有&a…

Prompt 工程

Prompt 工程 1. Prompt 工程简介 “预训练-提示预测”范式是近年来自然语言处理(NLP)领域的一个重要趋势,它与传统的“预训练-微调-预测”范式相比,提供了一种更为灵活和高效的模型应用方式。 Prompt工程是指在预训练的大型语言…

站长用站群安全特性怎么样

1. 高配置资源:站群服务器在CPU、内存、带宽等资源上通常会有较高的配置,这不仅确保了每个网站都能流畅运行,同时也为安全防护提供了硬件基础。 2. 易于管理:站群服务器提供集中式的控制面板或管理工具,使得网站管理员…

Unreal5从入门到精通之如何在指定的显示器上运行UE程序

前言 我们有一个设备,是一个带双显示器的机柜,主显示器是一个小竖屏,可以触屏操作,大显示器是一个普通的横屏显示器。我们用这个机柜的原因就是可以摆脱鼠标和键盘,直接使用触屏操作,又可以在大屏观看,非常适合用于教学。 然后我们为这款机柜做了很多个VR项目,包括Uni…