Протокол CAN цифровых модулей ZETSENSOR

Параметры CAN

Сеть CAN представляет собой шину — каждый пакет передается сразу всем участникам. Модуль сам решает, какие пакеты он будет обрабатывать.

Скорость передачи данных:

  • 100 кбит/сек;
  • 300 кбит/сек;
  • 960 кбит/сек.

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

Точка сэмплирования бита (Sample point) — в диапазоне от 60% до 85%.

Формат пакета

Каждый пакет CAN в модулях ZET SENSOR идентифицируется 11-битным идентификатором.

Бит Поле
10 CAN_SHORT
9 CAN_BODY
8 CAN_BEGIN
7 CAN_CHAIN
6 CAN_TO_MASTER
5 node
4 node
3 node
2 node
1 node
0 node

Младшие шесть битов числа (маска 0x3f) определяют адрес узла (node) от 0 до 63.

Старшие пять битов содержат флаги для различения пакетов по типу:

  • CAN_TO_MASTER (0x40) — флаг направления;
  • CAN_CHAIN (0x80) — флаг потоковых данных;
  • CAN_BEGIN (0x100), CAN_BODY(0x200), CAN_END(0x300) — флаги составных пакетов;
  • CAN_SHORT (0x400) — флаг типа данных.

Флаги 0x40..0x400 не должны быть все одновременно установлены в единицу.

Каждый модуль может занимать в сети CAN от одного и более адресов, по одному на каждый поддерживаемый им канал. В одной сети CAN не должно быть двух одинаковых адресов.

В семействе ZET SENSOR по сети CAN передаются следующие виды пакетов:

  • широковещательные пакеты;
  • потоковые данные;
  • командные пакеты (команды и ответы);
  • сервисные пакеты.

Мы условно выделяем роль мастера CAN — это модуль, который отправляет команды и принимает ответы. Мастер CAN может быть в сети только один, его адрес установлен в 1.

В модулях ZET SENSOR реализована функция автоматического определения скорости CAN. После включения только мастер может отправлять пакеты в CAN на выбранной скорости, а все остальные модули сначала слушают сеть, но ничего не отправляют. При успешном получении любого пакета модули определяют выбранную скорость и только после этого начинают отправку собственных пакетов. Таким образом, мастер CAN выполняет роль стартера сети CAN.

Широковещательные пакеты

В общем смысле, в сети CAN все пакеты широковещательные. Но мы будем называть широковещательными только пакеты с идентификатором 0, так как каждый модуль ZET SENSOR обязательно должен быть настроен на прием таких пакетов.

Широковещательные пакеты имеют самый высокий приоритет.

Пакеты активности узла

Пакет активности узла — это широковещательный пакет с одним байтом данных. Единственный байт данных содержит адрес (номер узла). Пакет активности узла играет роль heartbeat (сердцебиение), то есть служит для оповещения других участников сети CAN о присутствии этого узла в сети.

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

Период рассылки пакета активности составляет 1 сек + (адрес узла) мс. Если с какого-то адреса нет пакетов активности в течение достаточно длительного времени (10 сек и более), то можно считать данного участника сети отсутствующим (был отключен, завис, сменил адрес и так далее).

Пакеты синхронизации времени

Синхронизация времени основана на том, что модули запоминают время фактической отправки и приема CAN пакета (точнее, время отправки и приема символа SOF).

Задатчик времени (это либо модуль ZET 7175, либо мастер CAN, если ZET 7175 отсутствует) раз в секунду рассылает пакеты синхронизации. Каждый пакет содержит восемь байтов данных с информацией о времени отправки предыдущего пакета синхронизации:

long seconds; // время в секундах, начиная с 1970-01-01 00:00:00 UTC

long nanoseconds. // кол-во наносекунд, прошедших с указанной секунды

Точность снятия временных меток модулем довольно низкая — 1..10 мкс. Однако итоговое качество синхронизации обычно имеет более высокую точность (в районе 100..2000 нс) за счет фильтрации показаний и ПИ-регуляции.

В сети CAN может быть только один задатчик времени.

Потоковые пакеты

Потоковые пакеты — это пакеты с какими-то цифровыми данными, сгенерированными модулем. Это либо данные по каналу в формате float или short, либо событие. Принимать потоковые пакеты может как мастер CAN для передачи на ПК или записи на SD карту, так и любой модуль по желанию (например, для индикации текущего значения).

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

Командой выдачи служит любой командный пакет с кодом 0x03. Обычно достаточно отправить узлу пакет, содержащий следующие шесть байтов: 0x03 0x00 0x77 0x77 0x77 0x77.

В пакетах с потоковыми данными всегда установлены флаги CAN_CHAIN и CAN_TO_MASTER. Флаги CAN_SHORT, CAN_BEGIN и CAN_END используются при передаче данных, формат которых отличается от float.

Каждый пакет содержит до восьми байтов. В случае с форматом float это одно или два значения IEEE  754. Все значения передаются в порядке LSB first (или little-endian).

Командные пакеты

Командные пакеты (или пакеты Modbus) служат для передачи пакетов протокола Modbus между модулями и ПК.

Пакеты Modbus делятся на запросы и ответы. Запросы обычно исходят от ПК и адресованы самому мастеру CAN или любому другому модулю. Модуль с несколькими адресами принимает команды на каждый адрес.

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

Запрос Modbus, в зависимости от кода команды, может быть преобразован в единичный пакет CAN или в серию пакетов:

  • адрес — node (адрес узла, которому адресован запрос);
  • если это единичный пакет, то все флаги сброшены;
  • если это составной пакет, то первый пакет имеет флаг CAN_BEGIN, последний — CAN_END, а промежуточные пакеты — CAN_BODY;
  • данные содержат 6 или более байтов (в зависимости от кода команды), разбитые на пакеты по 8 байтов:
  • два байта — command (код команды Modbus в LSB);
  • два байта — addr (адрес регистра Modbus в LSB);
  • два байта — quantity (кол-во регистров Modbus в LSB);
  • после этого могут идти данные.

Формат пакетов с ответами Modbus соответствуют формату пакетов с запросами, но в данных отсутствуют первые шесть байтов (command, addr и quantity).

Инициатором запросов является мастер CAN (обычно по команде от ПК). В редких случаях, инициатором запросов может выступать другой модуль.

Сервисные пакеты

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

Формат данных в сервисном пакете (всегда восемь байтов).

#define CAN_SERVICE_MESS_ID (0x01 | CAN_SHORT)

#define CAN_SERVICE_ID_FROM_MASTER (0x0080)

#define CAN_SERVICE_ID_TOGGLE      (0x0040)

#define CAN_SERVICE_ID_NODE_MASK   (0x003f)

struct {

unsigned short service_id;  /* идентификатор сервисного пакета */

unsigned short service;     /* код сервисной функции */

unsigned long param;        /* параметр */

} CAN_SERVICE_DATA;

Идентификатор сервисного пакета состоит из следующих частей:

  • флаг направления: сброшен, если пакет содержит команду от указанного узла мастеру, и установлен, если пакет содержит ответ от мастера указанному узлу;
  • флаг четности для проверки в случае отправки одинаковых запросов: в команде флаг четности просто меняется перед каждой новой отправкой, а в ответе дублируется из команды;
  • номер узла всегда содержит номер узла, сделавшего запрос, независимо от направления пакета;

Код сервисной функции определяет тип запроса.

Параметр содержит какое-то число, смысл которого зависит от кода функции.

Модули отправляют только команды и принимают только ответы.

Мастер CAN принимает только команды и отправляет только ответы.

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

Обработчик ответа реализуется в каждом модуле отдельно.

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

Модуль может отправить новую команду, не дожидаясь ответа. При этом ответы на предыдущие команды будут проигнорированы.

Мастер CAN должен быть готов к приему новой команды в любой момент времени. Выполнение команды должно производиться как можно быстрее. После выполнения команды мастер может отправить ответ (а может и не отправлять).

Только модули могут быть инициаторами сервисных запросов. Даже если мастер CAN отправит какой-нибудь пакет без получения команды, то все такие пакеты должны быть проигнорированы модулями.

Получение данных с цифровых датчиков ZET SENSOR по CAN

Настройка и получение данных с цифровых датчиков ZET SENSOR (далее датчики) с интерфейсом CAN производится с помощью преобразователя интерфейсов ZET 7174 (CAN→USB) или ZET 7176 (CAN→Ethernet) и ПО ZETLAB.

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

Датчики должны быть предварительно настроены, адреса (node) каналов и частоты выдачи значений по ним должны быть известны.

Мастер должен иметь следующие параметры CAN:

  • скорость передачи данных составляет 960 кбит/с;
  • sample point в диапазоне от 60% до 85%;
  • используются базовые пакеты с 11-битными идентификаторами.

Чтобы активировать выдачу значений в датчиках, мастер должен отправить на каждый адрес (node) пакет с командой запуска:

  • идентификатор — адрес канала (например, 0x00B для адреса 11);
  • содержимое — 6 байтов данных: 0x03 0x00 0x77 0x77 0x77 0x77.

Отправку пакетов с командой запуска рекомендуется периодически повторять, например, раз в 10 или 60 секунд.

После получения команды запуска, датчики начинают самостоятельно отправлять по каждому каналу пакеты со значениями (по мере их готовности, в соответствии с настроенной частотой выдачи):

  • идентификатор — адрес канала с установленными битами 0x0C0 (например, идентификатор для адреса 11 будет равен 0x00B + 0x0C0 = 0x0CB);
  • содержимое — 4 или 8 байтов, каждые четыре байта содержат очередное значение.

Значения передаются в формате float (IEEE 754, одинарная точность, порядок байтов little-endian).