CANopen 预定义报文ID分类
1、报文传输采用 CAN 标准帧格式。即 11bit 的 ID 域,以尽量减小传输时间;
2、网络控制报文均采用数据最小字节数。比如心跳报文,只有 1 个字节数据;
3、实时更新的过程数据无需接收方报文应答。即采用生产消费模型,降低总线负载;
4、需要接收方确认的配置参数一般都是采用快速单字传输。即 1 个报文最多传送 1个 32 字节的参数变量,避免了分帧引起的实时性降低。
NMT(网络管理)和 Special protocols(特色协议)报文ID分类
1、NMT 主机一般是 CANopen 网络中具备监控的 PLC 或者 PC(当然也可以是一般的功能节点),所以也成为CANopen主站。相对应的其他 CANopen节点就是 NMT从机(NMT-slaves)。
2、NMT 主机和 NMT 从机之间通讯的报文就称为 NMT 网络管理报文。管理报文负责层管
理、网络管理和 ID 分配服务。例如,初始化、配置和网络管理(其中包括节点保护)。网络管理中,同一个网络中只允许有一个主节点、一个或多个从节点,并遵循主从模式。
3、另外,为了协调各个节点的同步、心跳、时间、错误提示等通讯控制,CANopen 还定义了一系列特殊协议(Special protocols)报文。如表 4.1 所示,为 CANopen 预定义报文(Pre-defined CAN-IDs)的 NMT 报文和特殊协议报文。
CAN-ID 就是这类报文的 COB-ID,其中绿色底纹的对象和CAN_ID常用协议报文。
PDO(过程数据对象)SDO(和服务数据对象)的报文 ID 分类
用户应用 CANopen 时,需要传递的配置信息和应用信息都是放在过程数据对象 PDO(Process data object)和服务数据对象 SDO (Service data object)里面。
PDO 和 SDO 的通讯区别在于,PDO 属于过程数据,即单向传输,无需接收节点回应CAN 报文来确认,从通讯术语上来说是属于“生产消费”模型。类似于UDP通讯
而 SDO 属于服务数据,有指定被接收节点的地址(Node-ID),并且需要指定的接收节点回应 CAN 报文来确认已经接收,如果超时没有确认,则发送节点将会重新发送原报文。这种通讯方式属于常见的“服务器客户端”的通信模型,即我们通常所说的轮询式。类似于TCP通信
对于 PDO 和 SDO 的报文 ID 分配,为了减少网络的组态工作量,CANopen 预定义了强制性的缺省标识符(CAN-ID)分配表,该分配表是基于 11 位 CAN-ID 的标准帧格式。将其划分为 4 位的功能码(Function-ID)和 7 位的节点号(Node-ID)。
在 CANopen 里也通常把 CAN-ID 称为 COB-ID(通信对象编号)。所以我们可以清楚两个易于混淆的名称:
1、COB-ID:Communication Object Identifier,即 CANopen 中对某种通讯对象的报文帧ID,即 CAN 报文的 11 位 ID。代表了一种通讯含义。
2、Node-ID:节点 ID 号,即 CANopen 网络中的节点地址,CANopen 规定了逻辑上最大 128 个节点,所以 Node-ID 最大为 128(7 位)。
COB-ID 和 Node-ID 无必然联系,但在过程数据对象(PDO)和服务数据对象(SDO)中,COB-ID 中包含了 Node-ID。
由于需要区分每个 CANopen 节点的输入和输出,所以 PDO 分为 TPDO(发送 PDO)
和(接收 RPDO),发送和接收是以 CANopen 从站节点为参考(如果 CAN 主站就相反)。TPDO和 RPDO 分别有 4 个数据对象,每种数据对象就是 1 条 CAN 报文封装。
而 SDO 就相对比较简单固定,发起通讯的“问”SDO 的 CAN 帧 ID 就是 600h +node-ID,这里的 Node-ID 是被问的节点地址,而被问的节点应“答”SDO 的 CAN 帧 ID 就是 580h +node-ID。一般在 CANopen 网络中,只有 NMT 主机能发起 SDO 通讯,进行节点参数配置或者关键性参数的传递。当然从节点也可以对其他从节点发起 SDO 通讯。
CANopen 预定义报文的 PDO 报文和 SDO 报文中的 ID 分类。
Object dictionary(对象字典)
CANopen 对象字典(OD: Object Dictionary)是 CANopen 协议最为核心的概念。所谓的对象字典就是一个有序的对象组,描述了对应 CANopen 节点的所有参数,包括通讯数据的存放位置也列入其索引,这个表变成可以传递形式就叫做 EDS 文件(电子数据文档Electronic Data Sheet)。对象字典,就像体检表,具备这个人每个功能的参数,便于用人单位(主站)进行合理分配工作。
每个对象采用一个 16 位的索引值来寻址,这个索引值通常被称为索引,其范围在 0x0000到 0xFFFF 之间。为了避免数据大量时无索引可分配,所以在某些索引下也定义了一个 8 位的索引值,这个索引值通常被称为子索引,其范围是 0x00 到 0xFF 之间。
每个索引内具体的参数,最大用 32 位的变量来表示,即 Unsigned32,四个字节。
每个 CANopen 设备都有一个对象字典,使用电子数据文档(EDS 文件)来记录这些参数,而不需要把这些参数记录在纸上。对于 CANopen 网络中的主节点来说,不需要对CANopen 从节点的每个对象字典项都访问。
CANopen 对象字典中的项由一系列子协议来描述。子协议为对象字典中的每个对象都
描述了它的功能、名字、索引、子索引、数据类型,以及这个对象是否必需、读写属性等等,这样可保证不同厂商的同类型设备兼容。
CANopen 协议的核心描述子协议是 DS301,其包括了 CANopen 协议应用层及通信结构描述,其它的协议子协议都是对 DS301 协议描述文本的补充与扩展。在不同的应用行业都会起草一份 CANopen 设备子协议,子协议编号一般是 DS4xx 。
对象字典概述
Communication profile area(通讯对象子协议区)
通讯对象子协议区(Communication profile area)定义了所有和通信有关的对象参数 标绿色底纹的索引范围 1000h to 1029h为通用通讯对象,所有 CANopen 节点都必须具备这些索引,否则将无法加入 CANopen 网络。
General communication objects(通用通讯对象)
由于通用通讯对象十分重要,NMT 主站(CANopen 主站)在启动时,通常都全部或
者部分读取所有从站中通用通讯对象中的索引,所以所有的通用通讯对象都必须在
CANopen 从站中实现
Manufacturer-specific Profile(制造商特定子协议)
对象字典索引 2000h to 5FFFh为制造商特定子协议,通常是存放所应用子协议的应用数据。而上文所描述的通讯对象子协议区(Communication profile area)是存放这些应用数据的通信参数
Standardized profile area(标准化设备子协议)
标准化设备子协议,为各种行业不同类型的标准设备定义对象字典中的对象。目前已有
十几种为不同类型的设备定义的子协议,例如 DS401、DS402、DS406 等,其索引值范围为 0x6000~0x9FFF。同样,这个区域对于不同的标准化设备子协议来说,相同的对象字典项其定义不一定相同。
对象字典和 EDS 文件实例
对于对象字典和 EDS 文件的实现,需要使用专用的 EDS 生成工具,并且能通过 CiA 的EDS 测试工具进行一致性测试。
Network management(网络管理 NMT) 与 CANopen 主站
一个 CANopen 网络中为了保证可靠、可控,必须要 NMT 网络管理。所以每个 CANopen 从节点的 CANopen 协议栈中,必须具备 NMT 管理的相应代码,这是节点具备 CANopen 协议的最基本的要素。
NMT 节点状态
NMT 管理涉及到一个 CANopen 节点从上电开始的 6 钟状态,包括:
1、初始化(Initializing):节点上电后对功能部件包括 CAN 控制器进行初始化;
2、应用层复位(Application Reset):节点中的应用程序复位(开始),比如开关量输出、模拟量输出的初始值;
3、通讯复位(Communication reset):节点中的CANopen通讯复位(开始),从这个时刻起,此节点就可以进行CANopen通讯了。
4、预操作状态(Pre-operational):节点的CANopen通讯处于操作就绪状态,此时此节点不能进行PDO通信,而可以进行SDO进行参数配置和NMT网络管理的操作;
5、操作状态(operational):节点收到NMT主机发来的启动命令后,CANopen通讯被
激活,PDO通信启动后,按照对象字典里面规定的规则进行传输,同样SDO也可以
对节点进行数据传输和参数修改;
6、停止状态(Stopped):节点收到NMT主机发来的停止命令后,节点的PDO通信被
停止,但SDO和NMT网络管理依然可以对节点进行操作;
除了初始化状态,NMT主机通过NMT命令可以让网络中任意一个的CANopen节点
进行其他5种状态的切换
NMT 节点上线报文
任何一个 CANopen 从站上线后,为了提示主站它已经加入网络(便于热插拔),或者
避免与其他从站 Node-ID 冲突。这个从站必须发出节点上线报文(boot-up),如图所示,节点上线报文的 ID 为 700h+Node-ID,数据为 1 个字节 0。生产者为 CANopen 从站。
NMT 节点状态与心跳报文
为了监控 CANopen 节点是否在线与目前的节点状态。CANopen 应用中通常都要求在线上电的从站定时发送状态报文(心跳报文),以便于主站确认从站是否故障、是否脱离网络。如图所示,为心跳报文发送的格式,CANID与节点上线报文相同700h+Node-ID,数据为 1 个字节,代表节点目前的状态,04h为停止状态,05h为操作状态,7Fh为预操作状态。
CANopen 从站按其对象字典中 1017h 中填写的心跳生产时间(ms)进行心跳报文的发送,而 CANopen 主站(NMT 主站)则会按其 1016h 中填写的心跳消费时间进行检查,假设超过诺干次心跳消费时间没有收到从站的心跳报文,则认为从站已经离线或者损坏。
NMT 节点守护
在早期 CANopen 应用中,还有一种可以通过轮询模式监视从站状态的节点守护模式,
它与心跳报文模式二者不能并存。通过节点守护,MNT 主机可以检查每个节点的当前状态。
NMT-Master 节点发送标准远程帧(无数据)如下:
NMT-Slave 节点应答发送数据帧,数据为 1 个字节:
数据部分包括一个触发位(bit7),触发位必须在每次节点保护应答中交替置“0”或者
“1”。触发位在第一次节点保护请求时置为“0”。位 0 到位 6(bits0~6)表示节点状态,
可为表中的数值。
由于远程帧在 CAN 发展中逐渐被淘汰,而节点守护由于需要更多的主站开销与增加网
络负载,CiA 协会已经不建议使用,被心跳报文所取代。
NMT 节点状态切换命令
NMT 网络管理中,最核心的就是 NMT 节点状态切换命令,这是 NMT 主站所进行网
络管理的“命令”报文。使用者必须牢记这些命令。
CANID 均为 000h,具备最高的 CAN 优先级。数据为 2 个字节:
第 1 个字节代表命令类型:
1、01h为启动命令(让节点进入操作状态);
2、02h为停止命令(让节点进入停止状态);
3、80h为进入预操作状态(让节点进入预操作状态);
4、81h为复位节点应用层(让节点的应用恢复初始状态,比如列车门都恢复打开状态);
5、82h为复位节点通讯(让节点的 CAN 和 CANopen 通讯重新初始化,一般用于总线收到干扰,导致节点总线错误被动,或者总线关闭时)。
第二个字节代表被控制的节点 Node-ID,如果要对整个网络所有节点同时进行控制,则这个数值为 0 即可。
CANopen 主站设备
通常 NMT 主站也称为 CANoepn 主站,上文所述为 CANopen 最基本的 NMT 操作,而作为一个完整的 CANopen 主站设备,设备模型如图 6.6 所示。为了满足管理整个 CANopen网络的从站设备,需要具备以下功能:
1、支持 PDO、SDO 发送与接收;
2、支持 NMT 网络管理;
3、支持 PDO 通信类型并能够支持监控每一个 PDO 目标;
4、LSS 层设置功能:从站波特率设置、从站节点编号设置;
5、支持从站管理功能:类型与名称读取、对象字典读写;
6、紧急报文发送功能;
7、扩展 CANopen 标准指示灯功能。
目前有二种形式的主站,一种是可编程控制器(PLC)中的一个单元,它的内部集成了
CANopen 的主站功能,这个单元能连接到 CANopen 总线,同时因为它是 PLC 中的一个单元,它能与 PLC 的 CPU 交换数据,因此通过编写 PLC 程序对它所连接的 CANopen 从站进行管理和控制。
另一种是通过 PC 扩展一个 CANopen 主站通信卡,从而令 PC 具有管理 CANopen 通信网络的能力。推荐使用 PCI 总线或 USB 总线来扩展 CANopen 通信卡,比如广州致远电子股份有限公司的 PCI-5010-P 或 USBCAN-E-P 主站卡.
Process data object(过程数据对象 PDO)
如前文所述 PDO 属于过程数据用来传输实时数据,即单向传输,无需接收节点回应
CAN 报文来确认,从通讯术语上来说是属于“生产消费”模型 PDO.
数据长度被限制为 1~8 字节。最多只要 1 帧就可以把一条信息或者一个变量传递结束。
PDO 的 CAN-ID 定义
PDO 通信比较灵活,广义上只要符合 PDO 范围内的所有 CANID 都可以作为节点自身
的 TPDO 或者 RPDO 使用,也称为 COB-ID,不受功能码和 Node-ID 限制.
而在 PDO 预定义中,人为规定了 TPDO 和 RPDO,规定了 Node-ID 在 PDO 中的位置,规定了 PDO 的编号
PDO 分为 TPDO(发送 PDO)和(接收 RPDO),发送和接收是以 CANopen 节点自身
为参考(如果 CAN 主站或者其他从站就相反)。TPDO 和 RPDO 分别有 4 个数据对象,每种数据对象就是 1 条 CAN 报文封装,这些都是数据收发的容器.
当然,如果某个节点需要传递的资源特别多,则有出现例如 TPDO5 之类的数据对象,
而它们的 CAN-ID 定义就需要打破预定义的规则,比如我们可以定义 Node-ID 为 1 的节点中 TPDO5 是 182h,这里的 PDO 的 COB-ID 中的低 7 位不再是表示 Node-ID。其实所有的PDO 的 COB-ID 与 Node-ID 无必然规则上的联系。
PDO 的传输形式
PDO 的两种传输方式:同步传输和异步传输。 如图所示,1、2 为异步传输,3、4为同步传输。
异步传输(由特定事件触发)
其触发方式可有两种,第一种是由设备子协议中规定的对象特定事件来触发(例如,定
时传输,数据变化传输等)。第二种是通过发送与 PDO 的 COB-ID 相同的远程帧来触发 PDO的发送。目前应用中的异步传输基本都采用第一种。
同步传输(通过接收同步对象实现同步)
同步传输就是通过同步报文让所有节点能在同一时刻进行上传数据或者执行下达的应
用指令,可以有效避免异步传输导致的应用逻辑混乱和总线负载不平衡的问题。一般发送同步报文的节点是 NMT 主机。
同步传输又可分为周期传输(循环)和非周期传输(无循环)。周期传输则是通过接收同步对象(SYNC)来实现,可以设置 1~240 个同步对象触发。 非周期传输是由远程帧预触发或者由设备子协议中规定的对象特定事件预触发传送。
PDO 的通信参数
PDO 通信参数,定义了该设备所使用的 COB-ID、传输类型、定时周期等。RPDO 通讯参数位于对象字典索引的 1400h to 15FFh,TPDO 通讯参数位于对象字典索引的 1800h to19FFh。每条索引代表一个 PDO 的通信参数集,其中的子索引分别指向具体的各种参数。如表所示。
PDO 的映射参数
它包含了一个对象字典中的对象列表,这些对象映射到相应的 PDO,其中包括数据的长度(单位,位),对于生产者和消费者都必须要知道这个映射参数,才能够正确的解释 PDO 内容。就是将通信参数、应用数据和具体 CAN 报文中数据联系起来。
RPDO 通讯参数 1400h to 15FFh,映射参数 1600h to 17FFh,数据存放为 2000h 之后厂商自定义区域;TPDO 通讯参数 1800h to 19FFh,映射参数 1A00h to 1BFFh,数据存放为 2000h 之后厂商自定义区域。
为了更加直观地表现映射,下表 模拟 TPDO1,将参数、应用数据、CAN 报文数据联
合起来展示,不同的映射采用不同的颜色。
CAN transmission( CAN 发送报文)
TPDO1(CAN-ID = 181h) Data field:数据域 4 个字节
Service data object(服务数据对象 SDO)
SDO 主要用于 CANopen 主站对从节点的参数配置。服务确认是 SDO 的最大的特点,
为每个消息都生成一个应答,确保数据传输的准确性。
在一个 CANopen 系统中,通常 CANopen 从节点作为 SDO 服务器,CANopen 主节点
作为客户端(称为 CS 通讯)。SDO 客户端通过索引和子索引,能够访问 SDO 服务器上的对象字典。这样 CANopen 主节点可以访问从节点的任意对象字典项的参数,并且 SDO 也可以传输任何长度的数据(当数据长度超过 4 个字节时就拆分成多个报文来传输)。
communication principle(通讯原则)
SDO 的通讯原则非常单一,发送方(客户端)发送 CAN-ID 为 600h+Node-ID 的报文,其中 Node-ID 为接收方(服务器)的节点地址,数据长度均为 8 字节;
接收方(服务器)成功接收后,回应 CAN-ID 为 580h+Node-ID 的报文。这里的 Node-ID依然是接收方(服务器)的节点地址,数据长度均为 8 字节。
Expedited SDO protocol(快速 SDO 协议)
最常用最常见的 SDO 协议是快速 SDO,所谓快速,就是 1 次来回就搞定。前提是读取和写入的值不能大于 32 位。如图所示,为快速 SDO 协议的示意图。命令中直接包含了要读写的索引、子索引、数据。可谓直接命中。快速 SDO 的难点在于 CS 命令符的记忆。
通过快速 SDO,可以直接对 CANopen 节点的对象字典中的值进行读取和修改,所以在做参数配置之外,也经常作为关键性数据传输之用。比如 CANopen 控制机器人的电机转动角度时,就使用 SDO 来传输,保证可靠到达。
Normal SDO protocol( 普通 SDO 协议)
当需要传输的值超过 32 位时,就不能使用快速 SDO 传输。必须使用普通 SDO 进行分
帧传输。在应用中较少用到,一般用于 CANopen 节点的程序固件升级,或者做网关转换MVB 总线之类数据最大可达 256 位的应用。
普通 SDO 协议难点在于分包逻辑与 CS 命令符的变化。
当然普通SDO的CAN帧ID与快速SDO相同,依然发送方(客户端)发送的报文CAN-ID
为 600h+Node-ID,接收方(服务器)成功接收后,回应 CAN-ID 为 580h+Node-ID 的报文。
普通下载
普通上传
Special protocols(特殊协议)
为了方便 CANopen 主站对从站管理。在 CANopen 协议中,已经为特殊的功能预定义
了 COB-ID,其主要有以下几种特殊报文
同步协议(Sync protocol)
每个节点都以该同步报文作为 PDO 触发参数,因此该同步报文的 COB-ID 具有比较高
的优先级以及最短的传输时间。 一般选用 80h作为同步报文的 CAN-ID.
一般同步报文由 NMT 主机发出,CAN 报文的数据为 0 字节。但如果一个网络内有 2
个同步机制,就需要设置不同的同步节拍,比如某些节点按 1 个同步帧发送 1 次 PDO,其他的节点收到2个同步帧才发送1此PDO,所以这里PDO参数中的同步起始值就起了作用。
在同步协议中,有 2 个约束条件:
1、 同步窗口时间:索引 1007h约束了同步帧发送后,从节点发送 PDO 的时效,即在
这个时间内发送的 PDO 才有效,超过时间的 PDO 将被丢弃;
2、 通讯循环周期:索引 1006h规定了同步帧的循环周期。
Time-stamp protocol(时间戳协议)
时间标记对象(Time Stamp),NMT 主机发送自身的时钟,为网络各个节点提供公共
的时间参考,即网络对时。
时间戳协议采用广播方式,无需节点应答,CAN-ID 为 100h,数据长度为 6,数据为当
前时刻与 1984 年 1 月 1 日 0 时的时间差。如图 所示。节点将此时间存储在对象字典 1012h的索引中。
Emergency protocol(紧急报文协议)
紧急事件对象(Emergency),是当设备内部发生错误,触发该对象,发送设备内部错误代码,提示 NMT 主站。紧急报文属于诊断性报文,一般不会影响 CANopen 通讯,其 CAN-ID存储在 1014h的索引中,一般会定义为 080h +node-ID,数据包含 8 个字节。
其中包括 EEC:紧急时间错误代码,ER:错误寄存器,MEF:厂商自定义的错误代码。当然这些都需要查表才能获知,进行诊断。
与 PDO 的生产禁止时间类似,紧急报文也有生产禁止时间,存储在对象字典的 1015h
中,为了限制节点不断发送紧急报文,导致总线负载过大。