CANopen PDO с использованием последовательного порта

Я пытаюсь понять протокол CANopen.

На данный момент у меня нет оборудования CAN или стека CANopen для экспериментов.

Я хотел бы знать, как написать программу на Java, чтобы просто интерпретировать сообщения CANopen, получаемые через порт RS-232.

  • Есть ли интерфейсы CAN, которые установлены как последовательный порт?
  • Смогу ли я написать программу для обработки сообщений CANopen? Я хочу только получать и интерпретировать сообщения. Это так просто, как создать буфер для входного потока, а затем разбить передачу на отдельные сообщения в соответствии с SOF и EOF? Как мне узнать, что такое SOF / EOF, поскольку он имеет длину всего 1 бит?
  • Почему существует ограничение на количество PDO узла CAN?
  • Как обработать PDO, чтобы определить узел, с которого он отправляется, а также тип данных и значение? Является ли PDO стандартным CAN-фреймом?
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
0
3 055
2

Ответы 2

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

Как правило, при использовании API для интерфейса CAN вы сможете читать сообщения, состоящие из идентификатора, длины и до восьми байтов данных. Вам не нужно беспокоиться о SOF / EOF. Даже при непосредственном взаимодействии на низком уровне с контроллером CAN (то есть, если у вас есть интерфейс CAN, для которого вам нужно написать драйвер / API самостоятельно), вам все равно не нужно заботиться об этих деталях. И вы вообще не хотите пытаться получить доступ к CAN-шине без использования CAN-контроллера ...

Если вы хотите представить, что у вас есть интерфейс CAN, вы можете создать функцию-заглушку, которая возвращает эти три элемента: идентификатор, длину данных и 64-битный буфер данных. Это в основном то, что вам предоставят все API интерфейса CAN. И при передаче сообщений CAN вы будете использовать те же параметры (идентификатор, данные о длине).

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

PDO представляют собой стандартные кадры CAN. Как уже упоминалось, CAN ID идентифицирует PDO. В предопределенном наборе соединений (которому следуют большинство устройств) идентификатор CAN всех сообщений состоит из функциональной части и части идентификатора модуля (идентификатор модуля может быть жестко запрограммирован для устройства или настраиваться, например, с помощью микропереключателей). Биты 10-7 CAN ID - это код функции, а бит 6-0 - номер модуля. Например, TxPDO1 от устройства с идентификатором модуля 0x10 будет иметь идентификатор CAN 0x190. Старшие четыре бита 11-битного CAN ID, ((CAN_ID & 0x780) >> 7), дают вам код функции (TxPDO1 = 3), а остальные биты, (CAN_ID & 0x7f), дают идентификатор модуля (который в этом примере был 0x10). Итак, если вы прочитаете сообщение на шине CAN с идентификатором CAN ID 0x190, вы узнаете, что это был PDO от устройства с идентификатором модуля 0x10.

(Более простой способ выразить это, может быть, сказать, что TxPDO1 имеет CAN ID, установленный на 0x180 + <module ID>, TxPDO2 имеет CAN ID, установленный на 0x280 + <module ID>, и т. д.)

Как следует интерпретировать данные в PDO, зависит от вашего устройства.

Я предлагаю вам найти хорошее руководство по CANopen. К сожалению, большинство из них заставляют все звучать намного сложнее, чем есть на самом деле. Так что осмотритесь, пока не найдете тот, который кажется вам понятным.

Существует множество интерфейсов CAN, которые могут работать через последовательный порт - VSCOM, Vector и многие другие. Существуют также бесплатные программы, которые позволяют отправлять и получать необработанные кадры CAN - CANhacker и т. д. Google для некоторых из них.

Чего я не нашел, так это бесплатной программы, которая может интерпретировать CANopen - большинство из них платные. Исключение составляет Wireshark для Linux - он использует SocketCAN для получения пакетов и может анализировать все кадры CANopen.

Я запускаю свою CAN-шину со скоростью 1 Mbit / s и использую интерфейс VSCOM для мониторинга ее на последовательном порту.

CANFestival - хороший стек с открытым исходным кодом, который легко переносится как на Linux, так и на голые машины.

Другие вопросы по теме