如何编写CanOpen堆栈?

İpe*_*ĞLU 2 c++ embedded can-bus qnx canopen

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

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

我的主设备是带有QNX的beagle bone black.QNX有一个通用的CAN库我认为但不是CANopen特有的.我的奴隶是一个军事化的无刷电机控制器.我正在用C++写作.我有一个关于我的系统的一般要求的文档.有2个RPDO和4个TPDO,传输是同步的,没有停止模式(因此没有心跳和节点保护)并且所有消息信息都被陈述(大小,格式,相关节点ID等)

any*_*ny1 13

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

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

我会发布链接,但显然我没有足够的"声誉".

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

Lely CANopen实际上具有相当不错的代码质量,如果我在开始编写自己的实现时可以使用它,我可能会使用它.但是,我没有尝试过使用它,所以我无法确切地说哪个实现"更好".我只能说它们不同,其中一种可能更适合您的需求.

现在,我怀疑任何这些实现​​都可以在QNX上直接使用.它们要么必须进行调整,要么可以将代码的各个部分复制到您自己的实现中.至少那应该可以节省你一些时间.


Lun*_*din 9

快速而肮脏的解决方法是仅实现最低限度(不要将其作为CANopen推销或声称CANopen合规性):

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

如果幸运的话,这就是所需要的.如果你运气不好,就会有SDO通讯,这意味着你必须实现SDO protcol以及整个对象字典.否则,上述内容相当简单,而且工作量不大.

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

  • @OliverHeggelbacher SDO通信仅应在预操作模式下进行。在预操作模式下允许其输出受到影响的控制系统的设计值得怀疑。同样,SDO通信也将需要更多的开销数据流量,无论是否加速。设计控制系统的实践既不是在请求发送的基础上进行,也不是在数据更改时发送(异步PDO / DS401默认行为),而是使用“事件计时器PDO”,每个操作模式都发送它们的数据_n_毫秒。 (2认同)