SocketCAN — CAN-стек, поддерживаемый ядром Linux: чтение и запись по CAN-шине выполняются через Socket API ядра, так что программе на C достаточно общаться с Socket API, чтобы управлять узлами CAN и передавать/принимать данные. В статье — как управлять устройствами TSCAN из Linux через SocketCAN.

Ключевые слова: SocketCAN, vcan, libTSCANApiOnLinux, sockettscan, cansend, candump, Linux.

1. Введение

Чтобы управлять устройствами TSCAN через SocketCAN, можно использовать виртуальный SocketCAN, встроенный в Linux. С помощью Linux-библиотеки TOSUN libTSCANApiOnLinux.so создаётся серверная программа vcan на локальной машине, которая преобразует сообщения SocketCAN в вызовы libTSCAN и обратно.

При таком подходе настройка скорости оборудования TOSUN и просмотр информации выполняются в программе sockettscan: сам vcan настройку скорости не поддерживает, и передать ему статистику тоже нельзя. Логическая схема (рис. 1):

Логическая схема SocketCAN
Рис. 1. Логическая схема связки SocketCAN и TSCAN

2. Руководство по SocketCAN

2.1. Настройка системного окружения

Если на компьютере уже установлен Linux, этот шаг можно пропустить.

  1. Шаг 1. Скачайте образ Ubuntu с http://releases.ubuntu.com/18.04/ (рис. 2).
  2. Шаг 2. Подключите образ в виртуальной машине: «Виртуальная машина» → «Изменить настройки» → «CD/DVD» → «Использовать ISO-образ» (рис. 3).
Загрузка Ubuntu
Рис. 2. Загрузка образа Ubuntu
Подключение ISO в ВМ
Рис. 3. Подключение ISO-образа в виртуальной машине

2.2. Загрузка библиотек

  1. Шаг 1. Создайте на рабочем столе папку vcan и скачайте в неё файлы vcan (рис. 4).
  2. Шаг 2. Скопируйте файлы папки в текущий каталог, например через USB-накопитель (рис. 5).
  3. Шаг 3. Для пяти файлов — libTSCANApiOnLinux.so, libTSH.so, sockettscan, sockettscan.cpp, TSCANDef.hpp — задайте свойства: в Permissions выставьте везде «Read and write», Group — sudo, отметьте «Execute» (рис. 6, 7).
  4. Шаг 4. В папке vcan скопируйте библиотеки libTSCANApiOnLinux.so и libTSH.so в каталог /usr/lib/ (рис. 8).
Папка vcan
Рис. 4. Папка vcan на рабочем столе
Копирование файлов
Рис. 5. Копирование файлов с USB-накопителя
Свойства файлов
Рис. 6. Настройка прав файлов
Права на исполнение
Рис. 7. Включение права на исполнение
Копирование библиотек
Рис. 8. Копирование библиотек в /usr/lib/

2.3. Включение vcan

  1. Шаг 1. Установите vcan по шагам (рис. 9, 10).
  2. Шаг 2. Проверьте установку командой ifconfig -a: если в выводе есть vcan0, установка успешна (рис. 11).
  3. Шаг 3. Установите CAN-утилиты: sudo install can-utils.
  4. Шаг 4. Запустите программу sockettscan (рис. 12, 13).
Установка vcan
Рис. 9. Установка vcan, шаги
Команды установки vcan
Рис. 10. Команды установки vcan
Проверка vcan0
Рис. 11. Проверка vcan0 через ifconfig -a
Установка can-utils
Рис. 12. Установка can-utils
Запуск sockettscan
Рис. 13. Запуск sockettscan

Привязка к каналу 1 устройства 0, скорости 500k–2M, включённый терминальный резистор: теперь вызовы SocketCAN через vcan0 синхронизируют сообщения с устройством TSCAN. Параметры: -b — арбитражная скорость, -d — скорость данных, -v — индекс аппаратуры (начинается с 0), -c — индекс канала (начинается с 1). Справка — sudo ./sockettscan -h (рис. 14).

Справка sockettscan
Рис. 14. Справка sockettscan (-h)

2.4. Тест: двухканальный обмен между устройствами

2.4.1. Оборудование TC1034

Соедините CAN1 и CAN2 устройства TC1034 дюпонтовскими проводами и создайте два канала vcan0 и vcan1 описанным выше способом (рис. 15).

Соединение каналов TC1034
Рис. 15. TC1034: соединение CAN1 и CAN2

Привяжите два канала через sockettscan. Важно при мультиканальной работе: каждый экземпляр sockettscan подключается к одному устройству TSCAN; несколько каналов указываются повторными параметрами (имя vcan0 должно идти первым); для нескольких устройств sockettscan запускается в нескольких терминалах (рис. 16, 17).

Привязка двух каналов
Рис. 16. Привязка каналов vcan0 и vcan1
Привязка каналов
Рис. 17. Привязка каналов к устройству

Проверьте приём и передачу по виртуальному CAN через cansend и candump: откройте два терминала — для приёма и для передачи. Сначала запустите candump (он блокируется в ожидании данных), затем отправьте данные командой cansend. Результат (рис. 18):

Тест cansend и candump
Рис. 18. Приём и передача через cansend и candump

2.4.2. Оборудование TC1034 и TC1016P

Соедините дюпонтовскими проводами CAN1 устройства TC1034 и CAN1 устройства TC1016P. Привяжите два канала через sockettscan: канал 1 (рис. 19, 20) и канал 2 (рис. 21, 22).

Соединение TC1034 и TC1016P
Рис. 19. Соединение TC1034 и TC1016P
Привязка канала 1
Рис. 20. Привязка канала 1
Привязка канала 2
Рис. 21. Привязка канала 2
Привязка второго устройства
Рис. 22. Привязка второго устройства

Проверьте приём и передачу по виртуальному CAN через cansend и candump в двух терминалах (рис. 23).

Тест обмена между устройствами
Рис. 23. Обмен данными между устройствами

3. Вопросы и ответы

3.1. sudo: ./sockettscan: command not found

  1. Шаг 1. Выберите файл sockettscan и откройте окно Properties (рис. 24, 25).
  2. Шаг 2. В Permissions выставьте везде «Read and write», Group — sudo, отметьте «Execute» (рис. 26).
Ошибка command not found
Рис. 24. Ошибка «command not found»
Окно Properties
Рис. 25. Окно Properties файла sockettscan
Настройка прав
Рис. 26. Настройка прав на исполнение

3.2. cannot open shared object file

В папке vcan скопируйте библиотеки libTSCANApiOnLinux.so и libTSH.so в каталог /usr/lib/ (рис. 27, 28), затем снова выполните команду подключения к оборудованию (рис. 29).

Ошибка shared object file
Рис. 27. Ошибка «cannot open shared object file»
Копирование библиотек
Рис. 28. Копирование библиотек в /usr/lib/
Повторный запуск
Рис. 29. Повторный запуск команды подключения