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):

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


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





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





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

2.4. Тест: двухканальный обмен между устройствами
2.4.1. Оборудование TC1034
Соедините CAN1 и CAN2 устройства TC1034 дюпонтовскими проводами и создайте два канала vcan0 и vcan1 описанным выше способом (рис. 15).

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


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

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




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

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



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


