[CATARC_2017S] Week2

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 
A:电压
B:短期燃油调节


-100

1.275 
99.2

{ displaystyle { frac {A} {200}}}

 

{ displaystyle { frac {100} {128}} B-100}

 

(如果B == $ FF,传感器不用于修剪计算)

15

2

氧传感器2 
A:电压
B:短期燃油调节

   

16

2

氧气传感器3 
A:电压
B:短期燃油调节

17

2

氧传感器4 
A:电压
B:短期燃油调节

18

2

氧传感器5 
A:电压
B:短期燃油调节

19

2

氧传感器6 
A:电压
B:短期燃油调节

1A

2

氧传感器7 
A:电压
B:短期燃油调节

1B

2

氧传感器8 
A:电压
B:短期燃油调节

1C

1

本车符合的OBD标准

     

位编码。见下文

1D

1

氧传感器存在(4个银行)

     

类似于PID 13,但是[A0..A7] == [B1S1,B1S2,B2S1,B2S2,B3S1,B3S2,B4S1,B4S2]

1E

1

辅助输入状态

     

A0 == 电源
取消(PTO)状态(1 ==有效)[A1..A7]未使用

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 
AB:燃油空气等效比
CD:电压


0

<2 
<8

比率
V

{ displaystyle { frac {2} {65536}}(256A + B)}

 

{ displaystyle { frac {8} {65536}}(256C + D)}

 

25

4

氧传感器2 
AB:燃油空气等效比
CD:电压

   

26

4

氧气传感器3 
AB:燃油空气等效比
CD:电压

27

4

氧气传感器4 
AB:燃油空气等效比
CD:电压

28

4

氧气传感器5 
AB:燃油空气等效比
CD:电压

29

4

氧气传感器6 
AB:燃油空气等效比
CD:电压

2A

4

氧气传感器7 
AB:燃油空气等效比
CD:电压

2B

4

氧气传感器8 
AB:燃油空气等效比
CD:电压

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}}}

(AB是二进制补码[3]

33

1

绝对大气压力

0

255

千帕

{ displaystyle A}

34

4

氧气传感器1 
AB:燃油空气等效比
CD:电流


-128

<2 
<128

比例
mA

{ displaystyle { frac {2} {65536}}(256A + B)}

 

{ displaystyle { frac {256C + D} {256}} - 128}

 

要么 { displaystyle C + { frac {D} {256}} - 128}

35

4

氧气传感器2 
AB:燃油空气等效比
CD:电流

   

36

4

氧气传感器3 
AB:燃油空气等效比
CD:电流

37

4

氧传感器4 
AB:燃油空气等效比
CD:电流

38

4

氧气传感器5 
AB:燃油空气等效比
CD:电流

39

4

氧气传感器6 
AB:燃油空气等效比
CD:电流

3A

4

氧气传感器7 
AB:燃油空气等效比
CD:电流

3B

4

氧气传感器8 
AB:燃油空气等效比
CD:电流

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空转
B-125发动机点1 
C-125发动机点2 
D-125发动机点3 
E-125发动机点4

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是发动机空闲请求
B6是引擎停止请求*

第一种情况,假设OBD接口上只有一路CAN线,那么基本上你从OBD上能看到的CAN报文很可能并不是整车所有CAN总线上的全部报文,网络拓扑上一般都有一个专门的网关控制器 (也有用仪表控制器车身控制器来兼用的) 负责转发各条CAN线之间的报文

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的连接

SET_MTA

0x02

设置MTA地址

DNLOAD

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

清除某内存区域

PROGRAM

0x18

FLASH编程(最多5个字节)

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

DAQ处理器过载

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];

    }

 

3.3.3 DNLOAD命令:

命令接收对象(CRO):

位(bit)

数据类型

描述

0

字节

命令代码(0x03)

1

字节

命令计数器

2

字节

需下传的数据长度

3-7

字节

数据

数据传送对象(DTO):

位(bit)

数据类型

描述

0

字节

命令代码(0xFF)

1

字节

命令返回代码

2

字节

命令计数器

3

字节

MTA0扩展位

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];

    }

   

3.3.5 SHORT UPLOAD命令:

命令接收对象(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];

3.3.10 START-STOP命令:

位(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];

    }

原文地址:https://www.cnblogs.com/cragoncanth/p/7261298.html