1. 术语解释
1.1 英文术语
英文术语 | 解释 |
---|---|
InputOutputControlByIdentifier | 通过ID控制输入输出 |
dataIdentifier | 数据标识符DID |
inputOutputControlParameter | 输入输出控制参数 |
ControlState | 控制状态(字节集合,包含controlState#1~controlState#m) |
controlEnableMaskRecord | 控制使能掩码记录(字节集合,包含controlMask#1~controlMask#r) |
controlOptionRecord | 控制选项记录 |
sub-function | 子功能参数 |
1.2 缩写表
缩写 | 描述 | 解释 |
---|---|---|
IOCP | inputOutputControlParameter | 输入输出控制参数 |
CS | ControlState | 控制状态(字节集合,包含controlState#1~controlState#m) |
2. 功能简介
2.1 功能概述
InputOutControlByIdentifier,0x2F服务作为输入输出控制服务,用于client主动请求server去对相关输入输出信号进行控制。所谓的输入输出控制简而言之就是屏蔽实际的输入输出信号值,取而代之的是client主动以某种指定的控制方式去设置这些信号值。
0x2F服务会对指定的DataIdentifier请求输入输出控制,其中可以通过IOCP来决定控制方式,如果IOCP等于0x3,那么需要加入CS值,重置受控信号的值,而该DID可能包含多个受控信号。当我们想对DID关联的一个或者多个受控信号进行控制时,需求在请求报文中加入controlEnableMask来指定受控信号。
注:其中CS和controlMask的个数(按字节)取决受控信号的个数。
为了验证0x2F服务是否生效效,此时要引入一个新的服务22(ReadDataByIdentifier),该服务可以通过信号所在的DID去获取对应的数值,然后与2F请求设置的数值比较是否相同,进而便可以知道2F控制是否生效。
2.2 应用场景
输入输出控制服务是用来控制ECU的某个外部执行器的状态(输出控制),或是替换ECU某个输入信号的值(输入控制) 。此服务在下线检测的时候经常会用到,e.g:
- 用诊断仪命令雨刷动两下,来判断雨刷功能及安装是否正确;
- 用诊断仪命令电机启动停止,来判断电机可以正常启停;
以上这两个例子是输出控制,在进行输出状态控制,即控制某个外部执行器的时候,要把ECU内部原来控制该执行器的上游逻辑切断,改为诊断控制,e.g:
- 当我们想控制雨刷的时候,ECU内部要把雨刷开关对雨刷器的控制功能切断,改为诊断控制,雨刷开关不再起作用,诊断控制完毕后再返回给ECU控制,这就是这里所说的输出控制;
- 而输入控制,则是当进行输入状态控制,即控制某个输入信号的时候,要把实际输入信号(如传感器检测信号)切断,用诊断仪发送的输入信号值来替代实际信号值,例如:在进行过压测试和欠压测试的时候,直接用诊断仪根据对应ID发出电压信号,根据是否报过压或欠压故障来判断软件逻辑是否有问题。
2.3 服务实现原理
收到0x2F执行输入替代或者输出控制时,ECU 收到请求后会有两个基本要求。
1、第 一个是断开 ID 参数上游控制策略的相应数据对象,否则将更新数据对象值。
2、第二个是替代控制策略所有下游活动所使用的相应数据对象值。例如,测试设备请求直接强制点亮头灯,需要阻止头灯开关位置影响头灯的 输出,并且将需求状态为“ON”的替代值赋给最终决定头灯状态期望输出功能所使用的数据对象。
3. 请求消息定义
3.1 0x2F请求消息格式
诊断请求格式中包含四大部分:
- SID: 诊断服务2F的标识符;
- DataIdenfier: 服务请求受控信号所对应的DID;
- ControlOptionRecord: 表示控制模式及控制的相关参数组成的数据集;
- IOCP : 输入输出控制参数;
- CS :需要被控制的参数(字节集合);
- controlEnableMaskRecord: 若CS参数个数超过1个时,此时可以使用controlMask(字节集合)来实现对不同参数的控制,但只有1个CS参数时,则不应该使用controlMask参数,否则会回复NRC13表示请求的长度不满足要求。
3.1.1 IO控制参数(IOCP)
IOCP有如下四种:
Byte data | 定义 | 说明 |
---|---|---|
00 | returnControlToECU | Tester取消某个的控制,将控制权归还给Server |
01 | resetToDefault | Tester请求ECU将指定DID下所有受控信号设置为默认值 |
02 | freezeCurrentState | Tester请求ECU冻结指定DID下所有受控信号的当前值 |
03 | shortTermAjustment | Tester请求ECU将DID下指定的受控信号设置成指定的值 |
注:1. 值得一提的是IOCP并非0x2F服务的子服务。
2. 在使用0x00,0x01,0x02参数请求服务时,不需要在报文中加入CS和controlMask,因为它们的操作对象是DID下所有受控信号的值。即请求报文只需是 2F DID(2 bytes) IOCP,而诊断回复报文中会带有所有受控信号的值。
3. 一般客户只会要求IOCP 0x00和0x03,并非全都支持。
3.1.2 CS
DID中的每个参数都可以是任意数量的Bit(可能存在跨字节的情况,e.g : DID的第一个参数长度为13bit,所以占了两个控制状态字节即ControlState#1-ControlState#2,还剩下3bit 数据可以被第二个参数使用,也可以空着。)
为了充分利用CS空间且能够避免使用多帧的情况,可以将数据长度小的参数放进同一个ControlState#n中,e.g :
- DID下的受控信号参数#1(2 bits), 参数#2 (3 bits),可以将参数#1 参数#2放到同一个ControlState#1中,即参数#1 位于ControlState#1 (0-1 bit),参数#2 位于ControlState#1 (2-4 bit)。
当然,CS空间够用的话,也可以让一个受控参数占用一个或者多个ControlState字节。仅当控制的DID由多个参数组成时(即DID按照定义进行位映射或分组),才能支持控制使能掩码记录。
控制使能掩码记录中应该有一个位对应于DID中定义的每一个单独的参数。当要控制的DID只包含一个参数时,不能支持控制使能掩码记录
当诊断请求IOCP为0x03时,需要发送DID下所有的受控参数ControlState#1~ControlState#n
3.1.3 controlEnableMaskRecord
controlEnableMaskRecord 包含多个controlMask字节,(controlMask#1~controlMask#r),这取决于受控参数个数。仅当控制的DID由多个参数组成时(即DID按照定义进行位映射或分组), 才能支持控制使能掩码记录。
控制使能掩码记录中应该有一个位对应于DID中定义的每一个单独的参数。当要控制的DID只包含一个参数(可能包含多个ControlState字节)时,不能支持控制使能掩码记录。
controlEnableMaskRecord中每个位的值将决定DID中的相应参数是否会受到请求响应。
controlEnableMaskRecord的位值’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中相应参数的位置精确匹配。
譬如下面2副图:
DID 0x0155下受控参数在CS中的位分布:
CS#n 与controlEnableMaskRecord中ControlEnableMask#1的mapping关系如下。
3.2 肯定响应定义
3.3 否定响应定义
3.3.1 否定消息定义
A_Data 字节 | 参数名称 | 字节值 | Cvt | 助记符 |
---|---|---|---|---|
#1 | 否定响应SID | 0x7F | M | SIDNR |
#2 | 通信控制请求SID | 0x2F | M | SIDRQ |
#3 | 否定响应码 | 0xXX | M | NRC_ |
3.3.2 否性响应码
3.3.3 NRC评估序列
4. 服务请求实例
4.1 进气门位置短期调整(单参数控制)
步骤如下:
- Step1 :切换至扩展回话;
- Step2 :使用通过DID读取数据的0x22服务,读取进气门位置的当前状态;
- Step3 :短期调整;
- Step4 :使用通过DID读取数据的0x22服务,读取进气门位置的当前状态;
- Step5 :将控制权返回给ECU;
- Step6 :冻结当前状态;
- Step7 :使用通过DID读取数据的0x22服务,读取进气门位置的当前状态;
- Step8 :将控制权返回给ECU;
- Step9 :使用通过DID读取数据的0x22服务,读取进气门位置的当前状态;
整个实现过程如下图:
4.2 EGR和IAC短期调整(多参数控制)
如下图,DID(0x0155)对应的受控参数有5个分别是IAC枢轴位置、发动机转速、踏板位置A、踏板位置B、EGR工作周期。其中,值得注意的是第三个和第四个参数的数据位置以及他们对应的controlMask。
4.3 仅控制IAC枢轴位置
4.4 仅控制RPM
4.5 同时控制踏板位置A和EGR工作周期
4.6 将所有受控参数控制权返还给ECU
5. 配置说明
- 主要涉及DcmDsd中的DcmDsdServiceTable容器中进行2F服务的配置:
- ServiceID的配置
- 引用相关的会话模式
- DID
- 涉及DcmDsp中的三个配置容器
- DcmDspDid
- DID中需要配置相应的Signals(引用DcmDspData)以及起始位
- DcmDspData
- a. 配置数据的大小端
- b. IOCP 各个参数的函数功能回调,回读DidData的回调
- c. 数据类型和size以及引用nvm block
- DcmDspDidInfo
- DcmDspDidControl中ControlMask及其Size,IOCP是否支持