Изучаю шину CAN J1939 через написание самописных утилит. Целенаправленно отключал датчик наддува для проверки своих программ. И здесь случай: Идёт выпуск машин на маршрут. На одном из автобусов АКПП не включается выше второй передачи. Сканера нет читать нечем. Но есть C, Linux, CANable, map_id_j1939, viz_j1939. Читать далее
Что делать, если утренний выпуск автобусов на линию под угрозой, дилерского сканера нет, а коробка-автомат наотрез отказывается переключаться выше второй передачи? Брать Linux, копеечный адаптер CANable и писать свои утилиты для разбора шины CAN. В этой заметке из ремзоны я покажу, как с помощью C и побитовых масок «на коленке» локализовать неисправность датчика в реальном времени.
Изучаю шину CAN J1939 через написание самописных утилит. Убежден, что создание собственных инструментов — это лучший способ глубоко разобраться в работе CAN-шины. В процессе тестов я намеренно отключал датчик наддува, чтобы проверить, как мои программы реагируют на ошибки и изменения в потоке данных - кстати , об этом эксперименте я писал в прошлой статье.
И вот реальный случай из практики. Утренний выпуск машин на маршрут, суета, и тут у одного из автобусов АКПП Voith наотрез отказывается переключаться выше второй передачи. Родного диагностического сканера под рукой нет — читать ошибки нечем. Зато со мной мой рабочий комплект: C, Linux, адаптер CANable и утилиты map_id_j1939 и viz_j1939.
Поиск имени интерфейса
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
Разбор структуры пакетаИдентификаторы (ID) J1939 мы читаем слева направо, начиная от нуля. Байт 3 — адресный (адрес источника / Source Address). Байты поля данных также читаем слева направо, но их отсчёт в спецификации SAE начинается с единицы:
SPN — упакован в 3-й, 4-й байты и три старших бита 5-го байта.
FMI — пять младших бит 5-го байта.
6-й байт — счётчик вхождений (Occurrence Count).
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, поэтому (>) означает сдвиг (>>)
Что в итогеДатчик частоты вращения выходного вала АКПП нестабильный (прыгающий) сигнал. Либо металлическая стружка на датчике, либо потребуется замена датчика. Если проблема в разъёме то FMI 3-6.
Открыт для стажировок по анализу и реверс-инжинирингу CAN J1939
Ссылка на github https://github.com/Data7Viz/data7-can
Канал для связи https://vk.ru/j1939
| # | Наименование новости | Тональность | Информативность | Дата публикации |
|---|---|---|---|---|
| 1 | АКПП Voith не включается выше второй передачи: разбираемся в J1939 | 0 | 7.51 | 06-08-2026 |
| 2 | Аномалия J1939 в CAN-шине: почему ЭБУ Weichai отправляет сообщение самому себе? Реверс-инжиниринг Weichai vs Yuchai | 0 | 9.63 | 22-07-2026 |
| 3 | Писать свои инструменты лучший способ изучить CAN-шину | 5 | 7 | 09-07-2026 |
| 4 | Бенчмаркая проверки границ: фикс, который шёл 8 лет, и проверка, которая жива до сих пор | 0 | 11.86 | 14-07-2026 |
| 5 | DPI для любопытствующих | 0 | 9.58 | 09-08-2026 |
| 6 | Обработка звука в реальном времени (или Full Duplex I2S на STM32) | 0 | 9.2 | 20-07-2026 |
| 7 | Разработка драйвера сетевого адаптера для Linux. Часть 2 | 0 | 8 | 30-06-2026 |
| 8 | Zynq 7000. HDMI для платы Zynq Mini и Linux | 0 | 7 | 15-07-2026 |
| 9 | Почему нельзя идеально оптимизировать светофоры: дело не в алгоритмах | 0 | 6.22 | 24-07-2026 |
| 10 | Когда контекстное окно кончается, а проект — нет | 5 | 7 | 23-06-2026 |