CAN/CANFD
CCP/UDS
Bootloader/OTA
ECU/VCU/FCU
Simulink/ECUCoder
Ethernet
Hardware
Download
上一篇
下一篇
CANopen基础知识
一.CANopen概述
-1.1.CANopen报文分类
-1.2.COB-ID简介
二.对象字典OD
-2.1.通信子协议区域
-2.2.制造商特定子协议
-2.3.标准化设备子协议
三.网络管理
-3.1.NMT节点状态
-3.2.NMT节点上线报文
-3.3.NMT心跳报文
-3.4.NMT节点状态切换指令
-3.5.CANopen主站设备
-3.6.ECU网络管理示例
四.过程数据对象PDO
-4.1.PDO的CAN-ID定义
-4.2.PDO的传输形式
-4.3.PDO的通信参数
-4.4.PDO的映射参数
-4.5.ECU与从站PDO通信示例
五.服务数据对象SDO
-5.1.通信原则
-5.2.快速SDO协议
-5.3.普通SDO协议
六.特殊协议
-6.1.同步报文协议
-6.2.时间戳报文协议
-6.3.紧急报文协议
回到顶部
CANopen基础知识
一.CANopen概述
-1.1.CANopen报文分类
-1.2.COB-ID简介
二.对象字典OD
-2.1.通信子协议区域
-2.2.制造商特定子协议
-2.3.标准化设备子协议
三.网络管理
-3.1.NMT节点状态
-3.2.NMT节点上线报文
-3.3.NMT心跳报文
-3.4.NMT节点状态切换指令
-3.5.CANopen主站设备
-3.6.ECU网络管理示例
四.过程数据对象PDO
-4.1.PDO的CAN-ID定义
-4.2.PDO的传输形式
-4.3.PDO的通信参数
-4.4.PDO的映射参数
-4.5.ECU与从站PDO通信示例
五.服务数据对象SDO
-5.1.通信原则
-5.2.快速SDO协议
-5.3.普通SDO协议
六.特殊协议
-6.1.同步报文协议
-6.2.时间戳报文协议
-6.3.紧急报文协议
回到顶部
# CANopen基础知识 ## 一. CANopen概述
CANopen是一种基于控制局域网络(Controller Area Network,CAN)开发的高层通信协议,包括通信子协议和设备子协议,通常在嵌入式系统中使用,是工业自动化中常用的一种现场总线。 CANopen基于CAN2.0A开发,CAN2.0A的OSI模型定义了物理层和数据链路层,在此基础之上CANopen还定义了传输层和应用层,CANopen的分层结构如图1-1所示。 - 传输层包括支持网络管理、设备监控及节点间通信、处理资料的分段传送及其组合等功能。 - 应用层包括寻址方案,通信子协议和设备子协议等。 ![](images/2022-11-24-16-56-04.png)
图1-1 与OSI模型对应的CANopen分层结构
CANopen 协议在使用过程中通常分为应用层、对象字典以及通信三个部分: - 应用层 用户根据实际的需求编写的应用对象,例如,取得从站数据该如何利用,该发送怎样的数据给从站等。 - 对象字典 描述了应用对象和 CANopen 报文之间的关系。 - 通信 定义了 CANopen 协议的通信规则以及与各个CAN控制器之间对应的关系。 CANopen由非营利组织CiA(CAN in Automation)进行标准的起草及审核工作,在CAN总线的工业自动化应用中,设备之间互联的需求越来越多,为此CiA制定了相对开放的、标准化的高层协议DS-301又名 CiA-301。由于CANopen在工业自动化领域的应用非常广,包括但不限于:车辆工业、轨道交通、电机驱动、工程机械等,基于DS-301定义了各个行业对应的子协议标准,例如: - CiA 401 series: Device profile for generic I/O modules 通用IO模块的设备子协议 - CiA 402 series: CANopen device profile for drives and motion control 驱动与运动控制CANopen设备子协议 - CiA 421 series: Train vehicle control system 列车车辆控制系统 - CiA 423 series: Diesel engine control system 柴油机控制系统 - CiA 424 series: Door control system 门控制系统 - CiA 426 series: Exterior light control system 外部灯控制系统 - CiA 430 series: Auxiliary equipment control system 辅助设备控制系统 它们可以实现各类设备在CAN 网络中提供标准的、统一的系统通信模式: - 应用层(Application layer):为网络中每一个有效设备提供一组有用的服务与协议。 - 通信描述(Communication profile):提供配置设备、通信数据的含义,定义数据通信方式。 - 设备描述(Device proflile):为设备增加符合规范的行为。 在 CANopen 创立之初,即使在 CAN 总线应用最广泛的汽车电子行业,网络中的 CAN 节点数量和和通信量都相对较少。而在工业自动化中,RS485是最为常用的通信总线,使用CAN取代RS485,主要在于通信效率出现以下的问题: - RS485需要逐一对节点进行查询,防止多个节点同时向总线发送数据,导致数据混乱。而CAN总线上的每个节点都拥有一个CAN控制器,通过发送的CAN-ID自动进行总线仲裁,始终保持总线上同一时刻只存在一条报文。 - RS485只提供物理层,而不提供数据链路层,因此数据错误的情况只能由应用层进行判断,RS485一旦损坏一个节点,总线网络就会全部中断。CAN总线定义了数据链路层每个节点的CAN控制器,可以对总线进行监测,在错误达到一定数量时会自动断开该节点。 CAN总线与RS485在不超100m的情况下,传输速率近乎相似,在网络传输方面CAN总线更加稳定可靠,价格方面自然也高于RS485,在并非严格要求通信质量的情况下,CAN总线并没有太大优势。但是CAN具有完善的通信协议,可由CAN控制器芯片及其接口芯片实现RS485开发中的大量代码,大大降低了系统开发难度,缩短了开发周期,这是只有物理层协议的RS485无法相比的。 ### 1.1. CANopen报文分类
CANopen与CAN规范的最大区别在于,CAN规范规定了多主竞争的方式,每个节点都是主站,通过CAN-ID进行总线仲裁。而CANopen采用的是主从机制,在一般情况下,总线上只存在一个主站,其余节点均为从站,主站控制各个从站运行,从站只返回自身数据,不与其他从站交互。 报文传输仅支持CAN标准帧格式,即11位ID,尽量减小传输时间。在CANopen网络中分为以下几类报文: - 用于网络管理的网络管理报文(NMT) - 用于实时更新数据的过程对象报文(PDO) - 用于配置各类参数的服务数据对象报文(SDO) - 特殊协议(Special protocols) 为了减小网络负载,NMT报文均采用数据最小字节数,比如心跳报文,只有 1 个字节数据,PDO报文无需接收方报文应答。SDO报文最常用的是快速 SDO,读取和写入的数据≤32位,传输一次即可完成配置。 ### 1.2. COB-ID简介
为了保证通信的时效性,减少网络的工作量,又为了减少使用者与维护者的学习时间,在CANopen中定义了强制性的默认标识符,并且重新定义了CAN-ID 11位的作用,在CANopen中称为COB-ID,如图1.3-1所示。 ![](images/2022-11-24-16-58-00.png)
图1.2-1 COB-ID
- 功能码 在CANopen中强制性定义了NMT功能、PDO功能、SDO功能、特殊报文的功能码。 - Node-ID 即CANopen网络中的节点地址,CANopen 规定了逻辑上最大128 个节点,即1个主站,127个从站,主机地址默认为0,从机地址范围为1~127。 在实际应用中COB-ID计算方式为:功能码+Node-ID,由于CANopen的开放度较高,例如某个节点需要传递的资源特别多,CANopen允许不按照这个规范定义COB-ID。 ## 二.对象字典OD(Object dictionary)
CANopen 对象字典(OD: Object Dictionary)是 CANopen 协议最为核心的概念。它是一组参数和变量的有序集合,它的作用是描述对应CANopen 节点的设备描述及设备网络状态的所有参数。CANopen协议采用16位索引和8位子索引的对象字典,一个主节点或配置工具能够访问从节点对象字典中的所有值,对象字典的结构如表2-1所示。 - 索引 长度16位,每个数据对象都会采用一个16位的索引来寻址,其范围为0x0000~0xFFFF 。 - 子索引 长度8位,为了避免数据量过大,索引不够分配的情况,在部分索引下增加了一个8位的索引值,这个值被称为子索引,其范围为0x00~0xFF 。 每个索引包含的具体参数,通常情况下不会大于32位的无符号整形数据(Unsigned int32),就是4个字节,每个 CANopen 设备都有一个对象字典,这些参数都记录在EDS文件中。 对于CANopen 网络中的主站来说,并不需要访问字典中的每一个对象,在不同的应用行业都会起草一份 CANopen 设备子协议,再由设备厂商完善成自己设备专属的子协议,在子协议中会注明每个对象的功能、名称、索引、子索引、数据类型,以及该对象是否允许读写等。 | 索引 | 对象 | | ------------- | ------------------------------- | | 0x0000 | 未使用 | | 0x0001-0x000F | 静态数据类型 | | 0x0020-0x003F | 复杂数据类型 | | 0x0040-0x005F | 制造商规定的复杂数据类型 | | 0x0060-0x007F | 设备子协议规定的静态数据类型 | | 0x0080-0x009F | 设备子协议规定的复杂数据类型 | | 0x00A0-0x0FFF | 保留 | | 0x1000-0x1FFF | 通信子协议区域(如设备类型,错误寄存器,支持的 PDO 数量) | | 0x2000-0x5FFF | 制造商特定子协议区域 | | 0x6000-0x9FFF | 标准化设备子协议区域 | | 0xA000-0xFFFF | 保留 |
表2-1 对象字典
表2-1中的通信子协议区域、制造商特定子协议区域、标准设备子协议区域,最为重要,也是制作EDS文件时需要操作的索引范围。 ### 2.1.通信子协议区域
通信子协议区域定义了所有与通信有关的对象参数,如表 2.1-1~表2.1-2所示,索引范围 0x1000-0x1029为通用通信对象,所有 CANopen 节点必须具备这些索引,否则将无法加入 CANopen 网络。在CANopen网络中,主站启动时,通常会读取所有从站的全部或者部分通用通信对象中的索引。其他索引根据实际情况进行分配与定义。 | --------------------索引范围-------------------- | -------------------Description 描述------------------- | | -------------------------------------------- | ---------------------------------------------------- | | 0x1000~0x1029 | 通用通信对象 | | 0x1200~0x12FF | SDO 参数对象 | | 0x1300~0x13FF | CANopen安全对象 | | 0x1400~0x1BFF | PDO 参数对象 | | 0x1F00~0x1F11 | SDO 管理对象 | | 0x1F20~0x1F27 | 配置管理对象 | | 0x1F50~0x1F54 | 程序控制对象 | | 0x1F80~0x1F89 | 网络管理主机对象 |
表 2.1-1 通信子协议区域
| Index 索引 | Object 对象 | Name 名字 | | -------- | --------- | ------------------------------------------ | | 0x1000 | VAR 变量 | 设备类型 | | 0x1001 | VAR 变量 | 错误寄存器 | | 0x1002 | VAR 变量 | 制造商状态寄存器 | | 0x1003 | ARRAY 数组 | 预定义错误场 | | 0x1005 | VAR 变量 | 同步报文 COB 标识符 | | 0x1006 | VAR 变量 | Communication cycle period 同步通信循环周期(单位 us) | | 0x1007 | VAR 变量 | Synchronous windows length 同步窗口长度(单位 us) | | 0x1008 | VAR 变量 | Manufacturer device name 制造商设备名称 | | 0x1009 | VAR 变量 | Manufacturer hardware version 制造商硬件版本 | | 0x100A | VAR 变量 | Manufacturer software version 制造商软件版本 | | 0x100C | VAR 变量 | Guard time 守护时间(单位 ms) | | 0x100D | VAR 变量 | Life time factor 寿命因子(单位 ms) | | 0x1010 | VAR 变量 | Store parameters 保存参数 | | 0x1011 | VAR 变量 | Restore default parameters 恢复默认参数 | | 0x1012 | VAR 变量 | COB-ID time stamp 时间报文 COB 标识符(发送网络时间) | | 0x1013 | VAR 变量 | High resolution time stamp 高分辨率时间标识 | | 0x1014 | VAR 变量 | COB-ID emergency 紧急报文 COB 标识符 | | 0x1015 | VAR 变量 | Inhibit time emergency 紧急报文禁止时间(单位 100us) | | 0x1016 | ARRAY 数组 | Consumer heartbeat time 消费者心跳时间间隔(单位 ms) | | 0x1017 | VAR 变量 | Producer heartbeat time 生产者心跳时间间隔(单位 ms) | | 0x1018 | RECORD 记录 | Identity object 厂商 ID 标识对象 | | 0x1019 | VAR 变量 | Sync.counter overflow value 同步计数溢出值 | | 0x1020 | ARRAY 数组 | Verify configuration 验证配置 | | 0x1021 | VAR 变量 | Store EDS 存储 EDS | | 0x1022 | VAR 变量 | Storage format 存储格式 | | 0x1023 | RECORD 记录 | OS command 操作系统命令 | | 0x1024 | VAR 变量 | OS command mode 操作系统命令模式 | | 0x1025 | RECORD 记录 | OS debugger interface 操作系统调试接口 | | 0x1026 | ARRAY 数组 | OS prompt 操作系统提示 | | 0x1027 | ARRAY 数组 | Module list 模块列表 | | 0x1028 | ARRAY 数组 | Emergency consumer 紧急报文消费者 | | 0x1029 | ARRAY 数组 | Error behavior 错误行为 |
表2.1-2 通用通信对象
### 2.2.制造商特定子协议
对象字典索引0x2000~0x5FFF为制造商特定子协议区,通常是存放设备子协议的应用数据,地址映射关系如下所示: - RPDO 的通信参数存放在0x1400-0x15FF,映射参数存放在0x1600-0x17FF,数据存放为0x2000之后厂商自定义区。 - TPDO 的通信参数存放在0x1800-0x19FF,映射参数存放在0x1A00-0x1BFF,数据存放为0x2000之后厂商自定义区。 制造商也可以在此区域根据需求定义对象字典对象,因此不同厂家对于该区域的定义会有所不同,详细情况请查阅章节4.4.《PDO的映射参数》。 ### 2.3.标准化设备子协议
标准化设备子协议,在索引0x6000~0x9FFF中定义了各个行业不同标准设备的子协议,例如,DS401、DS402、DS406等。对于不同的标准化设备而言,这一块区域的定义会有所不同。 ## 三.网络管理(NMT)
CANopen基于CAN2.0A开发,所有节点通信地位平等,运行时允许自行发送报文,但 CANopen 网络为了稳定可靠可控,需要设置一个网络管理主机 NMT-Master (Network Management-Master),主机的节点地址默认为0。 例如CAN规范、SAE J1939都是以多主竞争的方式通信的,CANopen用的则是主从管理模式进行通信,整个网络均由主机控制,它可以控制所有节点的启动与停止,对各个节点的运行状态进行切换。 ### 3.1.NMT节点状态
NMT网络管理对所有从节点规定了6种状态,分别是: - 初始化(Initializing) 节点上电后,对CAN控制器等部件进行初始化。 - 应用层复位(Application Reset) 对节点的应用程序进行复位操作,为对象字典索引范围0x2000~0xFFFF进行复位,例如,将各种执行器恢复到初始状态(关闭),开关量输出,模拟量输出恢复初始值。 - 通信复位(Communication reset) 对节点的CANopen通信进行复位,为对象字典索引范围0x1000~0x1FFF进行复位,启动CANopen通信,使节点接入CANopen网络。 - 预操作状态(Pre-operational) 当节点初始化完成后(包括应用层复位,通信复位),该节点自动进入与预操作状态,此时可以进行SDO配置参数 ,NMT网络管理的操作,但是不允许PDO通信。 - 操作状态(operational) 节点收到NMT主机发来的启动命令后,PDO通信启动,主从节点可以按照对象字典中的定义,进行数据传输,依旧可以进行SDO和NMT的操作。 - 停止状态(Stopped) 节点收到NMT主机发来的停止命令后,该节点的PDO通信被禁用,SDO与NMT网络管理依然可以对该节点进行操作。 在初始化结束之后(包括应用层复位,通信复位),NMT主机通过NMT命令可以让网络中任意节点进行5种状态的切换,如图3.1-1所示,一般情况用于预操作状态、操作状态和停止状态的切换,应用层复位和通信复位应用较少。 ![](images/2022-11-25-09-00-42.png)
图3.1-1 NMT管理状态转换图
### 3.2.NMT节点上线报文
CANopen规定,任意从站上线后,需要自主发送节点上线报文(boot-up),通知主站自己已经接入网络,报文格式:ID=0x700+Node-ID,数据长度1字节,内容为0。 假设该节点地址为1,则报文ID=0x701,DLC=0x01,Data=0x00,如图3.2-1所示。 ![](images/2022-11-25-09-03-02.png)
图3.2-1 节点上线报文
### 3.3.NMT心跳报文
为了监控CANopen从站是否在线以及当前的节点状态,CANopen协议通常要求接入网络的从站定时发送节点状态报文即心跳报文,以供主站监测。 从站按照对象字典中0x1017中填写的心跳时间(ms)为周期发送心跳报文,主站按照0x1016中填写的心跳次数与时间进行检查,假设超过若干次心跳时间没有收到从站的心跳报文,则认为从站已经离线或者损坏。 报文格式:ID=0x700+Node-ID,数据长度1字节,内容为X,ID与节点上线报文相同 假设该节点地址为1,则报文ID=0x701,DLC=0x01,Data=X。 当X=0x04时,代表节点处于停止状态; 当X=0x05时,代表节点处于操作状态; 当X=0x7F时,代表节点处于预操作状态。 示例如图3.3-1所示。 ![](images/2022-11-25-09-06-06.png)
图3.3-1 心跳报文
在CANopen早期应用中,存在一种主站循环发送远程帧请求,监测从站节点状态,被称为节点守护模式。 主站发送标准远程帧,请求1个字节的数据,ID=0x700+Node-ID; 从站返回数据,ID=0x700+Node-ID,DLC=1; 数据场字节0位7交替发送“0”和“1”,数据场字节0位6~0发送当前节点状态X,与心跳报文中相同。 节点守护与心跳报文不能并存,由于远程帧在 CAN 总线发展过程中逐渐被淘汰,远程帧也会增加网络负载,当今CANopen应用中已经不再使用节点守护,均由心跳报文代替。 ### 3.4.NMT节点状态切换指令
NMT 节点状态切换指令,由主站向网络中的所有从站发出的报文,ID=0x000,具有最高优先级,数据长度2个字节,该报文仅在需要的时候发送。 报文格式:ID=0x000,DLC=2,Data1=CS,Data2=Node-ID。 当CS=0x01时,代表启动命令,令节点进入操作状态; 当CS=0x02时,代表停止命令,令节点进入停止状态; 当CS=0x80时,代表预操作命令,令节点进入预操作状态; 当CS=0x81时,代表复位节点应用层,让节点的应用恢复初始状态,例如关闭各类执行器; 当CS=0x82时,代表复位节点通信,让节点的 CAN 和 CANopen 通信重新初始化,一般用于总线收到干扰,使节点进入被动错误或离线状态时; 当Node-ID=0时,对整个网络中的所有节点同时进行控制。 示例如图3.5-1所示。 ![](images/2022-11-25-09-10-34.png)
图3.4-1 NMT 节点状态切换命令
### 3.5.CANopen主站设备
CANopen主站也被称为NMT主站,作为完整的CANopen主站设备需要满足以下功能: - 支持 PDO、SDO 发送与接收; - 支持 NMT 网络管理; - 支持 PDO 通信类型并能够支持监控每一个 PDO 目标; - LSS 层设置功能:从站波特率设置、从站节点编号设置; - 支持从站管理功能:类型与名称读取、对象字典读写; - 紧急报文发送功能; - 扩展 CANopen 标准指示灯功能。 目前最为常用的两种主站,分为是可编程控制器(PLC)和PC 扩展CAN通信。 PLC必须含有内部集成CANopen 的主站功能的单元,才能通过这个单元连接到CANopen总线,PLC也是通过CPU与CANopen单元进行交互,再由CANopen单元对CANopen网络进行访问管理。 PC端则需要外接一个扩展 CANopen 主站的通信卡,从而令 PC 具有管理 CANopen网络的能力,专用CANopen主站的通信卡,一般会附带一个网络管理工具,可以用其开发和测试CANopen网络、扩展连接其他网络。 使用通用型USB-CAN卡也可以接入CANopen网络,但是无法使用CANopen配套软件,将无法进行LSS 层设置和从站管理,其余功能不受影响,依旧可以作为主站通过PDO,SDO,NMT功能控制从站。 使用电控单元ECU(比如RapidECU-U34)也可以当成CANopen主站来使用,通过PDO,SDO,NMT功能控制从站。 ### 3.6.ECU网络管理示例
使用RapidECU-U34控制器作为主站对从站变频器(假设Node-ID为1)进行CANopen网络管理示例如下图所示。 ![](images/2023-08-28-14-23-44-image.png) ## 四.过程数据对象PDO(Process data object)
PDO用于传输实时数据,单向传输,无需接收节点返回报文,数据长度一般为1~8字节,最多只要一帧就可以传递一条信息或变量。 ### 4.1.PDO的CAN-ID定义
在DS301中预定义了 PDO对象,分为: - TPDO:作用是将从站设备的运行状态数据实时发送至总线网络。 - RPDO:作用是将主站设备的命令数据实时发送至总线网络,对于从站设备而言则是接收命令。 DS301中为TPDO 和 RPDO 分别定义了 4 个数据对象,每个数据对象由1 条 CAN 报文封装,如表4.1-1所示。 | **Object 对象** | **Specification 规范** | **CAN-ID(COB-ID)** | | ------------- | -------------------- | ------------------------------- | | TPDO1 | DS301 | 0x180 +node-ID(ID范围0x181~0x1FF) | | TPDO2 | DS301 | 0x280 +node-ID(ID范围0x281~0x2FF) | | TPDO3 | DS301 | 0x380 +node-ID(ID范围0x381~0x3FF) | | TPDO4 | DS301 | 0x480 +node-ID(ID范围0x481~0x4FF) | | RPDO1 | DS301 | 0x200 +node-ID(ID范围0x201~0x27F) | | RPDO2 | DS301 | 0x300 +node-ID(ID范围0x301~0x37F) | | RPDO3 | DS301 | 0x400 +node-ID(ID范围0x401~0x47F) | | RPDO4 | DS301 | 0x500 +node-ID(ID范围0x501~0x57F) |
表4.1-1 PDO对象COB-ID
PDO报文的实际数量由从站设备制造商决定,定义在设备的对象字典与EDS文件中,PDO报文的数据物理意义由从站设备制造商决定,PDO报文示例如图4.1-1所示。 ![](images/2023-01-04-15-03-17.png)
图4.1-1 PDO报文
虽然DS301预定义了8个PDO数据对象,但是若某个节点需要传递的资源特别多,是允许自定义PDO对象的, 如上图所示Node-ID=1,需要新增一个TPDO5,那么它的COB-ID可以设为0x182,那么此时COB-ID中的位6~0不再表示Node-ID,但是需要注意,不能与其他从站协议中的ID冲突。 PDO 通信比较灵活,只要符合 PDO 范围,即0x181~0x57F,该范围内都可以作为节点自身的 TPDO 或者 RPDO 使用,因此PDO 的 COB-ID 与 Node-ID 并非完全关联。 ### 4.2.PDO的传输形式
PDO的两种传输方式:同步传输和异步传输。 - 异步传输 在CANopen总线网络空闲时,主站可以随时向从站发送RPDO,从站可以随时向主站发送TPDO,两者各管各的,不需要对方做出回应,但是主站会根据从站发来的报文判断做出相应判断。 - 同步传输 通过同步报文让所有节点能在同一时刻进行上传数据或者执行下达的应用指令,可以避免异步传输导致的应用逻辑混乱和总线负载不平衡的问题。但是,若有一个节点出现故障,主机不断丢失该节点报文,同步报文无法响应,可能使主机报错,甚至有可能使整个总线网络停止工作。 一般情况下,均使用异步传输的方式进行通信。 ### 4.3.PDO的通信参数
PDO通信参数,定义了该设备所使用的COB-ID、传输类型、定时周期等。均可在对象字典(EDS文件)中查询。RPDO对应索引 0x1400~0x15FF,TPDO对应索引0x1800~0x19FF。每条索引代表一个PDO的通信参数集,其中的子索引分别指向具体的参数,如表4.3-1所示。 | Sub-index 子索引 | Description 描述 | Data type 数据类型 | | ------------- | -------------------------------------------------------------------------------------------------------------------------- | -------------- | | 0x00 | 参数条目数量 | uint8 | | 0x01 | COB-ID:发送/接收这个 PDO 的帧 ID | uint32 | | 0x02 | Transmission type 发送类型:
0x00:非循环同步
0x01:循环同步
0xFC:远程同步
0xFD:远程异步
0xFE:异步,制造商特定事件
0xFF:异步,设备子协议特定事件 | uint8 | | 0x03 | 生产禁止约束时间(单位0.1ms) | uint16 | | 0x05 | 事件定时器触发的时间(单位 ms) | uint16 | | 0x06 | 同步起始值 | uint8 |
表4.3-1 PDO通信参数
- 参数条目数量 表示该条索引中包含几个参数。 - COB-ID 该PDO对应的CAN-ID。 - 发送类型 设定该PDO发送或者接收时的传输方式,通常使用"循环同步"或者"异步制造商特定事件"。 - 生产禁止约束时间(1/10ms): 设定PDO发送的最小间隔,避免报文传输过于密集导致总线负载剧烈增加,通过一个约束时间来进行“滤波”,防止节点短时间内不断向总线发送数据,这个时间单位为0.1ms。 - 事件定时器触发的时间(单位ms): 按照设定时间周期性发送PDO报文,如果这个时间为 0,则表示该PDO为事件触发。一般情况下TPDO为周期发送型,RPDO为事件触发型。 - 同步起始值 假设设定值为x, 同步传输的PDO在收到x条同步报文后,才进行发送。 ### 4.4.PDO的映射参数
在对象字典中定义的对象列表映射到对应的PDO,通过映射参数,主机与从机能够将通信参数、应用数据和CAN报文中具体的数据联系起来。 - RPDO的通信参数存放在0x1400~0x15FF,映射参数存放在0x1600~0x17FF,数据存放为0x2000之后厂商自定义区。 - TPDO的通信参数存放在0x1800~0x19FF,映射参数存放在0x1A00~0x1BFF,数据存放为0x2000之后厂商自定义区。 以TPDO索引0x1800为例如表4.4-1~4.4-3所示: | -----索引----- | ----------------------------------------------定义---------------------------------------------- | | ------------- | ---------------------------------------------------------------------------------------------- | | 0x1800 | TPDO1通信参数 | | **---子索引---** | **-------------------------------------------对象内容-------------------------------------------** | | 0x00 | 参数条目:0x05 | | 0x01 | COB-ID:0x181 | | 0x02 | 发送类型: 0xFF(异步) | | 0x03 | 生产禁止约束时间(1/10ms):100 | | 0x05 | 事件定时器触发的时间(单位 ms):100 | | 0x06 | 同步起始值:无 |
表4.4-1 TPDO1通信参数
| -----索引----- | ----------------------------------------------定义---------------------------------------------- | | ------------- | ---------------------------------------------------------------------------------------------- | | 0x1A00 | TPDO1映射参数 | | **---子索引---** | **-------------------------------------------对象内容-------------------------------------------** | | 0x00 | 参数条目:0x04 | | 0x01 | 值0x20300310,代表映射至索引0x2030下子索引0x03,对象16位。 | | 0x02 | 值0x20210308,代表映射至索引0x2021下子索引0x03,对象8位。 | | 0x03 | 值0x20210210,代表映射至索引0x2021下子索引0x02,对象16位。 | | 0x04 | 值0x20210610,代表映射至索引0x2021下子索引0x06,对象16位。 |
表4.4-2 TPDO1映射参数
| -----索引----- | ----------------------------------------------定义---------------------------------------------- | | ---------------- | -------------------------------------------------------------------------------------------------- | | 0x2021 | TPDO1制造商特定子协议 | | **---子索引---** | **-------------------------------------------对象内容-------------------------------------------** | | 0x00 | 参数条目:0x28 | | 0x01 | 默认值:0x00 01 类型:int16 | | 0x02 | 默认值:0xFC 03 类型:uint16 | | 0x03 | 默认值:0xBF 类型:uint8 | | 0x06 | 默认值:0xF0 31 类型:uint16 | | **-----索引-----** | **----------------------------------------------定义----------------------------------------------** | | 0x2030 | TPDO1制造商特定子协议 | | **---子索引---** | **-------------------------------------------对象内容-------------------------------------------** | | 0x00 | 参数条目:0x20 | | 0x01 | 默认值:0x00 00 类型:int16 | | 0x02 | 默认值:0x00 20 类型:uint16 | | 0x03 | 默认值:0x0C F0 类型:uint16 |
表4.4-3 制造商特定子协议
TPDO1:ID=0x181,DLC=7,数据格式为Intel,先发低字节再发高字节,Data如表4.4-4所示。 | --Byte0-- | --Byte1-- | --Byte2-- | --Byte3-- | --Byte4-- | --Byte5-- | --Byte6-- | | --------- | --------- | --------- | --------- | --------- | --------- | --------- | | 0xF0 | 0x0C | 0xBF | 0x03 | 0xFC | 0x31 | 0xF0 |
表4.4-4 TPDO1 数据场示例
### 4.5.ECU与从站PDO通信示例
使用RapidECU-U34控制器作为主站与从站变频器(假设Node-ID为1)进行PDO通信示例如下图所示。 ![](images/2023-08-28-14-31-06-image.png) ## 五.服务数据对象SDO(Service data object)
SDO主要用于CANopen主站读取和配置从站参数,从站收到报文后会返回一条应答消息,确保数据传输的准确性。 CANopen主站通过索引和子索引能够访问从站上的对象字典,从而读取其中设定的对象参数,通过SDO修改参数值。 ### 5.1.通信原则(Communication principle)
主站发送SDO报文,ID=0x600+Node-ID ,访问或者修改从站某个对象的参数值。 从站收到报文后,会向主站返回一条报文,ID=0x580+Node-ID,告知主站是否正常响应。 DLC=8,使用数据场全8个字节,未使用的字节用0补全。 ### 5.2.快速SDO协议(Expedited SDO protocol)
通常使用的SDO协议为快速SDO,主站与从站之间来回通信一次,即可完成参数的读取或配置。要求读写的值不能大于4个字节,发送的报文中包括命令字CS、要读写的索引、子索引和数据,命令字如表5.2-1所示,示例如图5.2-1所示。 | -----------命令字CS----------- | --------------方向-------------- | -----------------定义----------------- | |:---------------------------:|:------------------------------:| ------------------------------------ | | 0x2F | 主站→从站 | 写1个字节 | | 0x2B | 主站→从站 | 写2个字节 | | 0x27 | 主站→从站 | 写3个字节 | | 0x23 | 主站→从站 | 写4个字节 | | 0x60 | 主站←从站 | 写成功应答 | | 0x40 | 主站→从站 | 读取 | | 0x4F | 主站←从站 | 读响应1个字节 | | 0x4B | 主站←从站 | 读响应2个字节 | | 0x47 | 主站←从站 | 读响应3个字节 | | 0x43 | 主站←从站 | 读响应4个字节 | | 0x80 | 主站←从站 | 异常响应 |
表5.2-1 SDO命令字
![](images/2023-01-04-15-13-33.png)
图5.2-1 快速SDO报文
例如,主站向从站地址0x3006写入2个字节的数据0x64 01,未使用字节补0,首先查找地址映射,索引为0x2030,子索引为0x07。 主站发送报文:ID=0x601,Data=0x2B 30 20 07 64 01 00 00 从站响应报文:ID=0x581,Data=0x60 30 20 07 00 00 00 00 例如,主站向从站地址0x3006读取数据。 主站发送报文:ID=0x601,Data=0x40 30 20 07 00 00 00 00 从站响应报文:ID=0x581,Data=0x4B 30 20 07 64 01 00 00 通过快速SDO,可以直接对CANopen节点的对象字典中的值进行读取和修改,除了可以用来配置参数外,也经常用作关键性数据的传输。 若从站响应异常范围CS为0x80,数据场中存放附带错误代码,如表5.2-2所示。 | ---------错误代码--------- | ---------------------------------------定义--------------------------------------- | | ---------------------- | -------------------------------------------------------------------------------- | | 0x05030000 | 切换位未替代 | | 0x05040000 | SDO 协议超时 | | 0x05040001 | 客户端/服务器命令说明符无效或未知 | | 0x05040002 | 块大小无效(仅限块模式) | | 0x05040003 | 序列号无效(仅限块模式) | | 0x05040004 | CRC错误(仅限块模式) | | 0x05040005 | 内存不足 | | 0x06010000 | 不支持对对象的访问 | | 0x06010001 | 尝试读取只读对象 | | 0x06010002 | 尝试写入只读对象 | | 0x06020000 | 对象字典中不存在对象 | | 0x06040041 | 对象无法映射到PDO | | 0x06040042 | 要映射的对象的数量和长度将超过PDO长度 | | 0x06040043 | 一般参数不兼容原因 | | 0x06040047 | 设备内部普遍不兼容 | | 0x06060000 | 由于硬件错误,访问失败 | | 0x06070010 | 数据类型不匹配,服务参数长度不匹配 | | 0x06070012 | 数据类型不匹配,服务长度参数过高 | | 0x06070013 | 数据类型不匹配,服务长度参数太低 | | 0x06090011 | 子索引不存在 | | 0x06090030 | 超出了参数的值范围(仅适用于写访问) | | 0x06090031 | 写入的参数值过高 | | 0x06090032 | 写入的参数值过低 | | 0x06090036 | 最大值小于最小值 | | 0x08000000 | 一般性错误 | | 0x08000020 | 数据无法传输或存储到应用程序 | | 0x08000021 | 由于本地控制,数据无法传输或存储到应用程序 | | 0x08000022 | 由于当前设备状态,数据无法传输或存储到应用程序 | | 0x08000023 | 对象字典动态生成失败或不存在对象字典 |
表5.2-2 错误代码
### 5.3.普通SDO协议(Normal SDO protocol)
当传输数据的值超过4个字节时,无法使用快速SDO传输,必须使用普通SDO多帧报文完成传输,在实际应用中较少应用,通常只有在一些CANopen节点固件升级时才会用到。 ## 六.特殊协议(Special protocols)
为了方便 CANopen 主站对从站管理。在 CANopen 协议中,已经为特殊的功能预定义了 COB-ID,其主要有以下几种特殊报文: - 同步报文协议(Sync protocol) - 紧急报文协议(Emergency protocol) - 时间戳协议(Time-stamp protocol) ### 6.1.同步报文协议(Sync protocol)
该报文对象主要实现整个网络的同步传输(仅针对TPDO),每个节点都以该同步报文作为 PDO触发条件,收到该报文才允许发送PDO报文,因此该同步报文的 COB-ID优先级较高,以及最短的传输时间,一般选用0x80h作为同步报文的ID,如图 6.1-1 所示。 ![](images/2022-11-28-12-55-38.png)
图6.1-1 同步报文
一般同步报文由CANopen主站发出,CAN 报文的数据长度为 0 字节,收到同步报文后,从站向主站发送一帧TPDO报文,由此循环。 ### 6.2.时间戳报文协议(Time-stamp protocol)
时间标记对象(Time Stamp),NMT 主机发送自身的时钟,为网络各个节点提供公共的时间参考,即网络对时,从机将自身的时间设置为与主机相同,节点将此时间存储在对象字典 0x1012的索引中。如图6.2-1所示。 ![](images/2022-11-26-16-30-17.png)
图6.2-1 时间戳报文
数据类型是TIME_OF_DAY,该数据类型表示的时间为绝对时间,长度6字节,表示与1984年1月1日0时的时间差。 该报文主要用于故障诊断,在从站对时完成后,若某一从机发生故障,可以得知在同一时刻的其余从机的工作状态。 ### 6.3.紧急报文协议(Emergency protocol)
当设备内部发生错误时,会触发紧急事件对象(Emergency),发送设备内部错误代码,提示CANopen主站。紧急报文属于诊断性报文,一般不会影响CANopen通信,其 ID储存在索引0x1014中,一般情况下定义为0x080+Node-ID,数据场8个字节,包括EEC(紧急错误代码)、ER(错误寄存器)、MEF(厂商自定义错误代码),如图6.3-1所示。 ![](images/2023-01-04-15-17-49.png)
图6.3-1 紧急报文
紧急对象仅根据“错误事件”传输一次。只要没有新的设备上发生错误,无需传输其他紧急对象。 如果ER> 1,则发生了指定的错误,ER总共八位,唯一必须发送的信号是一般错误,一般错误在任何错误情况下都会发出信号,其余位按实际情况发送。 通过本规范,紧急错误代码(EEC)如表6.3-1 所示,错误寄存器(ER)如表6.3-2所示。设备特定的附加信息和紧急情况由厂商自定义,不在本规范的范围内。 | --------错误代码-------- | ----------------------------------------定义---------------------------------------- | | -------------------- | ---------------------------------------------------------------------------------- | | 0x00xx | Error reset or no error 错误复位或没有错误 | | 0x10xx | Generic error 一般错误 | | 0x20xx | Current 电流错误 | | 0x21xx | Device input side 设备输入端 | | 0x22xx | Inside of device 设备内部 | | 0x23xx | Device output side 设备输出端 | | 0x30xx | Voltage 电压错误 | | 0x31xx | Main 主供电 | | 0x32xx | Inside of device 设备内部 | | 0x33xx | Output 输出 | | 0x40xx | Temperature 温度错误 | | 0x41xx | Ambient 环境 | | 0x42xx | Device 设备 | | 0x50xx | Device hardware 硬件错误 | | 0x60xx | Device software 软件错误 | | 0x61xx | Internal 内部 | | 0x62xx | User 用户 | | 0x63xx | Data set 数据设置 | | 0x70xx | Additional modules 辅助设备错误 | | 0x80xx | Monitoring 监视错误 | | 0x81xx | Communication 通信 | | 0x8110 | CAN overrun CAN 通信超载 | | 0x8120 | Error Passive 错误被动 | | 0x8130 | Life Guard Error 节点守护错误 | | 0x8140 | Recovered from Bus-off 总线关闭恢复 | | 0x82xx | Protocol error 协议错误 | | 0x8210 | PDO not processed PDO 没有处理 | | 0x8220 | Length exceeded 长度越界 | | 0x90xx | External error 外部错误 | | 0xF0xx | Additional functions 附加功能错误 | | 0xFFxx | Device-specific 设备特定的错误 |
表6.3-1 紧急错误代码
| --------位-------- | --------要求-------- | ------------------------------定义------------------------------ | | ----------------- | ------------------ | -------------------------------------------------------------- | | 0 | 必须发送 | 一般错误 | | 1 | 可选发送 | 电流 | | 2 | 可选发送 | 电压 | | 3 | 可选发送 | 温度 | | 4 | 可选发送 | 通信错误(超时,错误状态) | | 5 | 可选发送 | 特定于设备配置 | | 6 | 可选发送 | 保留 | | 7 | 可选发送 | 制造商特定 |
表6.3-2 错误寄存器