CAN интерфейс

Здравствуйте!
Помогите, пожалуйста, разобраться с работой Wirenboard по интерфейсу CAN.
Wirenboard 6, HW 6.5. Нужно подключить устройство по CAN интерфейсу. Пока почитал только как настроить CAN на контроллере CAN — Wiren Board.
В разделе Работа с CAN приведён пример отправки сообщения:
cansend can0 123#DEADBEEF
Вопрос: откуда берётся адрес (123)?
У CAN устройства есть два ID: ID Control сообщений, которые передаются на устройство (управление). И ID Status сообщений, которые читаем из устройства.
Есть ли пример работы с CAN устройством?
По какому протоколу работает CAN интерфейс на контроллере?

Добрый день.
Параметры cansend хорошо описаны в его документации: cansend(1) — can-utils — Debian testing — Debian Manpages
Работа с can ничем не отличается от стандартной на компьютере, например.

Вот этот вопрос непонятен. CAN - транспортный уровень… Что в него отправляется - то и передается.

Добрый день!
Спасибо за предоставленную информацию. Очень полезная. Разобрался с адресом. Устройство подключать ещё не пробовал. Проверю, напишу о результатах.
Вопрос другой, у CAN-устройства есть ID. Его указываем в команде cansend в качестве адреса. Всё понятно. Как быть когда сам контроллер WirenBoard выступает в качестве устройства? Т.е. нужно соединить по CAN-интерфейсу два контроллера. Где брать адрес (или ID)?

Как писал - CAN это транспорт. То есть порт получает все сообщения из шины, их обработкой занимается уже ПО которое работает с интерфейсом.
То есть ПО может работать и не только с одним ID.

1 лайк

Добрый день!
Настроил CAN порт через Web интерфейс как описано в документации.
В консоли ввожу команду: cansend can0 0CFF42FA#1.5
Выходит сообщение об ошибке.

Можете объяснить, что не верно в команде? Почему формат не верный?

Сейчас ещё одну проблему увидел. В разделе
Настройки/Конфигурационные файлы/Сетевые соединения
создаю новое соединение CAN bus. Даю ему имя wb-can0. Сохраняю.
Когда в следующий раз захожу в этот раздел - нет добавленного соединения.
Почему оно пропадает?
Но, однако, команда nmcli device status - показывает, что устройство can0 есть:

А команда nmcli device show can0 - пишет, что ничего в устройстве неизвестно:

Что такое “0CFF42FA” и как это интерпретируется?

Устройство wb-can0 отсутствует физически.

0CFF42FA - это ID CAN сообщения, которое нужно передать в устройство. Об этом написано здесь: cansend(1) — can-utils — Debian testing — Debian Manpages
ID может состоять из трёх байт, может быть из 8 байт.

Далее байты сообщения: 1 - byte 0; 5 - byte 1.

Что надо сделать,что бы устройство wb-can0 присутствовало?
Написано же, что порт 2 RS485 переключается в CAN. Я так и сделал. Но почему он пропадает из списка?

И в файле /etc/network/interfaces
запись о добавленном порте существует.
Т.е., всё записалось, всё отработало правильно, но в списке устройств wb-can0 нет. Как такое возможно?

Проверяю:

Также:
Screenshot_20250507_170324

Описать его предварительно в FDT контроллера, в wb-hwconf файлах. А зачем, для чего менять имя устройства?

Из какого списка?
Я, скорее всего не совсекм понимаю что делаете и чем результат отличается от ожидаемого. Пожалуйста - опишите подробней.

Чуть выше - я видел ваши скриншоты выполняемых команд nmcli. Что ожидаете увидеть в interfaces?

Добрый день!
В общем мы не понимаем друг-друга. Попробую ещё раз объяснить чего я хочу.
В Wirenboard 6 второй порт RS485 можно переключить вместо интерфейса Modbus в интерфейс CAN. В документации написано, что это можно сделать:

  1. через web-интерфейс;
  2. вручную, редактируя файл /etc/network/interfaces;
  3. с помощью команды “nmcli connection add type ethernet ifname wb-eth2” - рассмотрен пример добавления Ethernet интерфейса.

(1). В web-интерфейсе по пути “Настройки / Конфигурационные файлы / Сетевые соединения” есть список сетевых соединений.


Можно добавить соединение. Так я и делаю.

В списке появляется соединение CAN wb-can0. wb-can0 я задаю сам по аналогии с другими соединениями.
Стоит уйти из этого окна и снова сюда вернуться - CAN соединения уже нет.
Почему так происходит? Или я что-то не так понимаю? Добавленное соединение должно же быть в этом списке?

(2). После добавления сетевого соединения CAN через web-интерфейс появляется запись в файле /etc/network/interfaces:


Так же, согласно документации, эти строки можно добавить в файл вручную.

(3). В документации приведён пример команды, которая добавляет сетевой интерфейс:
nmcli connection add type ethernet ifname wb-eth2
ethernet я меняю на CAN bus, wb-eth2 на wb-can0.
Но такая команда не проходит.
На изображении отображается ошибка в командной строке, указывающая, что тип соединения 'CAN' не поддерживается. (Captioned by AI)
Подскажите, что я не правильно делаю?

Как правильно переключить порт 2 RS485 в режим CAN?

Только для релизов до bullseye, то есть до NetworkManager.

Обратите пожалуйста внимание, в поле “Имя интерфейса” вы (зачем-то) записываете физически отсутствующий интерфейс “wb-can0”.
Указывать нужно существующий интерфейс. То есть can0, если говорить о настройке штатного порта контроллера.

В списке возможных типов “CAN bus” нет.
И в документации я не нашел.

Спасибо большое за подсказку, ввёл имя can0 - теперь соединение остаётся в списке. Но почему об этом ни где не написано? Имена других соединений начинаются с “wb-” (wb-eth0, wb-ap). Как можно догадаться, что CAN соединение надо писать без “wb”? И к тому же, раз предлагают написать имя, значит можно написать имя какое мне хочется. Не сказано же ни где, что надо писать зарезервированное имя?
Но команда “nmcli connection show” не показывает, что появилось соединение CAN.


Как узнать, что соединение CAN присутствует и готово к работе?

Имя соединения - может быть любым, но уникальным в пределах хоста. Имя интерфейса - однозначно определяется, например в udev правилах, в ядре. То есть аппаратно зависимо.

Не имя. Интерфейс с которым будет работать создаваемое соединение.

Прямо вот тут CAN — Wiren Board

И не должно:

nmcli d show can0 |grep STATE
GENERAL.STATE:                          10 (unmanaged)

Контроль состояния - это уже дело ПО которое работает с интерфейсом, NM не работает с ним как с обычным сетевым.

Большое спасибо за разъяснения. Я понял, что CAN интерфейс настроен для работы.
Буду пробовать посылать команды.

Отлично. Будут вопросы - пишите, постараюсь помочь.

Добрый день!
Устройство подключено к контроллеру по CAN интерфейсу. Через консоль посылаю команды, устройство их отрабатывает.
Подскажите, пожалуйста, как сделать что бы все команды, параметры отправляемые на устройство, а так же принимаемые от устройства, отображались в окне Устройства и в окне Каналы MQTT?

Для того чтобы устройство работало с MQTT контроллера по конвенции, принятой для ПО контроллера - нужно написать драйвер. В качестве примера можно посмотреть на GitHub - wirenboard/wb-mqtt-smartweb: Wiren Board MQTT SmartWeb driver

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

  1. Есть ли ещё какой-нибудь пример про написание драйвера?
  2. В начале речь идёт о шлюзе. Что такое в данном случае шлюз? Это файл wb-mqtt-smartweb? И в этот файл нужно написать код? Здесь для примера взят контроллер Smartweb. У меня другое устройство, значит имя шлюза нужно задать другое, верно?
  3. О том, что имеется CAN интерфейс говорят строки кода в файле /etc/network/interfaces.
    Далее приведена Структура конфигурационного файла. Это код, который нужно добавить в файл /etc/network/interfaces? Или этот код нужно писать в другом файле?
  4. Опрос программ SmartWeb - что это за программы? В примере приведена структура файла .json. В моём случае устройство - это электронный трёхходовой клапан (ECV). Значит и файл будет называться: wb-mqtt-ecv / wb-mqtt-ecv-class.schema.json, верно? Какое количество программ должно быть?

Добрый день!
Поизучав информацию о драйверах, я понял, что надо сделать следующим образом, проверьте, пожалуйста:
Моё устройство - Электронный трёхходовой клапан (ECV).
Создать файл конфигурации и положить его в папку /etc/wb-mqtt-ecv.conf
Создать файл шаблона и положить в папку /etc/wb-mqtt-ecv.conf.d/classes/wb-mqtt-ecv-class.schema.json

В приведённом Вами примере шаблон называется типом программы. Это верно?
И там говорится о нескольких типах программ. А сколько их должно быть?

Добрый день.

Да, я же дал ссылку на исходники.

Ох, кажется что я неверно оценил подход…
Итак, шлюзом я называю сервис, работающий на контроллере. То есть весь комплекс из исполняемого (бинарного) файла, его конфигов и библиотек.

Вам нужно спроектировать и написать сервис. В примере сервис написан на C++.

Нет. Нужно написать программу которая будет работать с устройством. Конфиги (их необходимость, расположение) - уже определить в процессе разработки.
Вряд ли получится использовать существующий шлюз для другого оборудования. То есть просто поменять конфиги условного SmartWeb - не сработает.

Это терминология разработчика SmartWeb. Для них “программа” - это устройство реализующее конечную функцию. Например PID контроллер.
Для SmartWeb - их может быть несколько десятков.

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