CAN
最新的OBD-II标准SAE J1979中描述了10种操作模式。它们如下:
模式(十六进制) | 描述 |
---|---|
01 | 显示当前数据 |
02 | 显示冻结帧数据 |
03 | 显示存储的诊断故障代码 |
04 | 清除诊断故障代码和存储值 |
05 | 测试结果,氧气传感器监控(仅限非CAN) |
06 | 测试结果,其他组件/系统监控(测试结果,仅适用于CAN的氧传感器监控) |
07 | 显示等待诊断故障代码(在当前或最后一个驾驶周期内检测到) |
08 | 车载部件/系统的控制操作 |
09 | 要求车辆信息 |
0A | 永久性诊断故障代码(DTC)(清除DTC) |
7DF 7E0 7E8
PID |
|RE| |
Details |
Min |
Max |
Uni |
Figure |
00 |
4 |
PID支持[01 - 20] |
位编码[A7..D0] == [PID $ 01..PID $ 20] 见下文 |
|||
01 |
4 |
自DTC清除后监视状态。(包括故障指示灯(MIL)状态和DTC数量。) |
位编码。见下文 |
|||
02 |
2 |
冻结DTC |
||||
03 |
2 |
燃油系统状态 |
位编码。见下文 |
|||
04 |
1 |
计算发动机负荷 |
0 |
100 |
% |
{\ displaystyle {\ tfrac {100} {255}} A} (要么 {\ displaystyle {\ tfrac {A} {2.55}}}) |
05 |
1 |
发动机冷却液温度 |
-40 |
215 |
C |
{\ displaystyle A-40} |
06 |
1 |
短期燃料调整 - 银行1 |
-100 |
99.2 |
% |
{\ displaystyle {\ frac {100} {128}} A-100}
(要么 {\ displaystyle {\ tfrac {A} {1.28}} - 100} ) |
07 |
1 |
长期燃油调整 - 银行1 |
||||
08 |
1 |
短期燃料调整 - 银行2 |
||||
09 |
1 |
长期燃油调整 - 银行2 |
||||
0A |
1 |
燃油压力(表压) |
0 |
765 |
千帕 |
{\ displaystyle 3A} |
0B |
1 |
进气歧管绝对压力 |
0 |
255 |
千帕 |
{\ displaystyle A} |
0℃ |
2 |
发动机RPM |
0 |
16,383.75 |
转 |
{\ displaystyle {\ frac {256A + B} {4}}} |
0D |
1 |
车速 |
0 |
255 |
公里/小时 |
{\ displaystyle A} |
0E |
1 |
定时提前 |
-64 |
63.5 |
° TDC之前 |
{\ displaystyle {\ frac {A} {2}} - 64} |
0F |
1 |
进气温度 |
-40 |
215 |
C |
{\ displaystyle A-40} |
10 |
2 |
MAF空气流量 |
0 |
655.35 |
克/秒 |
{\ displaystyle {\ frac {256A + B} {100}}} |
11 |
1 |
节气门位置 |
0 |
100 |
% |
{\ displaystyle {\ tfrac {100} {255}} A} |
12 |
1 |
指挥二级空中状态 |
位编码。见下文 |
|||
13 |
1 |
氧气传感器存在(2个银行) |
[A0..A3] ==银行1,传感器1-4。[A4..A7] ==银行2 ... |
|||
14 |
2 |
氧传感器1 |
0 |
1.275 |
伏 % |
{\ displaystyle {\ frac {A} {200}}}
{\ displaystyle {\ frac {100} {128}} B-100}
(如果B == $ FF,传感器不用于修剪计算) |
15 |
2 |
氧传感器2 |
||||
16 |
2 |
氧气传感器3 |
||||
17 |
2 |
氧传感器4 |
||||
18 |
2 |
氧传感器5 |
||||
19 |
2 |
氧传感器6 |
||||
1A |
2 |
氧传感器7 |
||||
1B |
2 |
氧传感器8 |
||||
1C |
1 |
本车符合的OBD标准 |
位编码。见下文 |
|||
1D |
1 |
氧传感器存在(4个银行) |
类似于PID 13,但是[A0..A7] == [B1S1,B1S2,B2S1,B2S2,B3S1,B3S2,B4S1,B4S2] |
|||
1E |
1 |
辅助输入状态 |
A0 == 电源 |
|||
1F |
2 |
发动机启动后运行时间 |
0 |
65,535 |
秒 |
{\ displaystyle 256A + B} |
20 |
4 |
PID支持[21 - 40] |
位编码[A7..D0] == [PID $ 21..PID $ 40] 见下文 |
|||
21 |
2 |
距离行驶故障指示灯(MIL) |
0 |
65,535 |
千米 |
{\ displaystyle 256A + B} |
22 |
2 |
燃油轨压力(相对于歧管真空度) |
0 |
5177.265 |
千帕 |
{\ displaystyle 0.079(256A + B)} |
23 |
2 |
燃油轨表压(柴油或汽油直喷) |
0 |
655350 |
千帕 |
{\ displaystyle 10(256A + B)} |
24 |
4 |
氧气传感器1 |
0 |
<2 |
比率 |
{\ displaystyle {\ frac {2} {65536}}(256A + B)}
{\ displaystyle {\ frac {8} {65536}}(256C + D)}
|
25 |
4 |
氧传感器2 |
||||
26 |
4 |
氧气传感器3 |
||||
27 |
4 |
氧气传感器4 |
||||
28 |
4 |
氧气传感器5 |
||||
29 |
4 |
氧气传感器6 |
||||
2A |
4 |
氧气传感器7 |
||||
2B |
4 |
氧气传感器8 |
||||
2C |
1 |
指挥的EGR |
0 |
100 |
% |
{\ displaystyle {\ tfrac {100} {255}} A} |
2D |
1 |
EGR误差 |
-100 |
99.2 |
% |
{\ displaystyle {\ tfrac {100} {128}} A-100} |
2E |
1 |
指挥蒸发吹扫 |
0 |
100 |
% |
{\ displaystyle {\ tfrac {100} {255}} A} |
2F |
1 |
燃油箱液位输入 |
0 |
100 |
% |
{\ displaystyle {\ tfrac {100} {255}} A} |
三十 |
1 |
代码清除后预热 |
0 |
255 |
计数 |
{\ displaystyle A} |
31 |
2 |
代码清除后的距离 |
0 |
65,535 |
千米 |
{\ displaystyle 256A + B} |
32 |
2 |
EVAP。系统蒸汽压力 |
-8,192 |
8191.75 |
霸 |
{\ displaystyle {\ frac {256A + B} {4}}} |
33 |
1 |
绝对大气压力 |
0 |
255 |
千帕 |
{\ displaystyle A} |
34 |
4 |
氧气传感器1 |
0 |
<2 |
比例 |
{\ displaystyle {\ frac {2} {65536}}(256A + B)}
{\ displaystyle {\ frac {256C + D} {256}} - 128}
要么 {\ displaystyle C + {\ frac {D} {256}} - 128} |
35 |
4 |
氧气传感器2 |
||||
36 |
4 |
氧气传感器3 |
||||
37 |
4 |
氧传感器4 |
||||
38 |
4 |
氧气传感器5 |
||||
39 |
4 |
氧气传感器6 |
||||
3A |
4 |
氧气传感器7 |
||||
3B |
4 |
氧气传感器8 |
||||
3C |
2 |
催化剂温度:Bank 1,Sensor 1 |
-40 |
6,513.5 |
C |
{\ displaystyle {\ frac {256A + B} {10}} - 40} |
3D |
2 |
催化剂温度:Bank 2,Sensor 1 |
||||
3E |
2 |
催化剂温度:Bank 1,Sensor 2 |
||||
3F |
2 |
催化剂温度:Bank 2,Sensor 2 |
||||
40 |
4 |
PID支持[41 - 60] |
位编码[A7..D0] == [PID $ 41..PID $ 60] 见下文 |
|||
41 |
4 |
监控此驱动器周期的状态 |
位编码。见下文 |
|||
42 |
2 |
控制模块电压 |
0 |
65.535 |
V |
{\ displaystyle {\ frac {256A + B} {1000}}} |
43 |
2 |
绝对负载值 |
0 |
25700 |
% |
{\ displaystyle {\ tfrac {100} {255}}(256A + B)} |
44 |
2 |
燃油指令的当量比 |
0 |
<2 |
比 |
{\ displaystyle {\ tfrac {2} {65536}}(256A + B)} |
45 |
1 |
相对节气门位置 |
0 |
100 |
% |
{\ displaystyle {\ tfrac {100} {255}} A} |
46 |
1 |
环境空气温度 |
-40 |
215 |
C |
{\ displaystyle A-40} |
47 |
1 |
绝对油门位置B |
0 |
100 |
% |
{\ displaystyle {\ frac {100} {255}} A} |
48 |
1 |
绝对节气门位置C |
||||
49 |
1 |
加速踏板位置D |
||||
4A |
1 |
加速踏板位置E |
||||
4B |
1 |
加速踏板位置F |
||||
4C |
1 |
指令油门执行器 |
||||
4D |
2 |
时间运行与MIL |
0 |
65,535 |
分钟 |
{\ displaystyle 256A + B} |
4E |
2 |
故障代码清除后的时间 |
||||
4F |
4 |
燃油空气当量比,氧传感器电压,氧传感器电流和进气歧管绝对压力的最大值 |
0,0,0,0 |
255,255,255,2550 |
比,V,mA,kPa |
A,B,C,D * 10 |
50 |
4 |
新新新新新旗新新新200新新200新200新新200新新200新新新200新新200新新200新新200新新200新新200新新200新新200 |
0 |
2550 |
克/秒 |
A * 10,B,C和D保留供将来使用 |
51 |
1 |
燃油类型 |
燃料型表见下图 |
|||
52 |
1 |
乙醇燃料% |
0 |
100 |
% |
{\ displaystyle {\ tfrac {100} {255}} A} |
53 |
2 |
绝对蒸发系统蒸气压 |
0 |
327.675 |
千帕 |
{\ displaystyle {\ frac {256A + B} {200}}} |
54 |
2 |
蒸发系统蒸气压力 |
-32,767 |
32,768 |
霸 |
((A * 256)+ B)-32767 |
55 |
2 |
短期二次氧传感器装饰,A:银行1,B:银行3 |
-100 |
99.2 |
% |
{\ displaystyle {\ frac {100} {128}} A-100} {\ displaystyle {\ frac {100} {128}} B-100} |
56 |
2 |
长期二次氧传感器装饰,A:银行1,B:银行3 |
||||
57 |
2 |
短期二次氧传感器修整,A:银行2,B:银行4 |
||||
58 |
2 |
长期二次氧传感器装饰,A:银行2,B:银行4 |
||||
59 |
2 |
燃油轨绝对压力 |
0 |
655350 |
千帕 |
{\ displaystyle 10(256A + B)} |
5A |
1 |
相对加速踏板位置 |
0 |
100 |
% |
{\ displaystyle {\ tfrac {100} {255}} A} |
5B |
1 |
混合电池组剩余寿命 |
0 |
100 |
% |
{\ displaystyle {\ tfrac {100} {255}} A} |
5C |
1 |
发动机机油温度 |
-40 |
210 |
C |
{\ displaystyle A-40} |
5D |
2 |
燃油喷射正时 |
-210.00 |
301.992 |
° |
{\ displaystyle {\ frac {256A + B} {128}} - 210} |
5E |
2 |
发动机燃油率 |
0 |
3276.75 |
升/小时 |
{\ displaystyle {\ frac {256A + B} {20}}} |
5F |
1 |
设计车辆的排放要求 |
位编码 |
|||
60 |
4 |
支持PID [61 - 80] |
位编码[A7..D0] == [PID $ 61..PID $ 80] 见下文 |
|||
61 |
1 |
驾驶员需求引擎 - 扭矩百分比 |
-125 |
125 |
% |
A-125 |
62 |
1 |
实际发动机 - 扭矩百分比 |
-125 |
125 |
% |
A-125 |
63 |
2 |
发动机参考扭矩 |
0 |
65,535 |
纳米 |
{\ displaystyle 256A + B} |
64 |
五 |
发动机百分扭矩数据 |
-125 |
125 |
% |
A-125空转 |
65 |
2 |
辅助输入/输出支持 |
位编码 |
|||
66 |
五 |
大气流量传感器 |
||||
67 |
3 |
发动机冷却液温度 |
||||
68 |
7 |
进气温度传感器 |
||||
69 |
7 |
指令的EGR和EGR误差 |
||||
6A |
五 |
指令柴油进气流量控制和相对进气流量位置 |
||||
6B |
五 |
废气再循环温度 |
||||
6C |
五 |
指令油门执行器控制和相对节气门位置 |
||||
6D |
6 |
燃油压力控制系统 |
||||
6E |
五 |
注射压力控制系统 |
||||
6F |
3 |
涡轮增压器压缩机入口压力 |
||||
70 |
9 |
提升压力控制 |
||||
71 |
五 |
可变几何涡轮(VGT)控制 |
||||
72 |
五 |
废物控制 |
||||
73 |
五 |
排气压力 |
||||
74 |
五 |
涡轮增压器转速 |
||||
75 |
7 |
涡轮增压器温度 |
||||
76 |
7 |
涡轮增压器温度 |
||||
77 |
五 |
增压空气冷却器温度(CACT) |
||||
78 |
9 |
排气温度(EGT)Bank 1 |
特殊PID。见下文 |
|||
79 |
9 |
排气温度(EGT)2 |
特殊PID。见下文 |
|||
7A |
7 |
柴油颗粒过滤器(DPF) |
||||
7B |
7 |
柴油颗粒过滤器(DPF) |
||||
7C |
9 |
柴油颗粒过滤器(DPF)温度 |
||||
7D |
1 |
NOx NTE(不超过)控制区域状态 |
||||
7E |
1 |
PM NTE(不超过)控制区域状态 |
||||
7F |
13 |
发动机运行时间 |
||||
80 |
4 |
支持PID [81 - A0] |
位编码[A7..D0] == [PID $ 81..PID $ A0] 见下文 |
|||
81 |
21 |
辅助排放控制装置(AECD)的发动机运行时间 |
||||
82 |
21 |
辅助排放控制装置(AECD)的发动机运行时间 |
||||
83 |
五 |
NOx传感器 |
||||
84 |
歧管表面温度 |
|||||
85 |
NOx试剂系统 |
|||||
86 |
颗粒物(PM)传感器 |
|||||
87 |
进气歧管绝对压力 |
|||||
A0 |
4 |
PID支持[A1 - C0] |
位编码[A7..D0] == [PID $ A1..PID $ C0] 见下文 |
|||
C0 |
4 |
PID支持[C1 - E0] |
位编码[A7..D0] == [PID $ C1..PID $ E0] 见下文 |
|||
C3 |
? |
? |
? |
? |
? |
返回许多数据,包括驱动器条件ID和引擎速度* |
C4 |
? |
? |
? |
? |
? |
B5是发动机空闲请求 |
CCP通信协议:主从式,主设备通过CAN总线与多台从设备相连,主设备室测量标定系统 ,从设备是需要标定的ECU,主设备首先与其中一个从设备建立逻辑连接,主、从设备之间的所有的数据传递均由主机控制,从设备执行主设备命令后返回包含命令响应值或错误代码等信息的报文,同时从设备可以根据主设备通过控制命令设置的列表信息来定时地向主设备传送变量信息,数据的传递是由主设备初始化并且从设备来执行的,并且是由固定的循环采样频率或者事件触发的。
主设备通过USB-CAN接口与从设备连接,符合CAN2.0协议。
通信过程中,所有报文均为8个字节,包括命令、数据、数据长度、地址等信息
该通信协议参照CCP协议,可以与INCA等标定软件接口。
CAN通信:采用两个报文数据对象 CRO和DTO (命令接收对象)(命令发送对象)每个对象根据其数据流向,都有一个唯一的ID标示符进行标示,ID标识符可以由用户自己设定。
命令接收对象(CRO):
用于传递指令代码和内部功能码或主、从设备之间交换的存储区数据
表1
CMD (1 Byte): |
命令代码。 |
CTR (1 Byte): |
命令计数器。 |
Parameter and Data(6 Byte): |
参数和数据场,命令相关的数据或参数 |
数据接收对象(DTO):
数据传输对象(DTO)指由从设备反馈的报文。DTO根据报文首字节PID的值可以由三种形式,见表2:
PID值 |
数据传输类型 |
备注 |
0xFF |
CRM(Command Return Message) |
由从设备发送,反馈CRO命令的报文 |
0xFE |
Event Message |
当从设备检测到内部发生错误机制时,由从设备自行向主设备发送,报告其当前的运行状态,并请求主设备暂停当前工作进程以处理发生的错误 |
0-0xFD |
DAQ-DTO(Data Acquisition-DTO) |
用于DAQ模式,由从设备定期向主设备发送。 根据对象描述表(ODT),确定需要上传的变量 |
CRM-Event Message报文帧格式
表3:场说明
PID(1 Byte) |
其值代表了DTO的类型 |
ERR(1 Byte) |
命令返回错误代码 |
CTR(1 Byte) |
命令计数器,与接收的相等。 |
Parameter and Data Field |
参数和数据场,命令相关的数据或参数 |
(2). DAQ-DTO(Data Acquisition-DTO)的报文帧:
3. 协议命令列表及说明(标注绿色字体部分逐步补充完整)
3.1 命令列表:
命令名称 |
代码 |
说明 |
CONNECT |
0x01 |
创建一个ECU的连接 |
0x02 |
设置MTA地址 |
|
0x03 |
下载最多5个字节数据到ECU |
|
DNLOAD_6 |
0x23 |
下载6个字节数据到ECU |
UPLOAD |
0x04 |
从ECU上载最多5个字节数据 |
SHORT_UP |
0x0F |
从ECU上载最多5个数据(不用MTA) |
DISCONNECT |
0x07 |
断开到该ECU的连接 |
GET_DAQ_SIZE |
0x14 |
得到指定DAQ列表大小 |
SET_DAQ_PTR |
0x15 |
选中某指定DAQ列表中某ODT的某元素 |
WRITE_DAQ |
0x16 |
设定该元素指定的地址 |
START_STOP |
0x06 |
开始/停止采集指定的DAQ列表 |
EXCHANGE_ID |
0x17 |
得到该ECU的标识符 |
GET_SEED |
0x12 |
得到计算密钥的种子(SEED) |
UNLOCK |
0x13 |
要求ECU释放某种功能 |
SET_S_STATUS |
0x0C |
设置当前会话状态 |
GET_S_STATUS |
0x0D |
得到当前会话状态 |
BUILD_CHKSUM |
0x0E |
计算指定区域的校验和 |
CLEAR_MEMORY |
0x10 |
清除某内存区域 |
0x18 |
||
PROGRAM_6 |
0x22 |
FLASH编程(6个字节) |
MOVE |
0x19 |
从MTA0处拷贝指定长度的字节到MTA1处 |
TEST |
0x05 |
测试当前在线的从设备 |
GET_ACTIVE_CAL_PAGE |
0x09 |
得到当前标定页(RAM or FLASH) |
DIAG_SERVICE |
0x20 |
|
ACTION_SERVICE |
0x21 |
|
3.2命令返回错误代码
代码 |
描述 |
种类 |
状态改变 |
0x00 |
正确接收,无错误 |
|
|
0x01 |
|
|
|
0x10 |
命令处理器忙 |
|
|
0x11 |
DAQ处理器忙 |
|
|
。。。 |
待续 |
|
|
3.3命令详细说明
3.3.1CONNECT命令:
命令接收对象(CRO):
位(bit) |
数据类型 |
描述 |
0 |
字节 |
命令代码(0x01) |
1 |
字节 |
命令计数器 |
2 |
字 |
站地址 |
4-7 |
字节 |
填0(不关心) |
数据传送对象(DTO):
位(bit) |
数据类型 |
描述 |
0 |
字节 |
命令代码(0xFF) |
1 |
字节 |
命令返回代码 |
2 |
字节 |
命令计数器 |
3-7 |
字节 |
填0(不关心) |
程序:connect命令
UINT8 Connect(UINT16 wStationAddr) {
UINT8pbCROData[8];
pbCROData[0] = CC_CONNECT;
pbCROData[1] = m_bCTR ++;
pbCROData[2] = (UINT8)(wStationAddr &0xFF);
pbCROData[3] = (UINT8)(wStationAddr >> 8);
pbCROData[4] = 0x00;
pbCROData[5] = 0x00;
pbCROData[6] = 0x00;
pbCROData[7] = 0x00;
UINT8bRlt;
UINT8pbDTOData[8];
if (CRC_OK != (bRlt = SendPackage(pbCROData,pbDTOData, TRANSMIT_TIMEOUT))) {
return bRlt;
}
// Response
// 0 Packet ID: 0xFF
// 1 Command Return Code
// 2 Command Counter = CTR
// 3..7 don't care
if (CRC_OK == pbDTOData[1]) {
m_bConnected = TRUE;
}
return pbDTOData[1];
}
3.3.2SET_MTA命令:
命令接收对象(CRO):
位(bit) |
数据类型 |
描述 |
0 |
字节 |
命令代码(0x02) |
1 |
字节 |
命令计数器 |
2 |
字节 |
存贮器传输地址(MTA0,MTA1) |
3 |
字节 |
地址扩展 |
4-7 |
无符号长整形 |
地址 |
数据传送对象(DTO):
0 |
字节 |
命令代码(0x01) |
1 |
字节 |
命令计数器 |
2 |
字 |
站地址 |
4-7 |
字节 |
填0(不关心) |
数据传送对象(DTO):
位(bit) |
数据类型 |
描述 |
0 |
字节 |
命令代码(0xFF) |
1 |
字节 |
命令返回代码 |
2 |
字节 |
命令计数器 |
3-7 |
字节 |
填0(不关心) |
3.3.2SET_MTA命令:
命令接收对象(CRO):
位(bit) |
数据类型 |
描述 |
0 |
字节 |
命令代码(0x02) |
1 |
字节 |
命令计数器 |
2 |
字节 |
存贮器传输地址(MTA0,MTA1) |
3 |
字节 |
地址扩展 |
4-7 |
无符号长整形 |
地址 |
数据传送对象(DTO):
位(bit) |
数据类型 |
描述 |
0 |
字节 |
命令代码(0xFF) |
1 |
字节 |
命令返回代码 |
2 |
字节 |
命令计数器 |
3-7 |
字节 |
填0(不关心) |
UINT8SetMTA(UINT8 bMTANumber, UINT8 bAddrExt, UINT32 dwAddr) {
UINT8pbCROData[8];
pbCROData[0]= CC_SET_MTA;
pbCROData[1] = m_bCTR ++;
pbCROData[2] = bMTANumber;
pbCROData[3] = bAddrExt;
pbCROData[4] = (UINT8)(dwAddr >> 24);
pbCROData[5] = (UINT8)(dwAddr >> 16);
pbCROData[6] = (UINT8)(dwAddr >> 8);
pbCROData[7] = (UINT8)(dwAddr >> 0);
UINT8bRlt;
UINT8pbDTOData[8];
// if (CRC_OK != (bRlt = SendMessage(pbCROData, pbDTOData,TRANSMIT_TIMEOUT))) {
if (CRC_OK != (bRlt = SendPackage(pbCROData,pbDTOData, 2000))) {
return bRlt;
}
// Response
// 0 Packet ID: 0xFF
// 1 Command Return Code
// 2 Command Counter = CTR
// 3..7 don't care
return pbDTOData[1];
}
数据类型 |
描述 |
|
0 |
字节 |
命令代码(0x03) |
1 |
字节 |
命令计数器 |
2 |
字节 |
需下传的数据长度 |
3-7 |
字节 |
数据 |
位(bit) |
数据类型 |
描述 |
0 |
字节 |
命令代码(0xFF) |
1 |
字节 |
命令返回代码 |
2 |
字节 |
命令计数器 |
3 |
字节 |
|
4-7 |
字节 |
执行后MTA0地址(即地址加上长度) |
UINT8Download(UINT8 &bSize, PUINT8 pbData, UINT8 &bExtAddr, UINT32&dwAddr) {
UINT8pbCROData[8];
UINT8i;
pbCROData[0] = CC_DNLOAD;
pbCROData[1] = m_bCTR ++;
pbCROData[2] = bSize;
if ((NULL == pbData)) {
return CRC_CMD_SYNTAX;
}
if (bSize > 5) {
bSize = 5;
}
for (i = 0; i < bSize; i ++) {
pbCROData[3 + i] = pbData[i];
}
for (; i < 5; i ++) {
pbCROData[3 + i] = 0x00;
}
UINT8bRlt;
UINT8pbDTOData[8];
if (CRC_OK != (bRlt = SendPackage(pbCROData,pbDTOData, TRANSMIT_TIMEOUT))) {
return bRlt;
}
// Response
// 0 Packet ID: 0xFF
// 1 Command Return Code
// 2 Command Counter = CTR
// 3 MTA0 extension (after post-increment)
// 4..7 MTA0 address (after post-increment)
bExtAddr = pbDTOData[3];
dwAddr= (((UINT32)pbDTOData[4]) << 24) ||
(((UINT32)pbDTOData[5]) << 16) ||
(((UINT32)pbDTOData[6]) << 8) ||
(((UINT32)pbDTOData[7]) << 0);
return pbDTOData[1];
}
3.3.4UPLOAD命令:
命令接收对象(CRO):
位(bit) |
数据类型 |
描述 |
0 |
字节 |
命令代码(0x04) |
1 |
字节 |
命令计数器 |
2 |
字节 |
需上传的数据长度 |
3-7 |
字节 |
填0 |
数据传送对象(DTO):
位(bit) |
数据类型 |
描述 |
0 |
字节 |
命令代码(0xFF) |
1 |
字节 |
命令返回代码 |
2 |
字节 |
命令计数器 |
3-7 |
字节 |
上传的数据 |
UINT8 Upload(UINT8 &bSize, PUINT8 pbData) {
UINT8pbCROData[8];
UINT8i;
if ((NULL == pbData)) {
return CRC_CMD_SYNTAX;
}
if (bSize > 5) {
bSize = 5;
}
pbCROData[0]= CC_UPLOAD;
pbCROData[1] = m_bCTR ++;
pbCROData[2] = bSize;
// don't care
pbCROData[3] = 0x00;
pbCROData[4] = 0x00;
pbCROData[5] = 0x00;
pbCROData[6] = 0x00;
pbCROData[7] = 0x00;
UINT8bRlt;
UINT8pbDTOData[8];
if (CRC_OK != (bRlt = SendPackage(pbCROData,pbDTOData, TRANSMIT_TIMEOUT))) {
return bRlt;
}
// Response
// 0 Packet ID: 0xFF
// 1 Command Return Code
// 2 Command Counter = CTR
// 3..7 requested data bytes
for (i = 0; i < bSize; i ++) {
pbData[i] = pbDTOData[3 + i];
}
return pbDTOData[1];
}
命令接收对象(CRO):
位(bit) |
数据类型 |
描述 |
0 |
字节 |
命令代码(0x0F) |
1 |
字节 |
命令计数器 |
2 |
字节 |
需上传的数据长度 |
3 |
字节 |
地址扩展 |
4-7 |
字节 |
地址 |
数据传送对象(DTO):
位(bit) |
数据类型 |
描述 |
0 |
字节 |
命令代码(0xFF) |
1 |
字节 |
命令返回代码 |
2 |
字节 |
命令计数器 |
3-7 |
字节 |
上传的数据 |
3.3.6DISCONNECT命令:
命令接收对象(CRO):
位(bit) |
数据类型 |
描述 |
0 |
字节 |
命令代码(0x07) |
1 |
字节 |
命令计数器 |
2 |
字节 |
0x00 暂时断开, 0x01 断开 |
3 |
字节 |
不关心 |
4-5 |
字节 |
站地址(低位在前) |
6-7 |
字节 |
填0(不关心) |
数据传送对象(DTO):
位(bit) |
数据类型 |
描述 |
0 |
字节 |
命令代码(0xFF) |
1 |
字节 |
命令返回代码 |
2 |
字节 |
命令计数器 |
3-7 |
字节 |
填0(不关心) |
UINT8 ShortUpload(UINT8 bSize, UINT8 bAddrExt, UINT32dwAddr, PUINT8 pbData) {
UINT8pbCROData[8];
UINT8i;
if ((NULL == pbData)) {
return CRC_CMD_SYNTAX;
}
if (bSize > 5) {
bSize = 5;
}
pbCROData[0] = CC_SHORT_UPLOAD;
pbCROData[1] = m_bCTR ++;
pbCROData[2] = bSize;
pbCROData[3] = bAddrExt;
pbCROData[4] = (UINT8)(dwAddr >> 24);
pbCROData[5] = (UINT8)(dwAddr >> 16);
pbCROData[6] = (UINT8)(dwAddr >> 8);
pbCROData[7] = (UINT8)(dwAddr >> 0);
UINT8bRlt;
UINT8pbDTOData[8];
if(CRC_OK != (bRlt = SendPackage(pbCROData, pbDTOData, TRANSMIT_TIMEOUT))) {
return bRlt;
}
// Response
// 0 Packet ID: 0xFF
// 1 Command Return Code
// 2 Command Counter = CTR
// 3..7 requested data bytes
for (i = 0; i < bSize; i ++) {
pbData[i] = pbDTOData[3 + i];
}
return pbDTOData[1];
}
3.3.7GET_DAQ_SIZE命令:
命令接收对象(CRO):
位(bit) |
数据类型 |
描述 |
0 |
字节 |
命令代码(0x14) |
1 |
字节 |
命令计数器 |
2 |
字节 |
DAQ表号(0,1…) |
3 |
字节 |
填0(不关心) |
4-7 |
字节 |
CAN 识别号(可选,暂不使用) |
数据传送对象(DTO):
位(bit) |
数据类型 |
描述 |
0 |
字节 |
命令代码(0xFF) |
1 |
字节 |
命令返回代码 |
2 |
字节 |
命令计数器 |
3 |
字节 |
该DAQ列表中ODT的数目 |
4 |
字节 |
该列表中第一个ODT表PID值 |
5-7 |
字节 |
填0(不关心) |
UINT8pbCROData[8];
pbCROData[0] = CC_GET_DAQ_SIZE;
pbCROData[1] = m_bCTR ++;
pbCROData[2] = bListNum;
// don't care
pbCROData[3]= 0x00;
pbCROData[4] = (UINT8)(dwCANId >> 24);
pbCROData[5] = (UINT8)(dwCANId >> 16);
pbCROData[6] = (UINT8)(dwCANId >> 8);
pbCROData[7] = (UINT8)(dwCANId >> 0);
UINT8bRlt;
UINT8pbDTOData[8];
if (CRC_OK != (bRlt = SendPackage(pbCROData,pbDTOData, TRANSMIT_TIMEOUT))) {
return bRlt;
}
// Response
// 0 Packet ID: 0xFF
// 1 Command Return Code
// 2 Command Counter = CTR
// 3 DAQ list size (= number of ODTs in this list)
// 4 Fisrt PID of DAQ list
// 5..7 don't care
bDAQListSize = pbDTOData[3];
bFirstPID = pbDTOData[4];
return pbDTOData[1];
}
3.3.8SET_DAQ_PTR命令:
命令接收对象(CRO):
位(bit) |
数据类型 |
描述 |
0 |
字节 |
命令代码(0x15) |
1 |
字节 |
命令计数器 |
2 |
字节 |
DAQ表号(0,1…) |
3 |
字节 |
QDT表号(0,1…) |
4 |
字节 |
ODT表里的元素(0,1…) |
5-7 |
字节 |
填0(不关心) |
数据传送对象(DTO):
位(bit) |
数据类型 |
描述 |
0 |
字节 |
命令代码(0xFF) |
1 |
字节 |
命令返回代码 |
2 |
字节 |
命令计数器 |
3-7 |
字节 |
填0(不关心) |
UINT8pbCROData[8];
pbCROData[0] = CC_SET_DAQ_PTR;
pbCROData[1] = m_bCTR ++;
pbCROData[2] = bListNum;
pbCROData[3] = bODTNum;
pbCROData[4] = bElementNum;
pbCROData[5]= 0x00;
pbCROData[6] = 0x00;
pbCROData[7] = 0x00;
UINT8bRlt;
UINT8pbDTOData[8];
if (CRC_OK != (bRlt = SendPackage(pbCROData,pbDTOData, TRANSMIT_TIMEOUT))) {
return bRlt;
}
// Response
// 0 Packet ID: 0xFF
// 1 Command Return Code
// 2 Command Counter = CTR
// 3..7 don't care
return pbDTOData[1];
3.3.9WTITE_DAQ命令:
命令接收对象(CRO):
位(bit) |
数据类型 |
描述 |
0 |
字节 |
命令代码(0x16) |
1 |
字节 |
命令计数器 |
2 |
字节 |
DAQ表中元素的长度(1,2,4) |
3 |
字节 |
表中元素的扩展地址 |
4-7 |
字节 |
表中元素的地址 |
数据传送对象(DTO):
位(bit) |
数据类型 |
描述 |
0 |
字节 |
命令代码(0xFF) |
1 |
字节 |
命令返回代码 |
2 |
字节 |
命令计数器 |
3-7 |
字节 |
填0(不关心) |
UINT8 pbCROData[8];
pbCROData[0] = CC_WRITE_DAQ;
pbCROData[1] = m_bCTR ++;
pbCROData[2] = bElementSize;
pbCROData[3] = bAddrExt;
pbCROData[4] = (UINT8)(dwAddr >> 24);
pbCROData[5] = (UINT8)(dwAddr >> 16);
pbCROData[6] = (UINT8)(dwAddr >> 8);
pbCROData[7] = (UINT8)(dwAddr >> 0);
UINT8bRlt;
UINT8pbDTOData[8];
if (CRC_OK != (bRlt = SendPackage(pbCROData,pbDTOData, TRANSMIT_TIMEOUT))) {
return bRlt;
}
// Response
// 0 Packet ID: 0xFF
// 1 Command Return Code
// 2 Command Counter = CTR
// 3..7 don't care
return pbDTOData[1];
位(bit) |
数据类型 |
描述 |
0 |
字节 |
命令代码(0x06) |
1 |
字节 |
命令计数器 |
2 |
字节 |
停止:0x00;启动:0x01;准备:0x02 |
3 |
字节 |
DAQ 列表数 |
4 |
字节 |
该DAQ列表中最后一张ODT表数 |
5 |
字节 |
触发事件数 |
6-7 |
字 |
发送速率分频系数 |
数据传送对象(DTO):
位(bit) |
数据类型 |
描述 |
0 |
字节 |
命令代码(0xFF) |
1 |
字节 |
命令返回代码 |
2 |
字节 |
命令计数器 |
3-7 |
字节 |
填0(不关心) |
UINT8 pbCROData[8];
pbCROData[0] = CC_START_STOP;
pbCROData[1] = m_bCTR ++;
pbCROData[2] = bMode;
pbCROData[3] = bDAQNum;
pbCROData[4] = bLastODTNum;
pbCROData[5] = bEventChannelNo;
pbCROData[6] = (UINT8)(wTransmissionRatePrescaler >> 8);
pbCROData[7] = (UINT8)(wTransmissionRatePrescaler >> 0);
UINT8bRlt;
UINT8pbDTOData[8];
if (CRC_OK != (bRlt = SendPackage(pbCROData,pbDTOData, TRANSMIT_TIMEOUT))) {
return bRlt;
}
// Response
// 0 Packet ID: 0xFF
// 1 Command Return Code
// 2 Command Counter = CTR
// 3..7 don't care
return pbDTOData[1];
3.3.11CLEAR_MEMORY命令:
命令接收对象(CRO):
位(bit) |
数据类型 |
描述 |
0 |
字节 |
命令代码(0x10) |
1-7 |
字节 |
填0(不关心) |
数据传送对象(DTO):
位(bit) |
数据类型 |
描述 |
0 |
字节 |
命令代码(0xFF) |
1 |
字节 |
命令返回代码 |
2 |
字节 |
命令计数器 |
3-7 |
字节 |
填0(不关心) |
3.3.12PROGRAM命令:
命令接收对象(CRO):
位(bit) |
数据类型 |
描述 |
0 |
字节 |
命令代码(0x18) |
1-7 |
字节 |
填0(不关心) |
数据传送对象(DTO):
位(bit) |
数据类型 |
描述 |
0 |
字节 |
命令代码(0xFF) |
1 |
字节 |
命令返回代码 |
2 |
字节 |
命令计数器 |
3-7 |
字节 |
填0(不关心) |
4、标定实现(举例)
建立完善的匹配标定具体流程为:与底层ECU进行连接,监控、在线标定,上载和下载map图,断开连接等操作。对于匹配标定的2个最主要的任务,就是在线标定和实时监控,它是通过协议命令的组合,来实现的,下面举例说明如何实现:
4.1监控命令解析:(假设有n张DAQ列表,每张列表中有m张ODT表)
序号 |
上位机 |
CCP |
CAN |
备注 |
1 |
设置监控变量列表,选择采样速率 |
|
|
(.A2L) |
2 |
|
GET_DAQ_SIZE |
发送 |
重复n次 |
3 |
|
CRM-DTO |
接收 |
重复n次 |
4 |
|
SET_DAQ_PTR |
发送 |
list 0~list m-1 |
5 |
|
CRM-DTO |
接收 |
list 0~list m-1 |
6 |
|
WRITE_DAQ |
发送 |
list 0~list m-1 |
7 |
|
CRM-DTO |
接收 |
list 0~list m-1 |
8 |
|
START_STOP |
发送 |
list 0~list n-1 |
9 |
|
CRM-DTO |
接收 |
list 0~list n-1 |
10 |
|
START_STOP_ALL |
发送 |
开始监控 |
11 |
|
CRM-DTO |
接收 |
|
12 |
|
DAQ-DTO |
接收 |
接收多次 |
13 |
显示 |
|
|
解码显示 |
14 |
|
START_STOP_ALL |
发送 |
停止显示 |
15 |
|
CRM-DTO |
接收 |
|
4.2 在线标定
标号 |
上位机 |
CCP |
CAN |
备注 |
1 |
修改数据 |
|
|
可能有n次 |
2 |
|
SET_MTA |
发送 |
|
3 |
|
CRM-DTO |
接收 |
|
4 |
|
DNLOAD |
发送 |
|
5 |
|
CRM-DTO |
接收 |
|
6 |
|
SHORT_UP |
发送 |
|
7 |
|
CRM-DTO |
接收 |
|
SETMTA 命令:
UINT8SetMTA(UINT8 bMTANumber, UINT8 bAddrExt, UINT32 dwAddr) {
UINT8pbCROData[8];
pbCROData[0]= CC_SET_MTA;
pbCROData[1] = m_bCTR ++;
pbCROData[2] = bMTANumber;
pbCROData[3] = bAddrExt;
pbCROData[4] = (UINT8)(dwAddr >> 24);
pbCROData[5] = (UINT8)(dwAddr >> 16);
pbCROData[6] = (UINT8)(dwAddr >> 8);
pbCROData[7] = (UINT8)(dwAddr >> 0);
UINT8bRlt;
UINT8pbDTOData[8];
// if (CRC_OK != (bRlt = SendMessage(pbCROData, pbDTOData,TRANSMIT_TIMEOUT))) {
if (CRC_OK != (bRlt = SendPackage(pbCROData,pbDTOData, 2000))) {
return bRlt;
}
// Response
// 0 Packet ID: 0xFF
// 1 Command Return Code
// 2 Command Counter = CTR
// 3..7 don't care
return pbDTOData[1];
}