Використання мережі can і стека canopen

Одного разу переді мною постало завдання розробити вбудовану систему, в якій би дані могли передаватися між вузлами c максимальною надійністю. Тоді то я вперше і дізнався про CAN.

У цій статті я хотів би розповісти коротко розповісти про те, що таке CAN і про свій досвід роботи з ним. Можливо люди, які займаються розробкою вбудованих систем, прочитавши мою статтю, зацікавляться цим стандартом, якщо він ще не потрапляв в їх поле зору. Тим більше, що контролери CAN в даний час присутні на багатьох мікроконтролерах.

CAN (Controller Area Network) - це стандарт, створений компанією Bosсh для мереж, що використовуються в автоматизації і промисловості. Стандарт знайшов широке застосування в промисловому виробництві, технологіях «розумного будинку», а так само в автомобілебудуванні. Дуже добре підходить для зв'язування різних датчиків і керуючих пристроїв в єдину мережу.
Як правило, CAN-мережа це мережа типу «шина», в якій всі вузли можуть передавати і приймати дані.
Вона володіє невеликою швидкістю, але високою надійністю.

Далі я хочу поверхнево описати стандарт і розповісти про використання такої мережі на практиці.

Стандарт описує канальний рівень і базові вимоги до фізичного рівня.
Головне в фізичному рівні - це вимога можливості передачі біта як "домінантного" і "рецесивного". Домінантний сигнал вважається одиницею, а рецесивний - нулем. Основна вимога - при передачі домінантного і рецесивного сигналу одночасно, усіх вузлів повинен прийти домінантний сигнал. На цьому принципі заснований механізм арбітражу. З цього випливає, що для передачі можуть використовуватися різні середовища, однак на практиці найчастіше використовують диференціальну пару.

Передача в мережі відбувається кадрами. У стандарті існують два типи кадрів: базовий і розширений.
Базовий кадр містить 11 бітовий ідентифікатор, а розширений - 29 бітовий. Кадр так само містить біт запиту на передачу, інформацію про довжину переданих даних і самі дані. Вони можуть займати від 0 до 8 байт в кадрі. Так само кадр містить деяку службову інформацію, але для програміста вона не принципова, оскільки її додавання реалізовано апаратно в контролері мережі.
Спочатку ідентифікатори не прив'язані до якогось вузла і характеризують саме повідомлення, а не відправника і одержувача. Ідентифікатори так само показують пріоритетність повідомлення. Пріоритет визначається домінантними битами в ідентифікатор. Так 10000000000 приоритетнее ніж 01 млрд.

Головним достоїнством CAN є його надійність. У ньому використовується механізм вирішення колізій (на відміну від механізму виявлення колізій в Ethernet), що дозволяє не втрачати пропускну здатність через колізії.
Його суть полягає в тому, що кожен вузол слухає мережу і, якщо вона вільна, може почати передачу. При цьому, він продовжує слухати мережу. Якщо у процесі розсилки рецесивного біта приймається домінантний, значить одночасно з цим вузлом почав передачу інший вузол з більш високим пріоритетом. У цьому випадку передача припиняється.

Крім цього використовуються механізми виявлення помилок, такі як контроль передачі, що доповнюють біти, використання контрольної суми і перевірка значень полів. Розробники оцінюють ймовірність невиявлення помилки передачі як 4,7 × 10-11.

Даний стандарт не описує протоколи верхнього рівня, тому було створено кілька реалізацій, як комерційних, так і відкритих.
Найбільш відомі з них:
- CANopen
- DeviceNet
- CAN Kingdom

Цю і навіть більш детальну інформацію про стандарті легко знайти в інтернеті, тому я нарешті приступаю до опису CANopen.

Як я вже писав, одного разу мені потрібно було створити надійну мережу з мікроконтролерів. Після розгляду можливих варіантів було вирішено зупинитися на мережі CAN. Як протоколу верхнього рівня був обраний CANopen і його реалізація - CANopenNode, оскільки вона є відкритою і простий в портировании на потрібне мені пристрій. CANopenNode ліцензований під LGPL.

Основні моменти протоколу CANopen:
- протокол працює зі стандартними ідентифікаторами. Мережа може містити до 127 вузлів.
- кожному вузлу видається унікальний номер в мережі.
- протокол не вимагає обов'язкової наявності майстри мережі (проте існують можливості, які доступні тільки одному вузлу в мережі, який умовно можна назвати майстром)
- OD (Object Dictionary) - словник об'єктів. Містить відсортований список змінних, доступ до яких можна отримати через мережу за допомогою SDO.
- SDO (Service Data Objects) - механізм доступу до словника об'єктів. Для доступу до об'єктів вузла мережі на цьому вузлі має бути запущений так званий SDO-сервер. У мережі може бути тільки один SDO-клієнт, умовно званий майстром, який може отримувати дані від будь-якого з серверів.
- PDO (Process Data Objects) - об'єкти для швидкого взаємодії між вузлами. Можуть містити до 8 байт даних і передаються в одному кадрі. Для кожного PDO виділяється свій ідентифікатор (в певному диапозоне). PDO умовно діляться на вхідні (RPDO) і вихідні (TPDO). Спочатку передбачається, що кожен вузол буде мати по 4 RPDO і 4 TPDO, проте їх можна перерозподілити між вузлами аж до того, що один вузол буде мати можливість приймати і передавати до 512 PDO. Однак в цьому випадку на інші вузли ідентифікаторів не вистачить.
PDO можуть надсилатися за таймером, по настанню певної події або за прямим запитом на посилку з керуючої програми.
- NMT (Network Management) - менеджер мережі. Повідомлення цього типу можуть переводити вузли в різні стани (ініціалізація, робоче, предрабочего, зупинене), а так само з їх допомогою забезпечується контроль роботи мережі - механізм heartbeat.
- Heartbeat - перекладається як серцебиття. Суть механізму полягає в тому, що кожен вузол передає в мережу певне повідомлення, унікальне для кожного вузла (ID виходить шляхом додавання номера вузла в мережі до певного числа). Будь-вузол, який хоче дізнатися, як і раніше йому доступні вузли з певними id повинен просто приймати і обробляти ці повідомлення. Повідомлення від нецікавих для нього вузлів можуть ігноруватися.
- Emergency message - в протоколі передбачена посилка повідомлень про аварійні ситуації.
- EDS (Electronic Data Sheets) - спеціальні текстові файли, що дозволяють налаштувати словник об'єктів. Існують програми, які допомагають в генерації таких файлів.

CANopenNode

CANopenNode - відкрита реалізація протоколу CANopen, написана на чистому С для використання в мікроконтролерах.

У вигляді взяття

Зрештою, я прийшов до висновку, що даний протокол не зовсім добре лягає на мою задачу і що мені доведеться написати свою реалізацію. Однак, за час, який я провів, розбираючись з цим протоколом, я набагато краще зрозумів принципи роботи з мережею CAN. Якщо Вам потрібно швидко отримати працюючий додаток, що використовує всі переваги надійної доставки, якщо Ви хочете, щоб ваша заявка було сумісно з багатьма вже існуючими системами, якщо Вам потрібні готові засоби налагодження CAN-мережі, то CANopen - це дуже хороший вибір.

Посилання на деякі ресурси, пов'язані з CAN