文章目录
- 前言
- 一、理论描述
- 二、使用步骤
- 1.请求
- 2.响应
- 总结
->返回总目录<-
前言
简称: “InputOutputControlByIdentifier”,根据标识符控制输入输出
功能: 根据标识符控制输入输出服务用于替换输入信号的值、电控单元内部参数或控制电子系统的输出值。
一、理论描述
通俗解释: 在诊断模式下,通过请求2F服务直接控制开关发出指定的信号。例如:我想要让左转向灯亮,那么就可以通过该服务跳过硬件电路的检测直接软件里操作并替换想要控制的左转向信号输出。
注:诊断服务中一般简单开关类控制都会采用2F服务(转向灯,雨刮之类等);还有一些较为复杂的功能会通过0x31服务来实现(例如控制发动机转速,归零标定方向盘角度等)。
疑问: 这样直接控制要发出的开关信号而已,这样实际运用有啥意义呢?既无法检测硬件,也无法检测软件。
解答: 用在台架HIL测试,实现自动测试,为了测试与开关相关的其他控制器功能。如2f请求左转向,测试接收转向灯信号的节点BCM有没输出点亮左转向等。
在这里博主偷个懒哈,只说Sub-Function为00 和 03(因为开发的项目中只用到这两个子ID)~~
03: 在诊断模式中,请求该子ID的服务,会短暂控制输出,如上述:控制左转向灯信号发出。
注: 是暂时,若要请求一次该服务让左转向信号一直发出,就必须先请求诊断服务0x3E,让诊断一直处于通信握手状态
00: 释放刚才对转向灯的控制权,让其正常检测硬件来发出实际的信号。
二、使用步骤
1.请求
输入输出参数数据标识符分为位映射或非位映射两类。根据位映射和非位映射标识符,该服务的请求报文格式不同。
位映射标识符 使用位为单位表示一个输入或输出参数。
例如: 整车厂指定一个DID为 0x6E88 来控制灯光类的信号,该DID控制参数占2Byte,bit7用于控制远光灯OFF/ON,那么请求远光灯ON的
报文格式:2F 6E 88 03 80 00
Service ID:2F
DataIdentifier:6E 88
IO Control Parameter:03
ControlEnableMaskRecord:80 00
黄框:远光灯信号ON
红框:请求的报文,6E 80当作 6E 88
2,释放控制权,2F 6E 88 00,此时输出的远光灯信号是硬件检测采样的实际信号。
非位映射标识符使用字节为单位来表示一个输入或输出参数。这里就不演示了。
例如:整车厂指定一个DID为 0x6E88 来控制远光灯的信号,该DID控制参数占1Byte,请求格式 2F 6E 88 01/00 , 01 表示ON 00表示OFF
2.响应
1)正响应
Response ID:6F (2F + 0x40,统一规范,回复SID要比请求SID加0x40)
DataIdentifier:6E 88
IO Control Parameter:03
ControlState:80 00 (控制掩码数据)
参见CANoe图中的蓝框
2)否定响应
支持的否定响应如下,一般工作上根据整车厂给的诊断输入文档来选择要支持的NRC码。
博主平日项目中,上图的NRC都需要支持。
NRC13: 请求报文数据长度有误(正确请求数据2F 6E 88 03 80 00 有6个字节。而你请求的是2F 6E 88 03 00只有5个字节,ECU收到你这条报文,无法理解,因此回复该NRC)
NRC22: 请求条件不满足
(一般整车厂会告诉你NRC22的满足条件,例如:车速>3km/h,电源过欠压时候,请求服务,ECU便回复该NRC)
NRC31: 请求超出范围(不按套路出牌,发送 2F 66 66 03 80 00,DataIdentifier有66 66?)
NRC33: 安全访问拒绝(在请求2F服务之前,必须先解锁,否则ECU回复NRC33)
总结
0x2F服务还是比较容易理解的,下一章0x31 例行控制服务见!
->返回总目录<-