CANopen 基本原理及其应用(四)——CANopen报文语法

1、 NMT报文

1.1、NMT模块控制(NMT Module Control)

只有NMT-Master节点能够传送NMT ModuleControl报文。所有从设备必须支持NMT模块控制服务。NMT Module Control消息不需要应答。NMT消息格式如下:

NMT-Master→NMT Slave

当Node-ID=0,则所有的NMT从设备被寻址。CS是命令字,可以取如下值:

1.2、MNT节点保护(NMT Node Guarding)

通过节点保护服务,MNT主节点可以检查每个节点的当前状态,当这些节点没有数据传送时这种服务尤其有意义。

NMT-Master节点发送远程帧(无数据)如下:

NMT-Master→NMT Slave

NMT-Slave节点发送如下报文应答:

NMT Slave→NMT-Master

数据部分包括一个触发位(bit7),触发位必须在每次节点保护应答中交替置“”或者“1”。触发位在第一次节点保护请求时置为“”。位到位6(bits0~6)表示节点状态,可为下表中的数值。

注意:带*号的状态只有支持扩展boot-up的节点才提供。注意状态从不在节点保护应答中出现,因为一个节点在这个状态时并不应答节点保护报文。

或者,一个节点可被配置为产生周期性的被称作心跳报文(Heartbeat)的报文。

HeartbeatProducer→Consumer(s)

状态可为下表种的数值:

当一个Heartbeat节点启动后它的Boot-up报文是其第一个Heartbeat报文。Heartbeat消费者通常是NMT-Master节点,它为每个Heartbeat节点设定一个超时值,当超时发生时采取相应动作。

一个节点不能够同时支持Node Guarding和Heartbeat协议。

1.3、NMT Boot-up

NMT-slave节点发布Boot-up报文通知NMT-Master节点它已经从initialising状态进入pre-operational状态。

NMT Slave→NMT-Master

2、过程数据对象(PDO)

作为一个例子,假定第二个transmit-PDO映射如下(在CANopen中用对象字典索引0x1A01描述):

在CANopen I/O模块的设备子协议(CiA DSP-401)定义中,对象0x6000子索引2是节点的第2组8位数字量输入,对象0x6401子索引0x01是节点的第1组16位模拟量输入。

这个PDO报文如果被发送(可能由输入改变,定时器中断或者远程请求帧等方式触发,和PDO的传输类型相一致,可以在对象0x1801子索引2中查找),则由3字节数据组成,格式如下:

PDO-producer→PDO-consumer(s)

通过改变对象0x1A01的内容,PDO的内容可被改变(如果节点支持(可变PDO映射))。

注意在CANopen中多字节参数总是先发送LSB(little endian)。

不允许超过8个字节的数据映射到某一个PDO中。

在CANopen Application Layer andCommunication Profile(CiA DS 301 V 4.02)中定义了MPDO(multiplexorPDO),允许一个PDO传输大量变量,通过在报文数据字节中包含源或目的节点ID、OD中的索引和子索引来实现。举个例子:如果没有这个机制,当一个节点有64个16位的模拟通道时,就需要16个不同的Transmit-PDOs来传送数据,

3、服务数据对象(SDO)

SDO用来访问一个设备的对象字典。访问者被称作客户(client),对象字典被访问且提供所请求服务的CANopen设备别称作服务器(server)。客户的CAN报文和服务器的应答CAN报文总是包含8字节数据(尽管不是所有的数据字节都一定有意义)。一个客户的请求一定有来自服务器的应答。

SDO有2种传送机制:

◆加速传送(Expedited transfer):最多传输4字节数据

◆分段传送(Segmented transfer):传输数据长度大于4字节

SDO的基本结构如下:

Client→Server /Server→Client

(**最大4字节数据(expeditedtransfer)或4字节字节计数器(segmented transfer)或关于blocktransfer参数)

或者

Client→Server /Server→Client

SDO命令字包含如下信息:

◆下载/上传(Download / upload)

◆请求/应答(Request /response)

◆分段/加速传送(Segmented / expedited transfer)

◆CAN帧数据字节长度

◆用于后续每个分段的交替清零和置位的触发位(toggle bit)

SDO中实现了5个请求/应答协议:启动域下载(Initiate Domain Download),域分段下载(DownloadDomain Segment),启动域上传(Initiate Domain Upload),域分段上传(Upload Domain Segment)和域传送中止(Abort Domain Transfer)。

在CANopen通讯协议的最新版本中,引入了一种新的SDO传送机制:

块传送(Block transfer):当传送数据长度大于4字节时,多个分段只由1个确认报文应答(如果是下载,则由服务器启动传送,如果是上传,则由客户启动传送)以增加总线吞吐量。

相应的协议为:启动块下载(Initiate Block Download),块分段下载(Download Block Segment),块下载结束(End BlockDownload),启动块上传(Initiate Block Upload),块分段上传(UploadBlock Segment)和块上传结束(End Block Upload)。

下载(Download)是指对对象字典进行写操作,上传(Upload)指对对象字典进行读操作。

下面给出几个例子说明如何使用SDO来访问一个节点的对象字典。

使用下面的SDO消息,值0x3FE将写到节点ID为2的对象字典中索引为0x1801,子索引为3的对象中去,使用启动域下载协议,加速传输(2字节数据)

Client→Server (节点#2)

使用下面的SDO消息,同样的对象字典中索引为0x1801,子索引为3的对象将被读出,使用启动域上传协议,服务器使用加速传输方式应答(2字节数据):

Client→Server(节点#2)

4、应急指示对象(EmergencyObject)

应急指示报文由设备内部出现的致命错误触发,由相关应用设备已最高优先级发送到其它设备。适用于中断类型的错误报警信号。

一个应急报文由8字节组成,格式如下:

sender→receiver(s)

6进制的应急错误代码如下表3-5所示。应急错误代码中‘xx’部分由相应的设备子协议定义。

应急错误代码(16进制)

错误寄存器(Error Register)在设备的对象字典(索引0x1001)中,表3-6说明了错误寄存器的位定义。设备可以将内部错误映射到这个状态字节中,并可以快速查看当前错误

制造商特定错误区域可能包含与设备相关的其它的错误信息

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180802B0NTXP00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券