CAN-scanner

1. Назначение CAN-сканера

Практически любой современный автомобиль (и другая подвижная техника) буквально напичкан множеством различных датчиков. Эти датчики непрерывно собирают огромное количество различных параметров работы узлов и агрегатов техники и передают их для обработки в электронный блок управления (ЭБУ). Причем таких ЭБУ в автомобиле может быть несколько, до 80! Это настоящий мозг автомобиля. Он сигнализирует о неполадках, облегчает управление и эксплуатацию, следит за безопасностью, развлекает водителя и пассажиров и вообще делает их нахождение внутри автомобиля комфортным. Кроме сбора данных с датчиков, ЭБУ также отдает команды различным исполнительным механизмам. Для связи ЭБУ между собой, а также со всеми датчиками и исполнительными механизмами служит CAN-шина.Подключиться к CAN-шине достаточно просто. Все выпускаемые терминалы линейки FORT позволяют сделать это. Процесс подключения подробно описан в соответствующем Руководстве по эксплуатации. Но само по себе наличие такого подключения ничего не дает, кроме того, что терминал начинает "слушать" CAN-шину. Для терминала информация из CAN-шины — это лишь бессмысленный поток нолей и единиц. И лишь при помощи специальной программы, CAN-сканера, эту ситуацию возможно изменитьДело в том, что данные в CAN-шине передаются в виде пакетов. Формат этих пакетов определяется протоколом. Терминалы FORT могут подключаться к CAN-шинам, использующим протокол J1939. Он является наиболее распространенным и применяется большинством производителей грузовых автомобилей, автобусов, сельскохозяйственной и специальной техники. Протокол J1939 определяет формат пакета, где содержится в том числе идентификатор пакета и блок данных объемом до 8 байт. Но, во-первых, каждую минуту через CAN-шину проходят тысячи пакетов с разными идентификаторами и разными данными. А во-вторых, каждый автопроизводитель сам решает, какой байт или даже бит, и в каком пакете у него будет содержать ту или иную информацию. Единый стандарт отсутствует.Например, Производитель 1 решил, что в 3-м байте пакета с заголовком 044А у него будет информация об уровне топлива в левом баке. А Производитель 2 решил разместить по тому же адресу значение напряжения в бортовой сети автомобиля. Мало того, к каждому значению могут применяться еще и различные множители. Например, какой-то байт содержит число 80. И только производителю известно, что на самом деле это температура окружающего воздуха умноженная на 4. Увы, и это еще не все. Адресация данных в CAN-шине для одинаковой модели автомобиля одного производителя может отличаться в зависимости от года выпуска. Есть и другие подводные камни, перечислять которые нет смысла. Главное, что программа CAN-сканер позволит инженеру или установщику отыскать нужный параметр среди множества пакетов. А затем передать этот параметр в систему Fort Monitor для дальнейшей обработки и отображения.

2. Функционал CAN-сканера

Функции
1 Отображение принимаемых параметров и их изменение в реальном времени
2 Поиск значений с заданным отклонением и коэффициентами
3 Поиск дискретных значений
4 Отображение байтов и битов выбранного параметра
5 Наложение маски и отображение подсчитанного значения
6 Построение графика значения маски
7 Составление списка отобранных масок с отображением их значений в реальном времени
8 Отслеживание либо скрытие некоторых параметров
9

Подсвечивание изменяющихся байтов

10 Фильтрация параметров по различным критериям (отслеживаемые, скрытые, изменяющиеся, найденные)
11 Отображение графиков по каждому байту каждого параметра в реальном времени
12 Запись лога принятых данных и его воспроизведение без подключенного терминала

CanScan.zip — с примерами снятых логов

3. Запуск CAN-сканера в Конфигураторе

  1. Удостовериться что терминал подключен к CAN шине транспортного средства (см. инструкцию к терминалу)
  2. Настроить параметры подключения к CAN в конфигураторе (см. инструкцию к конфигуратору)
  3. Открыть CAN сканер.
  4. Нажать кнопку "Запустить". Если п.п. 1 и 2 выполнены верно, то начнут отображаться принимаемые данные

4. Описание интерфейса CAN-сканера

cs1.png

  1. Кнопки управления. Позволяют считать и записать лог сообщений из CAN-шины. Запустить и остановить загруженный лог
  2. Выбранный пакет данных из CAN-шины. Выбор пакета осуществляется кликом мыши по любой строке в панели (3) (см. ниже). ID выбранного пакета отображается справа над панелью (2) жирным голубым шрифтом. Обращаем внимание, что в данной строке отображается не весь пакет, а только блок содержащихся в нем данных (8 байт). Динамично изменяющиеся в процессе "прослушивания" CAN-шины или проигрывания лога биты, выделяются красным цветом. Причем чем ярче оттенок красного, тем меньше времени прошло с момента изменения значения. Предусмотрена возможность выделения для анализа нескольких последовательных битов (фрагмента данных). Это можно сделать мышью, или вручную задать в панели (4) количество нужных битов и смещение относительно начала пакета данных. Выбранные биты выделяются голубым фоном. Каждый байт представлен в двоичном формате, но под каждым байтом отображается его HEX-представление
  3. Панель отображения пакетов данных их CAN-шины. По умолчанию в панели отображаются все пакеты из CAN-шины в HEX-формате. Пакеты, в которых зафиксировано изменение данных, выделены голубым фоном. В столбце ID отображен уникальный идентификатор пакета. Есть возможность скрыть ненужные пакеты или следить за нужными, кликнув соответствующие чекбоксы в строке. Выбранный для отображения в панели (2) пакет выделяется синим фоном.
  4. Панель выбора части последовательных битов (фрагмента данных) в пакете. В поле "Размер" указывается количество нужных вам битов. В поле "Смещение" задается смещение первого из нужных вам битов относительно первого бита в пакете. При этом есть возможность задать как прямой порядок байтов от старшего к младшему (BigEndian или BE) так и обратный порядок (LittleEndian или LE). Задав все значения и кликнув кнопку "Отобрать", нужные вам байты в панели (2) будут выделены голубым фоном. Назначение поля "Делитель" будет описано ниже (5).
  5. Панель анализа фрагмента данных. Для удобства анализа выбранный фрагмент данных здесь представлен в виде графика. Также в панели представлено исходное и тарированное значение фрагмента данных в десятичном виде. Например, вы предполагаете, что некий фрагмент данных содержит значение количества оборотов двигателя. Терминал подключен к CAN-шине автомобиля, и вы можете отслеживать пакеты данных в режиме онлайн. Выбрав в поле (4) нужный фрагмент данных вы нажимаете на педаль газа и видите, как график взлетает вверх. Отпускаете — график идет вниз. Все видно наглядно. По тахометру вы держите обороты на уровне 1500. Значение выбранного фрагмента данных — около 6000. Но, применив делитель 4 в панели (4), вы получите искомое тарированное значение 1500. О том, как подобрать правильный делитель написано здесь
  6. Панель отображения выбранных фрагментов данных. Часто бывает, что при поиске какого-то параметра, например тех же оборотов двигателя, сразу несколько фрагментов данных в разных пакетах имеют примерно одинаковое значение. В таких случаях требуются дополнительные проверки. Поэтому все отобранные фрагменты данных можно сохранить в отдельной панели. Для этого нужно выбрать фрагмент, как это описано в разделе (4) и кликнуть кнопку "Отобрать". Значение выбранного фрагмента данных появится в панели (6) вместе с другой необходимой информацией
  7. Панель фильтрации и поиска данных. Это основная рабочая панель, содержащая большое количество элементов. Поэтому ей посвящен весь следующий раздел

5. Описание панели фильтрации и поиска данных

1. Фильтры (можно активировать один или несколько):

  1. "Показывать только отслеживаемые". При активации данного фильтра в панели (3) будут показаны только те пакеты, которые отмечены галочками в столбце "Следить"
  2. "Показывать скрытые". При активации данного фильтра в панели (3) будут показаны только те пакеты, которые отмечены галочками в столбце "Скрыть"
  3. "Показывать меняющиеся". При активации данного фильтра в панели (3) будут показаны пакеты, в которых с момента последнего обновления данных изменился хотя бы один бит информации
  4. "Показывать графики". При выборе данной функции, фоном для каждого байта во всех отображаемых пакетах в панели (3) будет динамически меняющийся график, аналогичный графику в панели (5). Выглядит это следующим образом: cs2.png Данная функция является чрезвычайно полезной. Беглого взгляда на любой пакет достаточно, чтобы понять — какой байт в нем представляет практический интерес, а какой нет. Например, вы пытаетесь отыскать в CAN-шине какое-то фиксированное значение. Очевидно, что байты с текущими значениями "7С" и "41" вам не подходят, так как по графику видно, что они содержат циклично меняющиеся значения. Также, как и байты "FE" и "02", графики которых походят на "белый шум". Последний байт состоит из одних единиц, в средних байтах всего по одному биту имеют значение "1", а значит они тоже скорее всего не подходят. Соответственно интерес может представлять только первый байт со значением 68
  5. "Окно подсветки изменений". Этот фильтр позволяет выделять красным цветом в поле (3) фрагменты данных, которые меняются чаще, чем заданная в фильтре величина (в секундах).

2. Цветовая легенда справа от фильтров является простой подсказкой, каким цветом фона будут выделяться те или иные отфильтрованные пакеты в панели (3)

3. Поиск значений позволяет найти в массиве данных параметр, значение которого вам примерно известно. Как это сделать — описано ниже

4. Поиск дискретных значений. Процесс описан в следующем разделе

6. Поиск дискретных значений

cs3.png

Такой метод поиска подходит для определения факта открытия или закрытия дверей, состояния ремней безопасности (пристегнуты/отсетгнуты) или габаритных огней и прочих дискретных параметров. Алгоритм простой: кликаем кнопку "Сейчас 0" когда искомое состояние неактивно (например, дверь закрыта), либо кнопку "Сейчас 1" когда активно. В результате в поле (3) отфильтровываются пакеты, где содержатся биты, не меняющие своего значения до клика кнопки. Лучше всего показать работу метода на примере.

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

  1. В исходном состоянии дверь закрыта. Нажимаем на "Сейчас 0". Лучше сделать это несколько раз подряд. В результате в поле (3) отфильтруются пакеты, где содержится хотя бы один бит, ни разу не меняющий своего значения "0" между нажатиями кнопки. Но этих пакетов будет много.
  2. Открываем дверь и нажимаем на "Сейчас 1". Также повторяем это несколько раз. В поле (3) останутся только те пакеты, где хотя бы один бит поменял свое значения с "0" на "1". Таких останется всего несколько штук, и их уже можно анализировать визуально.
  3. Включаем фильтрацию "Показывать найденные бинарные значения" для отображения подходящих параметров.
  4. Несколько раз открываем и закрываем дверь, и визуально ищем изменяющийся байт. Все такие байты будут выделяться красным цветом. Если визуально определить нужный байт не удалось, можно повторить пп. 1 и 2, и еще сократить количество отфильтрованных пакетов.
  5. Выделяем подходящий пакет кликом мыши и контролируем в поле (2) какой бит меняет своё состояние при открывании/закрывании двери.
  6. Выделяем в поле (2) нужный бит. Это можно сделать кликом по нему мыши, либо в поле (4) вручную задать смещение и размер фрагмента данных.
  7. Нажимаем в поле (4) кнопку "Отобрать" для добавления в список отобранных значений в поле (5)
  8. В списке отобранных значений в поле (5) можно задать Id (номер) параметра для передачи на сервер и нажать на кнопку в ячейке "mask" для записи конфигурации в терминал.

7. Поиск параметров с известными значениями

Такой метод поиска применяется для определения параметров, чьи значения точно или приблизительно известны. Например уровень топлива в баке, пробег, обороты двигателя и т.п. Задать можно как саму величину так и допустимое отклонение от нее. Например, по индикатору на панели приборов вы видите, что бак заполнен топливом на 3/4. Объем бака — 100 литров. Указатель уровня топлива может иметь погрешность до 10%. Значите имеет смысл задать значение — 75 и отклонение 10.

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

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

Например, ищем уровень топлива в баке. Предположим, что на панели приборов автомобиля отображается точное целое значение уровня.

cs4.png

  1. Исходное состояние — зажигание включено, двигатель заглушен. Вводим в поле "Значение" текущее значения объема топлива в баке в соответствии с показаниями на приборной панели, например 45. В поле "Отклонение" вводим величину, на которую по нашему мнению индикатор может ошибаться, например 1 литр. Таким образом мы задали диапазон поиска от 44 до 46 литров.
  2. Выбираем коэффициенты, на которые может быть умножен объем топлива в CAN шине. Какие именно коэффициенты выбрать — конкретные рекомендации дать сложно. На первом этапе можно выбрать все коэффициенты, а затем последовательно уменьшать этот список.
  3. Нажимаем на кнопку "Задать". В поле (3) после этого будут подсвечиваться и отображаться найденные значения.
    cs5.png
  4. Выбираем в списке подходящий параметр и задаем маску в соответствии с подсвечиваемыми байтами. Начинаем видеть график. Можно задать коэффициент для значения маски. Например, для топлива это может быть 4.
  5. Заводим двигатель и ждем, когда выработается часть топлива. Либо вручную заливаем или сливаем часть топлива в/из бака. По графику и изменению значения определяем, подходит ли найденная маска.

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

8. Заключение

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