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




Я не знаю ни одного 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, так и на голые машины.