论利用OOP设计思想的通讯接口类的设计与应用

出处:电子爱好者博客 发布于:2013-07-24 11:00:01

  摘要:针对测控系统中测试仪器接口的差异性,利用面向对象的程序设计的封装,继承和多态思想,设计了一个具有较强通用性的通讯类。在此给出了该类族的UML图例,在具体的设计应用中,各个层次的分工明确清晰,从而提高设计的效率,使得采用该设计思想的系统具有较强的鲁棒性。之后,给出了应用于GPIB接口仪器的设计用例,系统具有很好的适应性和可扩展性,要增加不同仪器时,针对不同接口很容易添加每个接口类的设计代码。

  0 引言

  随着电子技术的发展,嵌入式控制系统进入了各个行业,而友善的人机交互决定了台式机和控制系统的结合不可避免。同时,随着虚拟仪器技术的发展,硬件软件化的趋势愈加明显,在测控系统中,一般的系统构架都采用前端是数据采集系统,然后将采集到的数据通过传输协议传输到后台台式机中进行更加灵活的处理和显示,比方说现在TI的CVS或者LabVIEW 就是专门用于方便地设计虚拟仪器的开发工具。这个一方面是降低成本的方式;另一方面,系统的构架上灵活,适应性得到了加强。

  1 硬件构架

  嵌入式的测控系统,结合台式机灵活的软件设计,可以提供给用户多样的虚拟仪器的人机交互界面,以及复杂的数据管理功能。图1就是一个典型的测控系统的基于虚拟仪器构架的抽象系统框图。

  整个系统,分成了3 个逻辑部分:部分就是待测控的系统,可能是某个系统的温度,或者是某个工业控制过程的流量等;第2部分是数据采集和控制执行单元,这个部分负责了数据的采样和来自工控机的命令的执行,关于数据采集单元,可以简单的由传感器加A/D转换电路组成,也可以是诸如频谱仪等专门的测量仪器。由于有些系统是开环系统,所以未必有控制执行单元,所以这个单元在图中用了虚线的方式表示,负责工控机经过某些算法运算之后,执行控制命令;第3部分就是工控机所在的仪器界面的部分,这个部分可以使对原始数据的形象图形化表示(即虚拟仪器,完成人机交互),也可以负责执行诸如一些特殊的信号处理功能,然后将处理结构进行显示或者将处理结果作为算法控制的输入,进行产生控制信号,一边对被控对象进行及时的控制。

  

  系统的工作过程,首先是由被测控系统的需要检测的数据决定了所需要的数据采用硬件进行采用原始的数据,然后又采用系统将数据直接转换为原始数据信号,如果采样后需要立即进行必要的数据处理,就可以使用DSP对数据进行加工,然后作为初始数据,通过标准的传输协议(如串口,网口,蓝牙,或者USB等),将数据传输给工控PC,然后通过编写工控软件,将数据进一步进行深层次的处理,显示,存储,如果需要对系统进行控制,就可以在工控机上对信号使用如滤波,变换或者控制PID 等的各种算法,然后通过标准协议,将处理的控制信号传输到控制执行单元,对测控系统中所关心的参数进行控制。

  本文关注的就是各种传输协议在工控PC上的编程时代码的适应性,扩展性以及代码的复用性。

  2 接口类的设计

  2.1 基于面向对象的接口类的设计

  本文利用了面向对象的设计思想,将图1中的各种标准工业传输协议进行抽象,提供统一的接口,这样设计的接口类,不但可以保证数据的安全性,使用的灵活性,还能实现良好的可扩充性。图2就是依照面向对象的设计思路,利用UML表示的类族的关系[7].

  

  在图2的UML表示类的关系中,是对图1的系统的在传输观点来看的一个抽象,其中,Device类是对设备的抽象,COM类是对通讯接口的抽象,这两个类都是抽象类,在应用软件看来,一个具体的测量设备,只关注设备打开,传输数据,和关闭,其他的细节,不需要应用程序知道太多。而面向对象的程序的设计思想,可以很好地满足这样的需求,基于此,Device类是一个用于后续实现多态机制的虚类,这个抽象类,是任何具体测量设备的父类,而派生自这个Device的任何类,都需要实现父类中的4 个基本操作方法Open,Close,SendCmd 和RecvData;至于是否需要其他的接口方法,用户可以根据需要进行添加。抽象类COM和Device是一种聚合的关系,任何一个Device 都有一个用于传输数据的通讯口,一个抽象的通讯类,需要提供的接口方法有Open,Close,Write 和Read,其中,Open 主要用于打开通讯口,包含了对通讯口的初始化,之后,就可以进行数据的传输了。Close用于释放通讯口所占用的资源,如果可能,包含了对通讯口的下电操作。而Read 和Write 就是完成数据缓冲区数据的接受和发送,其中,方法签名中的*pBuff是指向待发送或者接受到数据的缓冲区,iCount-ToWrite和iCountToRead分别是要发送或者接受的数据的字节数,这两个方法的返回值,是实际发送或者接受到的数据的字节数。如果出错,则返回小于0 的错误代码。

  对于具体的通讯协议接口,比如串口、网口或者GPIB,甚至其他的芯片的接口[8-9]等,都是继承自通讯类COM 的,在COM 类中,各个接口方法可以定义成虚方法,这样,有利于在具体的派生类中对其进行重载,从而有利于动态多态机制的实现,而具体的差异统统放到每个具体类的扩展部分。例如,对于串口,关注的是串口名称,串口数据传输速率,有无校验,数据位数以及停止位等信息,而网卡则关注的IP 地址和端口号,这些信息可以利用封装机制,封装到每个具体的接口类中,他们代表着不同类之间的差异与个性,这些差异信息完全由具体类自己控制操作。通过重载父类COM类的公有方法,就提供了通用的接口。

  2.2 该构架的使用模型

  采用图2类族设计了各个类之后,就可以使用图3所示的流程来应用这样的一些类。在具体的使用过程中,如果是用测量仪器进行来承担原始数据的采集的,那么用户一定是明了仪器所使用的与控制机进行联机的接口类型的,或者是串口,或者是网口,或者是其他的新标准的工业控制接口,在应用编程时,就需要先创建一个这样的通讯口的对象,然后把这个对象的引用传递给仪器类,产生一个仪器对象出来,由于仪器是继承Device抽象类的,所以在产生出具体仪器类之后,利用面向对象的多态技术,可以将这个仪器对象传给一个上层应用的Device指针,上层应用就可以通过Device 类提供的通用接口,来对设备进行打开,读写等操作,在应用层,用户可以利用线程技术,来提高系统的整体性能。

  

  2.3 接口类用例

  假设,现在有一个频谱测量系统,各个测量仪器与主控PC 采用了GPIB 进行系统的构建[10],则使用类族如图2 所示,流程图如3所示,可以设计如下的类族伪代码:

  class COM

  {

  public:

  virtual BOOL Open()=0;

  virtual int Write(BYTE* pBuff,int CountToWrite)=0;

  virtual int Read(BYTE* pBuff,int CountTORead)=0;

  virtual void Close()= 0;

  };

  而派生类GPIB 接口的实现,就是将该接口的各个API进行封装,然后由COM 的接口提供出统一的访问方式。

  在实现了具体的具体的仪器的类的编写后,就可以采用图3的流程来完成,下面是C++伪代码:

  COM *pc = new GPIB(1,0,0);

  Device pDevice = new FreqMeasureInstrumen(t pc);

  i(f TRUE == pDevice->Open())

  {

  开始与仪器的交互和测量数据的采集;

  }

  else

  {

  打开出错,错误处理;

  }

  测量完成,关闭仪器;

  pDevice->Close();

  在这段伪代码中,首先,定义了一个通信口的指针,但是所指的对象是一个动态产生的GPIB类的对象。然后再定义一个仪器类的指针pDevice,所指的对象是动态产生的一个频谱测量仪的对象。然后通过pDevice,就可以调用接口完成具体的测量任务。

  3 结语

  基于这样的面向对象的思想设计出来的测控系统的通讯接口类,在某个银行终端的模拟测试中,可以很好地适应串口和网口的测试,代码思路清晰,非常有利于扩展和维护。

关键词:接口通讯接口

版权与免责声明

凡本网注明“出处:维库电子市场网”的所有作品,版权均属于维库电子市场网,转载请必须注明维库电子市场网,https://www.dzsc.com,违反者本网将追究相关法律责任。

本网转载并注明自其它出处的作品,目的在于传递更多信息,并不代表本网赞同其观点或证实其内容的真实性,不承担此类作品侵权行为的直接责任及连带责任。其他媒体、网站或个人从本网转载时,必须保留本网注明的作品出处,并自负版权等法律责任。

如涉及作品内容、版权等问题,请在作品发表之日起一周内与本网联系,否则视为放弃相关权利。

相关技术资料
广告
上传BOM文件: BOM文件
*公司名:
*联系人:
*手机号码:
QQ:
应用领域:

有效期:
OEM清单文件: OEM清单文件
*公司名:
*联系人:
*手机号码:
QQ:
有效期:

扫码下载APP,
一键连接广大的电子世界。

在线人工客服

买家服务:
卖家服务:

0571-85317607

客服在线时间周一至周五
9:00-17:30

关注官方微信号,
第一时间获取资讯。

建议反馈

联系人:

联系方式:

按住滑块,拖拽到最右边
>>
感谢您向阿库提出的宝贵意见,您的参与是维库提升服务的动力!意见一经采纳,将有感恩红包奉上哦!