做了几年开发,这个技术点一直是面试高频考点,今天系统梳理一下核心知识点和实战经验。
目录
一、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) 单元测试覆盖核心逻辑。 这些看似简单,但能避免很多生产环境问题。
| 段名 | 核心功能简介 |
| 帧起始 (SOF) | 一个显性位 (逻辑0),如同发令枪,标志一帧数据的开始,并通知所有节点进行同步。 |
| 仲裁段 | 包含本帧的标识符 (ID),ID 值越小,优先级越高。当多个节点同时发送时,优先级高的帧会“赢得”总线使用权,实现非破坏性仲裁。 |
| 控制段 | 主要包含数据长度代码 (DLC),用 4 个比特指明数据段中包含的字节数 (0-8 个)。 |
| 数据段 | 存放实际要传输的数据内容,长度由控制段的 DLC 指定,最多 8 个字节。 |
| CRC 段 | 包含一个15位的循环冗余校验码,接收节点会进行相同的计算,若结果不匹配,则表明数据传输过程中出错。 |
| ACK 段 | 发送节点在此段发送两个隐性位 (逻辑1)。所有正确接收到数据的节点会在此时间段内反馈一个显性位 (逻辑0) 作为确认。 |
| 帧结束 (EOF) | 由 7 个连续的隐性位 (逻辑1) 组成,标志着本帧数据的终结。 |
2、CANopen数据结构
(1)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

| 特性维度 | 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-ID | 0x04/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节点自身也可以完成部分状态切换。
浙公网安备 33010602011771号