首页 / 资讯中心 / 文章详情

canopen从理论到源码——基础篇

canopen从理论到源码——基础篇 ★ FEATURED ARTICLE
文章目录前言基础知识CAN总线CANOpen2.1 简介2.2 帧ID/COB-ID2.3 NMT2.4 PDO2.5 SDO2.6 同步协议SYNC2.7 时间戳Time-stamp2.8 紧急报文EMCYCanFestival3.1 简介3.2 字典编辑器字典编辑1 安装环境2 新建节点字典文件3 *字典索引块介绍前言从理论到源码。计划分两篇完成基础篇和代码篇。剩余篇已更新到个人博客比较忙没时间同步到CSDN个人首页链接更新日期 2026年10月15日欢迎批评指正资源失效请联系 nowhitegivefoxmail.com基础知识​ 该章节旨在理解需要的基础知识后续章节会结合源码详细说明。CAN总线​ CAN 全称为Controller Area Network即控制器局域网由德国Bosch 公司最先提出是国际上应用最广泛的现场总线之一。CAN 是一种多主方式的串行通讯总线基本设计规范要求有高的位速率、高抗电磁干扰性而且要能够检测出总线的任何错误。当信号传输距离达10Km 时CAN 仍可提供高达50Kbit/s 的数据传输速率。CAN 具有十分优越的特点​ A、较低的成本与极高的总线利用率B、 数据传输距离可长达10Km传输速率可高达1Mbit/sC、可靠的错误处理和检错机制发送的信息遭到破坏后可自动重发D、节点在错误严重的情况下具有自动退出总线的功能E、报文不包含源地址或目标地址仅用标志符来指示功能信息和优先级信息总线工作示意图详细可参照链接不再赘述CANOpen2.1 简介​ CANopen是一种架构在控制局域网路Controller Area Network, CAN上的高层通讯协定包括通讯子协定及设备子协定常在嵌入式系统中使用也是工业控制常用到的一种现场总线。由非营利组织CiACAN in Automation进行标准的起草及审核工作基本的 CANopen 设备及通讯子协定定义在 CAN in Automation (CiA) draft standard 301中。针对个别设备的子协定以 CiA 301 为基础再进行扩充。如针对 I/O 模组的 CiA401 及针对运动控制的 CiA402。​ CANopen 实现了OSI模型中的网络层以上包括网络层的协定。CANopen 标准包括寻址方案、数个小的通讯子协定及由设备子协定所定义的应用层。 CANopen 支持网络管理、设备监控及节点间的通讯其中包括一个简易的传输层可处理资料的分段传送及其组合。一般而言数据链结层及物理层会用CAN来实作。除了 CANopen 外也有其他的通讯协定如EtherCAT实作 CANopen 的设备子协定。​ 简言之CAN是物理层和数据链路层CANOpen是调用CAN进行通行的应用层。详细可参照链接。​ CANOpen入门推荐周立功教程个人笔记版本后续将围绕该文档展开对照学习(后文对此文档简称canez)。2.2 帧ID/COB-ID​ 帧ID顾名思义是每一帧报文的身份识别码。通过帧ID即可判断该报文的类型以及目标节点。在CANOpen协议中已经预定义好了绝大部分需要用到的变量例如心跳波特率序列号等。参照canez p6(表4.1)以及p8(表4.2)。除了预定义的之外开发者还可以自定义COB-ID的作用虽然几乎用不到但是在开发时还是要双方协商好避免冲突。​ CANOpen以主从模式运行每条总线仅运行有一个主节点存在从节点可达127。每个节点都应该有互异的节点ID即NODE-ID。 CANOpen报文结构为COB-ID 数据长度 数据。​COB-ID包含了该报文功能码以及目标节点的NODE-ID。例如canez p8(表4.2)中182h表示该报文功能为TPDO1目标节点ID为2。2.3 NMT​ NMT全称Network Management-Master意为网络管理主机参照canez p16。一条总线中有且仅有一个主节点。主节点通过NMT命令可控制各个从节点的状态、监测各个节点等。节点状态转换按照canez p17(图6.2)进行转换。​ NMT命令帧ID为00h。数据段中包含了需要控制的目标ID。​ NMT讲解canez p17已经非常详细不再赘述。后续章节会结合源码进行详细讲解。至此只需理解NMT命令的内容以及作用即可。2.4 PDO​ 上文说过CANOpen以主从模式运行此外还遵循生产消费模型。生产消费模型可以简单理解为一个发送数据一个接收数据发送数据的一方叫生产者接收数据的叫消费者。​ PDO通信参照canez p22。其中较难理解的映射参数将在后文结合源码讲解更容易理解。​ PDO通信一共预定义了四个。每个PDO有一对RPDO和TPDO在编辑字典时根据双方协定设置发送类型将需要传输的数据变量在PDO项中预设发送方调用TPDO接收方通过RPDO的参数变量获得值。注意收发是以节点自身为参考。PDO无需应答适合数据的大量传输。状态机转为操作态才可开启PDO传输其余状态下PDO关闭。​2.5 SDO​ 参照canez p26。​ 简言之SDO可以读写字典中的数据。问的数据中包含索引和子索引等参数目标节点即可根据问的报文中索引与子索引指向的数据返回。SDO一般用于从站的参数配置或者变量读取。SDO命令在预操作态、操作态、停止态均可发送。​2.6 同步协议SYNC​ 同步命令SYNC参见canez p30帧ID为80h。​ 该命令主要作用就是同步各个节点的网络传输主要是PDO上文PDO中提到设置发送类型即可设置为每间隔n个SYNC报文主动发送一次PDO。SYNC一般由主节点发送在字典编辑器中可以设置发送的间隔时间。例如主站每间隔20ms发送一个SYNC从站A每间隔3个SYNC发送一次TPDO1每间隔4个SYNC发送一次TPDO2。这些参数都是在字典编辑器中编辑的也可以主站通过SDO修改。2.7 时间戳Time-stamp​ 时间戳帧ID为100h数据长度为6个字节。​ 在canopen协议中时间戳以3216位方式发送储存前32位表示当日的ms数后16位表示距离1984.1.1的天数。例如 时间戳数据段为0x 12 34 56 78 9A BC 。则前32位正确顺序为0x78 56 34 12 表示毫秒后16位0xBC9A表示天数。​ 周立功提供了时间戳转换源码canez p32亦可以自行转换。2.8 紧急报文EMCY​ 紧急报文帧ID为80hNODE-ID参照canez p33。当从站发生特定错误时可发送紧急报文报文中包含canopen协议预定义的错误代码或者用户自定义的错误码主站即可接收到错误信息并做出相应处理动作。CanFestival3.1 简介​ CanFestival提供了将CANOpen运行起来的源码以及字典编辑器。可以理解为canopen是一个协议而canfestival是将canopen运行起来的协议栈该协议栈开源并且提供字典编辑器的脚本后文对应章节会详细介绍并提供源码等链接。3.2 字典编辑器​ 对象字典本质是一个结构体亦可以理解为一个数据库其中存放了所有通过CANOpen协议的数据。内部根据CANOpen协议预设了许多参数变量例如节点ID、节点状态、波特率这些变量可在对象字典编辑器中修改、添加或者删除。对每一个CANOpen设备来说对象字典是其数据储存的容器正如名字一样该结构体储存的数据可以通过SDO读写索引位置数据。​索引为两个字节0x0000~0xffff。canopen协议对索引做了预定义对部分索引如果需要存放多个数据便有了子索引子索引为一个字节​ 对象字典包括由字典编辑器生产的.c和.h文件以及字典配置文件。​ 字典编辑器为python脚本运行后可新建编辑字典文件修改字典时必须有.od配置文件并生成.c和.h的源码文件可直接替换之前的文件。开发过程中应该规范命名变量方便后续开发。字典编辑​ 协议栈的运行字典的作用至关重要。此章节将会着重介绍字典如何新建、编辑以及字典的结构组成。​ canfestival协议栈具有很多版本不同版本之间源码可能会有区别字典编辑器的版本需要与字典文件和源码对应。提供最新版版本号为CanFestival-3-de1fc3261f21。该文件中包含了canfestival的字典编辑器、RTT的CANOpen修复版本该版本可以直接运行以及编辑器运行需要的软件。1 安装环境​ 字典编辑器需要安装python如果已经安装python3需要卸载否则会出现未知错误。如果后续步骤无法进行建议卸载现有python安装上述文件中的软件如下图所示。​ 安装完成之后打开下图文件。注从官网下载的源码需要解压某压缩包上述链接提供的版本已经解压完成。如果能出现下图则说明环境配置完成否则需要按照上述步骤重新配置。2 新建节点字典文件新建文件选择节点是从站还是主站右侧根据需要选择节点网络管理类型节点守护或者心跳一般情况下建议使用心跳。输入节点名称选择网络管理类型。图中DS-4xx文件协议属于行业特定协议如401为伺服电机控制协议若节点需要控制伺服电机即可选择该协议。字典中有厂商自定义区域不同行业在该区域订立标准形成上述的多种协议。确定之后即可进入到字典编辑。如下图所示左侧0x0001-0xBfff即为索引。右侧即为该索引块对应的功能。3 *字典索引块介绍0x0001-0x0fff该区域大部分为保留区域无法编辑能力有限原因尚不清楚知晓请发邮。其他为数据类型定义。0x1000-0x1029该区域为从站节点的一些基本属性例如心跳时间硬件/软件版本号等等。如果需要添加则按左下角选择之后添加即可。0x1200-0x12ff该区域为SDO数据块存放SDO主从的参数。在此添加或者删除SDO通道。0x1400-0x15ff该区域为RPDO基础参数区域即特质化某个RPDO的属性。其中包括了传输类型、生产禁止时间、开始传输的SYNC值等等。每个RPDO根据实际需要设置参数。在这里只是开启了RPDO的传输通道并且配置了某个RPDO是如何工作的但是没有涉及到接收到的数据应该存放在何处或者变量名称。这一部分内容是在后续索引中编辑的。0x1600-0x17ff该区域即为RPDO的映射区域。上面提到RPDO的数据接收存放问题即在此编辑。每添加或者删除一个RPDO字典编辑器会在此自动添加或者删除一个PDO映射。简言之当我们在上一步骤中添加或者删除一个RPDO字典编辑器会在此区域自动添加或者删除一个RPDO映射。每个映射中数据的个数、值需要我们自己编辑。subindex即为子索引箭头所指的数字8是该RPDO接收的数据个数最下方箭头所指内容即为需要接收的数据。图中只有一个选项是因为这部分内容在后面的自定义区域编辑后续会讲到。只需知道在这里选择需要接收的数据即可。0x1800-0x19ff结构与0x1400-0x15ff相似只是该区域设置的是TPDO的参数。0x1a00-0x1bff结构与0x1600-0x17ff相似该区域设置的是TPDO的映射。0x1c00-0x1fff该区域在此编辑器中无法编辑可能需要其他编辑器才能编辑如有请邮我。0x2000-0x5fff该区域即为自定义传输的地图变量。该编辑器提供了三种数据类型一是单一变量二是数组三是多变量集合。变量在字典文件中定义为全局变量。**添加单一变量type选择var添加之后可以在type中选择数据类型如u8,u16等。**添加数组变量类型选择array输入数组成员的个数数组中所有元素的数据类型都是一样的只能在子索引为1的位置修改如下图所示。数组成员的value值可以预设也可以在程序中赋值。**添加变量集合type选择REC该方法与数组方法不同首先数组方法各成员变量名称无法自定义其次数组方法成员变量类型全部一致。该方法可以自命名各个变量名称并且选择各个变量的数据类型。如下图所示。添加数据之后在RPDO或者TPDO的mapping中即可选择需要传输的数据。注意如果想要通过PDO传输数据那两个节点的RPDO与TPDO应该对应即接收方的RPDO接收的数据与发送方TPDO地图Mapping中映射的的数据以及数据类型都应一一对应协议栈会自动将接收到的数据一一对应并赋值无需接收后手动分解报文解码。0x6000-0xbfff行业自定义区域例如伺服电机的DS401在该区域定义了许多变量用以存放数据例如线圈数最大转速当前位置等等。这些都是由组织统一规范制定的。博客
阅读完成 · 觉得有帮助?
咨询建站