Описание процесса копания протокола OBD2

Примеры запрос-ответ представлены для аппаратного устройства CANBOX собственной разработки. Устройство посылает на CAN-шину пакеты на низком уровне, так же слушает шину, теоретически можно получать все сообщения на шине.

Адреса в протоколе общения с CANBOX имеют несколько нестандартный вид, вот таблица соответсвия в используемых адресах:

1F7C0000 - 7DFh - Широковещательный адрес.
1F800000 - 7E0h - Адрес ЭБУ двигателя.
1F840000 - 7E1h - Адрес ЭБУ коробки передач.
1FA00000 - 7E8h - Адрес ответа ЭБУ двигателя.
1FA40000 - 7E9h - Адрес ответа ЭБУ коробки передач.

Все сеансы общения представлены для автомобиля Mitsubishi Pajero Sport 2 поколения (год выпуска 2008). Щина соответсвует спецификациям CAN HS, скорость работы 500кбит/с.

Получение информации о поддержке стандартных PID

Запрос-ответ PIDs 01h-20h:

ATSEND=00007C1F080201000000000000
S5E8D06000000A01F08064100883B801300
S608D06000000A41F080641008818001300
            A  B  C  D
ID = 7E8h [88 3B 80 13]
ID = 7E9h [88 18 00 13]

Расшифровка маски:

ПолеЗначениеКод PIDОписание
A7101hMonitor status since DTCs cleared.
A6002hFreeze DTC
A5003hFuel system status
A4004hCalculated engine load value
A3105hEngine coolant temperature
A2006hShort term fuel % trim—Bank 1
A1007hLong term fuel % trim—Bank 1
A0008hShort term fuel % trim—Bank 2
B7009hLong term fuel % trim—Bank 2
B600AhFuel pressure
B51/00BhIntake manifold absolute pressure
B410ChEngine RPM
B310DhVehicle speed
B200EhTiming advance
B11/00FhIntake air temperature
B01/010hMAF air flow rate
C71/011hThrottle position
C6012hCommanded secondary air status
C5013hOxygen sensors present
C4014hBank 1, Sensor 1: Oxygen sensor voltage
C3015hBank 1, Sensor 2: Oxygen sensor voltage
C2016hBank 1, Sensor 3: Oxygen sensor voltage
C1017hBank 1, Sensor 4: Oxygen sensor voltage
C0018hBank 2, Sensor 1: Oxygen sensor voltage
D7019hBank 2, Sensor 2: Oxygen sensor voltage
D601AhBank 2, Sensor 3: Oxygen sensor voltage
D501BhBank 2, Sensor 4: Oxygen sensor voltage
D411ChOBD standards this vehicle conforms to
D301DhOxygen sensors present
D201EhAuxiliary input status
D111FhRun time since engine start
D0120hPIDs supported [21 - 40]

Запрос-ответ PIDs 21-40h:

ATSEND=00007C1F080201200000000000
SEA3307000000A01F08064120A019A01100
SEC3307000000A41F080641208001800100
            A  B  C  D
ID = 7E8h [A0 19 A0 11]
ID = 7E9h [80 01 80 01]

Расшифровка маски:

ПолеЗначениеКод PIDОписание
A7121hDistance traveled with malfunction indicator lamp (MIL) on
A6022hFuel rail Pressure (relative to manifold vacuum)
A5123hFuel rail Pressure (diesel, or gasoline direct inject)
A4024hO2S1_WR_lambda(1): Equivalence Ratio Voltage
A3025hO2S2_WR_lambda(1): Equivalence Ratio Voltage
A2026hO2S3_WR_lambda(1): Equivalence Ratio Voltage
A1027hO2S4_WR_lambda(1): Equivalence Ratio Voltage
A0028hO2S5_WR_lambda(1): Equivalence Ratio Voltage
B7029hO2S6_WR_lambda(1): Equivalence Ratio Voltage
B602AhO2S7_WR_lambda(1): Equivalence Ratio Voltage
B502BhO2S8_WR_lambda(1): Equivalence Ratio Voltage
B41/02ChCommanded EGR
B31/02DhEGR Error
B202EhCommanded evaporative purge
B102FhFuel Level Input
B0130h# of warm-ups since codes cleared
C7131hDistance traveled since codes cleared
C6032hEvap. System Vapor Pressure
C51/033hBarometric pressure
C4034hO2S1_WR_lambda(1): Equivalence Ratio Current
C3035hO2S2_WR_lambda(1): Equivalence Ratio Current
C2036hO2S3_WR_lambda(1): Equivalence Ratio Current
C1037hO2S4_WR_lambda(1): Equivalence Ratio Current
C0038hO2S5_WR_lambda(1): Equivalence Ratio Current
D7039hO2S6_WR_lambda(1): Equivalence Ratio Current
D603AhO2S7_WR_lambda(1): Equivalence Ratio Current
D503BhO2S8_WR_lambda(1): Equivalence Ratio Current
D41/03ChCatalyst Temperature Bank 1, Sensor 1
D303DhCatalyst Temperature Bank 1, Sensor 2
D203EhCatalyst Temperature Bank 2, Sensor 1
D103FhCatalyst Temperature Bank 2, Sensor 1
D0140hPIDs supported [41 - 60]

Запрос-ответ PIDs 21-40h:

ATSEND=00007C1F080201400000000000
SB44207000000A01F0806414048DC000000
SB74207000000A41F08064140C800000000
            A  B  C  D
ID = 7E8h [48 DC 00 00]
ID = 7E9h [C8 00 00 00]
ПолеЗначениеКод PIDОписание
A70/141hMonitor status this drive cycle
A6142hControl module voltage
A5043hAbsolute load value
A4044hFuel/Air commanded equivalence ratio
A3145hRelative throttle position
A2046hAmbient air temperature
A1047hAbsolute throttle position B
A0048hAbsolute throttle position C
B71/049hAbsolute throttle position D
B61/04AhAbsolute throttle position E
B504BhAbsolute throttle position F
B41/04ChCommanded throttle actuator
B31/04DhTime run with MIL on
B21/04EhTime since trouble codes cleared
B104FhMaximum value for equivalence ratio, oxygen sensor voltage, oxygen
sensor current, and intake manifold absolute pressure
B0050hMaximum value for air flow rate from mass air flow sensor
C7051hFuel Type
C6052hEthanol fuel %
C5053hAbsolute Evap system Vapor Pressure
C4054hEvap system vapor pressure
C3055hShort term secondary oxygen sensor trim bank 1 and bank 3
C2056hLong term secondary oxygen sensor trim bank 1 and bank 3
C1057hShort term secondary oxygen sensor trim bank 2 and bank 4
C0058hLong term secondary oxygen sensor trim bank 2 and bank 4
D7059hFuel rail pressure (absolute)
D605AhRelative accelerator pedal position
D505BhHybrid battery pack remaining life
D405ChEngine oil temperature
D305DhFuel injection timing
D205EhEngine fuel rate
D105FhEmission requirements to which vehicle is designed
D0060hPIDs supported [61 - 80]

На последующие запросы масок поддержки PID 61-80h ответов не приходит. Это ожидаемо: бита поддержки данного запроса нет.

Что примечательно, за каждый запрос приходит по 2 ответа. По всей видимости, первый от ЭБУ двигателя (с адреса 7E8h), второй от ЭБУ коробки передач (с адреса 7E9h).

Запросы температуры двигателя (PID=05h):

ATSEND=00007C1F080201050000000000
S210703000000A01F080341053900000000
S220703000000A41F080341053900000000

Ответа приходит 2 штуки. Вот полученный набор данных, запрашивалось несколько раз, видно увеличение температуры двигателя:

          A  B  C  D 
03 41 05 39 00 00 00 00  A-40 = 57-40 = 17°C
03 41 05 3A 00 00 00 00  A-40 = 58-40 = 18°C
03 41 05 3B 00 00 00 00  A-40 = 59-40 = 19°C
03 41 05 4B 00 00 00 00  A-40 = 75-40 = 35°C

Запросы оборотов коленчатого вала (PID=0Ch):

ATSEND=00007C1F0802010C0000000000
S81EA03000000A01F0804410C0D82000000
S85EA03000000A41F0804410C0D88000000
          A  B  C  D  
04 41 0C 0D 82 00 00 00  (256*A+B)/4 = 3458/4 = 864.5 rpm
04 41 0C 0D 88 00 00 00  (256*A+B)/4 = 3464/4 = 866.0 rpm
04 41 0C 0D 9B 00 00 00  (256*A+B)/4 = 3483/4 = 870.75 rpm
04 41 0C 0D 90 00 00 00  (256*A+B)/4 = 3472/4 = 868.0 rpm

Запрос VIN-номера

Один из стандартных запросов - это запрос VIN-номера автомобиля:

Send: 7DFh, Data: 02 09 02 00 00 00 00 00
Ans:  7E8h, Data: 10 14 49 02 01 4d 4d 43

Причем ответ не помещаетя в рамках одного пакета. ЭБУ по-умолчанию возвращает только 1ую строку, причем в течении 100мс после этого требуется запросить остальные строки:

Send: 7DFh, Data: 30 00 00 00 00 00 00 00
Ans:  7E8h, Data: 21 47 52 4b 48 38 30 39
Ans:  7E8h, Data: 22 46 5a 30 30 32 32 30

Вычленяем данные:

10 14 49 02 01 4d 4d 43
21 47 52 4b 48 38 30 39
22 46 5a 30 30 32 32 30

Начинается неким символом "01", что он означает - не совсем понятно, а вот и "расшифровка":

Запрос температуры АКПП (специфичный для NMPS)

Запрос параметра:

Send: 7DFh, Data: 02 21 02 00 00 00 00 00
Ans:  7E9h, Data: 10 0c 61 02 00 06 b0 00

Запрашиваем оставшиеся данные:

Send: 7DFh, Data: 30 00 00 00 00 00 00 00
Ans:  7E9h, Data: 21 00 2c 70 00 60 01 00

*** Лучше отправлять запросы не на широковещательный адрес 7DFh, а на адрес ЭБУ АКПП - 7E1h.

В процессе работы было сделано несколько запросов к АКПП с работающим двигателем. Так же провел переключение рычага в положение "R" (с включенным ручником, т.к. сидел на пассажирском). Последнее действие проведено, чтобы увидеть нагрев масла в АКПП, т.к. в данном режиме начинает работать гидротрансформатор и масляный насос. Температура на улице была примерно 3-4°C.

Итого, вернулись данные:

№ запросаA B C D E F G H I J Комментарии
0100h06hb0h00h00h2ch70h00h60h01hT=4°C.
Рычаг в "P".
Обороты на входном валу: 773.5rpm.
0200h06haeh00h00h2dh70h00h5bh01hT=5°C.
0300h00h00h00h00h2dh70h00hffh02hРычаг в "R".
0400h00h00h00h00h2dh6fh00hffh02h
0500h00h00h00h00h2dh71h00hffh02h
0600h00h00h00h00h2dh6fh00hffh02h
0700h00h00h00h00h2dh70h00hffh02h
0800h00h00h00h00h2dh71h00hffh02h
0900h00h00h00h00h2dh70h00hffh02h
1000h00h00h00h00h2eh70h00hffh02hT=6°C.
1100h00h00h00h00h2eh70h00hffh02h
1200h00h00h00h00h2eh71h00hffh02h
1300h00h00h00h00h2eh71h00hffh02h
1400h00h00h00h00h2eh6fh00hffh02h
1500h00h00h00h00h2fh70h00hffh02hT=7°C.
1600h00h00h00h00h30h70h00hffh02hT=8°C.

А вот описание из "плагина" к Torque Pro, правда, для Pajero 4, так что не все параметры могут совпадать:

"Pajero AT_V5A5A АКПП Обороты входного вала";"A/T-enter";"2102";"B*128+C*0.5";"0";"8000";"rpm";"7E1"
"Pajero AT_V5A5A АКПП Обороты выходного вала";"A/T-exit";"2102";"D*128+E*0.5";"0";"8000";"rpm";"7E1"
"Pajero AT_V5A5A Датчик температуры масла АКПП";"A/T temp";"2102";"F-40";"-40";"215";"град C";"7E1"
"Pajero AT_V5A5A Выходное напряжение реле контроля АКПП";"A/T contr";"2102";"G*33.15/255";"0";"31";"вольт";"7E1"
"Pajero AT_V5A5A Сигнал скорости автомобиля";"Speed";"2102";"H*714/255";"0";"200";"км/час";"7E1"
"Pajero AT_V5A5A Количество сцепления демпфера буксования";"Демпф букс";"2102";"I-51";"-51";"204";"об/мин";"7E1"
"Pajero AT_V5A5A АКПП Паркинг-Нейтраль";"A/T-P_N";"2102";"{J:0}";"0";"1";"off/on";"7E1"
"Pajero AT_V5A5A АКПП Задний ход";"A/T-Rev";"2102";"{J:1}";"0";"1";"off/on";"7E1"
"Pajero AT_V5A5A АКПП Первая передача";"A/T 1th";"2102";"{J:2}";"0";"1";"off/on";"7E1"
"Pajero AT_V5A5A АКПП Вторая передача";"A/T 2th";"2102";"{J:3}";"0";"1";"off/on";"7E1"
"Pajero AT_V5A5A АКПП Третья передача";"A/T 3th";"2102";"{J:4}";"0";"1";"off/on";"7E1"
"Pajero AT_V5A5A АКПП Четвертая передача";"A/T 4th";"2102";"{J:5}";"0";"1";"off/on";"7E1"
"Pajero AT_V5A5A АКПП Пятая передача";"A/T 5th";"2102";"{J:7}";"0";"1";"off/on";"7E1"

Расшифровки параметров в комментариях. Визуально все совпадает с описанием из данного файла.

Добавления 2015.12.13

Провел дополнительные эксперименты по получению параметров. Формат вывода изменен. Сделал удобную прослойку в виде функции get_pid(). В дальнейшем все будет модифицироваться, постепенно начну отходить от формата посылок, гуляющих по CAN-шине.

Запросы давления

get_pid(07df, 0123);
CAN SEND: 7dfh [02 01 23 00 00 00 00 00]
CAN RECV: 7e8h [04 41 23 19 53 00 00 00]

Давление топлива в рейке: 1953h = 6483*10 = 64830kPa ~ 650Атм. Сколько должно быть не знаю, запрос посылался на холостом ходу.

get_pid(07df, 0133);
CAN SEND: 7dfh [02 01 33 00 00 00 00 00]
CAN RECV: 7e8h [03 41 33 62 00 00 00 00]

Атмосферное давление: 62h = 98kPa. Нормальное значение, по-моему мнению, данные показатели на точность не претендуют (моя метеостанция на этот момент показала давление ~99.400Па, но в ней датчик с хорошей точностью).

get_pid(07df, 010b);
CAN SEND: 7dfh [02 01 0b 00 00 00 00 00]
CAN RECV: 7e8h [03 41 0b 65 00 00 00 00]

Давление во впускном коллекторе: 65h = 101kPa. Думаю, для холостого хода вполне нормальное значение, турбина на этих оборотах еще работать не должна, но небольшое превышение над атмосферным все-таки имеется.

Получение уровня топлива

В настоящий момент основная проблема - как получить уровень топлива. В списке поддержки стандартных PID-ов напротив бита Fuel Level Input (PID=2Fh) стоит предательский нолик. Если смотреть схемы, то на RV-Meter и на приборную панель приходит аналоговый сигнал с датчика в бензобаке. Конечно, можно обрабатывать непосредственно его, однако в найденном файле конфигурации для Torque Pro, обнаружены следующие строки:

"Pajero Panel Уровень топлива в баке","Fuel Level","21A3","(C-14)*0.88","0","88","litres","79E","1092"
"Pajero Panel Пробег автомобиля","Run","21AD","A+B*256+C*65536","0","1000000","km","79E","1092"

Похоже, вытащить с CAN-шины данные все-таки можно, запросив их из приборной панели. Однако, при попытках посылки получаем:

get_pid(07df, 21a3);
CAN SEND: 7dfh [02 21 a3 00 00 00 00 00]
CAN RECV: 7e9h [03 7f 21 12 00 09 f6 00]
get_pid(079e, 21a3);
CAN SEND: 79eh [02 21 a3 00 00 00 00 00]
Wait....................

Итого, на запрос, отправленный на стандартный адрес - ответ с непонятным телом (видимо, говорящий - поддержки нет). Если отправить на адрес 0x79E, то ответа не приходит. Есть только один шанс - посылка в ответ шлется с адресом из последнего столбца, т.е. 0x1092. Это предположение надо проверить, т.к. мои текущие фильтры этот адрес не пропускают... не соответствует это все стандартам.

Но в завершение, даже если ответ будет получен (хотя сомневаюсь, все-таки приборные панели Pajero Sport и Pajero 4 сильно отличаются), все-таки будет интереснее использовать показания с аналогового датчика, т.к. по формату ответа в CAN-посылке понятно, что разрешение там будем в районе 0.72л (следует из формулы). Так же обнаружил, что температура забортного воздуха на RV-Meter приходит так же напрямую с отдельного датчика.

UPD: запрашивать что-то от приборной панели в NMPS бессмысленно: она не имеет интерфейса CAN.

Ссылки

Original: http://igorkov.org/can-nmps,
Author: igorkov