CN101222510B - 一种实现CANopen主站的方法 - Google Patents
一种实现CANopen主站的方法 Download PDFInfo
- Publication number
- CN101222510B CN101222510B CN2008100568245A CN200810056824A CN101222510B CN 101222510 B CN101222510 B CN 101222510B CN 2008100568245 A CN2008100568245 A CN 2008100568245A CN 200810056824 A CN200810056824 A CN 200810056824A CN 101222510 B CN101222510 B CN 101222510B
- Authority
- CN
- China
- Prior art keywords
- message
- thread
- index
- task
- pdo
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
Images
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
一种实现CANopen主站的方法属于现场总线领域。其特征在于本主站的实现是基于MC9S12DP512硬件平台,在UC/OS-II操作***之上构建的一个多线程***,包括调度机线程、写报文线程和读报文中断。调度机用来管理CAN报文接收、CAN报文发送、PDO报文分发、SDO报文分发、NMT报文分发、同步报文生成、PDO处理、SDO处理和NMT处理等CANopen的基本任务。另外,作为CANopen协议核心的对象字典是通过散列表的方式构建的。这种构建对象字典的方式满足了主站对其对象字典必须具有可快速查找、添加、删除对象的特性的要求。本发明的优越性在于将任务调度应用在主站的设计中,使其具有高度的实时性、并发处理能力和动态灵活性;所实现的对象字典能满足网络的灵活扩展能力,可动态的向对象字典中添加对象。
Description
技术领域
本发明属于现场总线领域,特别是一种实现CANopen主站的方法。
背景技术
作为一种真正开放的CAN总线高层协议,CANopen协议允许不同的CAN设备以标准化的方式进行通讯,使得CAN设备具有互操作性。随着CANopen协议的日益完善,它在国内外已经有很多方面的应用,受到了广泛的重视。CANopen目前正在从汽车工业向更多领域辐射,已经广泛应用到公共交通运输***、医疗设备、海运电子设备和建筑自动化***中。在欧洲,CANopen协议已被广泛的应用于医疗装置中,并进一步扩展应用到保安控制***中;在美国,CANopen协议已经成为装载机械和公共运输设备的协议标准,同时也应用于嵌入式***的控制。但是据了解,国内在CANopen的研究还处于起步阶段,除了中国单片机公共实验室(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网络中主站要行使网络管理、配置从站的功能。主站对象字典的构建必须考虑网络的灵活扩展能力,即,灵活的增减节点。网络中节点的增减必然要求修改主站对象字典,甚至大量添加、删除对象字典中的对象。所以主站的对象字典必须具有可快速查找、添加、删除对象的特性。
本发明采用散列表的方式构建对象字典。具有可动态更新、搜索效率高和存储空间利用率高等优点。
具体采用散列表的方式构建对象字典如下:
使用一个数组来存储对象,设计一个哈希函数,使得每个对象的索引和子索引都与数组的一个下标相对应;数组定义如下:
ODIndex iOD[HS_index_range]
其中,HS_index_range为散列地址的范围常量;
对象的索引和子索引通过哈希函数转化为散列地址。采用如下哈希函数:
HS_index=mod(((index*ran_num)>>shift_num+sub_index),HS_index_range)
式中,HS_index为散列地址,mod()为取模运算,index为对象索引,ran_num为随即因子,shift_num为位移因子,sub_index为对象子索引,HS_index_range为散列地址的范围常量。
当出现对于不同的对象,却计算出了相同的函数值,这样就产生了冲突,即从index和sub_index到HS_index的映射会重叠;采用链地址法处理冲突,将映射到同一个散列地址处多于一个的对象组成链表,即形成该散列地址对应的溢出表。
为了方便实现CANopen协议,本主站按功能定义了CAN报文接收、CAN报文发送、PDO报文分发、SDO报文分发、NMT报文分发、同步报文生成、PDO处理、SDO处理和NMT处理等任务。根据主站的实时性和可扩展性的要求,采用多任务调度的核心结构,即,调度机通过任务等待队列和任务运行队列对CANopen的任务进行管理,如图3所示,有报文到时,CAN报文接收任务运行,将接收到的报文放入PDO、SDO、NMT报文接收队列,并触发PDO报文分发或SDO报文分发或NMT报文分发任务。PDO报文分发、SDO报文分发、NMT报文分发任务将触发它们对应的处理任务:PDO处理、SDO处理和NMT处理任务。如果在PDO处理、SDO处理和NMT处理任务中有报文要发送或者同步报文生成任务正在运行执行,将会触发CAN报文发送任务。
调度机线程具体为:调度机通过任务等待队列和任务运行队列对CANopen的任务进行管理,有报文到时,CAN报文接收任务运行,将接收到的报文放入PDO、SDO、NMT报文接收队列,并触发PDO报文分发或SDO报文分发或NMT报文分发任务。PDO报文分发、SDO报文分发、NMT报文分发任务将触发它们对应的处理任务:PDO处理、SDO处理和NMT处理任务。如果在PDO处理、SDO处理和NMT处理任务中有报文要发送或者同步报文生成任务正在运行执行,将会触发CAN报文发送任务。
附图说明
图1CANopen主站***结构图
图2***软件流程图
图3调度机内部任务之间关系结构图
图4调度机结构图
图5任务运行流程图
图6对象字典逻辑结构图
图7随机因子、位移因子和搜索时间之间的关系
图8引入高速缓存思想前后搜索效率的比较
具体实施方式
本发明是基于飞思卡尔16位单片机MC9S12DP512硬件平台的CANopen主站的开发,***软件结构框图如图1所示。其中开始线程、调度机线程、写报文线程是用户建立的,由UC/OS-II内核管理的三个线程。开始线程是操作***完成初始化之后所调度的第一个线程。它主要完成硬件的初始化,包括串口,***时钟的初始化、时钟节拍的初始化、CAN的初始化、中断的初始化以及创建调度机线程、写报文线程。该线程运行一次之后就将自己销毁。调度机线程主要完成CANopen内部各任务的调度。在没有更高级线程处于就绪态或者出现中断时该线程将会一直处于循环运行状态。写报文线程负责将需要发送的报文写进CAN控制器相应的寄存器中并将其发送到CAN总线上。该线程由调度机线程在需要的时候启动。
调度机管理的任务包括:CAN报文接收、CAN报文发送、PDO报文分发、SDO报文分发、NMT报文分发、同步报文生成、PDO处理、SDO处理和NMT处理等任务。调度机通过任务等待队列和任务运行队列对它们进行管理。它们之间的调度关系如图2所示:
有报文到时,CAN报文接收任务运行,将接收到的报文放入PDO、SDO、NMT报文接收队列,并触发PDO报文分发或SDO报文分发或NMT报文分发任务。PDO报文分发、SDO报文分发、NMT报文分发任务将触发它们对应的处理任务:PDO处理、SDO处理和NMT处理任务。如果在PDO处理、SDO处理和NMT处理任务中有报文要发送或者同步报文生成任务正在运行执行,将会触发CAN报文发送任务。
调度机的结构如图4所示。该调度机有两个基本的队列组成:任务等待队列、任务运行队列。其中,任务运行队列设计采用和UNIX SVR4相类似的运行队列结构。一共有九个优先级,则同时存在9个优先级队列,每一个队列有一个标志位。当队列中包含可运行任务,标志位为1,否则为0。其中,执行选择、执行任务、销毁任务、运行选择由调度机主函数完成,构成一个循环体。
对于单个任务而言,其运行的流程如图5所示。一旦任务获得执行,它的运行、停止、终结都由任务自身决定。一旦开始执行,主函数并不会主动终止函数。通过不同的返回信息,主函数可以知道如何对任务进行处理。本***规定任务有以下几种返回值:
TASK_OK:任务运行完毕,可以销毁;
TASK_WAIT:任务自身阻塞,放入等待队列;
TASK_RUN:任务可继续运行,放入执行队列;
TASK_ERR:任务运行出错,进行异常处理。
本发明采用散列表的方式构建对象字典,使用一个下标范围比较大的数组来存储对象。可以设计一个函数(哈希函数, 也叫做散列函数),使得每个对象的索引和子索引都与一个函数值(即数组下标)相对应,于是用这个数组单元来存储这个对象;也可以简单的理解为,按照索引和子索引为每一个对象″分类″,然后将这个对象存储在相应″类″所对应的地方。数组定义如下:
ODIndex iOD[HT_WIDTH]
其中,HT_WIDTH为散列地址的范围常量。
对象的索引和子索引通过哈希函数转化为散列地址。哈希函数应尽可能的使索引和子索引经过哈希函数得到一个随机的地址,以便将对象均匀的分布到整个地址区间中;由于对象字典访问的频繁性,映射函数还要足够简单以减少运算时间,这里采用如下哈希函数:
HS_index=mod(((index*ran_num)>>shift_num+sub_index),HS_index_range) 式1
式1中,HS_index为散列地址,mod()为取模运算,index为对象索引,ran_num为随即因子,shift_num为位移因子,sub_index为对象子索引,HS_index_range为散列地址的范围常量。
不能够保证每个对象的索引和子索引与函数值是一一对应的,因此极有可能出现对于不同的对象,却计算出了相同的函数值,这样就产生了冲突,即从index和sub_index到HS_index的映射会重叠。这里处理冲突的方法采用链地址法,将映射到同一个散列地址处多于一个的对象组成链表,即形成该散列地址对应的溢出表。从散列表的相应位置可以访问其对应的溢出表。
用散列表构建的对象字典逻辑结构图如图6所示,散列表地址范围为N,E代表一个索引项,N代表一个未使用的散列表项。
根据统计,一个小型的CANopen网络,CANopen主站需要保存约1500个数据字典项。这里选择散列表空间大小为512,即HS_index_range取值为512,这样,平均每个散列表项只需要链接一个长度为2的溢出表。在没有引入大的搜索时间的情况下,合理利用了空间。
可以根据现有的初始对象字典进行仿真,如图7所示,其中搜索时间的计算公式如下:
式2中sum为为遍历所有初始化对象需要的搜索时间,n(i)代表样本空间中映射到散列地址i的对象个数。从图中可以得到一个搜索时间最小点,即当ran_num取193、shift_num取3时搜索时间最小,散列表填充率最高,可达99.8%。
为了进一步提高搜索效率,借鉴高速缓存的思想,如果访问溢出表中某一结点需要的比较次数大于阀值OD_TARGET_DEPTH,则将该结点移到溢出表表头的位置。从而可以将经常被访问的对象存放在溢出表中靠前的位置。当再次访问这些对象时,可以快速从溢出表获得,从而进一步提高了搜索效率。此处OD_TARGET_DEPTH的取值应根据所构建的对象字典中常用的对象个数取值,应满足溢出表的前OD_TARGET_DEPTH项能够容纳所有常用的对象。
引入高速缓存的思想前后搜索效率比较如图8所示。图中横坐标表示对象的个数,纵坐标表示搜索常用对象(随机取总的对象个数的1/4作为常用对象)的平均比较次数。其中曲线1为没有引入高速缓存思想时所得到的曲线;曲线2表示引入了高速缓存思想后得到的曲线。显然,引入高速缓存思想后搜索效率得到了明显提高。
Claims (3)
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 iOD[HS_index_range]
其中,HS_index_range为散列地址的范围常量;
对象的索引和子索引通过哈希函数转化为散列地址;采用如下哈希函数:
HS_index=mod(((index*ran_num)>>shift_num+sub_index),HS_index_range)
式中,HS_index为散列地址,mod()为取模运算,index为对象索引,ran_num为随即因子,shift_num为位移因子,sub_index为对象子索引,HS_index_range为散列地址的范围常量;
当出现对于不同的对象,却计算出了相同的函数值,这样就产生了冲突,即从index和sub_index到HS_index的映射会重叠;采用链地址法处理冲突,将映射到同一个散列地址处多于一个的对象组成链表,即形成该散列地址对应的溢出表。
3.根据权利要求1所述的一种实现CANopen主站的方法,其特征在于,调度机线程具体为:调度机通过任务等待队列和任务运行队列对CANopen的任务进行管理,有报文到时,CAN报文接收任务运行,将接收到的报文放入PDO、SDO、NMT报文接收队列,并触发PDO报文分发或SDO报文分发或NMT报文分发任务;PDO报文分发、SDO报文分发、NMT报文分发任务将触发它们对应的处理任务:PDO处理、SDO处理和NMT处理任务;如果在PDO处理、SDO处理和NMT处理任务中有报文要发送或者同步报文生成任务正在运行执行,将会触发CAN报文发送任务。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2008100568245A CN101222510B (zh) | 2008-01-25 | 2008-01-25 | 一种实现CANopen主站的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2008100568245A CN101222510B (zh) | 2008-01-25 | 2008-01-25 | 一种实现CANopen主站的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101222510A CN101222510A (zh) | 2008-07-16 |
CN101222510B true CN101222510B (zh) | 2010-11-03 |
Family
ID=39632078
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN2008100568245A Expired - Fee Related CN101222510B (zh) | 2008-01-25 | 2008-01-25 | 一种实现CANopen主站的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN101222510B (zh) |
Families Citing this family (13)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101783741A (zh) * | 2010-03-03 | 2010-07-21 | 天津理工大学 | 具有短路保护与自诊断功能的CANopen现场总线输入输出装置 |
CN101854300B (zh) * | 2010-06-02 | 2012-05-16 | 北京工业大学 | 一种实现CANopen从站的方法 |
CN101923348A (zh) * | 2010-07-16 | 2010-12-22 | 北京工业大学 | 一种基于CANopen的混合动力汽车车载故障诊断***和诊断方法 |
CN103186416B (zh) * | 2011-12-29 | 2016-06-22 | 比亚迪股份有限公司 | 构建多任务多分支过程的方法、状态机及执行方法 |
CN103268259A (zh) * | 2013-04-28 | 2013-08-28 | 东方电气集团东方汽轮机有限公司 | 一种canopen从站实现方法及装置 |
CN103984290A (zh) * | 2014-04-04 | 2014-08-13 | 杭州金人自动控制设备有限公司 | 一种基于CANopen的CNC机械臂控制***及其方法 |
CN104993583B (zh) * | 2015-05-19 | 2017-07-25 | 航天科工深圳(集团)有限公司 | 配电自动化设备的通信方法 |
CN109495462B (zh) * | 2018-11-02 | 2021-10-08 | 合肥保得工业自动化有限公司 | 一种动态连接数据分布式***及其数据交互方法 |
CN109450757B (zh) * | 2018-11-02 | 2020-11-20 | 合肥保得工业自动化有限公司 | 一种CANopen主站的启动方法及其统筹管理器 |
CN109495236B (zh) * | 2018-11-02 | 2022-02-01 | 合肥保得工业自动化有限公司 | 一种基于CANopen的从站到主站的数据同步方法 |
CN109343453B (zh) * | 2018-11-02 | 2020-01-21 | 合肥保得工业自动化有限公司 | 一种CANopen的数据同步方法 |
CN110798390B (zh) * | 2019-11-13 | 2023-11-07 | 深圳欧特海洋科技有限公司 | 一种用于海底观测网供配电***的通讯***及通讯方法 |
CN115314338B (zh) * | 2022-07-27 | 2024-03-12 | 湖南航天机电设备与特种材料研究所 | 一种实时性运动控制方法及*** |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP1184754A2 (en) * | 2000-08-08 | 2002-03-06 | BOTTERO S.p.A. | Control system for a machine for producing hollow glass articles |
CN1562654A (zh) * | 2004-03-26 | 2005-01-12 | 清华大学 | 基于ccp协议的混合动力电动汽车控制器标定方法 |
CN1889567A (zh) * | 2006-06-02 | 2007-01-03 | 上海微电子装备有限公司 | 一种中速串行连接总线协议及其总线控制器 |
CN1913476A (zh) * | 2006-08-04 | 2007-02-14 | 哈尔滨工业大学 | Can报文优先级产生与检测***及其方法 |
-
2008
- 2008-01-25 CN CN2008100568245A patent/CN101222510B/zh not_active Expired - Fee Related
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP1184754A2 (en) * | 2000-08-08 | 2002-03-06 | BOTTERO S.p.A. | Control system for a machine for producing hollow glass articles |
CN1562654A (zh) * | 2004-03-26 | 2005-01-12 | 清华大学 | 基于ccp协议的混合动力电动汽车控制器标定方法 |
CN1889567A (zh) * | 2006-06-02 | 2007-01-03 | 上海微电子装备有限公司 | 一种中速串行连接总线协议及其总线控制器 |
CN1913476A (zh) * | 2006-08-04 | 2007-02-14 | 哈尔滨工业大学 | Can报文优先级产生与检测***及其方法 |
Non-Patent Citations (3)
Title |
---|
CN 1889567 A,全文. |
孙松,孙川.测控网络中CAN总线及其实现.计量与测试技术 7.2004,(7),23-25. |
孙松,孙川.测控网络中CAN总线及其实现.计量与测试技术 7.2004,(7),23-25. * |
Also Published As
Publication number | Publication date |
---|---|
CN101222510A (zh) | 2008-07-16 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN101222510B (zh) | 一种实现CANopen主站的方法 | |
CN101854300B (zh) | 一种实现CANopen从站的方法 | |
CN103914399B (zh) | 一种并行计算***中的磁盘缓存方法及装置 | |
US9665392B2 (en) | System and method for supporting intra-node communication based on a shared memory queue | |
CN102999522B (zh) | 一种数据存储方法和装置 | |
US20110265098A1 (en) | Message Passing with Queues and Channels | |
CN104394096A (zh) | 一种基于多核处理器的报文处理方法及多核处理器 | |
US8332606B2 (en) | System and method for distributed persistent computing platform | |
CN101383781B (zh) | 虚拟域间短信息通讯方法 | |
CN101739301B (zh) | Unix环境下进程间大量数据传输的方法 | |
CN103678172A (zh) | 一种本地数据缓存管理方法及装置 | |
CN104796337A (zh) | 一种转发报文的方法及装置 | |
CN104536724A (zh) | 一种多核环境下哈希表并发访问性能优化方法 | |
CN102479207A (zh) | 一种信息搜索的方法、***及信息搜索设备 | |
CN109690498A (zh) | 内存管理方法和设备 | |
US20110083130A1 (en) | Dynamic execution context management in heterogeneous computing environments | |
CN101150486A (zh) | 一种零拷贝缓冲区队列网络数据接收的管理方法 | |
CN101547212A (zh) | 一种分布式对象的调度方法和*** | |
CN101150488A (zh) | 一种零拷贝网络报文接收方法 | |
CN112114984B (zh) | 图数据处理方法及装置 | |
CN104778077A (zh) | 基于随机和连续磁盘访问的高速核外图处理方法及*** | |
CN112698959A (zh) | 一种多核通信方法和装置 | |
Swenson et al. | A new approach to zero-copy message passing with reversible memory allocation in multi-core architectures | |
CN112256457A (zh) | 一种基于共享内存的数据载入加速方法、装置、电子设备及存储介质 | |
CN102567278A (zh) | 一种片上多核数据传输方法和装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20101103 Termination date: 20130125 |
|
CF01 | Termination of patent right due to non-payment of annual fee |