使用python canopen包在两个节点之间进行CANopen协议通信

问题描述

我有两个 USB 转 CAN 设备(can0 和 can1),它们都连接到一台装有 socketcan 的 Linux 机器。我看过CAnopen协议的基础知识,我还没有看到任何可以使用Python CAnopen库在两个CAnopen设备之间建立通信的例子。

我在文档中读到每个设备都必须有一个 .eds 文件,所以我从 christiansandberg github 的 Python CAnopen 库中获取一个示例 .eds 文件,并尝试建立通信并使它们使用 PDO 相互通信,但是我做不到。

我们有一块电池并想与它通信,该电池采用 can-open 协议,并且他们提供了电池的 .eds 文件。我猜带有 CAnopen Python 库的 usb2can 设备可以完成这项工作。但是我只是不知道如何在usb2can设备和电池之间建立通信。任何有关构建数据包的见解都会有所帮助。

解决方法

这是你需要做的:

  • 获取 CAN 总线开发所需的工具。这意味着除了您自己的应用程序之外,还需要某种方式的 CAN 侦听器。这也意味着电缆 + 终端电阻。最简单的方法是使用 DB9 dsub 连接器。强烈建议使用示波器。
  • 阅读有关设备的文档,了解如何设置节点 ID 和波特率,或至少它使用哪些默认设置。
  • 找出设备使用的设备配置文件(如果有)。最常见的是 CiA 401“通用 I/O 模块”。在这种情况下,默认设置将为节点 ID 1,波特率 125kbps。
  • 您的应用程序需要在此总线上充当 NMT Master - 网络管理主机。即,负责跟踪所有其他节点的节点。
  • 如果设备符合 CANopen 标准,并且您已经确定了它使用的波特率和节点 ID,您将在通电时收到“NMT 启动”消息。很可能来自节点 1,除非您更改了设备的节点 ID。
  • 您需要向设备发送“NMT 启动远程节点”消息,以使其从预运行状态变为可运行状态。
  • 根据设备使用的设备配置文件,它现在可以响应一次发送所有启用的 PDO 数据,通常将所有数据都设置为零。
  • 现在检查设备的文档以找出驻留在哪个 PDO 中的数据。您需要将设备中的 TPDO 与应用程序中的 RPDO 相匹配,反之亦然。它们需要具有相同的 COBID - CAN 标识符,以及相同的大小等。
  • COBID 在对象字典的 PDO 通信设置中设置。如果您需要更改设备的设置,则需要通过设备对象字典的 SDO 访问来完成。
  • 更高级的选项涉及PDO 映射,您可以在其中决定将您感兴趣的数据的哪些部分放入哪个 PDO。并非所有设备都支持动态 PDO 映射 - 它可能使用静态 PDO 映射,在这种情况下,您无法更改数据的输出位置。
  • 其他有用的东西是 CANopen 的保存/加载功能,以防设备支持它们。然后,您可以永久存储您的配置,这样您的应用程序就无需在每次使用系统时在启动时发送 SDO 进行配置。
  • Heartbeat 可能有助于确保设备正常启动和运行。然后,您的应用程序将充当Heartbeat 消费者