UDS 诊断服务系列文章目录
诊断和通信管理功能单元
UDS 诊断 - DiagnosticSessionControl(诊断会话控制)(0x10)服务
UDS 诊断 - ECUReset(ECU重置)(0x11)服务
UDS 诊断 - SecurityAccess(安全访问)(0x27)服务
UDS 诊断 - CommunicationControl(通信控制)(0x28)服务
UDS 诊断 - TesterPresent(测试仪保活)(0x3E)服务
UDS 诊断 - AccessTimingParameter(访问计时参数)(0x83)服务
UDS 诊断 - SecuredDataTransmission(受保护的数据传输)(0x84)服务
UDS 诊断 - ControlDTCSetting(控制DTC设置)(0x85)服务
UDS 诊断 - ResponseOnEvent(基于事件响应)(0x86)服务
UDS 诊断 - LinkControl(链路控制)(0x87)服务
数据传输功能单元
UDS 诊断 - ReadDataByIdentifier(按标识符读取数据)(0x22)服务
UDS 诊断 - ReadMemoryByAddress(按地址读取内存)(0x23)服务
UDS 诊断 - ReadScalingDataByIdentifier(按标识符读取换算数据)(0x24)服务
UDS 诊断 - ReadDataByPeriodicIdentifier(按周期性标识符读取数据)(0x2A)服务
UDS 诊断 - DynamicallyDefineDataIdentifier(动态定义数据标识符)(0x2C)服务
UDS 诊断 - WriteDataByIdentifier(按标识符写数据)(0x2E)服务
UDS 诊断 - WriteMemoryByAddress(按地址写内存)(0x3D)服务
存储数据传输功能单元
UDS 诊断 - ClearDiagnosticInformation(清除诊断信息)(0x14)服务
UDS 诊断 - ReadDTCInformation(读取 DTC 信息)(0x19)服务(1) - 服务说明
UDS 诊断 - ReadDTCInformation(读取 DTC 信息)(0x19)服务(2) - 请求消息
UDS 诊断 - ReadDTCInformation(读取 DTC 信息)(0x19)服务(3) - 响应消息
UDS 诊断 - ReadDTCInformation(读取 DTC 信息)(0x19)服务(4) - 示例
输入输出控制功能单元
UDS 诊断 - InputOutputControlByIdentifier(按标识符的输入输出控制)(0x2F)服务
本文章可能会涉及到的文章
UDS诊断 - 数据标识符代码 DID 参数的定义
文章目录
- UDS 诊断服务系列文章目录
- 一、服务说明
- 二、请求消息
- 1. 请求消息定义
- 2. 请求消息数据参数定义
- 三、肯定响应消息
- 1. 肯定响应消息定义
- 2. 肯定响应消息数据参数定义
- 四、inputOutputControlParameter(输入输出控制参数)定义
- 五、支持的NRC
- 六、示例
- 1. 假设
- 2. 示例 1 - “进气门位置” shortTermAdjustment(短期调整)
- 3. 示例 2 - EGR 和 IAC shortTermAdjustment(短期调整)
- 1)假定
- 2)案例 1:仅控制 IAC 枢纽位置
- 3)案例 2:仅控制 RPM
- 4)案例 3:控制踏板位置 A 和 EGR 工作周期
- 5)案例 4:将参数的控制权返还给 ECU
一、服务说明
客户端使用 InputOutputControlByIdentifier(按标识符的输入输出控制)服务代替输入信号值,以及电子系统输出(执行机构)的内部服务器功能和/或力控制值。总之,该服务用于相对简单的(如静态)输入替换/输出控制,但若必须使用较为复杂的输入替换/输出控制时,则使用 routineControl(例程控制)。
客户端请求消息包括服务器引用输入信号、内部服务器功能和/或输出信号(执行机构)的 dataIdentifier(访问设备控制时可能引用一组信号)。controlOptionRecord(控制选项记录)参数须包括服务器输入信号、内部功能和/或输出信号的所有信息。若控制的 dataIdentifier 引用了多个参数(即打包或位映射数据标识符),则车辆制造商可要求请求消息中包含 controlEnableMask(控制启用掩码)。若车辆制造商选择支持 EnableMask(启用掩码)概念,则该服务的所有类型 InputOutputControlByIdentifier(按标识符的输入输出控制)请求必须有 controlEnableMask(控制启用掩码)参数。若对引用输出测量值或反馈值的 dataIdentifier 请求 InputOutputControlByIdentifier(按标识符的输入输出控制),则服务器须负责在服务器控制策略内替换正确的目标值,以使从客户端请求消息的正常服务器控制策略能够尝试达到所需状态。
若请求控制成功启动或已达到所需状态,则服务器须发送肯定响应消息。即使 dataldentifier 当前不受测试仪的控制,服务器也须向 returnControIToECU(将控制权返还给 ECU)的 inputOutputControlParameter(输入输出控制参数)的请求消息发送肯定响应消息。此外,服务器在接收到 retumControIToECU(将控制权返还给ECU)请求时,务必将客户端的所有 controlMask(控制掩码)(若支持)位设置为 ‘1’,以便打包或位映射的 dataldentifier会完全返回至 ECU。符合请求消息 controlOptionRecord(控制选项记录)参数的 inputOutputControlParameter(输入输出控制参数)的 controlState(控制状态)字节的格式和长度,须完全匹配正在被请求的 dataldentifier 的 dataRecord 的长度和格式。此种方式须确保用带相同 DID 的 ReadDatabyldentifier(按标识符读取数据)能够获取实际输出或输入状态。
使用 InputOutputContolByldentifier(按标识符的输入输出控制)服务执行输入替换或输出控制时,ECU 在接收到请求时会有两个基本要求。第一个是从所有的上流控制策略上断开 dataldentifier 内参数引用的对应数据对象,否则将更新数据对象值。第二个是替换控制策略所有下流活动所使用的对应数据对象值。例如,直接强制点亮前大灯的测试仪请求会需要防止前大灯开关位置受前大灯输出的影响,并将所需的 “点亮” 状态替换为最终决定前大灯状态所需输出的功能所使用的数据对象。
该服务允许控制单个 dataldentifier 及其单个请求消息的相应参数。这样的话,服务器会响应包括请求消息数据标识符以及控制状态信息在内的单个响应消息。
二、请求消息
1. 请求消息定义
字节 | 参数名称 | 字节值 | Cvt |
---|---|---|---|
#1 | InputOutputControlByIdentifier(按标识符的输入输出控制)请求SID | 0x2F | M |
#2 #3 | dataIdentifier[] = [
byte#2(LSB) ] | 0x00 - 0xFF 0x00 - 0xFF | M M |
#4 .. #4+(m-1) | controlOptionRecord[] = [
controlState#1 .. controlState#m ] | 0x00 - 0xFF 0x00 - 0xFF .. 0x00 - 0xFF | M1 C1 .. C1 |
#4+m .. #4+m+(r-1) | controlEnableMaskRecord[] = [
.. controlMask#r ] | 0x00 - 0xFF .. 0x00 - 0xFF | C2 .. C2 |
C1:是否使用该参数取决于 dataIdentifier 和 inputOutputControlParameter(输入输出控制参数)
C2:若车辆制造商支持 controlEnableMask(控制启用掩码)概念,则 dataIdentifier 由多个参数组成时须包括该参数。
2. 请求消息数据参数定义
定义 |
---|
dataIdentifier(数据标识符) 该参数定义了服务器本地输入信号、内部参数和/或输出信号。 |
controlOptionRecord(控制选项记录) 由一个或多个字节(inputOutputControlParameter 和 controlState#1 至 controlState#m)组成。 |
controlEnableMaskRecord(控制启用掩码记录) 由一个或多个字节(controlMask#1 至 controlMask#r)组成。仅在需控制的 dataIdentifier 由多个参数(即对数据标识符定义了位映射或打包)组成时支持 controlEnableMaskRecord。与 dataIdentifier 内定义的各个参数相对应的 controlEnableMaskRecord 中须有一位。需控制的 dataIdentifier 仅由单个参数组成时,不得支持 controlEnableMaskRecord。 注:dataIdentifier 的各参数可以是任何数目的位。 controlEnableMaskRecord 内各位的数值须确定 dataIdentifier 的对应参数是否请求的影响。controlEnableMaskRecord 的 ‘0’ 位值须表示相应参数不受该请求的影响,‘1’ 位值须表示相应参数受该请求的影响。controlMask#1 最高有效位须与 controlState#1 最高有效位 controlState 首个参数相对应,controlMask#1 的次高有效位须与 controlState 的第二个参数相对应,以此方式继续对所有参数采用所必须的多个 controlMask(控制掩码)字节。 例如,controlMask#2 最低有效位会与 controlState 的第 16 个参数相对应。对于位映射的数据标识符,不支持的位也须在 controlEnableMaskRecord 中有对应的位,以便 controlEnableMaskRecord 各参数的掩码位的位置与 controlState 对应参数的位置能够完全匹配。 |
三、肯定响应消息
1. 肯定响应消息定义
字节 | 参数名称 | 字节值 | Cvt |
---|---|---|---|
#1 | InputOutputControlByIdentifier(按标识符的输入输出控制)响应SID | 0x6F | M |
#2 #3 | dataIdentifier[] = [
byte#2(LSB) ] | 0x00 - 0xFF 0x00 - 0xFF | M M |
#4 #5 .. #5+(m-1) | controlStatusRecord[] = [
controlState#1 .. controlState#m ] | 0x00 - 0xFF 0x00 - 0xFF .. 0x00 - 0xFF | M C1 .. C1 |
C1:是否使用该参数取决于 dataIdentifier 和 inputOutputControlParameter(输入输出控制参数)。
2. 肯定响应消息数据参数定义
定义 |
---|
dataIdentifier(数据标识符) 该参数是请求消息的 dataIdentifier 的回显。 |
controlStatusRecord(控制状态记录) 由多个字节(inputOutputControlParameter 和 controlState#1 至 controlState#m)组成,包括反馈数据等。 |
四、inputOutputControlParameter(输入输出控制参数)定义
字节值 | 说明 |
---|---|
0x00 | returnControlToECU(将控制权返还给 ECU) 该值向服务器表明客户端不再控制 dataIdentifier 引用的输入信号、内部参数和/或输出信号。 请求的 controlState 字节的详细信息:0 字节 肯定响应的 controlState 字节的详细信息:等于 dataIdentifier 的 dataRecord 的大小和格式。 |
0x01 | resetToDefault(重置为默认状态) 该值向服务器表明需要将 dataIdentifier 引用的输入信号、内部参数和/或输出信号重置为默认状态。 请求的 controlState 字节的详细信息:0 字节 肯定响应的 controlState 字节的详细信息:等于 dataIdentifier 的 dataRecord 的大小和格式。 |
0x02 | freezeCurrentState(冻结当前状态) 该值向服务器表明需要冻结 dataIdentifier 引用的输入信号、内部参数和/或输出信号的当前状态。 请求的 controlState 字节的详细信息:0 字节 肯定响应的 controlState 字节的详细信息:等于 dataIdentifier 的 dataRecord 的大小和格式。 |
0x03 | shortTermAdjustment(短期调整) 该值向服务器表明需要将RAM 中 dataIdentifier 引用的输入信号、内部参数和/或受控输出信号调整为 controlOption 参数中的值(例如,将怠速空气控制阀设置为特定步骤编号,将脉冲宽度值设置为特定值/占空比)。 请求的 controlState 字节的详细信息:等于 dataIdentifier 的 dataRecord 的大小和格式 肯定响应的 controlState 字节的详细信息:等于 dataIdentifier 的 dataRecord 的大小和格式。 |
0x04 | 保留 |
Column 1 | Column 2 |
---|---|
centered 文本居中 | right-aligned 文本居右 |
五、支持的NRC
NRC | 说明 |
---|---|
0x13 | 消息长度不正确或格式无效 |
0x22 | 条件不正确 若不符合请求 inputOutputControl 的要求,则返回该 NRC。 |
0x31 | 请求超过限值 下述情况下,应发送此 NRC: - 装置不支持请求的 dataIdentifier 值; - InputOutputControlByIdentifier(按标识符的输入输出控制)所含的数值失效; controlOptionRecord 的一个或多个适用 controlState 数值失效; 装置不支持 controlEnableMaskRecord 的各启用控制的位组合。 |
0x33 | 安全访问被拒绝 若客户端发送带有效、安全的 dataIdentifier 的请求且服务器安全功能当前是激活的,则须返回 NRC。 |
下图为 0x2F 服务 NRC 的处理。
图例
1. 至少 4(SI + DID + IOCP)
2. 若 IOCP = shortTermAdjustment,则 1 字节 SI + 2 字节 DID + 1 字节 IOCP + 第 n 个字节 controlState + 第 n 个字节 controlMask(若适用)
2. 若 IOCP <> shortTermAdjustment,则 1 字节 SI + 2 字节 DID + 1 字节 IOCP + 第 n 个字节 controlMask(若适用)。
六、示例
1. 假设
下述示例说明了如何与 HVAC 控制模块一起使用 inputOutputControlByIdentifier(按标识符的输入输出控制),并假定在单个服务器内执行物理通信。
2. 示例 1 - “进气门位置” shortTermAdjustment(短期调整)
正受控制的参数是与 dataIdentifier(0x9B00)相关的 “进气门位置”。换算:Air Inlet Door Position(进气门位置)[%] = 十进制(十六进制)* 1 [%]
step1:使用 ReadDataByIdentifier(按标识符读取数据)服务读取进气门位置的当前状态
req 22 9B 00
resp 62 9B 00 0A
step2:shortTermAdjustment(短期调整)
req 2F 9B 00 03
3C - controlOptionRecord[controlState#1] = 60%
resp 6F 9B 00 03 3C
注:按上述规定,客户端已发送一条 InputOutputControlByIdentifier(按标识符的输入输出控制)请求消息。服务器已立即发送肯定响应消息,包括数值为 12% 的 controlState 参数 “进气门位置”。进气门需要一定的时间达到 60% 的请求值。
step3:使用 ReadDataByIdentifier(按标识符读取数据)服务读取进气门位置的当前状态
req 22 9B 00
resp 62 9B 00 3C
注:按上述规定,客户端在启用 InputOutputControlByIdentifier(按标识符的输入输出控制)时已发送一条 readDataByIdentifier 请求消息。服务器控制策略需要有限的时间最终达到所需的值。上述示例出现在服务器最终达到所需的目标值时。
step4:returnControlToECU(将控制权返还给 ECU)
req 2F 9B 00 00
resp 6F 9B 00 00 3A
step5:freezeCurrentState(冻结当前状态)
req 2F 9B 00 02
resp 6F 9B 00 02 3A
3. 示例 2 - EGR 和 IAC shortTermAdjustment(短期调整)
1)假定
本示例使用了打包的 dataIdentifier 0x0155 说明单个请求内的各个参数或多个参数。
本节规定了 shortTermAdjustment(短期调整)功能的测试条件和示例 dataIdentifier 0x0155 的相关消息流。
dataIdentifier 支持下表内的五个参数。
DID | 数据字节 | 参数 | 数据记录内容 | |
---|---|---|---|---|
数量 | 大小 | |||
0x0155 | #1(所有位) | #1 | 8 个位 | dataRecord[ data#1 ] = IAC Pintle Position(n = 次数) |
#2 - #3(所有位) | #2 | 16 个位 | dataRecord[ data#2 - #3 ] = RPM(0 = 0 U/min,65 535 = 65 535 U/min | |
#4(第 7 位至 4 位) | #3 | 4 个位 | dataRecord[ data#4(bits 7-4) ] = Pedal Position A:Linear Scaling,0 = 0%,15 = 120% | |
#4(第 3 位至 0 位) | #4 | 4 个位 | dataRecord[ data#4(bits 3-0) ] = Pedal Position B:Linear Scaling,0 = 0%,15 = 120% | |
#5(所有位) | #5 | 8 个位 | dataRecord[ data#5 ] = EGR Duty Cycle:Linear Scaling,0 次 = 0%,255 次 = 100% |
dataIdentifier 0x0155 由定义打包,并由五个基本参数组成。为实现单独控制,通过 ControlEnableMaskRecord(控制启用掩码记录)内的单一位选用这些各个基本参数。若指定的 dataIdentifier 有除了打包或位映射以外的定义,则请求消息中没有 ControlEnableMaskRecord。ControlMask#1 最高有效位务必与 ControlState#1 最高有效位 dataIdentifier 首个参数相对应。
dataIdentifier 0x0155 的 ControlEnableMaskRecord 总大小 = 1 字节(仅由 ControlEnableMask#1 组成) | ||
---|---|---|
位的位置 | ControlEnableMask#1 - 位含义(1 = 受影响,0 = 不受影响) | |
7 | (最高有效位) | 确定参数 1(IAC 枢纽位置)是否受请求的影响 |
6 | 确定参数 2(RPM)是否受请求的影响 | |
5 | 确定参数 3(踏板位置 A)是否受请求的影响 | |
4 | 确定参数 4(踏板位置 B)是否受请求的影响 | |
3 | 确定参数 5(EGR 工作周期)是否受请求的影响 | |
2 | 未因响应参数产生影响 | |
1 | 未因响应参数产生影响 | |
0 | (最低有效位) | 未因响应参数产生影响 |
2)案例 1:仅控制 IAC 枢纽位置
req 2F 01 55 03
07 - controlOptionRecord[ controlState#1 ] = IAC 枢纽位置(7 次)
XX - controlOptionRecord[ controlState#2 ] = RPM(XX)
XX - controlOptionRecord[ controlState#3 ] = RPM(XX)
YZ - controlOptionRecord[ controlState#4 ] = 踏板位置 A(Y)和 B(Z)
XX - controlOptionRecord[ controlState#5 ] = EGR 工作周期(XX)
80 - controlEnableMask[ controlMask#1 ] = 仅控制 IAC 枢轴位置
// 注:controlState#2 - #5 中的 RPM 值、踏板位置 A、B 和 EGR 工作周期均是各不相关的,因为 controlMask#1 参数规定了仅 dataIdentifier 的首个参数会受请求的影响。
resp 6F 01 55 03
07 - controlOptionRecord[ controlState#1 ] = IAC 枢纽位置(7 次)
02 - controlOptionRecord[ controlState#2 ] = RPM(750 U/min)
EE - controlOptionRecord[ controlState#3 ] = RPM
12 - controlOptionRecord[ controlState#4 ] = 踏板位置 A(8%)和 B(16%)
59 - controlOptionRecord[ controlState#5 ] = EGR 工作周期(35%)
// 注:controlState#1 - controlState#5 中的做优参数传输值须反映系统当前状态。
3)案例 2:仅控制 RPM
req 2F 01 55 03
XX - controlOptionRecord[ controlState#1 ] = IAC 枢纽位置(XX 次)
03 - controlOptionRecord[ controlState#2 ] = RPM(0x03E8 = 1000 U/min)
E8 - controlOptionRecord[ controlState#3 ] = RPM
YZ - controlOptionRecord[ controlState#4 ] = 踏板位置 A(Y)和 B(Z)
XX - controlOptionRecord[ controlState#5 ] = EGR 工作周期(XX)
40 - controlEnableMask[ controlMask#1 ] = 仅控制 RPM
// 注:controlState#1 和 controlState#4 - #5 中的 IAC 枢轴位置、踏板位置 A、B 和 EGR 工作周期均是各不相关的,因为 controlMask#1 参数规定了仅 dataIdentifier 的第二个参数会受请求的影响。
resp 6F 01 55 03
09 - controlOptionRecord[ controlState#1 ] = IAC 枢纽位置(9 次)
03 - controlOptionRecord[ controlState#2 ] = RPM(950 U/min)
B6 - controlOptionRecord[ controlState#3 ] = RPM
12 - controlOptionRecord[ controlState#4 ] = 踏板位置 A(8%)和 B(16%)
59 - controlOptionRecord[ controlState#5 ] = EGR 工作周期(35%)
// 注:controlState#1 - controlState#5 中的做优参数传输值须反映系统当前状态。
4)案例 3:控制踏板位置 A 和 EGR 工作周期
req 2F 01 55 03
XX - controlOptionRecord[ controlState#1 ] = IAC 枢纽位置(XX 次)
XX - controlOptionRecord[ controlState#2 ] = RPM(XX)
XX - controlOptionRecord[ controlState#3 ] = RPM(XX)
3Z - controlOptionRecord[ controlState#4 ] = 踏板位置 A(0x3 = 24%)和 B(Z)
72 - controlOptionRecord[ controlState#5 ] = EGR 工作周期(45%)
28 - controlEnableMask[ controlMask#1 ] = 控制踏板位置 A 和 EGR 工作周期
// 注:controlState#1 - #3 和 controlState#4(第 3 位至 0 位) 中的 IAC 枢轴位置、RPM 和踏板位置 B 的传输值均是各不相关的,因为 controlMask#1 参数规定了仅 dataIdentifier 的第三个和第五个参数会受请求的影响。
resp 6F 01 55 03
07 - controlOptionRecord[ controlState#1 ] = IAC 枢纽位置(7 次)
03 - controlOptionRecord[ controlState#2 ] = RPM(850 U/min)
52 - controlOptionRecord[ controlState#3 ] = RPM
32 - controlOptionRecord[ controlState#4 ] = 踏板位置 A(24%)和 B(16%)
69 - controlOptionRecord[ controlState#5 ] = EGR 工作周期(41%)
// 注:controlState#1 - controlState#5 中的做优参数传输值须反映系统当前状态。
5)案例 4:将参数的控制权返还给 ECU
req 2F 01 55 00
FF - controlEnableMask[ controlMask#1 ] = 所有基本参数
resp 6F 01 55 00
09 - controlOptionRecord[ controlState#1 ] = IAC 枢纽位置(9 次)
03 - controlOptionRecord[ controlState#2 ] = RPM(850 U/min)
52 - controlOptionRecord[ controlState#3 ] = RPM
12 - controlOptionRecord[ controlState#4 ] = 踏板位置 A(8%)和 B(16%)
59 - controlOptionRecord[ controlState#5 ] = EGR 工作周期(35%)
// 注:controlState#1 - controlState#5 中的做优参数传输值须反映系统当前状态。