如何编写简单的CANopen层

时间:2009-08-05 11:19:21

标签: can-bus canopen

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

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

7 个答案:

答案 0 :(得分:9)

因为这似乎是一个普遍感兴趣的话题 - 我同意理解完整的原始规格可能会有点痛苦。所以这里有一个建议“让你的车开始”,而不是“实现整个事情”:

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

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

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

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

免责声明 - 上述内容甚至不接近“实施CANopen”,“支持CANopen”,甚至“CANopen兼容”。这是关于“让你的驱动器尽快移动,没有第三方代码”。这有时是正确的做法。

答案 1 :(得分:4)

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

你必须阅读CiA规范,没有办法避免它,但起初它可能会变得有点压倒性。我建议你先阅读Pfeiffer,Ayre和Keydel的“Embedded Networking with CAN and CANopen”。它很好地解释了基本概念,这反过来有助于更好地理解规范。

答案 2 :(得分:3)

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

4-6个月似乎有点拉伸 - 你可能只需要一个主人或一个奴隶,我们在3-4周内用C ++做了一个仅限主人的实现。

答案 3 :(得分:1)

不幸的是,没有简单的 CANopen层。要支持CANopen,你必须实现整个过程。

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

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

答案 4 :(得分:1)

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

与其他堆栈相比,它相对便宜,虽然我们在网络中的所有节点上使用它,但我无法提供关于它如何与其他符合CANOpen的设备一起运行的见证。

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

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