一、CANopen 概述
CANopen 是基于 CAN(Controller Area Network,控制器局域网) 总线的高层通信协议,属于工业自动化领域的标准化协议之一,由 CiA(CAN in Automation)协会制定与维护。
核心定位
- 解决了 CAN 总线仅定义物理层与数据链路层、缺乏统一应用层规范的问题;
- 实现了不同厂商设备的互操作性,无需定制化开发即可组网;
- 兼具 CAN 总线的实时性、可靠性、抗干扰性,同时提供标准化的设备配置、数据交换与网络管理机制。
应用领域
广泛应用于工业自动化(PLC、伺服电机、传感器)、汽车电子(车身控制、电池管理)、医疗设备、机器人、轨道交通等场景。
二、CANopen 核心原理
1. 协议分层架构
CANopen 遵循 ISO/OSI 模型的简化分层:
|-----------|----------------|---------------|
| 层级 | 功能 | 对应规范 |
| 应用层 | 设备配置、数据交换、网络管理 | CiA 301(核心规范) |
| 数据链路层 | 帧传输、仲裁、错误检测 | CAN 2.0A/B |
| 物理层 | 电气特性、传输介质 | ISO 11898-2 |
2. 核心概念:对象字典(Object Dictionary)
对象字典是 CANopen 设备的"数据中心",所有设备参数、通信配置、过程数据均以索引(Index,16位)+ 子索引(Subindex,8位) 的形式存储,是设备互操作的基础。
典型索引范围
|----------------|---------|------------------------------|
| 索引范围 | 用途 | 示例 |
| 0x1000--0x1FFF | 通信参数区 | 0x1000(设备类型)、0x100C(同步对象周期) |
| 0x2000--0x5FFF | 厂商自定义区 | 设备特有参数 |
| 0x6000--0x9FFF | 标准设备行规区 | CiA 402(伺服电机)、CiA 401(I/O模块) |
3. 核心通信对象
CANopen 定义了 5 类核心通信对象,满足不同场景需求:
(1)网络管理对象(NMT)
- 功能:控制设备状态(初始化、预操作、操作、停止),实现网络节点的启停与复位。
- 典型命令:
- 启动远程节点:0x01
- 停止远程节点:0x02
- 进入预操作状态:0x80
- 复位节点:0x81
- 复位通信:0x82
(2)过程数据对象(PDO)
- 功能 :传输实时性要求高的过程数据(如位置、速度、传感器值),无确认机制,优先级高。
- 分类:
- TPDO(Transmit PDO):设备发送数据;
- RPDO(Receive PDO):设备接收数据。
- 关键特性:
- 支持同步传输 (由 SYNC 对象触发)和异步传输(事件触发);
- 通过PDO 映射(索引 0x1600--0x17FF、0x1A00--0x1BFF)定义数据内容。
(3)服务数据对象(SDO)
- 功能 :读写对象字典,用于设备配置、参数调整,采用客户端-服务器模式,有确认机制,可靠性高。
- 传输方式:
- 加速传输:数据 ≤ 4 字节时直接传输;
- 分段传输:数据 > 4 字节时分段传输。
(4)同步对象(SYNC)
- 功能:触发同步 PDO 传输,保证网络中多个设备的动作同步(如多轴伺服电机的同步运动)。
- 周期配置:通过对象字典 0x1006(通信周期)设置。
(5)紧急对象(EMCY)
- 功能:设备发生错误时主动发送报警信息(如过流、过压、位置误差过大),优先级仅次于 NMT。
三、CANopen 调试工具与命令
1. 常用调试工具
|--------------------------------|---------|-----------------------|
| 工具 | 适用平台 | 特点 |
| SocketCAN(cansend/candump) | Linux | 开源免费,命令行操作,适合底层调试 |
| CANoe/CANalyzer | Windows | 工业级工具,支持图形化分析、CAPL 脚本 |
| PCAN-Explorer | Windows | 界面友好,支持对象字典编辑、PDO 监控 |
| CANopen Magic | 跨平台 | 轻量级,支持快速读写对象字典 |
2. 典型调试命令与示例(以 SocketCAN 为例)
假设 CAN 接口为 can0,节点 ID 为 0x05:
(1)NMT 控制命令
- 启动节点 0x05:
|-----------------------------|
| Bash cansend can0 000#01.05 |
- 说明:000 为 NMT 帧 ID,01 为启动命令,05 为目标节点 ID。
- 停止节点 0x05:
|-----------------------------|
| Bash cansend can0 000#02.05 |
(2)SDO 读写对象字典
- 读对象字典(读取设备类型,索引 0x1000,子索引 0x00):
|-----------------------------------------------|
| Bash cansend can0 605#40.00.10.00.00.00.00.00 |
- 说明:605 为 SDO 客户端帧 ID(0x600 + 节点 ID),40 为读命令,00.10 为索引 0x1000(小端序),00 为子索引。
- 写对象字典(写入同步周期,索引 0x1006,子索引 0x00,值 1000ms):
|-----------------------------------------------|
| Bash cansend can0 605#23.06.10.00.E8.03.00.00 |
- 说明:23 为写命令(4字节数据),06.10 为索引 0x1006,E8.03.00.00 为 1000(小端序)。
(3)监控总线数据
- 实时监控所有 CAN 帧:
|-------------------|
| Bash candump can0 |
- 监控特定节点的 TPDO(TPDO1 帧 ID 为 0x180 + 节点 ID = 0x185):
|---------------------------|
| Bash candump can0,185:7FF |
四、CANopen 典型应用场景
1. 工业自动化:伺服电机控制(CiA 402 行规)
- 配置流程:
- 通过 SDO 写入控制字(0x6040)、操作模式(0x6060,如位置模式);
- 配置 TPDO 映射位置实际值(0x6064),RPDO 映射目标位置(0x607A);
- 发送 NMT 启动命令,进入操作状态;
- 通过 SYNC 触发同步 PDO 传输,实现实时位置控制。
2. 汽车电子:车身控制模块(BCM)
- 应用:控制车窗、车灯、雨刮等设备;
- 优势:CANopen 的标准化降低了不同厂商 BCM 与传感器/执行器的集成难度,EMCY 对象可实时上报故障。
3. 医疗设备:呼吸机
- 应用:传输压力、流量等传感器数据,控制阀门动作;
- 优势:CAN 的高可靠性保证了医疗数据的准确传输,对象字典便于设备参数的标准化配置。
五、总结
CANopen 凭借标准化、实时性、可靠性的优势,成为工业与汽车领域最主流的 CAN 高层协议之一。理解对象字典、PDO/SDO/NMT 等核心概念,掌握 SocketCAN 等工具的调试命令,是高效开发与调试 CANopen 网络的关键。