Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Малко помощ с декодиране на OBD2 - ISO 14230
http://mcu-bg.com/mcu_site/viewtopic.php?f=11&t=11428
Страница 1 от 2

Автор:  anio [ Пет Май 31, 2013 6:30 pm ]
Заглавие:  Малко помощ с декодиране на OBD2 - ISO 14230

Здравейте,
Имам един Нисан модел 2007 и се опитвам да си комуникирам с него през OBD2 като хоби проект с ЕЛМ327 адаптер. Опитах с много програми за всякакви ОС-та и никоя не успя да се върже с ЕКУ-то. Опитах и директно през серийния терминал да се вържа, но постоянно даваше BUS ERROR/NO DATA.
Най-накрая намерих един апп за андроид, който ползва явно някакви разширени кодове и с него работи. Проблемът е, че аз не искам да ползвам телефон в случая, а raspberry Pi или подобно. С hcidump на телефона успях да направя няколко дъмп-а на комуникацията, но нямам идея как да ги декодирам:
Код:
REQUEST:  ATZ
RESPONSE:  ATZ
RESPONSE: 
RESPONSE:  ELM327 v1.5>

REQUEST:  ATSP5
RESPONSE:  ATSP5OK>

REQUEST:  ATE0
RESPONSE:  ATE0OK>

REQUEST:  ATS0
RESPONSE:  OK>

REQUEST:  ATH1
RESPONSE:  OK>

REQUEST:  ATAT1
RESPONSE:  OK>

REQUEST:  ATST3A
RESPONSE:  OK>

REQUEST:  ATAL
RESPONSE:  OK>

REQUEST:  ATSH8110FC
RESPONSE:  OK>

REQUEST:  ATWM8110FC81
RESPONSE:  OK>

REQUEST:  3F
RESPONSE:  BUS INIT: ERROR>

REQUEST:  3F
RESPONSE:  BUS INIT: OK
RESPONSE:  83FC107F3F115E
RESPONSE:  >

REQUEST:  2211000401
RESPONSE:  87FC10621100E4010001EC
RESPONSE:  >

REQUEST:  2211200401
RESPONSE:  87FC10621120000C09114C
RESPONSE:  >

REQUEST:  1A81
RESPONSE:  87FC105A3145553430415D
RESPONSE:  >

REQUEST:  3E
RESPONSE:  81FC107E0B
RESPONSE:  >

REQUEST:  3106FFFF
RESPONSE:  82FC10710605
RESPONSE:  >

REQUEST:  3206
RESPONSE:  83FC107F3278B8
RESPONSE: 
RESPONSE:  >

Значи това, което успях да разбера е, че ползва physical addressing, но не мога да разбера как са кодирани.
Освен това ЕКУ-то в началото винаги връща BUS ERROR докато не му пратиш 3F и то понякога не само един път. Даже не знам какво значи 3F? Има и други команди без префикс "22" в лога (22 е за request с физически адрес) но и те не знам за какво са: 3206, 3106FFFF, 3E?

Проследих някои пид-ове:
Това е за "injector fuel"
request: 2212060401, ex. responses: 85FC1062120600EBF6, 85FC1062120600E7F2

Това е за "Base fuel schedule"
req: 2212080401, ex. responses: 85FC106212080FCCE8, 85FC106212080FE804

Това е за RPM(обороти) (но тук не съм 100% сигурен):
req: 2212010401, ex. response: 85FC10621201003D43

Моментна скорост: 2211020401, отговор, но тук изпуснах първата цифра: %4FC1062110200 (това е с 0km/h)

ECU-то дава BUS ERROR на пид 0100, а "BUS INIT: OK" само след "3F" команда. Стандартните ПИД-ове изобщо не ми се връзват с по-горните http://en.wikipedia.org/wiki/OBD-II_PIDs#Standard_PIDs

Накрая декомпилирах въпросната андроид програма до известна степен където разбрах, че ползват съвсем други команди. Примерно, за да се види кои пид-ове поддържа колата:
621100FFFFFFFF00 - първите 20
621120FFFFFFFF00 - вторите 20
и т.нт.

Проблемът е, че са ползвали тежки обфускатори за тая програма и най-важните части не могат да се видят :)

Много ще съм благодарен ако някой даде едно рамо. Ако е нужно ще дъмп-на още комникация.

Благодара предварително!

Автор:  CarBeta [ Пет Май 31, 2013 6:51 pm ]
Заглавие:  Re: Малко помощ с декодиране на OBD2 - ISO 14230

Това е комуникацията на андроида с ЕЛМ327 или нещо не съм разбрал?? Щото по ОБД'то не вървят такива АТ команди

Автор:  anio [ Пет Май 31, 2013 7:16 pm ]
Заглавие:  Re: Малко помощ с декодиране на OBD2 - ISO 14230

Да, това е комуникацията с ЕЛМ-а. В случая с ATH1 указва на елма да включи хедърите. С ATSH8110FC указва какъв да е хедъра "10" е адреса на ЕКУ-то, с което ще говори. Всяка команда започваща с "22" е директна комуникация с ЕКУ с адрес 10.
Всичко, което не започва с "АТ" ЕЛМ-а го обръща в хекс и го изпраща на ЕКУ-то като сам си смята последния байт, който е чексумата.

Автор:  _oXo_ [ Съб Юни 01, 2013 6:50 am ]
Заглавие:  Re: Малко помощ с декодиране на OBD2 - ISO 14230

попитах чичко гугъл и излезе това :

http://www.mp3car.com/vbulletin/attachm ... ematic.pdf

http://www.mp3car.com/vbulletin/attachm ... ssue_5.pdf

http://www.mp3car.com/vbulletin/attachm ... _ver_2.pdf


Нямам опит със Нисан ...

дано да съм бил полезен

Автор:  anio [ Съб Юни 01, 2013 9:54 am ]
Заглавие:  Re: Малко помощ с декодиране на OBD2 - ISO 14230

Мерси! Мисля, че ще ми свършат работа. Интересното е, че чичко гугъл от толкова време го питам и на мен не иска да ми ги каже тея неща :)

Автор:  _oXo_ [ Съб Юни 01, 2013 7:14 pm ]
Заглавие:  Re: Малко помощ с декодиране на OBD2 - ISO 14230

пиниза е във въпроса :))

пс. Да имаш опит с Volvo P1 или P3 платформите ?

Автор:  anio [ Пон Юни 03, 2013 9:20 am ]
Заглавие:  Re: Малко помощ с декодиране на OBD2 - ISO 14230

_oXo_ написа:
пиниза е във въпроса :))

пс. Да имаш опит с Volvo P1 или P3 платформите ?

За съжаление не знам нищо за волво.
А след като се зарових в исо-тата на 14230 разбрах структурата на протокола, но без спицифичните кодове от производителя няма как да ги дешифрирам. Някой да знае някой сайт с такива бази данни?

Автор:  _oXo_ [ Пон Юни 03, 2013 10:32 pm ]
Заглавие:  Re: Малко помощ с декодиране на OBD2 - ISO 14230

Нисан мисля че са под крилото на Рено - може да откриеш извесни прилики помежду им ... а може и да няма :(

Автор:  anio [ Пон Юни 03, 2013 10:44 pm ]
Заглавие:  Re: Малко помощ с декодиране на OBD2 - ISO 14230

Добре, че са братята китайци. С изключение на най-специфичните за нисан, които не са ми толкова нужни, всичко друго е подробно описано в стандартите SAE J2178_1, SAE J2178_2, SAE J2178_3, SAE J2178_4 и SAE J2190. А пдф-ите с тях са "доста" платени :)

Автор:  vgeorgiev [ Пон Юни 10, 2013 4:30 pm ]
Заглавие:  Re: Малко помощ с декодиране на OBD2 - ISO 14230

Виж тази тема.
Не ме кефи ЕЛМ-а. Има ли вариант да го накараш да работи без АТ команди ?

Ето какво знам аз по въпроса:
Съобщението е: [Format byte] [Target] [Source] [Data]...[Data] [CS]
Където:
Format byte: битове XXLL LLLL.
Ако XX = 10 -> физически адрес
Ако XX = 11 -> функционален адрес
LLLLLL определя дължината на данние и/или дали ще има байт
за дължина на данните.
Ако LLLLLL = 000000 - тогава имаме байт за дължина
(това не е нашия случай).
Ако LLLLLL е различно от 000000 тогава това число
определя броя на байтовете с данни.

ATSH8110FC
Това е команда за задаване на хедъра.
81 означава, че използваш физическо адресиране
10 е адреса на ЕКУто
FC е адреса на тестера

От лога ти:
REQUEST: 1A81
RESPONSE: 87FC105A3145553430415D

Това е рекует и респонс за някаква идентификация.
Ето например на Фиата какви са:

% read identification description
ReadId_2000, 0x1A, 0x80, "Identification code", 9, "Identification code", 1, "#scaling ascii 11 ", "Identification code", 1, "#scaling ascii 10 ", "Identification code", 1, "#scaling ascii 1 ", "Identification code", 1, "#scaling ascii 10 ", "Identification code", 1, "#scaling ascii 2 ", "Identification code", 1, "#scaling ascii 6 ", "Identification code", 1, "#scaling hex 5 ", "Identification code", 1, "#scaling ascii 10 ", "Identification code", 1, "#scaling hex 4 ";
ReadId_2000, 0x1A, 0x91, "FIAT drawing number", 1, "FIAT drawing number", 1, "#scaling ascii 11 ";
ReadId_2000, 0x1A, 0x92, "BOSCH HW number", 1, "BOSCH HW number", 1, "#scaling ascii 10 ";
ReadId_2000, 0x1A, 0x93, "BOSCH HW ver. number", 1, "BOSCH HW ver. number", 1, "#scaling ascii 1 ";
ReadId_2000, 0x1A, 0x94, "BOSCH SW number", 1, "BOSCH SW number", 1, "#scaling ascii 10 ";
ReadId_2000, 0x1A, 0x95, "BOSCH SW ver. number", 1, "BOSCH SW ver. number", 1, "#scaling ascii 2 ";
ReadId_2000, 0x1A, 0x96, "Homologation number", 1, "Homologation number", 1, "#scaling ascii 6 ";
ReadId_2000, 0x1A, 0x97, "ISO code", 1, "ISO code", 1, "#scaling hex 5 ";
ReadId_2000, 0x1A, 0x98, "Tester code", 1, "Tester code", 1, "#scaling ascii 10 ";
ReadId_2000, 0x1A, 0x99, "Programming date", 1, "Programming date", 1, "#scaling hex 4 ";



REQUEST: 3106FFFF
RESPONSE: 82FC10710605

Незнам какъв е рекуеста, но респонса ти е:
82 - 2 байта данни
FC - таргет адреса (тестера)
10 - сорс адреса (ЕКУ)
7106 да двата байта данни
05 е чек сумата


ЕЛМ интерфейса изпраща dummy данни, за да държи връзката жива. Тайм аута е 5 секунди.
Ето например как Унидиага държи връзката жива.
2752 send: 01
2753 echo: 01 OK
2758 send: 3E
2759 echo: 3E OK
2764 send: 3F
2765 echo: 3F OK
2793 rcvd: 01
2801 rcvd: 7E 7F

Имай в предвид, че тук комуникацията е без сорс и таргет адреси (защото може и така)

"
Това е за RPM(обороти) (но тук не съм 100% сигурен):
req: 2212010401, ex. response: 85FC10621201003D43
"
тук имаш 5 байта с данни: 621201003D, което е много голямо число.
Незнам как се смята.

Ето при мен как например мога да взема напрежението на акумулатора:
От Unidiag def файла: RDBLI_2000, 0x21, 0x43, "Battery voltage", 1, "Battery voltage", 1, "#scaling unsigned 2 (X*20.372 + 700)/1000 Volt";

изпращам: 820af12143
получавам: 61 43 02 44 [CS]
61 43 е отговора на 21 43 заявката.
02 44 са данние.

Това дава 580 десетично число.
(580 *20.372 + 700)/1000 Volt = 12,51V

Автор:  anio [ Пон Юни 10, 2013 6:31 pm ]
Заглавие:  Re: Малко помощ с декодиране на OBD2 - ISO 14230

Здравей, мерси за отговора!
Аз доста почетох и тези неща с физическия адрес ги разбрах. Успях от една андроид програма да изкарам всичките кодове, които ползва за моята кола.
REQUEST: 2211000401
RESPONSE: 87FC10621100E4010001EC
Това е рекуест за първите 20 поддържани ПИД-а. Щом изпращам командата с 22 отпред това означава readDataByCommonIdentifier.
REQUEST:
22 - readDataByCommonIdentifier
11 - recordCommonIdentifier (High Byte)
00 - recordCommonIdentifier (Low Byte)
04 - transmissionMode=[
single, //01
slow, //02
medium, //03
fast,//04
stop//05
]
01 - maximumNumberOfResponsesToSend (тоест само един отговор искам)

Отговорът значи:
87FC10 - хедър както ти си го описал
62 - успешен отговор (22+40). При не успешен е 7F
1100 - повторение на командата щом е успешно
E4010001 - 4 байта показващи кои от следващите 32 ПИД-а се поддържат. Това е същото като да пратя 0100 с функционална команда, но при мен не отговаря с нормалните команди.
EC - чек сума
Цитат:
"
Това е за RPM(обороти) (но тук не съм 100% сигурен):
req: 2212010401, ex. response: 85FC10621201003D43
"
тук имаш 5 байта с данни: 621201003D, което е много голямо число.
Незнам как се смята.

В случая командата ми за RPM e 1201
Отговор: 85FC10621201003D43 - където отговорът се състои само в двата байта 003D. Където по формулата за обороти би трябвало да се смята: ((A*256)+B)/4 = ((0*256)+0x3D)/4 = 15.25, но тук нещо не се връзва(освен ако не се умножи по 100).

Автор:  vgeorgiev [ Вто Юни 11, 2013 12:32 pm ]
Заглавие:  Re: Малко помощ с декодиране на OBD2 - ISO 14230

anio написа:
...В случая командата ми за RPM e 1201
Отговор: 85FC10621201003D43 - където отговорът се състои само в двата байта 003D. Където по формулата за обороти би трябвало да се смята: ((A*256)+B)/4 = ((0*256)+0x3D)/4 = 15.25, но тук нещо не се връзва(освен ако не се умножи по 100).

Рекуестнал си 221201 и си получил 85FC10621201003D43:
85 - 5 байта данни.
FC - tester
10 - ECU
621201003D - 5 байта данни, от които първите три (621201) са отговора на заявката.

003D - са самите обороти.
Това като десетично число е 61.
Умножи по 32 и получаваш 1952.
Формулите ги има в документите по-горе.

43 - чек сумата.

Защо делиш на 4 ?
старшия байт по 256 + младшия.

Защо не опиташ readDataByLocalIdentifier ?
Предполагам, че резултата ще е същия.

За Фиат common id не работи:
readDataByCommonIdentifier service
The service readDataByCommonIdentifier is not used in the FIAT implementation of protocol KWP2000.

Автор:  anio [ Вто Юни 11, 2013 6:00 pm ]
Заглавие:  Re: Малко помощ с декодиране на OBD2 - ISO 14230

Формулата за оборотите я взех от тук http://en.wikipedia.org/wiki/OBD-II_PIDs но явно не работи за моя случай.
readDataByLocalIdentifier не знам как да го ползвам при мен. Аз съм с Нисан 2007 год. Ползвам readDataByCommonIdentifier (22), защото както писах по-нагоре успях да извадя 300 пид-а за нисан от една платена програма и те всички се извикват с CommonIdentifier, но мога да прочета и за LocalIdentifier.
Това, което не можах да разбера, е смисълът на:
Цитат:
REQUEST: 3F
RESPONSE: BUS INIT: OK
RESPONSE: 83FC107F3F115E

Не знам това някакъв проблем специално с моето ECU ли е, защото тоя BUS винаги дава ERROR докато не му прати програмата поне 2 пъти тази команда 3F(която така и не разбрах за какво е).
Моето ECU е с 14320-4 (kwp2000) fast init, което доколкото разбрах е тегаво за инициализация. Ако се инициализира без ЕЛМ трябва да се инициализира точно както е написано в документа от линк-а по-горе с K-Line. Възможно ли е тази платената програма да прави такава инициализация, въпреки че се съмнявам да може да се прави подобно нещо през блутут?

Автор:  Vesko [ Вто Юни 11, 2013 9:27 pm ]
Заглавие:  Re: Малко помощ с декодиране на OBD2 - ISO 14230

Формулата от линк-а е само за OBD PID-вете. Тези, които се четът с $21 и $22 са специфични за всеки производител. И той сам с ги определя, както и мащабирането им. Тази информация не е публична. Май все пак е достъпна платена, но сигурно за много $.

А $3F e "Test Device Present" според SAE J2190. До колкото $7F е отговора при грешка, вероятно се ползва за да се провери има ли ECU връщащо грешка на съответният адрес.

В случая 7F3F11 -
7F - General Responce Message, така се връщат по принцип грешките
3F - Коя команда е предизвикала грешката
11 - Грешката е че командата не се подържа от ECU-то

Автор:  anio [ Нед Юни 16, 2013 4:13 pm ]
Заглавие:  Re: Малко помощ с декодиране на OBD2 - ISO 14230

Използвах наученото до тук и написах симулатор, по който после да си направя програмата, която чете от колата. Симулаторът работи с въпросния андроид апп все едно е вързан с колата.
Проблемът ми е, че когато всичко това го пробвам с истинския интерфейс в колата, немога да инициализирам ЕКУ-то. Стигам до 3F, но на мен постоянно ми връща BUS INIT: ERROR. Не знам дали не спазвам някакъв тайминг или апп-а успява през блутутът да вдига и сваля K и L линиите на серийния интерфейс на ЕКУ-то, за да го инициализира.
Много не съм на ясно със RS323, но не ми се вярва през блутут да може да се контролира на толкова ниско ниво особено като данните минават през ЕЛМ-а.

Страница 1 от 2 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/