Примеры запрос-ответ представлены для аппаратного устройства CANBOX собственной разработки. Устройство посылает на CAN-шину пакеты на низком уровне, так же слушает шину, теоретически можно получать все сообщения на шине.
Адреса в протоколе общения с CANBOX имеют несколько нестандартный вид, вот таблица соответсвия в используемых адресах:
1F7C0000 - 7DFh - Широковещательный адрес. 1F800000 - 7E0h - Адрес ЭБУ двигателя. 1F840000 - 7E1h - Адрес ЭБУ коробки передач. 1FA00000 - 7E8h - Адрес ответа ЭБУ двигателя. 1FA40000 - 7E9h - Адрес ответа ЭБУ коробки передач.
Все сеансы общения представлены для автомобиля Mitsubishi Pajero Sport 2 поколения (год выпуска 2008). Щина соответсвует спецификациям CAN HS, скорость работы 500кбит/с.
Запрос-ответ PIDs 01h-20h:
ATSEND=00007C1F080201000000000000 S5E8D06000000A01F08064100883B801300 S608D06000000A41F080641008818001300
A B C D ID = 7E8h [88 3B 80 13] ID = 7E9h [88 18 00 13]
Расшифровка маски:
Поле | Значение | Код PID | Описание |
A7 | 1 | 01h | Monitor status since DTCs cleared. |
A6 | 0 | 02h | Freeze DTC |
A5 | 0 | 03h | Fuel system status |
A4 | 0 | 04h | Calculated engine load value |
A3 | 1 | 05h | Engine coolant temperature |
A2 | 0 | 06h | Short term fuel % trim—Bank 1 |
A1 | 0 | 07h | Long term fuel % trim—Bank 1 |
A0 | 0 | 08h | Short term fuel % trim—Bank 2 |
B7 | 0 | 09h | Long term fuel % trim—Bank 2 |
B6 | 0 | 0Ah | Fuel pressure |
B5 | 1/0 | 0Bh | Intake manifold absolute pressure |
B4 | 1 | 0Ch | Engine RPM |
B3 | 1 | 0Dh | Vehicle speed |
B2 | 0 | 0Eh | Timing advance |
B1 | 1/0 | 0Fh | Intake air temperature |
B0 | 1/0 | 10h | MAF air flow rate |
C7 | 1/0 | 11h | Throttle position |
C6 | 0 | 12h | Commanded secondary air status |
C5 | 0 | 13h | Oxygen sensors present |
C4 | 0 | 14h | Bank 1, Sensor 1: Oxygen sensor voltage |
C3 | 0 | 15h | Bank 1, Sensor 2: Oxygen sensor voltage |
C2 | 0 | 16h | Bank 1, Sensor 3: Oxygen sensor voltage |
C1 | 0 | 17h | Bank 1, Sensor 4: Oxygen sensor voltage |
C0 | 0 | 18h | Bank 2, Sensor 1: Oxygen sensor voltage |
D7 | 0 | 19h | Bank 2, Sensor 2: Oxygen sensor voltage |
D6 | 0 | 1Ah | Bank 2, Sensor 3: Oxygen sensor voltage |
D5 | 0 | 1Bh | Bank 2, Sensor 4: Oxygen sensor voltage |
D4 | 1 | 1Ch | OBD standards this vehicle conforms to |
D3 | 0 | 1Dh | Oxygen sensors present |
D2 | 0 | 1Eh | Auxiliary input status |
D1 | 1 | 1Fh | Run time since engine start |
D0 | 1 | 20h | PIDs 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 | Описание |
A7 | 1 | 21h | Distance traveled with malfunction indicator lamp (MIL) on |
A6 | 0 | 22h | Fuel rail Pressure (relative to manifold vacuum) |
A5 | 1 | 23h | Fuel rail Pressure (diesel, or gasoline direct inject) |
A4 | 0 | 24h | O2S1_WR_lambda(1): Equivalence Ratio Voltage |
A3 | 0 | 25h | O2S2_WR_lambda(1): Equivalence Ratio Voltage |
A2 | 0 | 26h | O2S3_WR_lambda(1): Equivalence Ratio Voltage |
A1 | 0 | 27h | O2S4_WR_lambda(1): Equivalence Ratio Voltage |
A0 | 0 | 28h | O2S5_WR_lambda(1): Equivalence Ratio Voltage |
B7 | 0 | 29h | O2S6_WR_lambda(1): Equivalence Ratio Voltage |
B6 | 0 | 2Ah | O2S7_WR_lambda(1): Equivalence Ratio Voltage |
B5 | 0 | 2Bh | O2S8_WR_lambda(1): Equivalence Ratio Voltage |
B4 | 1/0 | 2Ch | Commanded EGR |
B3 | 1/0 | 2Dh | EGR Error |
B2 | 0 | 2Eh | Commanded evaporative purge |
B1 | 0 | 2Fh | Fuel Level Input |
B0 | 1 | 30h | # of warm-ups since codes cleared |
C7 | 1 | 31h | Distance traveled since codes cleared |
C6 | 0 | 32h | Evap. System Vapor Pressure |
C5 | 1/0 | 33h | Barometric pressure |
C4 | 0 | 34h | O2S1_WR_lambda(1): Equivalence Ratio Current |
C3 | 0 | 35h | O2S2_WR_lambda(1): Equivalence Ratio Current |
C2 | 0 | 36h | O2S3_WR_lambda(1): Equivalence Ratio Current |
C1 | 0 | 37h | O2S4_WR_lambda(1): Equivalence Ratio Current |
C0 | 0 | 38h | O2S5_WR_lambda(1): Equivalence Ratio Current |
D7 | 0 | 39h | O2S6_WR_lambda(1): Equivalence Ratio Current |
D6 | 0 | 3Ah | O2S7_WR_lambda(1): Equivalence Ratio Current |
D5 | 0 | 3Bh | O2S8_WR_lambda(1): Equivalence Ratio Current |
D4 | 1/0 | 3Ch | Catalyst Temperature Bank 1, Sensor 1 |
D3 | 0 | 3Dh | Catalyst Temperature Bank 1, Sensor 2 |
D2 | 0 | 3Eh | Catalyst Temperature Bank 2, Sensor 1 |
D1 | 0 | 3Fh | Catalyst Temperature Bank 2, Sensor 1 |
D0 | 1 | 40h | PIDs 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 | Описание |
A7 | 0/1 | 41h | Monitor status this drive cycle |
A6 | 1 | 42h | Control module voltage |
A5 | 0 | 43h | Absolute load value |
A4 | 0 | 44h | Fuel/Air commanded equivalence ratio |
A3 | 1 | 45h | Relative throttle position |
A2 | 0 | 46h | Ambient air temperature |
A1 | 0 | 47h | Absolute throttle position B |
A0 | 0 | 48h | Absolute throttle position C |
B7 | 1/0 | 49h | Absolute throttle position D |
B6 | 1/0 | 4Ah | Absolute throttle position E |
B5 | 0 | 4Bh | Absolute throttle position F |
B4 | 1/0 | 4Ch | Commanded throttle actuator |
B3 | 1/0 | 4Dh | Time run with MIL on |
B2 | 1/0 | 4Eh | Time since trouble codes cleared |
B1 | 0 | 4Fh | Maximum value for equivalence ratio, oxygen sensor voltage, oxygen sensor current, and intake manifold absolute pressure |
B0 | 0 | 50h | Maximum value for air flow rate from mass air flow sensor |
C7 | 0 | 51h | Fuel Type |
C6 | 0 | 52h | Ethanol fuel % |
C5 | 0 | 53h | Absolute Evap system Vapor Pressure |
C4 | 0 | 54h | Evap system vapor pressure |
C3 | 0 | 55h | Short term secondary oxygen sensor trim bank 1 and bank 3 |
C2 | 0 | 56h | Long term secondary oxygen sensor trim bank 1 and bank 3 |
C1 | 0 | 57h | Short term secondary oxygen sensor trim bank 2 and bank 4 |
C0 | 0 | 58h | Long term secondary oxygen sensor trim bank 2 and bank 4 |
D7 | 0 | 59h | Fuel rail pressure (absolute) |
D6 | 0 | 5Ah | Relative accelerator pedal position |
D5 | 0 | 5Bh | Hybrid battery pack remaining life |
D4 | 0 | 5Ch | Engine oil temperature |
D3 | 0 | 5Dh | Fuel injection timing |
D2 | 0 | 5Eh | Engine fuel rate |
D1 | 0 | 5Fh | Emission requirements to which vehicle is designed |
D0 | 0 | 60h | PIDs supported [61 - 80] |
На последующие запросы масок поддержки PID 61-80h ответов не приходит. Это ожидаемо: бита поддержки данного запроса нет.
Что примечательно, за каждый запрос приходит по 2 ответа. По всей видимости, первый от ЭБУ двигателя (с адреса 7E8h), второй от ЭБУ коробки передач (с адреса 7E9h).
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
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-номера автомобиля:
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", что он означает - не совсем понятно, а вот и "расшифровка":
Запрос параметра:
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 | Комментарии |
01 | 00h | 06h | b0h | 00h | 00h | 2ch | 70h | 00h | 60h | 01h | T=4°C. Рычаг в "P". Обороты на входном валу: 773.5rpm. |
02 | 00h | 06h | aeh | 00h | 00h | 2dh | 70h | 00h | 5bh | 01h | T=5°C. |
03 | 00h | 00h | 00h | 00h | 00h | 2dh | 70h | 00h | ffh | 02h | Рычаг в "R". |
04 | 00h | 00h | 00h | 00h | 00h | 2dh | 6fh | 00h | ffh | 02h | |
05 | 00h | 00h | 00h | 00h | 00h | 2dh | 71h | 00h | ffh | 02h | |
06 | 00h | 00h | 00h | 00h | 00h | 2dh | 6fh | 00h | ffh | 02h | |
07 | 00h | 00h | 00h | 00h | 00h | 2dh | 70h | 00h | ffh | 02h | |
08 | 00h | 00h | 00h | 00h | 00h | 2dh | 71h | 00h | ffh | 02h | |
09 | 00h | 00h | 00h | 00h | 00h | 2dh | 70h | 00h | ffh | 02h | |
10 | 00h | 00h | 00h | 00h | 00h | 2eh | 70h | 00h | ffh | 02h | T=6°C. |
11 | 00h | 00h | 00h | 00h | 00h | 2eh | 70h | 00h | ffh | 02h | |
12 | 00h | 00h | 00h | 00h | 00h | 2eh | 71h | 00h | ffh | 02h | |
13 | 00h | 00h | 00h | 00h | 00h | 2eh | 71h | 00h | ffh | 02h | |
14 | 00h | 00h | 00h | 00h | 00h | 2eh | 6fh | 00h | ffh | 02h | |
15 | 00h | 00h | 00h | 00h | 00h | 2fh | 70h | 00h | ffh | 02h | T=7°C. |
16 | 00h | 00h | 00h | 00h | 00h | 30h | 70h | 00h | ffh | 02h | T=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"
Расшифровки параметров в комментариях. Визуально все совпадает с описанием из данного файла.
Провел дополнительные эксперименты по получению параметров. Формат вывода изменен. Сделал удобную прослойку в виде функции 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.