汽车UDS诊断之输入输出控制服务(0x2F)深度剖析
当使用nputOutputControlByIdentifier执行输入替代或者输出控制时,ECU 收到请求后会有两个基本要求。
1、第 一个是断开 ID 参数上游控制策略的相应数据对象,否则将更新数据对象值。
2、第二个是替代控制策略所有下游活动所使用的相应数据对象值。例如,测试设备请求直接强制点亮头灯,需要阻止头灯开关位置影响头灯的 输出,并且将需求状态为“ON”的替代值赋给最终决定头灯状态期望输出功能所使用的数据对象。
该服务允许单个请求消息中单个DID 和它相应的参数的控制。如果这样做,服务端应响应一帧响应消息, 该消息包含请求消息的 DID 和控制状态信息。
表1-请求消息定义A_Data字节参数名称Cvt字节值助记符#1通过ID控制输入输出请求SIDM0x2FIOCBI#2
#3DID[]= [
byte#1(高字节)
byte#2(低字节)]
M
M0x00-0xFF
0x00-0xFFIOI_
B1
B2#4
:
#4+m控制选项记录[] = [
输入输出控制参数
控制状态#1
:
控制状态#m]M1
C1
:
C10x00-0xFF
0x00-0xFF
:
0x00-0xFFCSR_
IOCP_
CS_
:
CS_#4+m+1
:
#4+m+r控制使能掩码记录[] = [
控制掩码#1
控制掩码#r]C2
:
C20x00-0xFF
:
0x00-0xFFCEM_
CM_
:
CM_M1:输入输出控制参数应按照E.1中的定义来实现
C1:此参数的存在取决于DID和输入输出控制参数(见 E.1)
C2:如果车辆制造商支持控制使能掩码概念,则如果DID包含多个参数(参见控制使能掩码记录定义),则应包含此参数 该服务不使用子功能参数。(肯定也没有抑制肯定响应位,因为没有子功能参数)
该服务的请求消息数据参数定义如下:
表2-请求消息数据参数定义定义DID
该参数标识了服务器本地输入信号,内部参数和输出信号。该参数的适用值范围可以在C.1中定义的数据标识符DID表中找到。控制选项记录
控制选项记录由一个或多个字节(输入输出控制参数和控制状态#1到控制状态#m)组成。
控制选项记录参数详细信息应按照E.1中的定义来实现。 控制使能掩码记录
控制使能掩码记录包含一个或多个字节(控制掩码#1到控制掩码#r)。仅当控制的DID由多个参数组成时(即DID按照定义进行位映射或分组),才能支持控制使能掩码记录。
控制使能掩码记录中应该有一个位对应于DID中定义的每一个单独的参数。当要控制的DID只包含一个参数时,不能支持控制使能掩码记录
注意:DID中的每个参数都可以是任意数量的位。(可能是跨字节,譬如:DID的第一个参数为12个bit(这个参数超过一个字节,未超过两个字节发两个字节,多余的数据位如果没有别的DID参数利用就空着发0就可以,这时候也DID只有一个参数,但占了两个控制状态字节即ControlState#1-ControlState#2,所以它也不应支持控制使能掩码记录,这里就体现了DID参数按位映射来定义的意义。),车辆供应商应事先约定好)
控制使能掩码记录中每个位的值将决定DID中的相应参数是否会受到请求响应。
控制使能掩码记录中的位值'0'表示相应的参数不受此请求响应,并且位值'1'表示相应的参数受此请求响应。
ControlMask#1的最高有效位应与ControlState(这里指的是controlState#1-controlState#m整体)中从最高有效位开始的第一个参数(这个参数就是DID的第一个参数,一定会包含controlState#1某些位)相对应。
controlMask#1的次高有效位对应于ControlState中的DID的第二个参数,并继续以这种方式利用尽可能多的ControlMask字节来屏蔽所有参数。 例如,controlMask#2的最低有效位将对应于controlState中的DID的第16个参数。 对于位映射的DID,不支持掩码的DID的参数,也应在controlEnableMaskRecord中具有相应的位,以便controlEnableMaskRecord中每个参数的掩码位位置应与ControlState中相应参数的位置精确匹配。(这里的意思就是可以不用,但必须要有对应的掩码,以防掩码所对应位乱序。)
ControlState的分配
譬如:某个DID对应的受控参数只有两个:
Para1(在软件中该变量所占空间为3bit);//此DID对应的第一个参数
Para2(在软件中该变量所占空间为2bit);//此DID对应的第二个参数
对于我们车辆供应商来说有两套分配到ControlState中去:
1、对于我们车辆供应商来说完全可以把它放在controlState#1就可以完成功能效果,根据ControlMask对参数的受控规律,我们的Para1可以放在controlState#1低位(0-2),Para2可以放controlState#1(3-4)。-这样的分配有利于节约ControlState空间,当面对某个DID对应多个参数的情况,尽量避免使用多帧情况(使用首帧和连续帧打包发送)。
2、第二套分配方法就是ControlState空间够用,那就直接将Para1分配到controlState#1中占(此字节的低位),Para2分配到controlState#2中占(此字节的高位),剩下的一个字节就可以放controlMask#1。
以上的分配还是比较灵活的。
表E.1-输入输出控制参数定义字节值描述Cvt助记符0x00returnControlToECU
该值应向服务器指示客户端对数据标识符引用的输入信号、内部参数和输出信号没有控制权。
请求中的controlState字节的详细信息:0字节
正响应中的controlState字节的详细信息:等于dataIdentifier的dataRecord的大小和格式。URCTECU0x01resetToDefault
该值应向服务器指示请求将数据标识符引用的输入信号、内部参数和输出信号重置为默认状态。
请求中的controlState字节的详细信息:0字节
正响应中的controlState字节的详细信息:等于dataIdentifier的dataRecord的大小和格式。URTD0x02freezeCurrentState
该值应向服务器指示请求冻结数据标识符引用的输入信号、内部参数和输出信号的当前状态。
请求中的controlState字节的详细信息:0字节
正响应中的controlState字节的详细信息:等于dataIdentifier的dataRecord的大小和格式。UFCS0x03shortTermAdjustment
该值应向服务器指示请求将RAM中数据标识符所引用的输入信号、内部参数和受控的输入信号调整为controlOptionRecord中包含的controlState值。(例如,将怠速空气控制阀设置为特定步号,将阀的脉冲宽度设置为特定值/占空比)。
请求中的controlState字节的详细信息:等于dataIdentifier的dataRecord的大小和格式。(这个数据记录大小和格式在软件内部事先约定好的以多大空间去存这个信息,对应DID的数据大小和格式存储在我们软件中,当我们要调整这个数据参数,就必须通过0x2F服务请求对应DID以对等的controlState数据量进行调整)
正响应中的controlState字节的详细信息:等于dataIdentifier的dataRecord的大小和格式。USTA0x04-0xFFISOSAEReserved
该值由本文档保留以备将来定义MISOSAERESRVD 表 2——肯定响应消息定义A_Data 字节参数名称Cvt字节值助记符#1通过 ID 控制输入输出的响应 SIDM0x6FIOCBIPR #2
#3
DID[]= [
byte#1(高字节)
byte#2(低字节)] M
M
0x00-0xFF
0x00-0xFFIOI_
B1
B2 #4
#5
:
#5+(m-1)
控制状态记录[] = [
输入输出控制参数
控制状态#1
:
控制状态#m]M1
C1
:
C10x00-0xFF
0x00-0xFF
:
0x00-0xFFCSR_
IOCP_
CS_
:
CS_C1:该参数的存在与否取决于 DID 和输入输出控制参数(见 E.1)。 表 3——肯定响应消息数据参数定义定义 DID
该参数与请求消息中的 DID 相同。
控制状态记录
控制状态参数由多个字节(输入输出控制参数和控制状态#1 至控制状态#m)组成,例如反馈数据。控制状态记录参数细节定义在附录 E.1。
表 4——否定响应消息定义A_Data字节参数名称字节值Cvt助记符#1否定响应SID0x7FMSIDNR#2通过ID控制输入输出请求SID0x2FMSIDRQ#3否定响应码0xXXMNRC_
表 5——此服务支持的否定响应码NRC描述助记符0x13 消息长度错误或者无效格式
消息长度错误时发送该NRC。
IMLOIF0x22 条件不正确
请求输入输出控制的条件未满足时返回该NRC
CNC0x31 请求超出范围
该NRC在以下情况发送:
——设备不支持所请求的DID值;
——输入输出控制参数中的值无效(见输入输出控制参数定义);
——控制选项记录中的一个或多个可用控制状态值无效;
——设备不支持控制使能掩码记录的使能控制位组合。
ROOR0x33 安全访问被拒绝
客户端发动一个有效安全的DID且服务端安全功能当前为激活状态则返回该NRC。
SAD
HVAC控制模块如何使用通过ID控制输出输出服务,下面有图示说明,都是Intel格式的报文,因为Intel格式在汽车开发中是主流的报文格式。
受控制的参数是DID(0x9B00)相关的“进气门位置”。
换算:进气门位置[%]=十进制(Hex)*1[%]
进气门位置范围:1-100[%]
9.1.1.步骤1:通过ID读数据
该示例步骤使用通过ID读取数据服务(0x22号服务)读取进气门位置的当前状态。
表6-步骤1-通过ID读取数据请求
消息方向
客户端→服务端
消息类型
请求
A_Data字节
描述(所以值为16进制)
字节值
助记符
#1
通过ID读数据的请求SID
0x22
RDBI
#2
#3
DID[字节#1] = 0x9B
DID[字节#2] = 0x00(“进气门位置”)
0x9B
0x00
DID_B1
DID_B2
表7-步骤1-通过ID读取数据肯定响应消息
消息方向
服务端→客户端
消息类型
响应
A_Data字节
描述(所以值为16进制)
字节值
助记符
#1
通过ID请求数据的响应SID
0x62
RDBIPR
#2
#3
DID[字节#1] = 0x9B
DID[字节#2] = 0x00(“进气门位置”)
0x9B
0x00
DID_B1
DID_B2
#4数据记录[数据#1] = 10%0x0ADREC_DAT1
9.1.2.步骤2:短期调整
表8-步骤2-通过ID控制输入输出的请求
消息方向
客户端→服务端
消息类型
请求
A_Data字节
描述(所以值为16进制)
字节值
助记符
#1
通过ID控制输入输出的请求SID
0x2F
IOCBI
#2
#3
DID[字节#1] = 0x9B
DID[字节#2] = 0x00(“进气门位置”)
0x9B
0x00
IOI_B1
IOI_B2
#4
#5
控制选项记录[输入输出控制参数] = 短期调整
控制选项记录[控制状态#1] = 60%
0x03
0x3C
IOCP_STA
CS_1
表9-步骤2-通过ID控制输入输出肯定响应消息
消息方向
服务端→客户端
消息类型
响应
A_Data字节
描述(所以值为16进制)
字节值
助记符
#1
通过ID控制输入输出的响应SID
0x6F
IOCBIPR
#2
#3
DID[字节#1] = 0x9B
DID[字节#2] = 0x00(“进气门位置”)
0x9B
0x00
IOI_B1
IOI_B2
#4
#5
控制状态记录[输入输出控制参数] = 短期调整
控制状态记录[控制状态#1] = 12%
0x03
0x0C
IOCP_STA
CS_1
注意:客户端已经按照上述规定发送一帧通过ID控制输入输出的请求,服务端立即完成肯定响应的发送,肯定响应消息中带有“进气门状态”控制状态参数为12%。(进气门需要一定的时间调整到被请求的60%。)
9.1.3.步骤3:通过ID读数据
该示例步骤使用通过ID读取数据服务(0x22号服务)读取进气门位置的当前状态。
表10-步骤3-通过ID读取数据请求
消息方向
客户端→服务端
消息类型
请求
A_Data字节
描述(所以值为16进制)
字节值
助记符
#1
通过ID读数据的请求SID
0x22
RDBI
#2
#3
DID[字节#1] = 0x9B
DID[字节#2] = 0x00(“进气门位置”)
0x9B
0x00
DID_B1
DID_B2
表11-步骤3-通过ID读取数据肯定响应消息
消息方向
服务端→客户端
消息类型
响应
A_Data字节
描述(所以值为16进制)
字节值
助记符
#1
通过ID读数据的响应SID
0x62
RDBIPR
#2
#3
DID[字节#1] = 0x9B
DID[字节#2] = 0x00(“进气门位置”)
0x9B
0x00
DID_B1
DID_B2
#4数据记录[数据#1] = 60%0x3CDREC_DAT1
注:当通过ID控制输入输出激活时,客户端按照上述规定完成通过ID读取数据的请求消息的发送,客户端将给服务端的控制策略一定时间,以最终达到期望值。上述示例出现在服务端最终达到的目标值(不考虑软件内部做限制)。
9.1.4.步骤4:将控制权返回给ECU
表12-步骤4-通过ID控制输入输出的请求
消息方向
客户端→服务端
消息类型
请求
A_Data字节
描述(所以值为16进制)
字节值
助记符
#1
通过ID控制输入输出的请求SID
0x2F
IOCBI
#2
#3
DID[字节#1] = 0x9B
DID[字节#2] = 0x00(“进气门位置”)
0x9B
0x00
IOI_B1
IOI_B2
#4控制选项记录[输入输出控制参数] = 将控制权返回ECU0x00RCTECU
表13-步骤4-通过ID控制输入输出肯定响应消息
消息方向
服务端→客户端
消息类型
响应
A_Data字节
描述(所以值为16进制)
字节值
助记符
#1
通过ID控制输入输出的响应SID
0x6F
IOCBIPR
#2
#3
DID[字节#1] = 0x9B
DID[字节#2] = 0x00(“进气门位置”)
0x9B
0x00
IOI_B1
IOI_B2
#4
#5
控制状态记录[输入输出控制参数] = 将控制权返回ECU
控制状态记录[控制状态#1] = 58%
0x00
0x3A
RCTECU
CS_1
9.1.5.步骤5:冻结当前状态
表14-步骤6-通过ID控制输入输出的请求
消息方向
客户端→服务端
消息类型
请求
A_Data字节
描述(所以值为16进制)
字节值
助记符
#1
通过ID控制输入输出的请求SID
0x2F
IOCBI
#2
#3
DID[字节#1] = 0x9B
DID[字节#2] = 0x00(“进气门位置”)
0x9B
0x00
IOI_B1
IOI_B2
#4控制选项记录[输入输出控制参数] = 冻结当前状态0x02IOCP_FCS
表15-步骤5-通过ID控制输入输出肯定响应消息
消息方向
服务端→客户端
消息类型
响应
A_Data字节
描述(所以值为16进制)
字节值
助记符
#1
通过ID控制输入输出的响应SID
0x6F
IOCBIPR
#2
#3
DID[字节#1] = 0x9B
DID[字节#2] = 0x00(“进气门位置”)
0x9B
0x00
IOI_B1
IOI_B2
#4
#5
控制状态记录[输入输出控制参数] = 将控制权返回ECU
控制状态记录[控制状态#1] = 50%
0x02
0x32
IOCP_FCS
CS_1
9.1.6.步骤6:通过ID读数据
该示例步骤使用通过ID读取数据服务(0x22号服务)读取进气门位置的当前状态。
表16-步骤6-通过ID读取数据请求
消息方向
客户端→服务端
消息类型
请求
A_Data字节
描述(所以值为16进制)
字节值
助记符
#1
通过ID读数据的请求SID
0x22
RDBI
#2
#3
DID[字节#1] = 0x9B
DID[字节#2] = 0x00(“进气门位置”)
0x9B
0x00
DID_B1
DID_B2
表17-步骤6-通过ID读取数据肯定响应消息
消息方向
服务端→客户端
消息类型
响应
A_Data字节
描述(所以值为16进制)
字节值
助记符
#1
通过ID读数据的响应SID
0x62
RDBIPR
#2
#3
DID[字节#1] = 0x9B
DID[字节#2] = 0x00(“进气门位置”)
0x9B
0x00
DID_B1
DID_B2
#4数据记录[数据#1] = 50%0x32DREC_DAT1
9.1.7.步骤7:将控制权返回给ECU
表18-步骤7-通过ID控制输入输出的请求
消息方向
客户端→服务端
消息类型
请求
A_Data字节
描述(所以值为16进制)
字节值
助记符
#1
通过ID控制输入输出的请求SID
0x2F
IOCBI
#2
#3
DID[字节#1] = 0x9B
DID[字节#2] = 0x00(“进气门位置”)
0x9B
0x00
IOI_B1
IOI_B2
#4控制选项记录[输入输出控制参数] = 将控制权返回ECU0x00RCTECU?
表19-步骤7-通过ID控制输入输出肯定响应消息
消息方向
服务端→客户端
消息类型
响应
A_Data字节
描述(所以值为16进制)
字节值
助记符
#1
通过ID控制输入输出的响应SID
0x6F
IOCBIPR
#2
#3
DID[字节#1] = 0x9B
DID[字节#2] = 0x00(“进气门位置”)
0x9B
0x00
IOI_B1
IOI_B2
#4
#5
控制状态记录[输入输出控制参数] = 将控制权返回ECU
控制状态记录[控制状态#1] = 47%
0x00
0x2F
RCTECU
CS_1
9.1.8.步骤8:通过ID读数据
该示例步骤使用通过ID读取数据服务(0x22号服务)读取进气门位置的当前状态。
表20-步骤8-通过ID读取数据请求
消息方向
客户端→服务端
消息类型
请求
A_Data字节
描述(所以值为16进制)
字节值
助记符
#1
通过ID读数据的请求SID
0x22
RDBI
#2
#3
DID[字节#1] = 0x9B
DID[字节#2] = 0x00(“进气门位置”)
0x9B
0x00
DID_B1
DID_B2
表21-步骤8-通过ID读取数据肯定响应消息
消息方向
服务端→客户端
消息类型
响应
A_Data字节
描述(所以值为16进制)
字节值
助记符
#1
通过ID读数据的响应SID
0x62
RDBIPR
#2
#3
DID[字节#1] = 0x9B
DID[字节#2] = 0x00(“进气门位置”)
0x9B
0x00
DID_B1
DID_B2
#4数据记录[数据#1] = 10%0x0ADREC_DAT1
9.1.9 操作汇总
步骤1:通过ID读数据
步骤2:短期调整
步骤3:通过ID读数据
步骤4:将控制权返回给ECU
步骤5:冻结当前状态
步骤6:通过ID读数据
步骤7:将控制权返回给ECU
步骤8:通过ID读数据
图解:
操作CAN报文实体01234567通过ID读数据0x030x220x9B0x00 客户端肯定响应0x040x620x9B0x000x0A 服务端短期调整0x050x2F0x9B0x000x030x3C 客户端肯定响应0x050x6F0x9B0x000x030x0C 服务端通过ID读数据0x030x220x9B0x00 客户端肯定响应0x040x620x9B0x000x3C 服务端将控制权返回给ECU0x040x2F0x9B0x000x00 客户端肯定响应0x050x6F0x9B0x000x000x3A 服务端冻结当前状态0x040x2F0x9B0x000x02 客户端肯定响应0x050x6F0x9B0x000x020x32 服务端通过ID读数据0x030x220x9B0x00 客户端肯定响应0x040x620x9B0x000x32 服务端将控制权返回给ECU0x040x2F0x9B0x000x00 客户端肯定响应0x050x6F0x9B0x000x000x2F 服务端通过ID读数据0x030x220x9B0x00 客户端肯定响应0x040x620x9B0x000x0A 服务端
注意:此案例是从ISO14229中找的,不过ISO14229中的此示例在参数在字节与字节、字节内的位设置有点不合乎逻辑,所以做了一定修改。
该示例使用打包[打包的意思个人觉得是发送报文时,单帧放不下此DID对应的受控参数,所以要用首帧和连续帧分开放]的DID(0x0155)展示对一个请求中单个参数(就需要用控制掩码来协调)或者或者多个参数进行控制。
此DID(0x0155)对应的受控参数有5个分别是IAC枢轴位置、发动机转速、踏板位置A、踏板位置B、EGR工作周期,该DID对应参数对应的上游控制变量(需要被替代的值)在软件中实际定义的空间大小(譬如:VCU发送给ECU的转速控制信号是16个bit的CAN信号,所以我们UDS就需要想办法在建立另一种诊断通道,让我们UDS诊断请求中信号来代替这个CAN信号)如下:
【注:DID对应参数的大小和格式要与将要被替代的上游控制变量的大小和格式一致】
IAC枢轴位置(8位bit)
电机转速(16位bit)
踏板位置A(4位bit)
踏板位置B(4位bit)
EGR工作周期(8位bit)
根据以上的信号数据大小,我们要在UDS模块中定义此DID对应相同大小储存空间的变量来存放我们UDS请求数据参数以便我们将来拿这个值来替代实际输入输出的值,所以车辆供应商在软件中定义了关于此DID的混合数据块,如下:
DID数据字节参数数据记录内容编号大小0x0155#1(所有位)#18位数据记录[数据记录#1] = IAC枢轴位置(n=计数)#2-#3(所有位)#216位数据记录[数据#2-#3]=发动机转速(0= 0r/min,65535r/min)#4(bits3-0)#34位数据记录[数据#4(bits3-0)]=踏板位置A:线性比例, 0 = 0%, 15 = 120%#4(bits7-4)#44位数据记录[数据#4(bits7-4)]=踏板位置B:线性比例, 0 = 0%, 15 = 120%#5 (所有位)#58位 数据记录[数据记录#5] = EGR工作周期:线性比例, 0计数 = 0%
255计数 = 100%
此DID(0x0155)定义由五个基本参数组成。对于要实现某个参数的单独控制就必须通过控制使能掩码记录中的单个位进行选择(如果你不想实现单个参数控制可以不用加控制掩码)。控制掩码#1的最高有效位通常与DID的首个参数对应。
表22-控制使能掩码记录
DID 0x0155 控制使能掩码记录
总大小 = 1字节(即,仅包含控制掩码#1)
位排布控制掩码#1 - 位定义(1=受影响, 0 =不受影响)7(最高有效位)决定参数#1(IAC枢轴位置)是否被请求影响6决定参数#2(发动机转速)是否被请求影响5决定参数#3(踏板位置A)是否被请求影响4决定参数#4(踏板位置B)是否被请求影响3决定参数#5(EGR工作周期)是否被请求影响2由于无对应参数故不影响1由于无对应参数故不影响0(最低有效位)由于无对应参数故不影响
9.2.1.示例操作1:仅控制IAC枢轴位置
表23-示例操作1-通过ID控制输入输出的请求
消息方向
客户端→服务端
消息类型
请求
A_Data字节
描述(所以值为16进制)
字节值
助记符
#1
通过ID控制输入输出的请求SID
0x2F
IOCBI
#2
#3
DID[字节#1] = 0x01
DID[字节#2] = 0x55(IAC/RPM/PPA/PPB/EGR)
0x01
0x55
IOI_B1
IOI_B2
#4
#5
#6
#7
#8
#9
控制选项记录[输入输出控制参数] = 短期调整
控制选项记录[控制状态#1] = IAC枢轴位置(7计数)
控制选项记录[控制状态#2] = 发动机转速低字节(XX)
控制选项记录[控制状态#3] = 发动机转速高字节(XX)
控制选项记录[控制状态#4] = 踏板位置A(Y)和B(Z)
控制选项记录[控制状态#5] = EGR工作周期(XX)
0x03
0x07
0xXX
0xXX
0xZY
0xXX
IOCP_STA
CS_1
CS_2
CS_3
CS_4
CS_5
#10控制使能掩码[控制掩码#1] = 仅控制IAC枢轴位置0x80CM_1注意:由于状态掩码#1参数定义了只有DID中第一个参数被请求影响,所以控制状态#2-#5中传输的电机转速,踏板位置A,踏板位置B,和EGR工作周期值是无效的。
表24-示例操作1-通过ID控制输入输出肯定响应消息
消息方向
服务端→客户端
消息类型
响应
A_Data字节
描述(所以值为16进制)
字节值
助记符
#1
通过ID控制输入输出的响应SID
0x6F
IOCBIPR
#2
#3
DID[字节#1] = 0x01
DID[字节#2] = 0x55(IAC/RPM/PPA/PPB/EGR)
0x01
0x55
IOI_B1
IOI_B2
#4
#5
#6
#7
#8
#9
控制状态记录[输入输出控制参数] = 短期调整
控制状态记录[控制状态#1] = IAC枢轴位置(7计数)
控制状态记录[控制状态#2] = 发动机转速低字节
控制状态记录[控制状态#3] = 发动机转速高字节(750r/min)
控制状态记录[控制状态#4] = 踏板位置A(16%)和B(8%)
控制状态记录[控制状态#5] = EGR工作周期(35%)
0x03
0x07
0xEE
0x02
0x12
0x59
IOCP_STA
CS_1
CS_2
CS_3
CS_4
CS_5
9.2.2.示例操作2:仅控制发动机转速
表25-示例操作2-通过ID控制输入输出的请求
消息方向
客户端→服务端
消息类型
请求
A_Data字节
描述(所以值为16进制)
字节值
助记符
#1
通过ID控制输入输出的请求SID
0x2F
IOCBI
#2
#3
DID[字节#1] = 0x01
DID[字节#2] = 0x55(IAC/RPM/PPA/PPB/EGR)
0x01
0x55
IOI_B1
IOI_B2
#4
#5
#6
#7
#8
#9
控制选项记录[输入输出控制参数] = 短期调整
控制选项记录[控制状态#1] = IAC枢轴位置(XX计数)
控制选项记录[控制状态#2] = 发动机转速低字节
控制选项记录[控制状态#3] = 发动机转速高字节(1000r/min)
控制选项记录[控制状态#4] = 踏板位置A(Y)和B(Z)
控制选项记录[控制状态#5] = EGR工作周期(XX)
0x03
0xXX
0xE8
0x03
0xZY
0xXX
IOCP_STA
CS_1
CS_2
CS_3
CS_4
CS_5
#10控制使能掩码[控制掩码#1] = 仅控制发动机转速0x40CM_1
表26-示例操作1-通过ID控制输入输出肯定响应消息
消息方向
服务端→客户端
消息类型
响应
A_Data字节
描述(所以值为16进制)
字节值
助记符
#1
通过ID控制输入输出的响应SID
0x6F
IOCBIPR
#2
#3
DID[字节#1] = 0x01
DID[字节#2] = 0x55(IAC/RPM/PPA/PPB/EGR)
0x01
0x55
IOI_B1
IOI_B2
#4
#5
#6
#7
#8
#9
控制状态记录[输入输出控制参数] = 短期调整
控制状态记录[控制状态#1] = IAC枢轴位置(7计数)
控制状态记录[控制状态#2] = 发动机转速低字节
控制状态记录[控制状态#3] = 发动机转速高字节(950r/min)
控制状态记录[控制状态#4] = 踏板位置A(16%)和B(8%)
控制状态记录[控制状态#5] = EGR工作周期(35%)
0x03
0x07
0xB6
0x03
0x12
0x59
IOCP_STA
CS_1
CS_2
CS_3
CS_4
CS_5
注:我们发现发动机转速变化的同时,IAC枢轴位置还是7,因为我们的在进行仅控制发动机操作前,没有把控制权交还给ECU,所以它会一直是7。
9.2.3.示例操作3:同时控制踏板位置A和EGR工作周期
表27-示例操作3-通过ID控制输入输出的请求
消息方向
客户端→服务端
消息类型
请求
A_Data字节
描述(所以值为16进制)
字节值
助记符
#1
通过ID控制输入输出的请求SID
0x2F
IOCBI
#2
#3
DID[字节#1] = 0x01
DID[字节#2] = 0x55(IAC/RPM/PPA/PPB/EGR)
0x01
0x55
IOI_B1
IOI_B2
#4
#5
#6
#7
#8
#9
控制选项记录[输入输出控制参数] = 短期调整
控制选项记录[控制状态#1] = IAC枢轴位置(XX计数)
控制选项记录[控制状态#2] = 发动机转速低字节(XX)
控制选项记录[控制状态#3] = 发动机转速高字节(XX)
控制选项记录[控制状态#4] = 踏板位置A(24%)和B(Z)
控制选项记录[控制状态#5] = EGR工作周期(45%)
0x03
0xXX
0xXX
0xXX
0xZ3
0x72
IOCP_STA
CS_1
CS_2
CS_3
CS_4
CS_5
#10控制使能掩码[控制掩码#1] = 控制踏板位置A和EGR0x28CM_1注:该控制掩码仅影响DID的第3个参数(踏板位置A)和第5个参数(EGR工作周期)。
表28-示例操作3-通过ID控制输入输出肯定响应消息
消息方向
服务端→客户端
消息类型
响应
A_Data字节
描述(所以值为16进制)
字节值
助记符
#1
通过ID控制输入输出的响应SID
0x6F
IOCBIPR
#2
#3
DID[字节#1] = 0x01
DID[字节#2] = 0x55(IAC/RPM/PPA/PPB/EGR)
0x01
0x55
IOI_B1
IOI_B2
#4
#5
#6
#7
#8
#9
控制状态记录[输入输出控制参数] = 短期调整
控制状态记录[控制状态#1] = IAC枢轴位置(7计数)
控制状态记录[控制状态#2] = 发动机转速低字节
控制状态记录[控制状态#3] = 发动机转速高字节(950r/min)
控制状态记录[控制状态#4] = 踏板位置A(24%)和B(8%)
控制状态记录[控制状态#5] = EGR工作周期(41%)
0x03
0x07
0xB6
0x03
0x13
0x69
IOCP_STA
CS_1
CS_2
CS_3
CS_4
CS_5
注:控制状态#1-控制状态#5所有参数传输值应该反馈系统的当前状态。
9.2.4.示例操作4:将所有参数的控制权返回给ECU
表29-示例操作4-通过ID控制输入输出的请求
消息方向
客户端→服务端
消息类型
请求
A_Data字节
描述(所以值为16进制)
字节值
助记符
#1
通过ID控制输入输出的请求SID
0x2F
IOCBI
#2
#3
DID[字节#1] = 0x01
DID[字节#2] = 0x55(IAC/RPM/PPA/PPB/EGR)
0x01
0x55
IOI_B1
IOI_B2
#4控制选项记录[控制输入输出参数] = 将控制权返回给ECU0x00RCTECU#5控制使能掩码[控制掩码#1] = 所有基本参数0xFFCM_1
表30-示例操作3-通过ID控制输入输出肯定响应消息
消息方向
服务端→客户端
消息类型
响应
A_Data字节
描述(所以值为16进制)
字节值
助记符
#1
通过ID控制输入输出的响应SID
0x6F
IOCBIPR
#2
#3
DID[字节#1] = 0x01
DID[字节#2] = 0x55(IAC/RPM/PPA/PPB/EGR)
0x01
0x55
IOI_B1
IOI_B2
#4
#5
#6
#7
#8
#9
控制状态记录[输入输出控制参数] = 将控制权返回给ECU
控制状态记录[控制状态#1] = IAC枢轴位置(9计数)
控制状态记录[控制状态#2] = 发动机转速低字节
控制状态记录[控制状态#3] = 发动机转速高字节(850r/min)
控制状态记录[控制状态#4] = 踏板位置A(16%)和B(8%)
控制状态记录[控制状态#5] = EGR工作周期(35%)
0x00
0x09
0x52
0x03
0x12
0x59
IOCP_STA
CS_1
CS_2
CS_3
CS_4
CS_5
注:以上测试都是连在一起的。
到这里我们的0x2F号服务基本学完了。
以上解释有没有解决大家的疑惑,如果还是觉得有疑惑的地方,欢迎大家踊跃提出,一起分享,共同进步!!!