一种实现CANopen主站的方法

文档序号:7686978阅读:1394来源:国知局
专利名称:一种实现CANopen主站的方法
技术领域
本发明属于现场总线领域,特别是一种实现CANopen主站的方法。
技术背景作为一种真正开放的CAN总线高层协议,CANopen协议允许不同的CAN设 备以标准化的方式进行通讯,使得CAN设备具有互操作性。随着CANopen协 议的日益完善,它在国内外已经有很多方面的应用,受到了广泛的重视。 CANopen目前正在从汽车工业向更多领域辐射,已经广泛应用到公共交通运 输系统、医疗设备、海运电子设备和建筑自动化系统中。在欧洲,CANopen协 议已被广泛的应用于医疗装置中,并进一步扩展应用到保安控制系统中;在 美国,CANopen协议已经成为装载机械和公共运输设备的协议标准,同时也应 用于嵌入式系统的控制。但是据了解,国内在CAN叩en的研究还处于起步阶 段,除了中国单片机公共实验室(BOL)外,目前鲜有研究院所在进行相关工作, 而中国在该领域的标准制定工作也仍处于摸索阶段。因此CANopen协议在我 国的进一步推广仍需大量的研发工作。CANopen主站的实现方法在国外也无 相关技术的公开文献报道。发明内容本发明的目的在于提供一种实现CANopen主站的方法。 本发明提供一种实现CANopen主站的方法,如图1和图2所示,其特征 在于,包括以下步骤1) 主站开始运行时,首先初始化全局变量,对本协议栈中需要的所有 全局变量进行初始化;2) 初始化系统时间,该系统时间是通过定时器获得的微秒级时间;3) 初始化基本任务,包括给它们分配存储空间,赋初始值;4) 初始化对象字典,建立基本的对象字典项;5) 添加节点,向主站的对象字典中添加从节点的信息;6) 建立发送PDO,在对象字典中添加发送PDO对应的所有信息;7) 建立接收PDO,在对象字典中添加接收PDO的所有信息;8) 启动网络;9) 初始化操作系统;10) 创建线程,这里只创建一个开始线程;11) 启动操作系统,操作系统开始调度线程第一个被操作系统调度的 线程是开始线程,在这个线程中完成的工作包括硬件的初始化、调度机线程 的创建和写报文线程的创建,该线程运行一次之后就将自己销毁。之后写报 文线程被调度运行,但是此时没有报文要发送,所以该线程退出运行状态并触发调度机线程。调度机线程完成CANopen内部各任务的调度。在没有更高优先级线程处于就绪态或者出现中断时该线程将会一直处于循环运行状态。 当调度机中的任务需要发送报文时触发写报文发送线程,该线程将需要发送的报文写进CAN控制器相应的寄存器中并将其发送到CAN总线上。当 CAN控制器收到报文时将产生报文接收中断,读报文中断服务程序开始执行, 将报文从CAN控制器中读出,当调度机线程再次获运行时将调度其管理的相 应任务处理该报文。对象字典是CANopen协议的核心,是一个有序的对象组,其中定义了 CANopen网络中设备的所有信息。在CANopen网络中主站要行使网络管理、 配置从站的功能。主站对象字典的构建必须考虑网络的灵活扩展能力,艮卩, 灵活的增减节点。网络中节点的增减必然要求修改主站对象字典,甚至大量 添加、删除对象字典中的对象。所以主站的对象字典必须具有可快速查找、 添加、删除对象的特性。本发明采用散列表的方式构建对象字典。具有可动态更新、搜索效率高 和存储空间利用率高等优点。具体采用散列表的方式构建对象字典如下 使用一个数组来存储对象,设计一个哈希函数,使得每个对象的索引和 子索引都与数组的一个下标相对应;数组定义如下0DIridex iOD[//^LjWex—_ra/^e]其中,j'/7ofex—ra;^e为散列地址的范围常量;对象的索引和子索引通过哈希函数转化为散列地址。采用如下哈希函数式中,力5_&^义为散列地址,mod()为取模运算,^^"为对象索引, raw—www为随即因子,A诉—为位移因子,s"Z — i/7ofer为对象子索弓I , v^」'/^e义一ra/^e为散列地址的范围常量。当出现对于不同的对象,却计算出了相同的函数值,这样就产生了冲突,即从i/7Gfex和5Y^」'77flfer到力[^flfe义的映射会重叠;采用链地址法处理冲突, 将映射到同一个散列地址处多于一个的对象组成链表,即形成该散列地址对 应的溢出表。为了方便实现CANopen协议,本主站按功能定义了 CAN报文接收、CAN 报文发送、PDO报文分发、SDO报文分发、NMT报文分发、同步报文生成、 PDO处理、SDO处理和NMT处理等任务。根据主站的实时性和可扩展性的 要求,采用多任务调度的核心结构,即,调度机通过任务等待队列和任务运 行队列对CANopen的任务进行管理,如图3所示,有报文到时,CAN报文接 收任务运行,将接收到的报文放入PDO、 SD0、丽T报文接收队列,并触发PD0 报文分发或SDO报文分发或丽T报文分发任务。PD0报文分发、SD0报文分 发、丽T报文分发任务将触发它们对应的处理任务PD0处理、SD0处理和 醒T处理任务。如果在PD0处理、SDO处理和丽T处理任务中有报文要发送或 者同步报文生成任务正在运行执行,将会触发CAN报文发送任务。调度机线程具体为调度机通过任务等待队列和任务运行队列对 CANopen的任务进行管理,有报文到时,CAN报文接收任务运行,将接收到 的报文放入PD0、 SD0、丽T报文接收队列,并触发PD0报文分发或SD0报文 分发或NMT报文分发任务。PD0报文分发、SD0报文分发、丽T报文分发任 务将触发它们对应的处理任务PD0处理、SDO处理和丽T处理任务。如果在 PD0处理、SD0处理和丽T处理任务中有报文要发送或者同步报文生成任务正 在运行执行,将会触发CAN报文发送任务。


图1 CANopen主站系统结构2系统软件流程3调度机内部任务之间关系结构4调度机结构5任务运行流程6对象字典逻辑结构7随机因子、位移因子和搜索时间之间的关系图8引入高速缓存思想前后搜索效率的比较具体实施方式
本发明是基于飞思卡尔16位单片机MC9S12DP512硬件平台的CANopen 主站的开发,系统软件结构框图如图l所示。其中开始线程、调度机线程、 写报文线程是用户建立的,由UC/0S-工I内核管理的三个线程。开始线程是操 作系统完成初始化之后所调度的第一个线程。它主要完成硬件的初始化,包 括串口,系统时钟的初始化、时钟节拍的初始化、CAN的初始化、中断的初 始化以及创建调度机线程、写报文线程。该线程运行一次之后就将自己销毁。 调度机线程主要完成CANopen内部各任务的调度。在没有更高级线程处于就 绪态或者出现中断时该线程将会一直处于循环运行状态。写报文线程负责将 需要发送的报文写进CAN控制器相应的寄存器中并将其发送到CAN总线上。 该线程由调度机线程在需要的时候启动。调度机管理的任务包括CAN报文接收、CAN报文发送、PD0报文分发、 SD0报文分发、丽T报文分发、同步报文生成、PD0处理、SDO处理和丽T处理等任务。调度机通过任务等待队列和任务运行队列对它们进行管理。它们 之间的调度关系如图2所示有报文到时,CAN报文接收任务运行,将接收到的报文放入PDO、 SD0、 丽T报文接收队列,并触发PD0报文分发或SD0报文分发或丽T报文分发任 务。PD0报文分发、SD0报文分发、丽T报文分发任务将触发它们对应的处理 任务PD0处理、SD0处理和丽T处理任务。如果在PD0处理、SD0处理和NMT 处理任务中有报文要发送或者同步报文生成任务正在运行执行,将会触发CAN 报文发送任务。调度机的结构如图4所示。该调度机有两个基本的队列组成任务等待 队列、任务运行队列。其中,任务运行队列设计采用和UNIXSVR4相类似 的运行队列结构。 一共有九个优先级,则同时存在9个优先级队列,每一个 队列有一个标志位。当队列中包含可运行任务,标志位为l,否则为0。其中,执行选择、执行任务、销毁任务、运行选择由调度机主函数完成,构成一个 循环体。对于单个任务而言,其运行的流程如图5所示。 一旦任务获得执行,它 的运行、停止、终结都由任务自身决定。 一旦开始执行,主函数并不会主动 终止函数。通过不同的返回信息,主函数可以知道如何对任务进行处理。本 系统规定任务有以下几种返回值TASKJ3K:任务运行完毕,可以销毁;TASK_WAIT:任务自身阻塞,放入等待队列; TASK—RUN:任务可继续运行,放入执行队列; TASK_ERR:任务运行出错,进行异常处理。本发明采用散列表的方式构建对象字典,使用一个下标范围比较大的数 组来存储对象。可以设计一个函数(哈希函数,也叫做散列函数),使得每 个对象的索引和子索引都与一个函数值(即数组下标)相对应,于是用这个 数组单元来存储这个对象;也可以简单的理解为,按照索引和子索引为每一 个对象"分类",然后将这个对象存储在相应"类"所对应的地方。数组定义如 下0DIndex iOD[HT—WIDTH]其中,H乙WIDTH为散列地址的范围常量。对象的索引和子索引通过哈希函数转化为散列地址。哈希函数应尽可能 的使索引和子索引经过哈希函数得到一个随机的地址,以便将对象均匀的分 布到整个地址区间中;由于对象字典访问的频繁性,映射函数还要足够简单 以减少运算时间,这里采用如下哈希函数-式1中,力[i/7Gfey为散列地址,mod()为取模运算,i/w^r为对象索引, raw—咖m为随即因子,s/j辨—"wm为位移因子,swZ — j'/ ofez为对象子索弓| , 力5Li/7cfe《—ra7^e为散列地址的范围常量。不能够保证每个对象的索引和子索引与函数值是一"^对应的,因此极有 可能出现对于不同的对象,却计算出了相同的函数值,这样就产生了冲突, 即从众ofer和^//Li/^ez到力5—J'/7flfer的映射会重叠。这里处理冲突的方法采用链地址法,将映射到同一个散列地址处多于一个的对象组成链表,即形成 该散列地址对应的溢出表。从散列表的相应位置可以访问其对应的溢出表。用散列表构建的对象字典逻辑结构图如图6所示,散列表地址范围为iV,E代表一个索引项,N代表一个未使用的散列表项。根据统计, 一个小型的CANopen网络,CANopen主站需要保存约1500 个数据字典项。这里选择散列表空间大小为512,即y76^'/^ez—T^7^e取值为 512,这样,平均每个散列表项只需要链接一个长度为2的溢出表。在没有引 入大的搜索时间的情况下,合理利用了空间。可以根据现有的初始对象字典进行仿真,如图7所示,其中搜索时间的计算公式如下<formula>formula see original document page 9</formula>式2中sum为为遍历所有初始化对象需要的搜索时间,/76 代表样本空 间中映射到散列地址i的对象个数。从图中可以得到一个搜索时间最小点,即当2^7_一77腿取193、 W^ft一/7腿取3时搜索时间最小,散列表填充率最高,可达99.8%。为了进一步提高搜索效率,借鉴高速缓存的思想,如果访问溢出表中某 一结点需要的比较次数大于阀值OD一TARGE乙DEPTH,则将该结点移到溢出表表 头的位置。从而可以将经常被访问的对象存放在溢出表中靠前的位置。当再 次访问这些对象时,可以快速从溢出表获得,从而进一步提高了搜索效率。 此处OD_TARGET—DEPTH的取值应根据所构建的对象字典中常用的对象个数取 值,应满足溢出表的前OD—TARGET—DEPTH项能够容纳所有常用的对象。引入高速缓存的思想前后搜索效率比较如图8所示。图中横坐标表示对 象的个数,纵坐标表示搜索常用对象(随机取总的对象个数的1/4作为常用对 象)的平均比较次数。其中曲线1为没有引入高速缓存思想时所得到的曲线; 曲线2表示引入了高速缓存思想后得到的曲线。显然,引入高速缓存思想后 搜索效率得到了明显提高。
权利要求
1、一种实现CANopen主站的方法,其特征在于,包括以下步骤1)主站开始运行时,首先初始化全局变量,对本协议栈中需要的所有全局变量进行初始化;2)初始化系统时间,该系统时间是通过定时器获得的微秒级时间;3)初始化基本任务,包括给它们分配存储空间,赋初始值;4)初始化对象字典,建立基本的对象字典项;5)添加节点,向主站的对象字典中添加从节点的信息;6)建立发送PDO,在对象字典中添加发送PDO对应的所有信息;7)建立接收PDO,在对象字典中添加接收PDO的所有信息;8)启动网络;9)初始化操作系统;10)创建线程,这里只创建一个开始线程;11)启动操作系统,操作系统开始调度线程第一个被操作系统调度的线程是开始线程,在这个线程中完成的工作包括硬件的初始化、调度机线程的创建和写报文线程的创建,该线程运行一次之后就将自己销毁;之后写报文线程被调度运行,但是此时没有报文要发送,所以该线程退出运行状态并触发调度机线程;调度机线程完成CANopen内部各任务的调度;在没有更高优先级线程处于就绪态或者出现中断时该线程将会一直处于循环运行状态;当调度机中的任务需要发送报文时触发写报文发送线程,该线程将需要发送的报文写进CAN控制器相应的寄存器中并将其发送到CAN总线上;当CAN控制器收到报文时将产生报文接收中断,读报文中断服务程序开始执行,将报文从CAN控制器中读出,当调度机线程再次获运行时将调度其管理的相应任务处理该报文。
2、 根据权利要求1所述的一种实现CANopen主站的方法,其特征在 于,采用散列表的方式构建对象字典使用一个数组来存储对象,设计一个哈希函数,使得每个对象的索引和 子索引都与数组的一个下标相对应;数组定义如下 ODIndex i0D[7^_j'/ cfex—ra/ ge] 其中,M一J'/K/eu朋卵为散列地址的范围常量;对象的索引和子索引通过哈希函数转化为散列地址;采用如下哈希函数式中,力S—i/7ofex为散列地址,mod()为取模运算,i"ofex为对象索引, ra"—mw7为随即因子,s/z辨—"wm为位移因子,s〃6—y;7afer为对象子索弓l, 力5^'/7血Lra7^e为散列地址的范围常量;当出现对于不同的对象,却计算出了相同的函数值,这样就产生了冲突,即从i加fer和S"6—J'/7血Y到力5Li/70fer的映射会重叠;采用链地址法处理冲突,将映射到同一个散列地址处多于一个的对象组成链表,即形成该散列地址对 应的溢出表。
3、根据权利要求1所述的一种实现CAN叩en主站的方法,其特征在 于,调度机线程具体为调度机通过任务等待队列和任务运行队列对CANopen 的任务进行管理,有报文到时,CAN报文接收任务运行,将接收到的报文放入 PD0、 SD0、 NMT报文接收队列,并触发PD0报文分发或SD0报文分发或丽T 报文分发任务;PD0报文分发、SD0报文分发、醒T报文分发任务将触发它们 对应的处理任务PD0处理、SDO处理和丽T处理任务;如果在PD0处理、SD0 处理和丽T处理任务中有报文要发送或者同步报文生成任务正在运行执行, 将会触发CAN报文发送任务。
全文摘要
一种实现CANopen主站的方法属于现场总线领域。其特征在于本主站的实现是基于MC9S12DP512硬件平台,在UC/OS-II操作系统之上构建的一个多线程系统,包括调度机线程、写报文线程和读报文中断。调度机用来管理CAN报文接收、CAN报文发送、PDO报文分发、SDO报文分发、NMT报文分发、同步报文生成、PDO处理、SDO处理和NMT处理等CANopen的基本任务。另外,作为CANopen协议核心的对象字典是通过散列表的方式构建的。这种构建对象字典的方式满足了主站对其对象字典必须具有可快速查找、添加、删除对象的特性的要求。本发明的优越性在于将任务调度应用在主站的设计中,使其具有高度的实时性、并发处理能力和动态灵活性;所实现的对象字典能满足网络的灵活扩展能力,可动态的向对象字典中添加对象。
文档编号H04L29/06GK101222510SQ20081005682
公开日2008年7月16日 申请日期2008年1月25日 优先权日2008年1月25日
发明者余春暄, 威 宋, 张明杰, 喆 徐, 段建民, 闫士珍 申请人:北京工业大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1