目录
- 一、CANopen 协议概述
- 二、CANopen 核心概念2.1 对象字典(Object Dictionary, OD)2.2 通信对象(Communication Objects)2.3 节点 ID(Node-ID)2.4 COB-ID(Communication Object Identifier)
- 三、NMT(网络管理)3.1 NMT 状态机3.2 NMT 命令示例
- 四、Heartbeat(心跳)4.1 生产者机制 (Heartbeat Producer)4.2 消费者机制 (Heartbeat Consumer)
- 五、SDO(服务数据对象)5.1 传输类型5.2 通信示例(Expedited 读)
- 六、PDO(过程数据对象)6.1 映射机制6.2 TPDO 示例6.3 RPDO 示例
- 七、CiA 401 应用配置文件(通用 I/O 规范)7.1 标准化对象字典7.2 应用示例:数字输入模块7.3 应用示例:数字输出控制
一、CANopen 协议概述
CANopen 是一个基于 CAN (Controller Area Network) 总线的高层通信协议,由 CiA (CAN in Automation) 国际用户和制造商组织维护和标准化。其核心目标是定义一个应用于嵌入式系统的网络层和应用层规范,确保不同制造商生产的设备能够在同一个 CAN 总线上实现无缝互联和互操作。
核心优势
CANopen 最显著的优势在于其设备互操作性。只要不同厂商的设备都符合 CANopen 标准,它们就可以在同一个网络中协同工作,无需进行大量定制开发,极大地简化了系统集成、降低了开发成本和时间。
应用领域
CANopen 协议因其高可靠性、实时性、灵活性和标准化特性,被广泛应用于以下领域:
- 运动控制:精确控制电机、驱动器等
- 工业自动化:PLC、传感器、执行器、HMI 等
- 机器人技术:多轴机器人控制
- 医疗设备:诊断和治疗设备
- 楼宇自动化:HVAC 系统、照明控制
- 轨道交通:列车控制系统
- 船舶电子设备:导航和控制系统
二、CANopen 核心概念
2.1 对象字典(Object Dictionary, OD)
对象字典是 CANopen 设备的核心,可比喻为设备的 "大脑" 或 "配置文件"。它是一个标准化且结构化的参数存储区,包含了设备的所有可配置参数、状态信息、诊断数据以及通信设置等。
核心作用
- 参数配置:允许外部设备(如 NMT 主站)通过网络修改设备的运行参数
- 状态读取:提供设备当前状态和测量值的统一访问接口
- 功能定义:定义了设备支持的功能和能力
结构化存储
对象字典中的每个条目都通过一个唯一的 16 位索引(Index)和一个可选的 8 位子索引(Sub-index)进行标识:
- 索引:类似于主地址,用于标识一个主要的功能或参数组
- 子索引:类似于副地址,用于标识主参数组中的具体子参数或数组元素
- 示例:0x1000:00 表示设备类型,0x1017:00 表示心跳周期
内容分类
- 标准定义条目:协议为通用功能预留了特定的索引范围,例如 0x1000 到 0x1FFF 通常用于通信参数和设备通用信息
- 应用配置文件定义条目:针对特定设备类型(如 CiA 401 通用 I/O、CiA 402 运动控制),定义了标准化的对象字典条目
- 厂商自定义扩展条目:厂商可以在协议预留的自定义范围内(通常是 0x2000 到 0x5FFF)添加特有的功能和参数
访问方式
对象字典中的条目通常通过 SDO (Service Data Object) 协议进行读写。SDO 提供了可靠的、请求 / 响应式的通信机制,非常适合用于非实时性的参数配置和诊断。
2.2 通信对象(Communication Objects)
CANopen 协议定义了多种不同类型的通信对象(COB),每种对象都有其特定的功能和通信模型,并由其 COB-ID 决定其类型和优先级。
- NMT (Network Management):网络管理是 CANopen 网络的 "大脑",负责控制网络中所有设备的运行状态(启动、停止、复位等),采用主从模式,通常有一个 NMT 主站管理所有从站,NMT 消息具有最高优先级。
- Heartbeat (心跳):心跳机制用于周期性地报告设备的当前 NMT 状态,允许网络中的其他设备(特别是 NMT 主站)监控该设备的在线状态和健康状况。
- SDO (Service Data Object):服务数据对象用于传输非实时、但需要可靠传输的配置、诊断和参数数据,采用请求 / 响应的服务模型,确保数据传输的完整性和正确性。
- PDO (Process Data Object):过程数据对象用于传输实时、高优先级、小批量(通常 1-8 字节)的过程数据,采用广播 / 多播通信模式,不进行握手确认,实现快速、高效的数据交换。
- SYNC (Synchronous Object):同步对象是一个周期性的广播消息,用于协调网络中多个设备的周期性动作,确保多设备同步执行任务。
- EMCY (Emergency Object):紧急事件对象用于报告设备内部发生的故障或错误,当设备检测到内部错误时立即发送,具有高优先级,允许相关节点及时响应处理异常。
2.3 节点 ID(Node-ID)
Node-ID 是 CANopen 网络中每个设备的唯一标识符:
- 唯一性:在一个 CANopen 网络中,每个设备(从站)都必须分配一个唯一的 7 位 Node-ID,范围从 1 到 127
- NMT 广播地址:Node-ID 0 是特殊值,用于 NMT 主站发送广播命令
- 配置方式:硬件配置:通过 DIP 开关、跳线帽等在设备上直接设置软件配置:在设备启动时通过 SDO 配置LSS (Layer Setting Services):CANopen 标准定义的底层服务,允许主站动态分配和配置 Node-ID
2.4 COB-ID(Communication Object Identifier)
COB-ID 是 CANopen 协议中用于标识 CAN 帧类型和优先级的 11 位 CAN 帧 ID,遵循 CAN 标准的优先级规则:数值越小,优先级越高。
组成
COB-ID 通常由两部分组成:
- 功能码 (Function Code):标识 CANopen 消息的类型(如 NMT、SDO、PDO、Heartbeat 等)
- Node-ID:标识消息的来源设备或目标设备
决定消息类型和优先级
- 消息类型:功能码决定 CANopen 消息是哪种通信对象
- 优先级:较低的 COB-ID 值意味着更高的 CAN 总线优先级,这对于实时通信至关重要
示例
- 0x000:NMT 命令,CANopen 中优先级最高的 COB-ID
- 0x080:SYNC 同步消息,优先级仅次于 NMT
- 0x180 + Node-ID:TPDO1,如 Node-ID 0x10 的 TPDO1 COB-ID 为 0x190
- 0x200 + Node-ID:RPDO1,如主站向 Node-ID 0x10 发送 RPDO1,COB-ID 为 0x210
- 0x580 + Node-ID:SDO Rx (Server -> Client),如 Node-ID 0x10 的 SDO 响应 COB-ID 为 0x590
- 0x600 + Node-ID:SDO Tx (Client -> Server),如主站向 Node-ID 0x10 发送 SDO 请求,COB-ID 为 0x610
- 0x700 + Node-ID:Heartbeat 心跳消息,如 Node-ID 0x10 的心跳 COB-ID 为 0x710
三、NMT(网络管理)
NMT 是 CANopen 网络的控制中心,负责管理网络中所有设备的生命周期和运行状态。NMT 通常采用主从模式,一个 NMT 主站负责管理多个 NMT 从站。
3.1 NMT 状态机
每个 CANopen 设备都遵循定义好的 NMT 状态机,设备在不同状态下具有不同的行为和通信能力,NMT 主站通过发送 NMT 命令控制从站的状态转换。
Initialization (初始化)
- 描述:设备上电后或接收到复位命令后首先进入此内部状态,执行自检、硬件初始化、加载固件等操作
- 行为:完成初始化后,设备会发送 Bootup 消息(COB-ID 0x700 + Node-ID,数据 [0x00]),告知网络已启动,随后自动进入 Pre-operational 状态
Pre-operational (预操作)
- 描述:设备启动后进入的默认状态,功能受限,主要用于网络的配置和诊断
- 行为:设备可以响应 NMT 命令和 SDO 请求 / 响应,但禁止进行 PDO 通信,允许主站安全地配置 PDO 映射、通信参数等
Operational (操作中)
- 描述:设备的正常工作状态,所有功能都已激活
- 行为:设备支持所有的通信对象,可正常发送和接收过程数据,执行预定的应用程序任务,主站通常发送 Start Node 命令将设备从 Pre-operational 切换到此状态
Stopped (停止)
- 描述:安全状态,通常由主站发送 Stop Node 命令触发
- 行为:设备停止所有应用程序执行,并停止所有 PDO 通信,仍会响应 NMT 命令和发送 Heartbeat 消息,但不发送或接收 PDO 数据,常用于紧急停止、维护或安全断开设备
3.2 NMT 命令示例
NMT 命令由 NMT 主站发出,COB-ID 固定为 0x000,数据包含命令码和目标 Node-ID。
场景
主站希望使 Node-ID 0x10 进入 Operational 状态
CAN 帧
- COB-ID:0x000 (NMT 命令的固定 COB-ID,最高优先级)
- Data:[0x01, 0x10]0x01 是 NMT 命令码,表示 "Start Node"(启动节点)0x10 是目标 Node-ID,表示该命令仅针对 Node-ID 为 0x10 的设备
其他常见 NMT 命令码
- 0x02:Stop Node (停止节点)
- 0x80:Enter Pre-operational (进入预操作状态)
- 0x81:Reset Node (复位节点,包括应用层和通信层)
- 0x82:Reset Communication (仅复位通信层)
广播命令
如果 NMT 命令的目标 Node-ID 为 0x00,则表示该命令是广播命令,网络中所有从站都将执行该命令(例如:[0x01, 0x00] 会启动所有节点)。
四、Heartbeat(心跳)
心跳机制是 CANopen 中用于监控设备在线状态和 NMT 状态的周期性消息。
4.1 生产者机制 (Heartbeat Producer)
每个 CANopen 设备(生产者)都会周期性地广播其当前的 NMT 状态:
- COB-ID:0x700 + Node-ID这是 NMT 错误控制消息范围的 COB-ID,0x700 是功能码,Node-ID 指定发送心跳的设备示例:Node-ID 0x10 的心跳 COB-ID 为 0x710
- 数据内容:周期性发送 1 字节 NMT 状态这一字节表示发送设备当前的 NMT 状态码,例如:0x00:Bootup(启动 / 复位),设备上电或复位后发送一次0x04:Stopped(停止)0x05:Operational(操作中)0x7F:Pre-operational(预操作)
- 周期性发送:生产者会按照其对象字典中 0x1017:00 (Heartbeat Production Time) 配置的时间间隔发送心跳,若此值为 0,则设备不发送心跳
示例
Node-ID 0x10 处于 Operational 状态时,会周期性发送帧为:
- COB-ID:0x710
- Data:[0x05] (表示 Operational 状态)
4.2 消费者机制 (Heartbeat Consumer)
NMT 主站或其他需要监控设备状态的节点(消费者)会监听并处理心跳消息。
监控设备在线状态,维护超时计时器
- 消费者会为每个需要监控的 Node-ID 维护独立的超时计时器,超时时间通常在对象字典 0x100D:00 (Heartbeat Consumer Time) 中配置,并关联到 0x100C:00 (Heartbeat Consumer Node ID)
- 接收到心跳时重置计时器:每当消费者收到来自被监控设备的心跳帧,立即重置该设备对应的超时计时器,表示设备仍然在线并正常工作
- 超时则报告故障:如果在设定的超时时间内,某个设备的计时器未能被重置,消费者判断该设备已离线、故障或通信中断,触发故障报告
收到 Bootup 状态(0x00)时,提示设备复位
- 特殊含义:当消费者收到心跳帧,其数据字节为 0x00,且 COB-ID 符合 0x700 + Node-ID 时,表明该 Node-ID 对应的设备刚刚执行了复位操作(上电、软件复位或看门狗复位)
- 详细提示与处理:即时识别:消费者立即识别出这是设备复位事件,而非简单的状态变更或故障详细日志与用户通知:"设备 [Node-ID] 报告了 Bootup (启动) 状态!这意味着设备刚刚完成复位,系统将重新尝试与该设备建立完整的通信和配置"后续流程:NMT 主站通常会根据此 Bootup 消息,重新开始对该设备的配置流程复位计数:高级系统可能会维护每个设备的复位计数器,每次收到 Bootup 消息时递增此计数
五、SDO(服务数据对象)
SDO 提供了一种可靠的、面向服务的通信机制,用于在 CANopen 网络中访问和修改对象字典条目,遵循客户端 - 服务器模型,SDO 客户端(通常是 NMT 主站)向 SDO 服务器(CANopen 从站)请求服务。
5.1 传输类型
SDO 传输根据数据量大小分为三种主要类型:
Expedited (快速传输)
- 特点:用于传输数据量小于等于 4 字节的简单读写请求
- 机制:整个读写操作在单个 CAN 帧内完成请求和响应,无需额外的分段或确认,非常高效
- 应用:读取单个参数、设置布尔值或小整数值
Segmented (分段传输)
- 特点:用于传输数据量大于 4 字节,但通常小于几十到几百字节的数据
- 机制:数据被分成多个段进行传输,每个段传输后都需要接收方发送一个确认帧(握手机制),确保数据可靠传输
- 应用:读取 / 写入长字符串、大型数组、较长的参数
Block (块传输)
- 特点:用于传输大批量数据(如固件更新、配置表)
- 机制:数据被分成块,每块包含多个数据段,发送方发送完一个块的所有数据后,接收方才发送一个确认帧,减少握手次数,提高效率
- 支持 CRC 校验:块传输通常支持可选的 CRC 校验,确保数据完整性
- 应用:固件下载、批量参数上传 / 下载
5.2 通信示例(Expedited 读)
场景
主站(Node-ID 0x0A,作为 SDO 客户端)希望读取 Node-ID 0x10 设备(作为 SDO 服务器)的对象字典中 0x1000:00(设备类型)的值。
请求帧(主站 → 从站)
- COB-ID:0x60A (0x600 + 客户端 Node-ID 0x0A)0x600 是 SDO Tx(客户端发送给服务器)的基地址
- Data:[0x40, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00]0x40:SDO 命令字节,表示一个 expedited read request0x00, 0x10:索引 0x1000 (小端序)0x00:子索引 0x000x00, 0x00, 0x00, 0x00:响应中将包含读取到的值
响应帧(从站 → 主站)
- COB-ID:0x590 (0x580 + 服务器 Node-ID 0x10)0x580 是 SDO Rx(服务器发送给客户端)的基地址
- Data:[0x4B, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00]0x4B:SDO 命令字节,表示一个 expedited read response0x00, 0x10:索引 0x1000 (回显请求的索引)0x00:子索引 0x00 (回显请求的子索引)0x00, 0x00, 0x00, 0x00:读取到的 0x1000:00 的实际值
SDO Abort 消息
如果 SDO 请求失败(如索引 / 子索引不存在、权限不足),服务器会发送一个 SDO Abort 消息,其命令字节为 0x80,并包含一个 Abort Code。
六、PDO(过程数据对象)
PDO 专为实时、高优先级的数据传输设计,通常用于传感器数据、电机位置、控制器输出等过程变量的快速交换,不提供确认机制,以追求最高效率。
6.1 映射机制
PDO 的灵活性体现在其映射机制上,每个 PDO 都可以映射对象字典中的一个或多个条目。
TPDO (Transmit PDO) 映射 (0x1A00-0x1A03)
- 作用:定义设备内部对象字典中的哪些变量(以及顺序和数据类型)将被打包到某个 TPDO 帧中并周期性发送
- 配置:NMT 主站通过 SDO 配置从站的 TPDO 映射参数,例如将 0x1A00:01 设置为 0x30010120 表示 TPDO1 的第一个映射条目是 OD 索引 0x3001、子索引 0x01 的 32 位变量
RPDO (Receive PDO) 映射 (0x1600-0x1603)
- 作用:定义当设备接收到某个 RPDO 帧时,帧中的数据如何被解析并写入到设备对象字典中的相应变量
- 配置:由 NMT 主站通过 SDO 配置从站的 RPDO 映射参数,例如将 0x1600:01 设置为 0x30000120 表示 RPDO1 接收到的数据将被写入 OD 索引 0x3000、子索引 0x01 的 32 位变量
PDO 传输触发类型
- Synchronous (同步):收到 SYNC 消息后发送 / 接收
- Asynchronous (异步 / 事件驱动):当映射的变量值发生变化、达到特定阈值或周期时间到时发送
- Cyclic (周期性):按照预设的时间间隔自动发送(独立于 SYNC)
- Remote Request (远程请求,TPDO):收到一个空的对应 PDO COB-ID 的帧时发送
6.2 TPDO 示例
场景
Node-ID 0x10(作为 TPDO 生产者)的 TPDO1 映射了其对象字典中 0x3001:01(假设是 32 位输入值,如传感器测量值),当该值发生变化或定时器触发时,设备需要发送该值。
CAN 帧
- COB-ID:0x190 (0x180 + 0x10)0x180 是 TPDO1 的基地址
- Data:[0x78, 0x56, 0x34, 0x12]假设 0x3001:01 的当前值为 0x12345678CANopen 通常使用小端序 (Little-endian) 传输多字节数据,低位字节 0x78 在前,高位字节 0x12 在后接收方解析此 PDO 帧后,会将内部对应映射的 0x3001:01 变量更新为 0x12345678
6.3 RPDO 示例
场景
主站(作为 RPDO 生产者)向 Node-ID 0x10(作为 RPDO 消费者)的 RPDO1 写入 0x3000:01(假设是 32 位输出值,如电机速度设定值)。
从站 RPDO 映射配置
Node-ID 0x10 的对象字典中 0x1600:01 已被配置为映射到 0x3000:01。
CAN 帧(主站发送)
- COB-ID:0x210 (0x200 + 0x10)0x200 是 RPDO1 的基地址
- Data:[0xAA, 0xAA, 0x00, 0x00]主站希望将 0x3000:01 的值设置为 0x0000AAAA由于是小端序,数据字节为 0xAA, 0xAA, 0x00, 0x00Node-ID 0x10 接收到此帧后,其内部对象字典 0x3000:01 的值将被更新为 0x0000AAAA,设备的应用层会根据新值控制输出
七、CiA 401 应用配置文件(通用 I/O 规范)
除了核心通信协议外,CANopen 还定义了大量的应用配置文件 (Application Profiles),针对特定类型的设备标准化其对象字典条目和 PDO 映射,增强不同厂商同类产品之间的互操作性。CiA 401 是最常见的应用配置文件之一,定义了通用 I/O 模块的接口。
7.1 标准化对象字典
核心目的
CiA 401 为数字输入 / 输出(DIO)和模拟输入 / 输出(AIO)设备提供统一的、即插即用的通信接口,使用户可通过标准化方式访问设备的 I/O 功能,无需了解设备内部细节。
关键索引范围
CiA 401 在对象字典中定义了以下关键的索引范围,用于表示不同类型的 I/O:
- 0x6000-0x60FF:数字输入 (Digital Input),用于读取数字输入引脚或通道的状态
- 0x6200-0x62FF:数字输出 (Digital Output),用于控制数字输出引脚或通道的状态
- 0x6400-0x64FF:模拟输入 (Analog Input),用于读取模拟输入通道的测量值(如电压、电流)
- 0x6700-0x67FF:模拟输出 (Analog Output),用于设置模拟输出通道的值
7.2 应用示例:数字输入模块
假设有一个符合 CiA 401 规范的数字输入模块 (Node-ID 0x10)。
OD 条目
- 0x6000:01:表示模块的第一个数字输入通道的当前状态(1 = ON,0 = OFF)
- 0x6000:02:表示第二个数字输入通道的状态
- 这些条目的值会随着实际物理输入的变化而更新
PDO 配置
NMT 主站(控制器)会通过 SDO 配置该模块的 TPDO1,使其映射上述数字输入条目:
- 主站设置模块的 0x1A00:00 (TPDO1 的映射条目数量) 为 1,并将 0x1A00:01 设置为 0x60000108 (表示映射 0x6000:01,8 位数据)
- 主站还会配置 TPDO1 的传输类型(如周期性传输或事件驱动),确保模块周期性地或在输入状态改变时自动发送包含这些输入状态的 TPDO 帧
优势
通过 PDO 传输,主站可以实时、高效地获取所有数字输入的状态,无需频繁发送 SDO 请求轮询每个输入状态,减轻总线负载并提高响应速度。
7.3 应用示例:数字输出控制
假设有一个符合 CiA 401 规范的数字输出模块 (Node-ID 0x20)。
从站 RPDO 配置
NMT 主站会通过 SDO 配置该模块的 RPDO1,使其映射到其数字输出控制条目:
- COB-ID:模块的 RPDO1 默认为 0x200 + Node-ID,即 0x220
- 映射参数:主站设置模块的 0x1600:00 (RPDO1 的映射条目数量) 为 1,并将 0x1600:01 设置为 0x62000108 (表示将接收到的数据写入 0x6200:01,8 位数据)
主站发送帧
当主站希望控制数字输出时,构造一个 RPDO 帧并发送到模块:
- COB-ID:0x220 (目标 Node-ID 0x20 的 RPDO1)
- Data:[0x01, 0x00] (假设 0x6200:01 控制第一路输出,0x6200:02 控制第二路输出,且都只用 1 位)0x01:将第一个字节的值设置为 0x01,若 0x6200:01 映射到这个字节的位 0,第一路输出将被设置为 ON0x00:将第二个字节的值设置为 0x00,若 0x6200:02 映射到这个字节的位 0,第二路输出将被设置为 OFF
从站行为
模块收到此 RPDO 帧后,会自动解析数据并更新其对象字典 0x6200:01 和 0x6200:02 的值,从而改变其物理数字输出引脚的状态。
发表评论