Показать сообщение отдельно
Старый 14.12.2012, 16:17   #80
Kino
 
Kino
 
Адрес: Киев, м.Дарница
Возраст: 42
Сообщений: 3,659
Машина: Slavuta 1.3Li
Длина: 43480мкм
Диаметр: 35мм
Отправить сообщение для Kino с помощью ICQ
По умолчанию

Поиск текущих ошибок в ответе ЭСУД Микас.

Вот мне стало тут «нефиг делать», решил поделиться промежуточными этапами разбора протокола KWP2000. Так сказать, для общего развития. На примере микаса 7.6.

Давно известно, что микас 7.6 на запрос ReadDataByLocalIdentifier (0x82, 0x10, 0xF1, 0x21, 0x01, 0xA5) выдает ответ из 57 байтов (микас 10.3 немного больше).
Полностью расписывать каждый байт не буду, приведу картинку, на которой основные байты расписаны. Нас интересуют байты от 9 до 16, в них каждый бит отвечает за ошибку. В документации на протокол они называются «Слово флагов текущих неисправностей №xx».
По тексту будем их так и называть.



Так как в документации на протокол нет четкого описания данных ошибок, будем выпиливать их с помощью программы KWP_D. Очевидно, что на автомобиле Таврия/Славута такого количества ошибок быть не может, тем не менее вычислим все.

Что нам для этого надо? Программа KWP_D, сниффер порта (у меня portmonitor) и какой нибудь эмулятор протокола. В качестве последнего у меня лежит платка с контроллером avr.
Поехали. Запускаем kwp_d (настраиваем) и сниффер. Что видим? kwp_d посылает запрос на установку соединения с блоком.



Надо ответить. Ответ выглядит вот так: 0x83, 0xF1, 0x10, 0xC1, 0x6B, 0x8F, 0x3F. Отсылаем kwp_d эти байтики. Когда kwp_d прохавает этот ответ, он запросит чтение собственно основных параметров, тех, что на первой картинке. Запрос будет выглядеть вот так:


Для проверки правильности принятого ответа программой kwp_d, в некоторые параметры поставим заведомо известные значения. Надо учесть, что есть параметры, реальное значение которых необходимо вычислять по формуле. Например, тахометр поставим на 100, это в hex равно 0x64, положение дроссельной заслонкой на 25 градусов умноженное на 10, т.е. записать надо 250, в hex это 0xFA, УОЗ ставим на 10 гр. умноженное на 10, т.е. 100 = 0xFA, время впрыска надо умножать на 100, берем 4 мс * 1000 = 4000, в hex 0x0FA0. Температуру ОЖ надо писать на 40 градусов больше. Ставим 70 градусов, 70+40 = 100, в hex 0x6E. Для проверки достаточно. Скармливаем эту посылку kwp_d и смотрим результат.



Все параметры приняты правильно, ничего в процессе передачи не потерялось.
Переходим, собственно, к текущим ошибкам.



Ошибок нет, не удивительно, т.к. у нас байты 9-16 в нулях. Начнем с девятого байта. Попробуем записать в нулевой бит единичку.
00000001 = 0x01
Т.е. посылка выглядит так:



Отправляем, смотрим.


Поставим в единичку первый бит в этом байте. Нулевой оставим как есть, тоже в единичке, т.е. вот так 00000011 = 0x03.
Должна добавиться еще одна ошибка.



Отправляем, смотрим.



Идея понятна, дальше скриншотить не буду, аналогично ставим единички до 7 бита. И так для всех восьми байт (9-16).

В итоге имеем.


«Слово флагов текущих неисправностей №1» (9-й байт)


«Слово флагов текущих неисправностей №2» (10-й байт)


«Слово флагов текущих неисправностей №3» (11-й байт)


«Слово флагов текущих неисправностей №4» (12-й байт)


«Слово флагов текущих неисправностей №5» (13-й байт)


«Слово флагов текущих неисправностей №6» (14-й байт)


«Слово флагов текущих неисправностей №7» (15-й байт)


«Слово флагов текущих неисправностей №8» (16-й байт)


Спасибо за внимание.
Kino вне форума   Ответить с цитированием