通常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 | 通讯参数在 |
紧急 | 081H-0FFH | 1024H,1015H |
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 |
假设我们读取到一组编码器数据是这样的《0x181
我们在实践中会发现,编码器的数据在不断的更新输出,那输出周期如何定义呢?这个我们就来讨论一下引申的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
我们得到编码器的反馈数据是
0x581
上述命令的解释是,控制器通过SDO指令读取1号编码器OD为6200H的编码器发送数据周期的参数,得到编码器的回答是每隔10ms发送一次。40H和4BH是启动域上传的命令字。
如果需要将6200H的参数修改为20ms一次数据,我们应该怎么做?
发送:0x601
反馈:0x581
原文地址:http://blog.sina.com.cn/s/blog_7f731b4d0101ivcs.html