【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 相关函数
以下是你提供的 diagSetSuppressResp
和 diagGetSuppressResp
函数的详细解析,以富文本格式呈现:
Function Description
diagGetSuppressResp 和 diagSetSuppressResp 函数用于在 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 版本以来支持 动态方法。
- diagGetSuppressResp 在 9.0 版本中可用。
Example
没有具体的例子提供,但可以参考以下示例来使用 diagSetSuppressResp
和 diagGetSuppressResp
。
// 发送带抑制正响应的诊断请求
diagRequest req;
diagSetSuppressResp(req, 1); // 设置抑制正响应位// 查询该请求的抑制正响应位是否已设置
if (diagGetSuppressResp(req) == 1) {write("抑制正响应位已设置");
} else {write("未设置抑制正响应位");
}
Note
调用 diagSetSuppressResp
函数后,诊断对象的大小会被重置为诊断描述中定义的大小。因此,如果需要,应该在调用 diagSetSuppressResp
后调用 diagResize
函数来调整对象的大小。