Обновить

Обзор протокола J1939 (или нервная система грузовиков)

Уровень сложностиПростой
Время на прочтение10 мин
Охват и читатели9.5K
Всего голосов 15: ↑15 и ↓0+21
Комментарии29

Комментарии 29

отличный мануал, который самому приходится по сути пересказывать в работе. (копаю CAN-шины, в том числе J1939 с обратной стороны — расшифровываю логи, собираю DBC)

отличный мануал

Спасибо!

Не уверен насчёт отличного. Всё как обычно смешано в кучу.

Пример со скоростью вращения двигателя: множитель 1000, 4 байта. Это пример чего? Эта величина в 1939 имеет другой множитель и не занимает 4 байта.

Часть сообщений не транслируется непрерывно, а отправляется только по запросу.

ISO-TP может передаваться поверх 1939, никаких ограничений на это нет.

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

ISO-TP может передаваться поверх 1939, никаких ограничений на это нет.

Да. Мультиплексирование между ISO-TP или J1939 происходит как раз в структуре CAN-ID двумя битами (24 и 25): Extended Data Page (bit 25) и Data Page (bit 24) .

https://habr.com/ru/articles/798489/
Обзор Протокола ISO-TP [ISO 15765-2]

Очень доступно, интересно и познавательно. Работал с этим достаточно давно и изучал, но из статьи познал несколько моментов, которых до этого не знал.

Спасибо большое!

Спасибо большое!

Пожалуйста.

240 адресов хватает в современных реалиях?

Да, 254 адресов в J1939 более чем достаточно: в реальной технике обычно одновременно работает порядка 15–30 электронных блоков управления.

На практике ограничением современных систем является не адресное пространство, а пропускная способность классической CAN-шины — как правило, 250 или 500 кбит/с. Поэтому при увеличении количества устройств и объёма передаваемых данных сеть разделяют на несколько независимых CAN-сегментов, соединённых шлюзами. Каждый сегмент работает как отдельная сеть и использует собственное адресное пространство J1939.

Еще я сталкивался с тем, что сети делили по степени критичности: все важное, связанное с движением и безопасностью - в одну подсеть, а всякую второстепенную шляпу - в другую.

да, так и делают — разводят критичное и второстепенку по разным шинам.

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

Плюс критическую сеть часто делают с резервированием или на более надёжной топологии, а «шляпу» — попроще и подешевле.

240 адресов хватает в современных реалиях?

В одном пролете CAN шины может быть максимум 127 трансиверов.
Далее емкость между проводами CAN_L и CAN_H становится слишком высокой и электрические фронты смазываются.

я вообще не понял зачем адреса тут прикрутили. оригинальный canпрекрасен отсутвием адресов и проблем с ними связанных (адреса нужно назначать, легко возникает путаница, можно придумать каку нибуть автоматизацию раздачи адресов, но оно тоже может глючить). нужно просто отцеживать данные с нужным id причем фильтр "аппаратный". (собственно это почему то выделено как достоинство J1939 хотя адреса есть)

(адреса нужно назначать, легко возникает путаница, можно придумать каку нибуть автоматизацию раздачи адресов, но оно тоже может глючить).

Протокол DHCP для CAN.

Или как -то вручную прописывать J1939 адрес в NVRAM.

вот вот. подключил и оно как то само. DHCP кстати тоже не идеален и вместо него есть всякие другие придумки.

в dronecan вроде тоже вручную прописывать nodeid надобно, но там есть доп. конфигураторы. и исходники

Адресация на уровне протокола (Идентификаторы)

Вся адресация закладывается в ID сообщения (Identifier):

  • Standard CAN (2.0A): использует 11-битный ID. Это позволяет передавать до 2 048 уникальных идентификаторов.

  • Extended CAN (2.0B): использует 29-битный ID. Это дает более 536 миллионов уникальных идентификаторов.

Ограничения прикладных протоколов (CANopen, J1939)

Если поверх CAN готовый промышленный или автомобильный протокол, лимиты задаются им:

  • CANopen: жестко ограничивает сеть до 127 узлов (Node ID от 1 до 127) из-за структуры встроенных сервисных объектов (SDO/NMT). Обойти лимит можно только разделением сети на сегменты с помощью мостов (CAN-bridges) или шлюзов.

  • SAE J1939: использует 8 бит для адреса узла, что позволяет адресовать до 254 устройств на одной шине.

Отчксти,все упирается в то, что мы используем и как используем. Если это протокол над физикой и он имеет ограничения, то в них и упирается, а если делаем свой и используем физически CAN 2.0B то можем создавать свою адресация в рамках аппаратного. Да, делим на сегменты, ставим репитеры и так далее. Аналогично и у rs-485. Например стандартный MAX485 не может вытянуть более 32 узлов, сигнал заваливается, а вот уже 128 узлов вытягивает SP485R, но 256 он не может и для этого требуется MAX3485E. С шиной CAN аналогично: стандартный TJA1054 вытянет не более 32 узлов, в тоже время mcp2561 уже 110 узлов вытягивает. Нужно больше, ставим репитеры и не ограничиваем себя.

Каждый репитер создает новый изолированный физический сегмент. Если один сегмент на современных трансиверах (например, TCAN1042) тянет 110–128 узлов, то, соединив 4–8 сегментов через репитеры, можно физически подключить 500–1000 устройств.

Главное ограничение (Задержка сигнала): Физический репитер вносит задержку (обычно около 150–200 нс). Поскольку в CAN-шине критически важен одновременный арбитраж (все узлы должны услышать друг друга в пределах одного бита), каждый репитер эквивалентен удлинению кабеля примерно на 30–40 метров.

Следствие: На скорости 1 Мбит/с вы сможете поставить максимум 1–2 репитера. Чтобы построить сеть из 5–8 физических сегментов на репитерах, вам придется снизить скорость шины до 50–125 кбит/с.

И шина CAN шина - арбитражная (мультимастерная), следовательно В CAN-шине каждый узел во время отправки ID одновременно слушает линию. Чем больше физических узлов на линии, тем сильнее падает эффективная скорость сети. Поэтому сеть можно сделать больше, длиннее, но эффективность её станет настолько низкой, что будет в определённые моменты времени бесполезной.

Любую техническую систему не стоит загружать больше чем на 70 процентов .

По хорошему (и как мы привыкли на пост советском пространстве) желательно вообще иметь 100% запас.

а кстати кто нибуть знает готовые модули/блоки CAN репитеров без лишнего ?

готовые модули/блоки CAN репитеров 

Можно запрограммировать на отладочное плате JZ-F407VET6 
https://habr.com/ru/articles/988494/

Да как то особо не приходилось использовать репитеры, но можно сделать на 2х копеечных трансиверах и одном микроконтроллере типа stm32 или esp32 (с 2-мя CAN портами)

а кстати кто нибуть знает готовые модули/блоки CAN репитеров без лишнего ?

У нас на работе есть свое внутренне решение.
Отличный переходник с USB на два CAN-а.
Прибор можно запрограммировать, как CAN-повторитель для удлинения мегабитной шины. Но я не знаю про то хотят или будут ли его делать на продажу для этого.
@0xdefec8ed

не не, меня интересовал прям готовый вариант "сбегать и купить" в случае резкой необходимости.

однако тут я гляжу интереснее: я то подразумевал в каком то смысле пассивный удлинитель "a la realay" чисто для физического уровня. по контексту же тут предлагается активный по сути маршрутизатор. я так понимаю все дело в этой самой задержке на ответ?

Лет 20 назад подобное решение было в одном из промышленных счетчиков электроэнергии: в документации написано CAN, а по факту UART на трансиверах. Если не используется аппаратный арбитраж по монтажному ИЛИ, то RS-485 гораздо лучше.

Ну и виртуозы!

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

Можно попробовать собрать can медиа конвертор. Вообще без микроконтроллера. Просто взять два чипа физики CAN трансивера и соединить их rx в tx. Подать питание.

ну да, да, я про это. Готовое есть? (а если нет то почему, вроде вещь иногда нужная).

Не-а, так не работает, я попробовал. Нужно арбитраж направления ставить, но с ним не всегда работает корректно. Лучше через микроконтроллер.

Как то так выглядит логика арбитража:

Взято отсюда

Принято, уже спасибо.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации