Заметка из ремзоны: C + Linux = Диагностика.

Что делать, если утренний выпуск автобусов на линию под угрозой, дилерского сканера нет, а коробка-автомат наотрез отказывается переключаться выше второй передачи? Брать Linux, копеечный адаптер CANable и писать свои утилиты для разбора шины CAN. В этой заметке из ремзоны я покажу, как с помощью C и побитовых масок «на коленке» локализовать неисправность датчика в реальном времени.

Изучаю шину CAN J1939 через написание самописных утилит. Убежден, что создание собственных инструментов — это лучший способ глубоко разобраться в работе CAN-шины. В процессе тестов я намеренно отключал датчик наддува, чтобы проверить, как мои программы реагируют на ошибки и изменения в потоке данных - кстати , об этом эксперименте я писал в прошлой статье.

И вот реальный случай из практики. Утренний выпуск машин на маршрут, суета, и тут у одного из автобусов АКПП Voith наотрез отказывается переключаться выше второй передачи. Родного диагностического сканера под рукой нет — читать ошибки нечем. Зато со мной мой рабочий комплект: C, Linux, адаптер CANable и утилиты map_id_j1939 и viz_j1939.

Подключение CANable

  • Поиск имени интерфейса

  • ls /dev/ttyACM*

  • Привязать порт к CAN интерфейсу

  • sudo slcand -o -c -s5 (имя интерфейса) can0

  • Включить интерфейс

  • sudo ip link set can0 up

  • Проверка работоспособности

  • candump -t a can0 > file

Запуск интерфейса
Запуск интерфейса

Снимаем логи записываем в файл

candump -t a can0 > error_akpp

Фильтрация в утилите viz_J1939

Для выделения нужных данных используем маску идентификатора (ID J1939) расширенного формата (29 бит) детали структуры (25-й, 26-й бит ID) пока опустим:

pgn = (id >> 8) & 0xFFFF;

if (pgn == 0xFECA) { ... }

0xFECA (DM1) — это вещательный диагностический номер группы параметров (PGN), который содержит активные диагностические коды неисправностей (DTC). По сути, он транслирует текущее состояние системы. Блоки пневмоподвески (ECAS) , тормозной системы (ABS/EBS), управления двигателем (ЭБУ) и АКПП постоянно передают эти данные из оперативной памяти в шину в реальном времени. Данные же из энергонезависимой памяти (сохраненные ошибки) доступны только по запросу.

./viz_j1939 error_akpp

Результат фильтрации и разбора пакетов 0xFECA утилитой viz_j1939
Результат фильтрации и разбора пакетов 0xFECA утилитой viz_j1939

Разбор структуры пакета

Идентификаторы (ID) J1939 мы читаем слева направо, начиная от нуля. Байт 3 — адресный (адрес источника / Source Address). Байты поля данных также читаем слева направо, но их отсчёт в спецификации SAE начинается с единицы:

  • SPN — упакован в 3-й, 4-й байты и три старших бита 5-го байта.

  • FMI — пять младших бит 5-го байта.

  • 6-й байт — счётчик вхождений (Occurrence Count).

Разбираем байты 3, 4, 5 и 6 из нашего лога

  • 0x00 — ДВС (система чистая)

  • 0x0B — тормозная система ABS/EBS (система чистая)

  • 0x2F — пневмоподвеска ECAS (система чистая)

  • 0x03 — АКПП (активная ошибка)

Поле данных ошибки от АКПП: A1 02 0A 7E.

Учитывая порядок байт Little-Endian (младший байт впереёд), собираем SPN из байта 3, байта 4 и верхушки байта 5. Получаем: 0x2A1.

  • SPN 673 (0x2A1) — частота вращения выходного вала АКПП.

  • FMI 10 (0x0A) — аномальная скорость изменения (Abnormal Rate of Change).

  • 6-й байт (0x7E) — счётчик зафиксировал 126 повторений

Код написан на switch, поэтому (>) означает сдвиг (>>)
Код написан на switch, поэтому (>) означает сдвиг (>>)

Что в итоге

Датчик частоты вращения выходного вала АКПП нестабильный (прыгающий) сигнал. Либо металлическая стружка на датчике, либо потребуется замена датчика. Если проблема в разъёме то FMI 3-6.

Открыт для стажировок по анализу и реверс-инжинирингу CAN J1939

Ссылка на github https://github.com/Data7Viz/data7-can

Канал для связи https://vk.ru/j1939

Комментарии (18)


  1. vesper-bot
    06.08.2026 19:17

    А с коробкой в итоге что сделали? Датчик прочистили и поехало, или таки менять пришлось?


    1. DMGarikk
      06.08.2026 19:17

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


    1. DataViz Автор
      06.08.2026 19:17

      Дело было уже в конце смены. Машина осталась в день. Чем всё закончилось не знаю.


      1. vvzvlad
        06.08.2026 19:17

        "Что делать, если утренний выпуск автобусов на линию под угрозой, дилерского сканера нет, а коробка-автомат наотрез отказывается переключаться выше второй передачи?"

        Хз, поиграться и уйди домой, какая разница что там


  1. radioxoma
    06.08.2026 19:17

    Хорошую вещь 0xFECA не назовут…


  1. xacler
    06.08.2026 19:17

    Отличный разбор, спасибо! Сам как раз изучаю J1939, твой подход с самописными утилитами на C — это мощно. Подскажи, а утилиты viz_j1939 и map_id_j1939 у тебя в открытом доступе? Полезно было бы посмотреть код, чтобы лучше понять парсинг DTC. И с каким именно адаптером CANable работаешь — MCP2515 или другой?


    1. DataViz Автор
      06.08.2026 19:17

      Пожалуйста. Утилиты на github в открытом доступе. На корпусе написано Makerbase CANable V2.0 Pro какая микросхема не знаю


    1. NutsUnderline
      06.08.2026 19:17

      CANable и MCP2515 это две разные сущности. MCP2515 отдельная микруха которую подключают к малинкам и ардуинкам. usb - в адаптерах на stm32


  1. ildus78
    06.08.2026 19:17

    1. Адаптер Canable следует первым делом перепрошить в адаптер PCAN

    2. Вместо Linux+C установить драйверы PCAN и использовать TsMaster - пользуюсь им каждый день при разработке встроенного ПО для ЭБУ, покрывает абсолютно все потребности в изучении, диагностике и экспериментах.

    3. Весь стек протоколов SAE J1939 очень хорошо документирован, все документы стандарта (хоть он и платный) можно (если очень постараться), найти в открытом доступе.


  1. Planet_Dust
    06.08.2026 19:17

    ЛиАЗ-5292? =)


    1. DataViz Автор
      06.08.2026 19:17

      Volgabus


  1. Byteman
    06.08.2026 19:17

    Следующим шагом я бы попытался разобраться, как получить в реальном времени данные с датчика да положил это всё на график - стало бы видно, датчик барахлит (пропадание сигнала/контакты), или всё же сам вал вращается не так, как хотелось бы...


  1. muxa_ru
    06.08.2026 19:17

    Что делать, если утренний выпуск автобусов на линию под угрозой, дилерского сканера нет, а коробка-автомат наотрез отказывается переключаться выше второй передачи?

    Я правильно понимаю, что Вы работаете в лицензируемой сфере общественного транспорта и лезете внутрь опасного оборудования несертифицированными работниками с помощью самописного софта?


    1. DMGarikk
      06.08.2026 19:17

      ...вы ещё не знаете как на ЖД вагоны в рейс выпускают...а там людей побольше чем в автобусе...


      1. muxa_ru
        06.08.2026 19:17

        А это нарушение регламентов?


        1. DMGarikk
          06.08.2026 19:17

          Если бы это было не нарушением, я бы это не упомянул

          Если возникает риск сорвать график, вагон может и без пробы и настройки тормозов в рейс уехать. И с недособранной ходовой частью.

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

          Насколько я знаю маразм с преклонением к графику никуда не делся и в 2026 году. Также как и попытка скрыть критические неисправности в пунктах оборота в неродных депо (чтобы им не платить за ремонт...потому что если так сделаешь, останешся без премии, а то и с рейсов снимут в наказание)


    1. yahooyaks
      06.08.2026 19:17

      В ремзону работать взяли - значит сертифицированный.


  1. Riedl
    06.08.2026 19:17

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