如何编写简单的 CANopen 层

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

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

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

can-bus canopen
7个回答
13
投票

因为这似乎是一个普遍感兴趣的话题 - 我同意理解完整的原始规格可能是一个有点痛苦的经历。因此,这里有一个“让你的动力继续前进”的建议,而不是“实施整件事”:

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

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

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

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

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


4
投票

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

您必须阅读 CiA 规范,这是无法避免的,但一开始它可能会让人不知所措。我建议您首先阅读 Pfeiffer、Ayre 和 Keydel 撰写的“使用 CAN 和 CANopen 的嵌入式网络”。它很好地解释了基本概念,这反过来又有助于更好地理解规范。


3
投票

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

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


1
投票

我们将 MicroCANopen 堆栈与 Manager 插件一起使用,从这里开始: http://www.canopenstore.com/pip/microcanopen.html

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


1
投票

不幸的是,没有简单 CANopen 层。要支持 CANopen,您必须实施整个事情。

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

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


0
投票

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


0
投票

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

正如之前所说:它不是免费的,也不是便宜的。但与几个月的开发时间相比,几千美元又算什么呢?

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