0

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

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

我们有一个电池并想与它通信,电池工作在可以打开的协议上,他们为电池提供了 .eds 文件。我猜一个带有 CANopen Python 库的 usb2can 设备可以完成这项工作。但是我只是不知道如何在usb2can设备和电池之间建立通信。这对于构建数据包的任何见解都会有所帮助。

4

1 回答 1

1

这是你需要做的:

  • 获取 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 的 SAVE/LOAD 功能,以防设备支持它们。然后您可以永久存储您的配置,这样您的应用程序就不需要在每次使用系统时在启动时发送 SDO 进行配置。
  • Heartbeat可能有助于确保设备正常启动并运行。然后,您的应用程序将充当Heartbeat 消费者
于 2021-04-30T07:56:53.827 回答