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

        }

  • 相关阅读:
    Python--基本的对象类型(列表_可变的数据类型)
    Python--基本的对象类型(数字int和布尔值bool)
    Java项目目录结构
    linux- day1
    python学习笔记,视频day20-装饰器
    python学习笔记,视频day19-习题
    python学习笔记,视频day17、18-文件处理
    python学习笔记,视频day16 17-内置函数
    python学习笔记,视频day16-函数作用域,匿名函数,map,filter,reduce
    python学习笔记,视频day15-全局变量与局部变量、风湿理论、函数递归
  • 原文地址:https://www.cnblogs.com/cragoncanth/p/7261298.html
Copyright © 2020-2023  润新知