【问题标题】:How to program a simple CANopen layer如何编写一个简单的 CANopen 层
【发布时间】:2010-11-16 23:39:50
【问题描述】:

我们有一个机器人项目,电机控制器使用CANopen 进行通信。我需要使用主微控制器与这些电机控制器通信。问题是我需要在这个微控制器中开发一个CANopen层,但我只知道如何在低级(CAN)发送和接收。

我对 CANopen(PDO、SDO、Heartbeat、对象字典等)了解不多。我试图阅读 CiA 规范,但它非常复杂。如果有人能指出正确的方向或给我一个很好的教程来编写一个简单的 CANopen 层,我将不胜感激。

【问题讨论】:

标签: can-bus canopen


【解决方案1】:

由于这似乎是一个普遍感兴趣的话题 - 我同意理解完整的原始规格可能是一种痛苦的经历。所以这里有一个“让你的驱动器继续前进”的建议,而不是“实施整个事情”:

  • 检查您的 CANopen 驱动器是否可以通过 CiA 402 标准对象进行操作,出于性能原因,不配置和使用 PDO 是完全可以的,而且您真的不需要心跳,a.s.o.它通常是切换驱动器的状态机(对象 6040h,控制字),设置操作模式(对象 6060h),以及设置“轮廓位置速度”等附加参数。

  • 然后实现仅加速 SDO 传输。 (请参阅http://en.wikipedia.org/wiki/CANopen。) SDO 下载用于写入/更改驱动器中的对象。 SDO 上传用于读取对象。

  • 我建议使用可以读写 SDO 并具有 CAN 总线监视器的 PC 软件。 (我们的Kickdrive Zero 免费软件可以做到这一点,但实际上,任何其他适用于 CANopen 的 PC 工具都应该可以工作。)对您需要的数据类型和对象进行一些示例读取和写入。看看这如何转化为 CAN 级别的帧。对于基本的整数数据类型,请求总是只有一帧,答案是一帧。

  • 现在在您的微控制器上构建一个简单的协议栈,可以发送 SDO 下载/上传请求并处理答案。

免责声明 - 上述内容甚至不接近“实现 CANopen”、“支持 CANopen”,甚至“符合 CANopen”。它是关于“让您的驱动器尽快移动且无需第三方代码”。这有时是正确的做法。

【讨论】:

  • 我发现 TxPDO 的实现也很重要,以避免周期性 SDO 请求污染总线。最后,映射是一大堆 SDO 写入,您可以只解析您期望的 TxPDO 数据包。
  • 我明白你的意思,但我相信这取决于应用程序。最初的问题是关于“没有更简单的方法吗?”。我不将 PDO 映射及其通过 SDO 的配置计算到 CANopen 的更简单方面。这完全取决于您的节点数量和您真正需要的周期时间。
  • 好吧,PDO 映射本身非常简单(4 或 5 次 SDO 写入)。 IMO 对响应的处理需要做很多工作,但(再次是 IMO)如果不小于 SDO 轮询循环(毕竟你肯定想要获得输入),那么它是可比的。这正是 LabVIEW 的 CANopen 库中的 what I did
  • 哇,ntd,感谢您提供 CANopen LabVIEW 库的链接!这看起来很有趣!
【解决方案2】:

我们从头开始为嵌入式 ARM 和 Windows PC 设备实现了 CANopen 层。这并非不可能,不像以前的答案可能会让你思考。如果您只需要 CANopen 的基本功能,并且可以快速了解协议的概念,那么您可以相当快地启动和运行。

您必须阅读 CiA 规范,没有办法避免它,但起初它可能会变得有些不知所措。我建议您首先阅读 Pfeiffer、Ayre 和 Keydel 的“Embedded Networking with CAN and CANopen”。它很好地解释了基本概念,从而有助于更好地理解规范。

【讨论】:

  • 是的,您可以自己“快速”实施大多数事情。但是正如一些人已经指出的那样,如果您想要一个符合标准的实现,可以与其他符合标准的 CANopen 节点交互,那么购买商业堆栈的成本将低于您自己编写的成本。
  • 如果您从事开源、教育或非营利项目,还有两个完全免费使用的开源 CANopens 大头钉。在 Google 上搜索 CANFestival 和 CANopenNode。
  • @SimonByholm CANfestival 是LGPL,CanOpenNode 是GPL with linking exception,所以两者都可以用于商业项目。
  • @ntd LGPL 在许多紧凑型嵌入式系统上存在问题,因为所有内容都是静态链接的。
【解决方案3】:

尝试使用 CanFestival 堆栈 - 它是免费的,并且它可以轻松地从 Linux 等操作系统移植到只有滴答计时器的裸机。

4-6 个月似乎有点牵强 - 您可能只需要一个主设备或一个从设备,我们在 3-4 周内用 C++ 完成了一个只有主设备的实现。

【讨论】:

    【解决方案4】:

    我们正在使用带有 Manager 插件的 MicroCANopen 堆栈,从这里开始: http://www.canopenstore.com/pip/microcanopen.html

    与其他堆栈相比,它相对便宜,尽管我们在网络中的所有节点上都使用它,所以我无法提供关于它如何与其他 CANOpen 兼容设备一起运行的证明。

    【讨论】:

      【解决方案5】:

      不幸的是,没有simple CANopen 层。要支持 CANopen,你必须实现整个事情。

      我建议您从第三方供应商处购买 CANopen 库。通常它们并不便宜,但考虑到您自己实施它所需的时间,它比您当时的工资便宜。

      我们一直在使用PORT GmbH's ANSI-C CANopen Library 库,与我们尝试过的其他库相比,它价格适中且错误很少。

      【讨论】:

        【解决方案6】:

        如果这是商业用途,我不会考虑实施 CANopen。这将带你(即使是一个子集)在四到六个月之间(如果你真的希望它工作的话)。我不知道你每小时的工资是多少,你的上市时间要求是多少。你需要自己算算。

        【讨论】:

          【解决方案7】:

          我使用的另一个商业解决方案是IXXAT's CANopen software。它们为许多不同平台提供端口。

          如前所述:你不是免费获得它,它也不便宜。但与几个月的开发时间相比,几千美元算什么?

          【讨论】:

            猜你喜欢
            • 2012-07-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-11-07
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多