做了几年开发,这个技术点一直是面试高频考点,今天系统梳理一下核心知识点和实战经验。

目录

一、Canopen简介

1、发展史

2、主要应用领域

3、主要优点

二、Canopen内容介绍

1、CAN数据帧的格式

2、CANopen数据结构

(1)CANopen数据结构简介

(2)CANopen帧ID

(3)CANopen协议划分


一、Canopen简介

        CANopen是基于CAN(Controller Area Network)总线的高层通信协议和设备配置文件标准。它实现了设备间的标准化数据交换,是工业自动化领域最重要的嵌入式网络标准之一。

1、发展史

(1)1990年代:由德国CiA(CAN in Automation)协会主导开发,旨在为基于CAN的工业应用建立统一标准。

(2)1995年:发布核心标准CiA DS-301,定义了通信和服务框架。

(3)后续发展:通过制定大量设备行规,覆盖了从I/O模块到复杂伺服驱动的各类设备,成为欧洲 和全球自动化领域的主流标准之一。

2、主要应用领域

工业自动化:PLC、传感器、执行器、HMI之间的通信。

运动控制:伺服驱动器、多轴协调控制。

特种车辆:工程机械、农业机械的内部控制网络。

医疗设备:医疗装置内部的子系统通信。

轨道交通:列车辅助控制系统。

3、主要优点

标准化与互操作性:统一的设备行规确保了不同厂商设备的无缝集成。

高实时性:基于事件驱动和优先级仲裁,响应速度快,适用于实时控制。

高可靠性:具备完善的错误检测、处理和节点监控机制。

网络灵活性:支持多主、对等通信,易于实现分布式控制结构。

可扩展性:网络节点最多可达127个,满足中小型系统需求。

二、Canopen内容介绍

        物理层与拓扑结构和之前的J1939的物理层与拓扑结构一致,因为这两种应用层通讯协议都是CAN总线的物理层和数据链层的,所以其数据帧的基本形式是一致的(CAN总线),主要区别在数据段。

1、CAN数据帧的格式

CAN数据帧如下图所示,分为两种,即11位标识符的标准帧与29位标识符(11+18)的扩展帧,有左到右依次是帧起始、仲裁段、控制段、数据段、CRC段、ACK段、帧结束。

最佳实践:

经过多个项目的验证,我总结了几个关键点:1) 做好异常处理 2) 添加详细日志 3) 单元测试覆盖核心逻辑。 这些看似简单,但能避免很多生产环境问题。

CAN数据帧结构介绍
段名核心功能简介
帧起始 (SOF)

​一个显性位 (逻辑0),如同发令枪,标志一帧数据的开始,并通知所有节点进行同步。

仲裁段包含本帧的标识符 (ID),ID 值越小,优先级越高。当多个节点同时发送时,优先级高的帧会“赢得”总线使用权,实现非破坏性仲裁。
控制段主要包含数据长度代码 (DLC),用 4 个比特指明数据段中包含的字节数 (0-8 个)。
数据段存放实际要传输的数据内容,长度由控制段的 DLC 指定,最多 8 个字节。
CRC 段包含一个15位的循环冗余校验码,接收节点会进行相同的计算,若结果不匹配,则表明数据传输过程中出错。
ACK 段

发送节点在此段发送两个隐性位 (逻辑1)。所有正确接收到数据的节点会在此时间段内反馈一个显性位 (逻辑0) 作为确认。

帧结束 (EOF)由 7 个连续的隐性位 (逻辑1) 组成,标志着本帧数据的终结。

2、CANopen数据结构

(1)CANopen数据结构简介

         如下图所示,CANopen 设备结构。CANopen 协议通常分为用户应用层、对象字典以及通信三个部分。其中最为核心的是对象字典,描述了应用对象和 CANopen 报文之间的关系。

        在CANopen 创立之初,即使在 CAN 总线应用最广泛的汽车电子行业,网络中的CAN节点数量和需要通讯的信息都是比较少的。人们使用 CAN 取代 RS485主要是看重其可以突发发送的实时性优势,而在多节点、长距离应用中,CAN 总线和 RS485 比起来并无优势,比如同样的波特率下,CAN 的通信距离只能达到 RS485 0.6-0.8 倍,而多节点通信 CAN无法进行任意的突发发送,不得不遵循 RS485 那样的轮询通信机制,否则会导致拥堵。

        CANopen 的创始人是非常了解 CAN 总线这个特征,所以报文传输采用CAN标准帧格式,即11bit的ID域。学习和使用CANopen协议时,只需要关注仲裁段、数据长度编码段与数据段即可,其他段均与普通CAN总线一致。

(2)CANopen帧ID

        在CANopen里通常把CAN-ID称为COB-ID(通讯对象编号)。
        我们要分清楚两个易于混淆的名称:
        1)COB-ID:Communication Object Identifier,即CAN报文的11位ID;
        2)Node-ID:设备节点ID号,即CANopen网络中的节点地址,CANopen规定了逻辑上最大128个节点,所以Node-ID最大位128(7位)。
COD-ID和Node-ID无必然联系,但在过程数据对象(PDO)和服务数据对象(SDO)中,COB-ID包含了Node-ID。
功能码:与Modbus里的类似,就是表示这条报文的功能,例如读/写等。
功能码和节点号可以都存在,也可以只存在任意一个。
下面是CANopen协议中 PDO(过程数据对象)​ 和 SDO(服务数据对象)​ 的对比表格。
PDO (过程数据对象)与SDO (服务数据对象)
特性维度PDO (过程数据对象)SDO (服务数据对象)
核心用途​

传输实时过程数据,如传感器读数、电机控制命令等

传输配置参数与服务数据,用于设备参数设置、状态查询等
通信模型生产者/消费者模型:单向传输,无需接收方应答,类似广播客户端/服务器模型:采用请求-响应机制,每次通信都需要确认
实时性与速度,优先级高,延迟低,专为快速、周期性数据交换设计

较低,优先级相对较低,适用于非实时、按需访问的场景

数据长度限制≤ 8字节。一帧CAN报文即可传完,保证高效率理论上无限制。通过分帧机制传输大量数据,如固件升级文件
触发方式

事件触发(如数据变化)、定时触发同步信号(SYNC)触发

按需请求触发。由客户端(通常是主站)发起

数据可靠性

不保证。采用“一厢情愿”的传输方式,可能因新数据覆盖旧数据而丢失

保证。通过握手机制确保传输可靠,数据100%准确
COB-ID规则较为灵活,可在对象字典中配置。预定义连接集中,TPDO的COB-ID通常为 0x180+ Node-ID相对固定。客户端请求帧ID通常为 0x600+ Node-ID,服务器响应帧ID为 0x580+ Node-ID
通俗类比

实时广播(如现场直播),追求速度和效率

挂号信(有回执),追求可靠与准确送达

        简单来说,PDO是为了速度与效率而生,是传输实时数据的“高速公路”;而SDO是为了可靠与精确而设计,是确保关键配置数据准确送达的“特种运输车” 。在实际系统中,它们协同工作:系统启动时用SDO配置参数(包括PDO的映射关系),运行时则主要依靠PDO进行高速实时数据交换 。

(3)CANopen协议划分

CANopen协议划分成以下几种类型的报文,COD-D对应为:

1)心跳报文

        为了监控CANopen节点是否在线与目前的节点状态,CANopen应用中通常都要求在线上电的从机定时发送状态报文(心跳报文),以便于主机确认从站是否故障、是否脱离网络。

心跳报文
11位1字节
COD-ID数据
0x700+Node-ID0x04/0x05/0x7F

2)节点状态切换

        NMT节点状态切换是非常重要的报文,COB-ID为000h,具备最高的CAN优先级。数据为2个字节:

11位1字节
COD-ID数据
0x00命令符    节点地址

3)对象字典OD(Object dictionary)

        对象是CANopen协议最为核心的概念。所谓的对象字典就是一个有序的对象组,描述了对应CANopen节点的所有参数。例如电机速度,加速度等。

CANOPEN对象字典:https://pan.baidu.com/s/1e_mMHtTZsnwo96LPSXMguw 提取码: wtng

(4)CANopen节点从上电开始的6种状态

1)初始化 (Initializing):节点上电后对功能部件(包括CAN控制器)进行初始化。

2)应用层复位 (Application Reset):节点中的应用程序复位(开始),例如设定开关量输出、模拟量输出的初始值。

3)通讯复位 (Communication Reset):节点中的CANopen通讯复位(开始)。从此刻起,该节点可以进行CANopen通信。

4)预操作状态 (Pre-operational):点的CANopen通讯处于激活状态。在此状态下,节点不能进行PDO通信,但可以进行SDO参数配置和NMT网络管理操作。

5)操作状态 (Operational):节点收到NMT主机发来的启动命令后,进入此状态。节点将按照对象字典中规定的规则传输数据(PDO通信启动),同时SDO也可用于数据传输和参数修改。

6)停止状态 (Stopped):节点收到NMT主机发来的停止命令后,进入此状态。节点的PDO通信被停止,但SDO和NMT网络管理依然可对该节点进行操作。

        除了“初始化”状态外,NMT主机可以通过NMT命令,让网络中的任意一个CANopen节点在其他5种状态之间切换。当然,CANopen节点自身也可以完成部分状态切换。

---

⭐ 优质资源

如果你觉得本文有帮助,以下资源可以帮你深入学习: