Quantex GmbH
DE RU EN EL
Ваш регион: Европа

Руководство по J2534 для разработчиков

Последнее изменение:

Что такое J2534?

J2534 (часто называемый Pass-Thru) — это стандарт, разработанный SAE (Обществом автомобильных инженеров), который решает важную задачу: он позволяет одному и тому же программному обеспечению для диагностики работать с диагностическими адаптерами от разных производителей.

Основная идея:

Представьте, что вы пишете программу для диагностики автомобилей. Без стандарта J2534 вам пришлось бы писать уникальный код для каждого адаптера (K-Line, CAN-адаптер и т.д.), который вы хотите поддержать. Это сложно и дорого.

Стандарт J2534 определяет единый API (программный интерфейс), который производители адаптеров должны реализовать в своих драйверах. Страндарт определяет этот API только как DLL-библиотека для Windows

Для разработчика это означает:

Таким образом, J2534 — это "мост" между вашим приложением и диагностическим адаптером, который скрывает сложности конкретного оборудования и позволяет сосредоточиться на логике диагностики.

Многие клиенты кроме Windows, хотят использовтаь альтернативные платформы. Мы предлагаем помимо стандартной DLL для Windows, так же библиотеки для Linux, OSX_ а так же мобильных платформ Android и iOS.


Что J2534 не делает (Ваша зона ответственности)

Важно понимать, что J2534 — это стандарт для транспортного уровня. Он берёт на себя всю работу по отправке и приёму байтов данных по выбранному физическому интерфейсу (CAN, K-Line и т.д.).

Однако, стандарт J2534 не определяет:

Это остаётся задачей вашего приложения. Вы, как разработчик, должны знать, какие именно байты нужно отправить, чтобы запросить, например, коды ошибок или текущие параметры, и как разобрать ответ от блока управления.

Для этого вам потребуются знания прикладных протоколов диагностики, таких как:

J2534 DLL доставит ваши байты до ЭБУ, но что это за байты и что делать с ответом — решает ваша программа.


Обзор стандартов

Стандарт J2534 является частью большого семейства стандартов, регулирующих автомобильную диагностику. Для глубокого понимания рекомендуется ознакомиться с официальными документами.

Подробная таблица соотношения протоколов и стандартов

Адаптер ScanDoc реализует не полный вариант стандарта J2534-1 и некоторые расширения из J2534-2, а также имеет собственные функции для расширения возможностей.


Как начать работу (Пошаговое руководство)

Работа с J2534-адаптером из вашего приложения обычно следует этому алгоритму:

Шаг 1: Поиск и загрузка J2534 DLL

Каждый производитель J2534-адаптера предоставляет свою реализацию API в виде DLL-файла. При установке драйвера информация об этой DLL (путь к файлу) записывается в реестр Windows.

Ваше приложение должно:

  1. Найти доступные J2534-устройства в системном реестре.
  2. Предоставить пользователю выбор, какой адаптер использовать (если их несколько).
  3. Загрузить соответствующую DLL в память с помощью функции LoadLibrary (в Windows).

Шаг 2: Основной цикл работы с адаптером

После загрузки DLL и получения указателей на функции, типичный сеанс диагностики выглядит так:

  1. Открыть соединение с адаптером:
    Вызовите функцию PassThruOpen(), чтобы инициализировать связь с физическим устройством. В ответ вы получите DeviceID — уникальный идентификатор этого сеанса.
    // Пример
    unsigned long deviceID;
    long result = PassThruOpen(NULL, &deviceID);
  2. Установить канал связи с ЭБУ:
    Вызовите PassThruConnect(), чтобы установить логический канал связи с автомобилем по определённому протоколу (например, ISO15765 для CAN-шины). Вы указываете протокол, скорость и другие параметры. В ответ вы получаете ChannelID.
    // Пример
    unsigned long channelID;
    result = PassThruConnect(deviceID, ISO15765, 0, 500000, &channelID);
  3. Установить фильтры:
    Настройка фильтров — обязательный шаг. По умолчанию адаптер не будет принимать входящие сообщения, пока не будет сконфигурирован хотя бы один фильтр. Фильтры позволяют отсеять весь ненужный трафик в шине и получать только интересующие вас данные (например, ответы от конкретного ЭБУ). Для создания и настройки фильтров используется функция PassThruStartMsgFilter().
  4. Обмен данными:

    Процесс обмена данными является асинхронным и построен на очередях:

    • Отправка данных: Вызов функции PassThruWriteMsgs() не отправляет сообщение в шину немедленно. Вместо этого, она помещает одно или несколько сообщений в очередь на отправку и сразу же возвращает управление. Драйвер адаптера самостоятельно отправит эти сообщения из очереди, как только появится такая возможность.
    • Чтение данных: Приходящие из шины сообщения (например, ответы от ЭБУ) накапливаются во внутренней очереди приема. Функция PassThruReadMsgs() используется для извлечения сообщений из этой очереди.

    Важное замечание: Библиотека J2534 является однопоточной. Это значит, что все вызовы функций (PassThruWriteMsgs, PassThruReadMsgs и др.) для одного канала должны выполняться строго последовательно. Нельзя вызывать одну функцию, пока не завершилось выполнение предыдущей. Попытка одновременного вызова функций из разных потоков для одного и того же канала приведет к непредсказуемому поведению.

  5. Закрыть канал связи:
    После завершения работы с ЭБУ, закройте канал с помощью PassThruDisconnect().
    // Пример
    result = PassThruDisconnect(channelID);
  6. Закрыть соединение с адаптером:
    В самом конце, когда работа с адаптером полностью завершена, вызовите PassThruClose(), чтобы освободить устройство.
    // Пример
    result = PassThruClose(deviceID);

Этот цикл — основа любого J2534-приложения. В следующих разделах подробно описана каждая функция API и её параметры.


Обработка ошибок

Каждая функция J2534 API возвращает код состояния. Успешное выполнение всегда возвращает STATUS_NOERROR (значение 0). Любое другое значение указывает на конкретную ошибку (например, ERR_TIMEOUT, ERR_INVALID_CHANNEL_ID и т.д.).

Крайне важно проверять возвращаемое значение после каждого вызова функции.

Особый код ошибки — ERR_FAILED. Это общая, неспецифичная ошибка. Только в этом случае следует вызывать функцию PassThruGetLastError(), чтобы получить от драйвера более детальное, текстовое описание проблемы.

// Пример правильной обработки ошибок
long result = PassThruConnect(deviceID, ISO15765, 0, 500000, &channelID);
if (result != STATUS_NOERROR)
{
    printf("Ошибка PassThruConnect. Код: %ld\n", result);

    // Если ошибка общая, запрашиваем детали
    if (result == ERR_FAILED)
    {
        char errorDescription[80];
        PassThruGetLastError(&errorDescription[0], 80);
        printf("  Дополнительная информация: %s\n", errorDescription);
    }
    
    // Здесь может быть логика обработки других кодов ошибок
    // switch (result) { case ERR_TIMEOUT: ... }

    return; // Прерываем выполнение
}

Справочник стандартных функций J2534

Подробное описание каждой функции стандарта J2534 вынесено в справочник функций.