注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

易拉罐的博客

心静自然凉

 
 
 

日志

 
 

转 CANopen协议介绍  

2011-10-19 20:12:26|  分类: CAN总线 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
很长一段时间以来,很多人问我CANopen总线优势到底在什么地方,我也大体的给了口头的讲述,但是比较笼统,没办法做到详细解释,加上纯技术的话语比较晦涩,遇上内行还能多聊几句,如果是刚接触的,那就是云里雾里了。这次正好要进行公司业务员培训,要讲讲CANopen,在整理过程中把我的讲义贴出来,希望能帮到大家,以下内容是我讲课的口述内容,比较白话,不能作为资料,大家见谅,鉴于我整理也比较辛苦,也算个小小的知识产权,所以PPT我就不贴出来了。^-^

 

 讲义内容:

通常CANopen协议相关的一些资料相对来说比较晦涩,非专业人士看起来比较困难。我尽量以浅显易懂的方式将CANopen协议的框架和它在实际应用中存在的优缺点展示给大家。

我按照最先接触的内容由浅入深的讲解,直接讲CANopen协议会有点跳跃的感觉,所以,我以产品作为切入点,分析一下如何使用,在这个过程中,让大家理解什么是CANopen协议。首先,我们拿到一个产品,比方说是编码器,它的用途是作为位置传感器,那我们就需要将编码器送出的数据进行采集。一般自然界中存在的信号有多种形式,大多以模拟量形式存在,类似于人感觉到温度的高低、水流的快慢、风力的大小等等。但这是很模糊的概念,今天热了还是冷了,风大风小,没有比较是很难界定的,为了规范这些量,方便描述时的统一性,温度计量标准有华氏和摄氏、水流有每秒多少立方、风力有级数。这些,就是数字量。数字量在人与人之间传递时,可以通过嘴和耳,语言和听力,在设备之间如何来传递呢?学过数电的人知道,灯泡有两种状态,亮和暗,在最基础的电路回路里,“通”和“断”是两个最基本的状态,我们可以把他理解为“1”和“0”,这样,就有了表述的方法。但是单独使用这两种状态是无法传递信息的,如何把编码器的数据传递出去,就需要使用到协议,下面我就讲讲协议。

我们知道,人与人交流需要用到语言,我们要表达出一个完整的意思就要使用一句话,一句话内会包含很多的字,每个字又由笔画构成。这样,我们协议的基本框架就出来了,在整个CANopen协议传递过程中,最大的单位称为“帧”,类似于一句话,“帧”由“字节”组成,就代表了字,每个“字节”由“位”组成,我们称为笔画。那地球上还有英语、法语、德语、还有听不懂的鸟语呢!那就是各个通讯协议,比如Profibus-DP、DeviceNet、CC-Link、Hart、Modbus等。让DP和CANopen通讯,那就是相当于一个讲德语的与讲中文的对话,鸡同鸭讲,能沟通吗?需要翻译,对吧。回过头来我们讲讲CANopen的帧格式,CANopen一帧数据由一个COB-ID(报文头)和最大8字节数据组成,其中COB-ID可以是11位(CAN2.0),也可以是29位(CAN2.0B),当然,CAN2.0B需要向下兼容11位CAN报文。对于每字节数据由哪些位组成,这里就不再赘述,因为这部分内容不在OSI模型的第七层应用层内描述,开发人员也不必过多考虑这块内容。由于CANopen协议内对COB-ID的各个地址段报文有详细规范,这里就花点时间讲一下,当然也没时间全部讨论,只选一些重要内容来说。

以前我们培训一直在说CANopen协议好,速度快,广播报文,这些关键字听的多了,但是大家可能不是很理解这些内容。现在就来解释一下。在编码器应用中,CAN报文我们常用的有SDO(Service Data Object服务数据对象)和PDO(Process Data Object过程数据对象),从字面描述意义看,通常数据的发送读取是采用PDO来实现的,CAN参数的修改是通过SDO来实现的(当然这不是绝对的,具体的如果有兴趣可以会后询问)。先来说说PDO,我们在很多资料上会看到这样一张表

对象

COB-ID

通讯参数在 OD 中的索引

紧急

081H-0FFH

1024H1015H

PDO1(发送)

181H-1FFH

1800H

PDO1(接收)

201H-27FH

1400H

PDO2(发送)

281H-2FFH

1801H

PDO2(接收)

301H-37FH

1401H

PDO3(发送)

381H-3FFH

1802H

PDO3(接收)

401H-47FH

1402H

PDO4(发送)

481H-4FFH

1803H

PDO4(接收)

501H-57FH

1403H

SDO(发送/服务器)

581H-5FFH

1200H

SDO(接收/客户)

601H-67FH

1200H

NMT Error Control

701H-77FH

1016H-1017H

                                                                        

                                                  注意:PDO/SDO  发送/接收是由(slave)CAN节点方观察的

                                                                         表一:CANopen主/从连接集对象

 

假设我们读取到一组编码器数据是这样的《0x181  0x30  0x1F  0x00  0x00》,我们应该如何理解呢?首先,“0x”只是一个符号,它代表了紧跟着的数据是十六进制的(等同于在数据后面直接标“H”,上述表达式也可以表述为《181H   30H   1FH   00H   00H》),“181”我们查看上表后发现,它包含在PDO1(发送)里面,它代表了是由编码器发出的过程数据对象,表上显示是“181H~1FFH”,这是因为COB-ID包含了节点号信息,地址1对应着181H,地址2对应了182H,以此类推,最大127个节点。“0x30  0x1F  0x00  0x00”就代表了数据内容,在CAN协议内,帧数据是低位在前,高位在后的。所以上述数据直接读取后得出编码器送出1F30H,这就代表了编码器的当前位置值。那在总线上面,多个节点同时发送数据不会产生冲突么?以前我们说过,CAN协议具有仲裁,这里简单介绍一下仲裁是如何实现的。上面说了,COB-ID包含了节点号信息,也就是说,只要总线上的设备节点号不同,所送出的广播报文的COB-ID肯定是不同的,如果一个是182H,一个是183H,仲裁时怎么做?本文最开始的时候介绍了每个字由笔画组成,现在就要用到位(bit)的概念了,182H换算成二进制是0001 1000 0010(B),“B”代表了二进制,183H换算成二进制是0001 1000 0011(B),关于显性位、隐形位这里不再赘述,这个有兴趣可以找我要资料看,这里我就简单描述为“0”比“1”的优先级高,可以理解为拖后腿,“0”为低电平,“1”为高电平,在线上低电平会把高电平拉低,一旦183H发现数据传输过程中与自身数据不符合,就终止上传,保证了182H的数据先上总线。

我们在实践中会发现,编码器的数据在不断的更新输出,那输出周期如何定义呢?这个我们就来讨论一下引申的PDO传送方式。我们以前在培训时一直介绍CANopen协议与DP协议相比的好处在于DP是轮询的,问答方式浪费了大量的时间,而CAN协议是广播的,可以将1MHz的速率发挥至极致。这种说法形象,一般可以解释给初步接触CANopen的人听。其实CANopen的报文形式很多样化,在不同的应用场合可以采取不同的方式,上面说的称为异步方式,异步方式也分两种,一种是上面的内部时钟触发,也就是按照固定时间间隔发送,另一种是事件触发,假设编码器发生转动,数据相应送出。还有一种同步方式,我们也可以口述为踏拍方式,当主站要求报数是,所有从节点按照仲裁的优先顺序进行数据发送。这三种报文方式分别在哪些场合适用呢?我们以车辆来举例。车辆开在路上,在整个车辆控制内,最重要的,具有高优先级的,应该是牵涉到安全的制动(刹车),安全气囊等等。其次是转向、车灯。再次是音响、影视系统(当然,我对车不是很熟悉,这是我的主观认识,作为一个例程)。我们可以把小的节点号分配给制动系统,以保证数据能及时送达控制器,并采用定时报数,实时监测车辆制动系统的情况。对于音箱什么的,我们可以采用事件触发方式,在有输入控制时(比方说打开收音机)进行响应。同步数据一般用在实时数据监测方面,比方是在同一时间点查阅角度、位置、重量、压力、流量等等信息,保证所监测的各个数据在很小的时间变化范围内。当然CANopen不可能摒弃问答方式的数据采集,这可以通过SDO访问OD来实现。

讲到SDO——服务数据对象,我们可以这么理解,PDO报文在发送出去后不需要反馈信号,总线上能消化这个数据的都可以消化,所以白话叫广播报文。而SDO报文是需要响应的,每一帧SDO发出后需要等待反馈。那这会不会引起无反馈时总线死机呢?不会,CAN数据链路内规定了超时,在一定时间内得不到回答,总线将进行后面的作业,多次询问无果,总线会对错误节点进行屏蔽处理。SDO的帧格式和PDO的帧格式是一致的,但对有些字节的定义不同,下面就简单介绍一些编码器修改参数时用到的帧格式。

SDO中实现了5个请求/应答协议,这里我只讲讲启动域下载与上传,其他的有兴趣可以问我要资料看。

COB-ID

命令字

对象字典OD

子索引

数据

主从连接集

1 byte

2 bytes

1 byte

4 bytes

 

我来解释一下上表,COB-ID引用第一张表的SDO地址段。假设主站需要读取1号编码器对象字典(OD)6200H内的参数,我们应该如何做呢?我们需要发送

0x601    0x40   0x00   0x62   0x00   0x00   0x00   0x00   0x00

我们得到编码器的反馈数据是

0x581    0x4B   0x00   0x62   0x00   0x0A   0x00   0x00   0x00

上述命令的解释是,控制器通过SDO指令读取1号编码器OD为6200H的编码器发送数据周期的参数,得到编码器的回答是每隔10ms发送一次。40H和4BH是启动域上传的命令字。

如果需要将6200H的参数修改为20ms一次数据,我们应该怎么做?

发送:0x601    0x22   0x00   0x62   0x00   0x14   0x00   0x00   0x00

反馈:0x581    0x60   0x00   0x62   0x00   0x00   0x00   0x00   0x00

 

http://zch2634.blog.163.com/blog/static/7517477620109123485495/ 

  评论这张
 
阅读(582)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017