如何编写 CANopen 堆栈?

问题描述 投票:0回答:3

我也有类似的问题。 如何编写简单的 CANopen 层。 我阅读了答案,但我必须自己编写一个 CANopen 层,我无法获得商业层。那么编写 CANopen 堆栈(或我不确定其差异的层)有什么基础知识吗?我什至不知道从哪里开始......

如果需要,这里有一些信息:

我的主设备是带有 QNX 的 Beagle Bone Black。我认为 QNX 有一个通用的 CAN 库,但不是特定于 CANopen 的。我的奴隶是一个军用无刷电机控制器。我正在用 C++ 编写。

我有一份关于我的系统一般要求的文档。 有两个 RPDO 和四个 TPDO,传输是同步的,没有停止模式(因此没有心跳和节点保护)并且所有消息信息都被说明(大小、格式、相关节点 ID 等)

c++ embedded qnx can-bus canopen
3个回答
22
投票

实际上至少有 4 个开源项目实现了 CANopen:

  • CanFestival 是最古老的,也可能是最成熟的解决方案。许可证:LGPLv2。
  • CANopenNode 针对微控制器。许可证:GPLv2。
  • Lely CANopen 是一个用于实现 CANopen 主站和从站的库。许可证:Apache 版本 2。
  • openCANopen是一个运行在Linux上的master。许可证:ISC。注意:我是这个项目的作者。

我本来会发布链接,但显然我没有足够的“声誉”。

openCANopen 还包括一些实用程序,例如用于通过 TCP 转发流量的守护程序以及解释 CANopen 流量并将其转储到标准输出的程序。

Lely CANopen 实际上具有相当不错的代码质量,如果在我开始编写自己的实现时它可用的话,我可能会使用它。但是,我还没有尝试使用它,所以我不能真正说哪种实现“更好”。我只能说它们是不同的,其中一个可能更适合您的需求。

现在,我怀疑这些实现是否能在 QNX 上直接开箱即用。它们要么必须进行调整,要么您可以将代码的各个部分复制到您自己的实现中。至少这可以节省您一些时间。


12
投票

快速而肮脏的解决方法是仅实现最低限度(只是不要将其作为 CANopen 进行营销或声称符合 CANopen 要求):

  • 支持其他节点将发送/期望接收的特定 RPDO/TPDO。使用固定 COBID(CAN 标识符)。忘记 PDO 映射和 PDO 配置,使用固定设置。
  • 实现 NMT 启动消息。
  • 在预操作和操作之间实现 NMT 状态转换(您的节点需要从 NMT 主站响应这些状态)。
  • 实现一些设置节点id的方法。最简单的可能是将其硬编码为程序常量。

如果你幸运的话,这就是所需要的。如果你运气不好,将会有 SDO 通信,这意味着你必须实现 SDO 协议以及整个对象字典。否则,上面的内容相当简单,不需要太多工作。

如果您需要对象字典,那么可能没有其他方法来获得成熟的协议栈。您还需要从 CAN-in-Automation 申请供应商 ID,但这是一次性费用(无版税)。


1
投票

我来自嵌入式 Office,希望将我的钱添加到您的搜索中,即使已经晚了。首先我想提一下,我们没有将驱动程序放入 canopen-stack 存储库的原因是使用多个编译器在多个目标上进行嵌入式软件开发的复杂性,以及我的目标是尽可能提供可运行的软件。仅凭一个库很难发现使用过程中的问题。

好消息,我设置了一个环境,让单个维护者(我)可以管理不同的目标和编译器。因此,canopen-stack 是在主机上使用 LLVM 开发的,并为 STM32F7xx 微控制器提供了第一个演示。更多内容即将推出,敬请期待:-)

© www.soinside.com 2019 - 2024. All rights reserved.