Интерфейс CAN в ZETSENSOR
Протокол взаимодействия цифровых модулей по интерфейсу CAN 2.0
Документ описывает новый протокол, по которому взаимодействуют между собой цифровые модули ZETSENSOR, работающие по интерфейсу CAN 2.0 (начиная с версии 600 и выше).
Общее описание CAN
CAN представляет собой шину — каждый пакет передается сразу всем участникам, а участники уже сами решают, какие пакеты они будут обрабатывать.
Каждому участнику одной сети CAN назначается уникальный адрес узла — целое число в диапазоне от 1 до 63.
Цифровые модули ZETSENSOR поддерживают три скорости передачи данных:
- 100 кбит/с;
- 300 кбит/с;
- 960 кбит/с (или 1 Мбит/с для простоты).
От скорости передачи зависит общая пропускная способность сети, а также максимально допустимая длина кабелей.
Точка сэмплирования бита (Sample point) — в диапазоне от 60% до 85%.
Новый протокол
Новый протокол разработан с целью решения ряда проблем старого протокола:
- ошибки при отправке кадров CAN с одинаковыми идентификаторами;
- конфликты в командах между мастерами CAN и регистрирующими модулями;
- неоднозначность в выборе задатчика времени.
Для этого в новый протокол вводятся следующие основные изменения:
- все идентификаторы становятся уникальными;
- задействуются расширенные кадры (с 29-битными идентификаторами);
- кадры более строго распределяются по типу передаваемой информации;
- в кадры синхронизации добавляется информация о классе точности задатчика времени.
Основной упор в новом протоколе делается на арбитраж — встроенный в CAN 2.0 механизм разрешения коллизий. Арбитраж делает целесообразным использование расширенных идентификаторов, а также позволяет четко задавать приоритеты кадрам в зависимости от типа передаваемой ими информации.
Формат кадра
Кадр содержит базовый идентификатор и до восьми байтов полезных данных. Помимо базового идентификатора, в кадре может содержаться также расширенный идентификатор.
Базовый и расширенный идентификаторы участвуют в механизме разрешения коллизий CAN — при одновременной отправке кадров несколькими узлами будет передан кадр с наименьшим значением идентификатора.
Базовый идентификатор состоит из одиннадцати битов:
- старшие три бита — базовый тип кадра;
- следующий бит — всегда нулевой;
- следующий бит — нулевой или четность;
- младшие шесть битов — адрес узла-отправителя.
Таблица 1. Формат базового идентификатора
Номер бита | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|
CTRL | 0 | 0 | 0 | 0 | 0 | sender_node | |||||
DATA | 1 | 0 | 0 | ||||||||
PACK | 1 | 0 | 1 | parity | |||||||
INFO | 1 | 1 | 0 | 0 |
Базовый тип определяет формат полезных данных кадра, а также формат расширенного идентификатора (при наличии).
Всего задействовано пять базовых типов из восьми возможных:
- CTRL (0) — кадр управления;
- DATA (4) — кадр данных;
- PACK (5) — кадр упакованных данных;
- INFO (6) — кадр дополнительной информации.
Расширенный идентификатор, при его наличии, состоит из восемнадцати битов:
- старшие четыре бита — расширенный тип (подтип) кадра;
- остальные четырнадцать битов — зависят от базового типа и подтипа.
Кадры, которые содержат только базовый идентификатор, называются базовыми. Для передачи базового кадра требуется до 135 битов. Кадры, содержащие также и расширенный идентификатор, называются расширенными и требуют для передачи до 160 битов.
Кадры могут быть одиночными и групповыми. Групповые кадры передают часть некой общей информации. Номер кадра в группе указывается в младших шести битах расширенного идентификатора. Таким образом, групповыми могут быть только расширенные кадры, а сама группа может содержать не более 64 кадров или не более 512 байтов полезных данных.
В групповых кадрах старший бит расширенного идентификатора всегда равен единице. Другими словами, все групповые кадры имеют подтип 8 или выше.
Кадры управления (CTRL)
Кадры управления предназначены для функционирования всей сети CAN.
Кадры управления разделены на следующие подтипы:
- CTRL_NODE — кадры присутствия узла;
- CTRL_SYNC — кадры синхронизации времени;
- CTRL_REQ и CTRL_RESP — кадры запросов и ответов Modbus.
Таблица 2. Формат расширенного идентификатора в кадрах CTRL
Номер бита | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | ||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
CTRL_NODE | x | x | x | x | x | x | x | x | x | x | x | x | x | x | x | x | x | x | ||
CTRL_SYNC | 0 | 0 | 1 | 0 | clock_class | sequence | ||||||||||||||
CTRL_SACK | 0 | 1 | 0 | 0 | clock_class | sequence | ||||||||||||||
CTRL_HOLD | 0 | 1 | 0 | 1 | hold_reason | 0 | 0 | 0 | 0 | 0 | 0 | |||||||||
CTRL_REQ | 1 | 0 | 0 | 0 | 0 | 0 | slave_node | group_sequence | ||||||||||||
CTRL_RESP | 1 | 0 | 0 | 1 | 0 | 0 | master_node | group_sequence |
Кадры присутствия узла (CTRL_NODE)
Кадры присутствия узла предназначены для оповещения остальных узлов о своем присутствии.
Кадры присутствия узла — это базовые кадры управления (без расширенного идентификатора). Кадры присутствия узла не содержат полезных данных, поэтому для их передачи требуется не более 55 битов.
Каждый узел должен отправлять кадр присутствия раз в секунду. Узел считается пропавшим, если кадры его присутствия перестают поступать в течение десяти или более секунд с момента последней отправки.
Коллизия узлов возникает, если в сети есть два или более различных модулей с одним и тем же номером узла. В этом случае кадры присутствия узла, отправленные одновременно разными модулями, не приведут к ошибкам CAN, так как такие кадры полностью совпадают. При этом факт коллизии может обнаружить как один из проблемных узлов (по факту приема кадра с собственным узлом), так и сторонний участник (по среднему количеству одинаковых кадров за секунду). Узел, обнаруживший коллизию с собственным номерами, не имеет права отправлять любые другие кадры, помимо кадров присутствия узла.
Кадры синхронизации времени (CTRL_SYNC)
Кадры синхронизации времени предназначены для синхронизации внутреннего времени всех узлов относительно времени задатчика, который рассылает эти кадры.
Кадры синхронизации узла — это расширенные кадры управления с подтипом 2.
Кадр содержит время отправки предыдущего пакета. Время указывается в виде 64-битного числа в порядке little-endian. Число содержит количество наносекунд, прошедших с 01 января 1970 года 00:00:00.000.
Расширенный идентификатор содержит класс задатчика времени и номер последовательности.
Класс задатчика формируется из двух компонентов:
- старшие четыре бита — источник времени, используемый задатчиком;
- младшие четыре бита — тип устройства.
Возможные значения источников времени и типов устройств перечислены в таблицах. Значения компонентов суммируются и формируют одно число — чем ниже значение класса, тем более высокий приоритет он имеет. Если классы задатчика у нескольких устройств совпадают, то выбирается задатчик с наименьшим адресом узла.
Таблица 3. Классификация задатчиков времени по источнику времени
Номер бита | Название источника | Откуда получено время |
0x00 | SYNC_SOURCE_NONE | |
0x20 | SYNC_SOURCE_GPS_FIXED | По GPS с отслеживаемых спутников |
0x40 | SYNC_SOURCE_PTP_SLAVE | По протоколу PTP (IEEE 1588) |
0x60 | SYNC_SOURCE_GPS_LOST | После потери сигналов от GPS спутников |
0x70 | SYNC_SOURCE_RADIO | По беспроводному радиоканалу |
0x80 | SYNC_SOURCE_HTTP | По интернету из HTTP-ответа |
0xA0 | SYNC_SOURCE_MODBUS | От ПК по протоколу MODBUS |
0xC0 | SYNC_SOURCE_RTC | Из встроенной микросхемы реального времени |
0xF0 | SYNC_SOURCE_INVALID | Нет источника времени |
Таблица 4. Классификация задатчиков времени по типу устройства
Номер бита | Название источника |
0x0 | SYNC_DEVICE_NONE |
0x2 | SYNC_DEVICE_7175 |
0x5 | SYNC_DEVICE_7177 |
0x8 | SYNC_DEVICE_7176 |
0x9 | SYNC_DEVICE_7174 |
0xA | SYNC_DEVICE_7172 |
0xC | SYNC_DEVICE_7173 |
0xF | SYNC_DEVICE_SLAVE |
Номер последовательности увеличивается на 1 для каждого следующего кадра. При превышении максимального значения (63) номер сбрасывается в 0. Номер последовательности не стоит путать с номером группы.
Кадры подтверждения синхронизации времени (CTRL_SACK)
Кадры подтверждения синхронизации времени — это расширенные пустые кадры управления с подтипом 4. Они передаются в течение 500 мс после получения кадра синхронизации времени (CTRL_SYNC) и содержат такие же класс задатчика времени и номер последовательности.
Кадры подтверждения используются для диагностики проблем на шине CAN. На стороне мастера (или любого другого диагностического узла, настроенного на прием всего трафика в линии) можно сопоставлять кадры синхронизации и кадры подтверждения и на основании этого диагностировать следующие проблемы шины:
- кадр синхронизации CTRL_SYNC не был принят узлом;
- кадр подтверждения CTRL_SACK был отправлен узлом, но не дошел до мастера;
- узел не получил подтверждение отправленного им кадра CTRL_SACK и повторил передачу.
Кадр синхронизации достаточно отправлять только с основного адреса узла. Второстепенные адреса, принадлежащие одному устройству, можно исключить.
Кадры удержания линии (CTRL_HOLD)
Кадры удержания линии используются, когда требуется максимально возможная пропускная способность сети без потери ее работоспособности. Узел, который пытается занять линию, рассылает кадры с указанием причины. Рассылка должна производиться не реже чем раз в десять секунд.
Кадры удержания линии — это расширенные кадры управления с подтипом 5 без данных.
При получении кадра удержания линии каждый участник сети сравнивает полученный код с собственным по принципу «меньше» — «важнее». Если полученный код оказывается более важным, узел должен на время освободить линию, то есть приостановить передачу выходных данных и дополнительной информации. Если полученный код совпадает с собственным кодом, то освобождать линию не требуется.
По умолчанию у узла нет причин удержания линии, что соответствует коду 0xFF.
Таблица 5. Классификация задатчиков времени по источнику времени
Номер бита | Название источника | Откуда получено время |
0x00 | HOLD_REASON_ZERO | Зарезервировано |
0x40 | HOLD_REASON_USER | Запрошено пользователем |
0x60 | HOLD_REASON_FLASHING | Производится обновление прошивки |
0x80 | HOLD_REASON_SELFTEST | Производится метрологический самоконтроль |
0xFF | HOLD_REASON_ABSENT | Нет причин (по умолчанию) |
Поддержка кадров удержания линии временно отключена — считается, что датчики не должны сами (неявно) принимать решение о приостановке выдачи данных.
Кадры запросов и ответов (CTRL_REQ и CTRL_RESP)
Кадры запросов и ответов предназначены для управления узлами по протоколу MODBUS RTU.
Кадры запросов и ответов — это групповые расширенные кадры управления с подтипами 8 (запросы) и 9 (ответы).
Полезные данные группы содержат полный пакет MODBUS RTU, начиная с адреса устройства (который совпадает с адресом узла) и заканчивая контрольной суммой. Максимальный размер пакета MODBUS RTU — 256 байтов. Формат пакета в запросе полностью соответствует формату MODBUS RTU. Формат пакета в ответе отличается тем, что регистры не переворачиваются.
Расширенный идентификатор содержит, помимо номера группы, адрес узла-получателя: в запросах это адрес устройства, который должен выполнить команду, а в ответах — адрес того, кто отправил команду.
Запрос может быть отправлен любым узлом, но обычно их отправляет мастер CAN по инициативе пользователя (ПК).
Кадры данных (DATA)
Кадры данных предназначены для передачи потоковых или событийных данных, генерируемых узлами.
Кадры данных разделены на следующие подтипы:
- DATA_FLOW — кадры потоковых данных;
- DATA_MESSAGE — кадры сообщений.
Таблица 6. Формат расширенного идентификатора в кадрах DATA
Номер бита | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
DATA_FLOW | x | x | x | x | x | x | x | x | x | x | x | x | x | x | x | x | x | x |
DATA_MESSAGE | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | group_sequence |
Кадры потоковых данных (DATA_FLOW)
Кадры потоковых данных предназначены для передачи непрерывных чисел в формате IEEE 754 (float) с фиксированной частотой.
Кадры с потоковыми данными — это базовые кадры данных. Полезные данные содержат одно или два числа с плавающей запятой, в порядке little-endian. Частота выдачи чисел, единицы измерения и другие параметры соответствуют информации о канале.
Кадры сообщений (DATA_MESSAGE)
Кадры сообщений предназначены для передачи данных, сгруппированных в виде сообщений.
Кадры сообщений — это групповые расширенные кадры данных с подтипом 8. Полезные данные группы содержат одно сообщение целиком или часть сообщения. Все поля в сообщении указаны в порядке little-endian.
Таблица 7. Формат сообщения DATA_MESSAGE
Поле | Назначение | Размер, байты | Номер кадра |
seconds | Кол-во секунд с 01 января 1970 00:00:00 | 4 | 0 |
nanoseconds | Кол-во наносекунд после seconds | 4 | 0 |
format_id | Идентификатор сообщения | 2 | 1 |
length | Размер сообщения | 2 | 1 |
data | Само сообщение | length | 1 .. [(length + 11) / 8] |
Кадры сообщений используются старыми версиями модулей. В новых версиях для передачи сообщений используются кадры упакованных данных.
Кадры упакованных данных (PACK)
Кадры упакованных данных отличаются от кадров данных тем, что данные передаются в более экономном режиме.
Кадры упакованных данных используют бит четности (это бит номер 6 с базовом идентификаторе). Четность используется для защиты от повторного приема одного и того же кадра, а также для лучшего контроля приоритетов.
Передача упакованных данных начинается с расширенного кадра PACK_START. В идентификаторе такого кадра указываются формат упакованных данных и количество последующих кадров, а в данных — секундная и наносекундная часть метки времени. Бит четности всегда 1 (то есть кадры PACK_START всегда нечетные).
Упакованные данные передаются в базовых кадрах. Первый после PACK_START пакет имеет нулевой бит четности, а в последующих кадрах четность чередуется.
Таблица 8. Формат расширенного идентификатора в кадрах PACK
Номер бита | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
PACK_DATA | x | x | x | x | x | x | x | x | x | x | x | x | x | x | x | x | x | x |
PACK_START | 0 | 1 | 0 | 0 | format_id | frames_count |
Таблица 9. Формат базового идентификатора кадра упакованных данных
Номер бита | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|
PACK_DATA | 1 | 0 | 1 | 0 | parity | sender_node |
Формат сообщения определяет, что именно передается в самом сообщении. Более подробное описание форматов сообщений приведено в отдельной статье:
Формат ZDT для записи и передачи данных в ZETSENSOR.
Кадры дополнительной информации (INFO)
Кадры дополнительной информации предназначены для низкоприоритетной передачи различной вспомогательной информации, такой как информация о канале.
Кадры дополнительной информации разделены на следующие подтипы:
- INFO_DIAG — кадры диагностических параметров;
- INFO_LINK — кадры информации о внешнем подключении;
- INFO_ZDT — кадры информации о канале.
Таблица 10. Формат расширенного идентификатора в кадрах INFO
Номер бита | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
INFO_DIAG | 0 | 1 | 0 | 0 | diag_code | |||||||||||||
INFO_LINK | 0 | 1 | 1 | 0 | link_interface | link_port | INFO_LINK | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | group_sequence |
Кадры диагностических параметров (INFO_DIAG)
Диагностический параметр — это пара из двух чисел: кода параметра (целое 14-битное) и его значения (float). Код параметра определяет все его характеристики, которые берутся из фиксированной таблицы диагностических параметров.
Каждый параметр передается отдельным кадром. Код параметра содержится в расширенном идентификаторе, а значение — в данных кадра.
В отличие от обычных потоковых данных, диагностические значения не привязаны строго ко времени, то есть не обязаны иметь фиксированную частоту выдачи.
Таблица 11. Перечень диагностических параметров
Код | Название параметра | Описание |
0x0000 | Зарезервировано (не используется) | |
0x0001 | DIAG_UPTIME | Время работы с момента включения, с |
0x0002 | DIAG_CLOCK_SHIFTS | Количество сдвигов времени |
0x0003 | DIAG_CLOCK_ADJ | Уровень подстройки частоты, % |
0x0004 | DIAG_CLOCK_OFFSET | Смещение времени относительно задатчика, мкс |
0x0005 | DIAG_CAN_SPEED | Скорость CAN, кбит/с |
0x0006 | DIAG_CAN_LOAD | Загрузка CAN, % |
0x0007 | DIAG_SYNC_STAGE | Состояние синхронизации (2 — ожидание, 3 — overtake, 4 — PID, 6 — holdover) |
Кадры информации о внешнем подключении (INFO_LINK)
Кадры информации о внешнем подключении используются модулями, которые помимо CAN имеют интерфейс для связи с ПК или другими устройствами: Ethernet, USB, GSM и т.п. Рассылка кадров производится по изменению состояния подключения. Если состояние длительное время не меняется, то кадры рассылаются периодически, не реже одного кадра в десять секунд.
В идентификаторе кадра указываются тип интерфейса (протокол) и номер порта. Номер порта предусмотрен на случай, если модуль имеет несколько отдельных портов одного интерфейса. Нумерация начиная с нуля.
Таблица 12. Перечень внешних интерфейсов (link_interface)
Значение | Название интерфейса | Описание |
0x00 | LINK_INTERFACE_NONE | |
0x73 | LINK_INTERFACE_MSC | USB Mass Storage Class |
0x74 | LINK_INTERFACE_USB | USB ZETLAB |
0x76 | LINK_INTERFACE_ETHERNET | Ethernet |
0x77 | LINK_INTERFACE_ZDT | ZDT |
0xFF | Зарезервировано |
Кадры содержат один байт с состоянием подключения указанного интерфейса.
Таблица 13. Перечень состояний подключения
Значение | Название Состояния | Описание |
0x00 | LINK_STATE_ESTABLISHED | Подключение установлено |
0x10 | LINK_INTERFACE_MSC | Попытка подключения (активный режим) |
0x20 | LINK_STATE_LISTENING | Ожидание подключения (пассивный режим) |
0x80 | LINK_STATE_ERROR | Подключение невозможно (нет патч-корда и т.п.) |
0xF0 | LINK_STATE_DISABLED | Интерфейс отключен или не активен |
В будущем могут быть задействованы другие байты данных кадра.
Кадры информации об узле (INFO_ZDT)
Кадры информации об узле — это групповые расширенные кадры дополнительной информации с подтипом 8.
Полезные данные группы содержат полный пакет в формате ZDT. Если узел имеет несколько видов информации (несколько пакетов ZDT), то каждый пакет передается отдельной группой.
Каждый узел отправляет информацию автоматически после получения кадра синхронизации времени (CTRL_SYNC), в котором номер последовательности совпадает с адресом узла. Таким образом, для отправки информации со всех возможных узлов, требуется 64 последовательных кадра CTRL_SYNC (обычно это 64 секунды).
Новые типы кадров
Протокол может быть дополнен новыми базовыми типами и новыми подтипами в уже выделенных базовых типах.
При добавлении новых типов или подтипов кадров требуется учитывать их назначение и приоритет, а также реализовать поддержку в соответствующих устройствах.
Примеры
Приведены примеры отправляемых пакетов для узла с адресом 3.
Чтение параметров канала
Внутренняя память устройства представлена как последовательность вкладок. Каждая вкладка начинается с заголовка фиксированного формата. Каждая вкладка содержит информацию и настраиваемые поля, относящиеся к какой-либо части цифрового модуля. Например, параметры канала обычно содержатся во вкладке CHANNEL_PAR.
Для чтения содержимого вкладок используются кадры запросов и ответов MODBUS (CTRL_REQ и CTRL_RESP).
Получение потоковых данных
Цифровые модули автоматически рассылают в CAN пакеты типа CAN_DATA, содержащие канальные данные по мере их формирования. Специальный запрос не требуется. Однако рассылку можно остановить явной командой остановки данных. Возобновление рассылки производится либо явной командой запуска данных, либо неявно через перезапуск модуля, например, путем сброса питания.