В блоге:

2014-01-30

Протокол Suzuki через K-Line: соединение (практика прикладных программ)

Сузуковский протокол через K-Line условно соответствует ISO 14230-1 и ISO 14230-2 (первые две части Keyword Protocol 2000). Поэтому соединение с блоками управления осуществляется согласно этим стандартами. Расскажу более подробно.

В большинстве случаев протокол Suzuki через K-Line использует метод инициализации соединения под названием fast initialization (быстрая инициализация в противовес медленной 5-бодовой) ISO 14230-2. В спокойном состоянии линия находится в состоянии логической единицы. Для начала соединения нужно на 25 мс перевести линию в логический нуль, затем на 25 мс обратно в единицу. И сразу после этого отправить стартовое сообщение (в обычной конфигурации 8-N-1 со скоростью 10400 бод).

Практическая проблема в том, что указанные временные параметры (25 мс) нужно соблюдать с точностью 1 мс, иначе блок не распознает попытку начала соединения и ничего не ответит. На уровне отдельной железяки со своим микропроцессором в этом нет сложности (почему проще для соединения использовать ELM327 или тому подобное), а вот при прикладном программировании возникают небольшие проблемы.

Сейчас я применяю два практических способа fast initialization:

1. Управление через break. Во многих API последовательного порта есть возможность управления сигналом break. Break сигнал - это как раз нужный перевод линии в состояние логического нуля. Тогда алгоритм инициализации упрощенно выглядит так:

а) set break
б) sleep 25 ms
в) clear break
г) sleep 25 ms
д) write start message

Основная практическая проблема в том, что та же ОС Windows гуляет сама по себе: то свопится, то чешет спину. Выдержать нужные задержки в 25 мс с требуемой точностью сложно и нестабильно. Еще хуже, если PC медленный, а язык программирования высокоуровневый с промежуточными слоями библиотек.

2. Альтернативным способом без использования управления break является способ с отправкой данных на низкой скорости с дальнейшем переходом на 10400.

Поясню идею. Нужно отправить некие данные, которые бы дали 25 мс логического нуля, а затем 25 мс логической единицы. Если отправлять данные в конфигурации 8-N-1, то каждый отправленный байт состоит из последовательности битов: один старт-бит (логический ноль), восемь бит данных, один стоп-бит (логическая единица). Если отправляемые биты данных будут состоять из 4 нулевых битов и 4 единичных битов, то получается общая последовательность из 5 нулевых битов и 5 единичных. Каждые из этих 5 бит должны передаваться требуемые 25 мс, что дает скорость 1000/25*5=200 (бод). Поскольку данные передаются в "обратном" порядке, то требуемым байтом с 4 нулями и 4 единицами будет F0h. Тогда алгоритм инициализации упрощенно выглядит так:

а) set 200 baud rate
б) write F0h
в) set 10400 baud rate
г) write start message

Но проблема в том, что пункты в-г нужно выполнять только после физической передачи F0h. Практически для этого приходится между шагами б и в добавлять sleep 50 ms (в идеальном случае). Но здесь опять та же проблема с временными задержками.


Но не все так плохо. На практике эти способы работают, хотя и наблюдается сильная зависимость от PC, операционной системы и даже адаптера K-Line (хорошо, что их у меня два для тестирования). Результаты опыта:

1. Ноутбук Lenovo T60 c Windows XP. Старый, но по тем временам не такой медленный.

С адаптером VAG 409 достаточно надежно работают оба способа соединения (и управление break, и отправка F0h@200). Но для break-метода паузу приходится чуть уменьшать.

С адаптером Орион работает break-метод (тоже с уменьшением паузы), но не хочет стабильно работать метод F0h@200.

2. Ноутбук Asus Eee Pc T91MT с Windows 7. Поновее, но жутко медленный (тогдашние процессоры Intel Atom были редкостным барахлом), еще и Windows 7 "способствует".

Ни с одним из двух адаптеров не удается стабильно соединяться методом break (сильно плавает задержка). Но с обоими адаптерами работает метод F0h@200. С Орионовским даже получше, а для VAG 409 приходится чуть задержку увеличивать.

Поэтому в своей программе встроил автоподбор способа соединения. В результате первоначальные соединения не такие шустрые, как могли бы быть, но, надеюсь, будут работать на широком спектре ноутбуков.


А что касается 5-бодовой инициализации ISO 14230-2, то она, судя по разным источникам, используется, но с редкими видами блока SRS (DELCO и т.п. экзотикой). У меня нет такого блока, поэтому нет возможности тестирования.

0 comments:

Post a Comment

Blog Archive