使用串口的CANopen PDOs

3

我正在尝试理解CANopen协议。

目前,我没有任何CAN硬件或CANopen堆栈进行实验。

我想知道如何编写Java程序来简单解释在RS-232端口接收到的CANopen消息。

  • 有没有安装为串行端口的CAN接口?
  • 我能否编写程序来处理CANopen消息?我只想能够接收和解释消息。是创建输入流缓冲区,然后根据SOF和EOF将传输分成单独的消息,这么简单吗?我怎么知道SOF / EOF是什么,因为它只有1位长?
  • 为什么CAN节点的PDO数量有限制?
  • 如何处理PDO以识别发送它的节点、数据类型和值?PDO是标准的CAN帧吗?
2个回答

6
我不知道有任何连接到串口的CAN接口(基于具有CAN和串口的微控制器创建一个并不太难)。但是,标准的串口速度太慢,无法支持CAN中可用的更高速度。
通常,在使用CAN接口的API时,您将能够读取由ID、长度和最多八个字节的数据组成的消息。您不需要关心SOF/EOF。即使直接在低级别上与CAN控制器进行接口(也就是说,如果您有一个需要编写驱动程序/API的CAN接口),您仍然不需要关心这些细节。而且,您不想尝试在没有使用CAN控制器的情况下访问CAN总线...
如果您想假装拥有CAN接口,可以创建一个存根函数,该函数返回这三个项目:ID、数据长度和64位数据缓冲区。这基本上是所有CAN接口API将为您提供的内容。在传输CAN消息时,您将使用相同的参数(ID、长度数据)。
PDO由它们对CAN ID字段的使用定义。理论上,设备的PDO数量并不真正受到限制,但是预定义的连接集仅为每个节点分配了少量(四个)PDO。
PDO是标准的CAN帧。如上所述,CAN ID标识PDO。在预定义的连接集中(大多数设备都遵循此集),所有消息的CAN ID由功能部分和模块ID部分组成(模块ID可以为设备硬编码,也可以通过DIP开关进行配置等)。 CAN ID的位10-7是功能代码,位6-0是模块号。例如,具有模块ID 0x10 的设备的TxPDO1将具有CAN ID 0x190。11位CAN ID的前四位((CAN_ID & 0x780) >> 7),给出了功能代码(TxPDO1 = 3),其余位(CAN_ID & 0x7f),给出了模块ID(在此示例中为0x10)。因此,如果您在CAN总线上读取具有CAN ID 0x190的消息,则会知道这是来自模块ID 0x10的PDO。
(更简单的表达方式可能是说TxPDO1的CAN ID设置为0x180+<module ID>,TxPDO2的CAN ID设置为0x280+<module ID>,依此类推。)
如何解释PDO中的数据取决于您的设备。
我建议您找一份好的CANopen教程。不幸的是,大多数教程使一切听起来比实际复杂得多。因此,请寻找一个看起来易于理解的教程。

1

有许多CAN接口可以从串行端口运行-VSCOM,Vector和许多其他接口。还有免费的程序可以让您发送和接收原始CAN帧-CANhacker等等。谷歌搜索一些。

我没有找到一个免费的程序来解释CANopen - 大多数都是付费程序。例外是Wireshark for Linux - 它使用SocketCAN来拉取数据包并可以解析所有的CANopen帧。

我将我的CAN总线设置为1 Mbit/s,并使用VSCOM接口在串行端口上监视它。

CANFestival是一个很好的开源堆栈,易于移植到Linux以及裸机。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接