GPIB命令的数据结构

2010-07-13 06:01刘建纯
电子设计工程 2010年2期
关键词:同层树形数据结构

刘建纯

(北京邮电大学 信息与通信工程学院,北京 100876)

1965年,惠普公司设计了一种用于连接计算机和可编程仪器的总线—惠普接口总线(HP-IB)[1],由于其结构简单、传输速率较高,很快得到普及。1975年,IEEE对惠普接口总线进行了标准化[2],并更名为通用接口总线GPIB(General Purpose Interface Bus)。GPIB技术可用计算机实现对仪器的操作和控制,替代传统的人工操作方式,可以很方便地把多台仪器相组合,形成自动测量系统。

典型的GPIB系统由1台PC机、1块GPIB接口卡和若干台GPIB形式的仪器通过GPIB电缆连接而成。1台上位机(控制GPIB设备的计算机)可以控制多个GPIB接口,各个设备的信息传递就是通过这些接口卡收发GPIB命令来实现的。

本文通过分析GPIB命令的标准格式,讨论了在基于C++的环境下设计通信程序时,如何使程序设计逻辑分明,减少出错,同时使代码高效运行。从数据结构中“树”的概念出发,对普通的树进行改造,形成特有的“GPIB命令树”。

1 GPIB命令的格式

图1是某仪表的GPIB命令。AFGenerator和CALL是两组功能不同的命令集,前者是频率发生器方面的,后者是电话呼叫方面的。AFGenerator和CALL是第1级命令,称为根结点,连在它们后面的是下一级命令,称结点。在同一组命令里,:FREQuency与:VOLTage同级,同样:SAMPlitude,:AMPLitude,:STATe 是同级结点,如此类推。同组命令里,在每一级别里选出1个命令,按前后级的顺序排列,就构成一个完整的GPIB命令,即可发送出去。图1给出GPIB命令格式说明示例。

图1 GPIB命令格式说明示例

通过分析可得到GPIB标准命令格式的规则如下:

1)命令一般由大小写英文字母和“:”组成。 例如:“CALL:CCPChannel:PRIMary”。

2)命令中的大写字母部分是必须有的,小写字母部分则是可选的。 例如:命令“CALL:CCPChannel:PRIMary”也可写成“CALL:CCPC:PRIMary”或“CALL:CCPC:PRIM”。

3)命令是以“:”分隔不同级别的命令。例如:命令“CALL:CCPChannel:PRIMary”中,“CALL”是第 1 级命令,“CCPChannel”是第 2 级命令,“PRIMary”是第 3 级命令。

4)当命令带有参数时,用空格将命令和参数隔开,命令有多个参数时,用 “,”将不同参数隔开。例如:“CALL:CCPChannel:PRIMary-6”,“SYSTem:TIME 8,59,59”。

5)命令集中带有“[]”的命令在使用时“[]”中的部分可以省略,且不能带有“[]”。 例如:“SYSTem:APPLication[:CURRent][:NAME]”在使用时可以写成“SYSTem:APPLication”、“SYSTem:APPLication:CURRent”、 “SYSTem:APPLication:NAME”、 “SYSTem:APPLication:CURRent:NAME” 或 “SYSTem:APPLication:CURR:NAME”。

6)在某些情况下,可以将几条命令复合在一起,用“;”将相同级别的子命令隔开。例如:命令 “CALL:REGister”和“CALL:CONNected” 可以写成“CALL:REGister;CONNected”,命令“CALL:FPAChannel-8”和“CALL:PICHannel-5”可以写成“CALL:FPAChannel-8;PICHannel-5”。

7)使用查询功能的命令时以 “?”结尾。例如:“CALL:CCPChannel:PRIMary?”、“CALL:CCPChannel:SECOndary?”。

8)不可查询的命令不能以“?”结尾。 例如:“CALL:REG-ister:STARt?”和 “CALL:ORIGinate?”都是错的。

9)命令中间不允许出现空格。 例如:“CALL:CCPChannel:PRIMary”和“CALL:CCPChannel:PRIM ary”都是错的。

10)IEEE488.2[2-3]中规定了一个公共命令集,它是一组公共命令的集合,公共命令都以“*”开始,且只有一级。例如:*IDN?表示该命令只能查询;*CLS表示该命令不可查询;*ESE表示该命令要带参数。

2 GPIB命令的数据结构

2.1 数据结构的选择

依据数据元素之间的关系,数据结构可分为线性结构和非线性结构两大类。

从GPIB命令格式可以看到,GPIB各个命令前部分有很多相同之处,以分支关系定义的层次结构非常明显。对比以上对线性结构和非线性结构特点的分析,很容易联想到使用非线性结构中“树”[4]的概念来构建一个GPIB命令集。GPIB标准命令格式的规则规定:命令以“:”分隔不同级别的命令;在最前面的命令级别最高,以冒号为标识,后面的命令级别依次降低,对应树的层次关系就是最前面的命令在树的顶层,后面的命令在树中的层次依次降低。由此确定GPIB命令的数据结构为“树”[5]。

图2给出树的逻辑表示,它形如一棵倒长的树。其中A是根结点,一般都在树的顶部。其余结点分成3个互不相交的子集:T0={B,E,F,K,L},T1={C,G},T2={D,H,I,J,M}, 它们都是根结点A的子树。再看T0,它的根是B,其余结点又可以分成2个互不相交的子集T00={E,K,L},T01={F},它们是T0的子树。由此可知,树的定义是一个递归的定义,即树的定义中又用到树的概念。

图2 树的逻辑示意图

确定GPIB命令的数据结构为“树”,仅是得到一种数据结构的设计思路;而根据树的形状特点,树又分为多种树形,因此下面将讨论如何设计GPIB命令树的树形。

2.2 GPIB命令树的树形设计

GPIB命令集由IEEE488.2公共命令集和仪表子系统命令集构成。设计GPIB命令树时必须考虑以下因素:

1)IEEE488.2公共命令集和仪表子系统命令集无公共根结点,因此不能设计成只有一个根结点的树,至少需要2棵独立的树。

2)IEEE488.2公共命令集都以“*”开始,且只有一级。

3)仪表子系统的子命令集功能各不相同,因此仪表子系统子命令集对应的树也不能设计成只有一个根结点,需要多个根结点,表示多棵树。

4)仪表子系统的子命令集在开发过程中不断添加、修改,所以结点的度是不确定的,有的结点度比较大,有的结点比较小甚至为0。根据这些因素,以下将讨论两种不同的设计方案。

注意:这里讨论的GPIB树的设计是针对上位机而言的。实际上,各个GPIB设备本身就存有GPIB命令集,以便对不同的GPIB命令作出相应的响应,可以用不同的数据结构实现[6],很有可能用的不是上面讨论的GPIB树,有可能是二叉树或其他。从上位机软件设计的角度来看,是为了让用户知道所发的命令及其格式是正确,因为GPIB设备只对正确的GPIB命令作出响应,而对错误的GPIB命令则不做任何动作,包括返回错误。因此,在上位机软件里设计一个跟GPIB设备相同的GPIB命令是必要的,只是在数据结构和存储方式方面会有差异。

2.2.1 GPIB命令的树形设计方案1

根据上述分析,最直观也最易想到的方案如图3所示。

图3 GPIB命令的树形设计方案1

对应设计GPIB树时必须考虑的因素,其特点如下:1)IEEE488.2公共命令集的树和仪表子系统命令集的树分别独立;2)IEEE488.2公共命令集的树一个结点为一棵;3)仪表子系统命令集的树根据第1级命令的不同,设计成多棵树。

此方案的优点在于逻辑思路很简单,完全根据GPIB命令的基本特点设计;同时,在考虑程序实现树的构造时,其缺点又是明显的:1)仪表子系统命令集的树中,结点的度根据GPIB命令的需要而改变,没有确定的大小。仪表子系统命令集的树的度不能确定,则结点的数据结构难以设计,因为不能确定需定义的结点指向子树的变量的个数,定义过多会浪费较多的空间资源,定义不足则不能实现树的构造。这也是此方案最大的缺点。2)另外,根据该设计,IEEE488.2公共命令集的树应有2棵,仪表子系统命令集的树应有8棵,树的数目太多,不便于管理。

2.2.2 GPIB命令的树形设计方案2

针对方案1的缺点,综合考虑,设计出新型的GPIB命令树的树形。注意,这种新型的树和通常所说的树的结构不太一样,是树的变形。GPIB树的树形设计方案2如图4所示。

图4 GPIB命令的树形设计方案2

其特点如下:1)IEEE488.2公共命令集的树和仪表子系统命令集的树分别独立。这点和方案1相同;2)IEEE488.2公共命令集的树只有1棵,而且各个结点同在一层;3)仪表子系统命令集的树也只有1棵,根据功能划分为不同的子树,无公共根结点;每棵子树的根结点相连接;4)仪表子系统命令集的每棵子树中原来同层的兄弟结点直接相连。如{H,I},{J,K,L},{N,O,P}; 所有的双亲结点只与第 1 个兄弟结点相连。如D只和H相连,E只和J相连,I只和M相连,J只和N相连。相对普通的树,这种GPIB树的最大特点是:同层的结点则对应同级的 GPIB 命令。 如 D:H 和 D:I:M,H、I同级,则H、I在树中同层。

相比方案1,其优点有:1)仪表子系统命令集的树的度为2(1个结点最多要指向其他2个结点),那么在设计结点的数据结构时就有了依据,指针域只需定义2个变量即可实现树的连接生成;2)生成的树只有2棵,即EEE488.2公共命令集的树和仪表子系统命令集的树,易于维护管理。

与方案1相比,这种树形逻辑简单,同层的结点则对应同级的GPIB命令;而且程序设计也较容易实现。尽管这种树形不是书本中通常讨论的树,例如它没有根结点、兄弟结点之间是直接相连等,但它的层次关系还是与通常的树一样,原来同一层次的还是同一层次。而这样变形可简化程序实现,改善程序效率。

基于以上优点,选择此树形为GPIB命令树。按照这种方案的设计思想,最终GPIB树如图5所示。

图5 GPIB命令树示意图

3 结论

本文针对GPIB命令的结构特点,为利于程序设计,提出一种存储GPIB命令的数据结构。考虑到程序实现的效率以及管理维护方面的因素,对普通的树进行改造,形成本文特有的“GPIB命令树”。这种树形逻辑上简单,易懂,同层的结点则对应同级的GPIB命令,在程序设计上也较容易实现,提高了程序执行的效率。为以后开发基于GPIB总线技术的控制系统打下了基础。

[1]杨乐平,李海涛,肖 凯,等.虚拟仪器技术概论[M].北京:电子工业出版社,2003.

[2]IEEE Std 488.2.IEEE standard digital interface for programmable instrumentation-part2:codes,formats,protocols,and common commands for use with IEEE Std 488.1-1987[S].1992.

[3]National Instrumentation Corporation.NI-488.2 function reference manual for Windows[DB/OL].1999.http://www.ni.com/pdf/manuals/321038g.pdf.

[4]朱战立.数据结构—使用 C++语言[M].西安:西安电子科技大学出版社,2001.

[5]殷人昆,陶永雷,谢若阳,等.数据结构(用面向对象方法与C++描述)[M].北京:清华大学出版社,1999.

[6]严蔚敏,吴伟民.数据结构(2)[M].北京:清华大学出版社.1991.

猜你喜欢
同层树形数据结构
苹果高光效树形改造综合配套技术
易木同层
莱阳茌梨老龄园整形修剪存在问题及树形改造
易木同层
数据结构线上线下混合教学模式探讨
易木同层
同层排水技术在实际应用中的比较和探讨
猕猴桃树形培养和修剪技术
休眠季榆叶梅自然开心树形的整形修剪
“翻转课堂”教学模式的探讨——以《数据结构》课程教学为例