[摘 要]与设备通信的驱动程序是世纪星组态软件的重要组成部分,本文主要讲述COM组件技术在开发世纪星驱动程序时的应用。
1 引言
在工控软件中,数据的采集和下发直接影响系统的性能,因此对于如何构架一个高效合理的软件系统在工控界一直被广泛关注。在组态软件中,一般可分为两部分:HMI人机接口和数据采集模块。其中HMI是用户和现场设备进行通信的接口,HMI要做到直观易用以便于用户对生产情况的了解和操作,而HMI要以数据采集模块作为支撑,可见数据采集模块在工控软件中的重要性。为了适应各种不同的设备,世纪星的驱动程序采用了组件技术,使数据采集模块具有高性能、高可靠性、灵活、便于升级等重要特性。
2 COM组件技术
COM--Component Object Model,即组件对象模型,它是微软提出的一套开发软件的方法与规范。组件实际上是一些小的二进制可执行程序,它们可以给应用程序,操作系统,以及其他组件提供服务,能够跨越链接库、应用程序、系统软件甚至网络软件,多个COM对象甚至可以联接起来形成应用程序或组件系统。组件式程序设计方法能像搭积木一样开发大而复杂的软件系统,并且可以利用以往开发的组件资源而不必进行二次开发。COM(组件对象模型)是一个与操作平台 无关的、分布的、面向对象的机制,其本质特性是COM对象的接口与实现的分离。基于COM的组件开发具有以下几点优势:
第一,从用户的角度考虑,用户一般希望能够定制所用的应用程序,而组件技术从本质上讲就是可被定制的,因而用户可以用更能满足他们需要的某个组件来替换原来的那个。
第二,由于组件是相对应用程序独立的部件,我们可以在不同的程序中使用同一个组件而不会产生任何问题,软件的可重用性将大大的得到增强。
第三,随着网络应用的普及,分布式网络应用程序在软件市场上变得越来越重要。组件价构可以使得开发这类应用程序的过程得以简化。
第四,组件式开发便于软件系统的升级,当某部分功能需要升级时,开发人员只需修改相应组件即可,而用户只需替换原来的组件,这就使得软件升级只是替换一些组件而已。
第五,组件式开发便于软件开发的分工协作,每个组件各自完成所需功能,只需在进行开发前协商好接口即可。
3 世纪星数据采集模块
数据采集模块是世纪星软件系统的后台服务程序,负责从现场设备采集数据并将数据提供给HMI,而HMI产生的控制信号又通过数据采集模块传输给设备,这样就达到了用户与设备的相互对话。其信息流如图1所示:
图1
在数据采集模块中,基本上由两部分组成,一部分是和设备相对应的驱动程序,该程序既是一个COM组件,另有一个控制程序DataComm负责调用驱动程序以及和其他模块通信。在上位机和下位机或其他一些板卡进行通信时大致有以下几种方式:串口,TCP/IP,计算机PCI卡,数据采集模块通过一个统一的接口访问不同的设备,设备驱动文件只需完成该接口功能即可,这样在与新设备通信时DataComm不必修改,只要开发出与该设备通信的驱动组件就能完成上位机与设备之间的通信,DataComm与驱动程序之间的关系如图2所示:
图2
4 设备驱动的接口设计与实现
每个COM组件都至少有一个IUnknown接口或继承IUnknown的子接口,IUnknown接口负责查询该组件的其他接口和维护引用计数,引用计数与组件对象持久性相关,本文不详细阐述。前面说访问设备使用统一的接口,那么该接口应该具有所有操作设备通用的功能,如初始化和关闭设备,读写数据等。在C++中使用抽象基类作为接口,其部分定义如下:
class IDeviceAccess : public IUnknown
{
public:
virtual HRESULT __stdcall QueryInterface(REFIID iid, void** ppvObj) = 0;
virtual ULONG __stdcall AddRef() = 0;
virtual ULONG __stdcall Release() = 0;
public:
virtual BOOL __stdcall UnInitialDevice( LPDEVADDR pDevAddr )=0;
virtual BOOL __stdcall InitialDevice( LPDEVINIDATA pInitDat )=0;
virtual BOOL __stdcall ReadData(…… )=0;
virtual BOOL __stdcall WriteData( …… )=0;
…… ……
};
该接口的实现是在COM组件中,因为设备不同,所以实现也有所不同,但同类设备也有一些相同之处,比如智能仪表大多都是通过串口进行通信,而对串口的参数设置是这类设备的共同之处,为此我们定义一个类CDevice:public IdeviceAccess,这个类完成初始化等基本的功能,而读写数据ReadData和WriteData都进行空实现,让所有相关设备以CDevice为基类然后重写ReadData和WriteData即可。世纪星的驱动组件是使用MFC开发的,MFC是通过嵌套类实现COM功能,在世纪星中我们以继承CDevice的类作为嵌套类,这个嵌套类完成一些具体功能,它所在的类我们成为外部类,外部类提供一个全局唯一的CLSID,DataComm通过CLSID定位组件,然后使用之前定义的接口完成与设备的通信,通过图3描述如下:
图3
5 小结
数据采集模块的性能是影响工控软件的一个重要因素,高效稳定的数据通信服务是工控软件或许更大发展的基本保证。世纪星使用COM技术实现数据通信既方便了开发人员对新设备驱动的开发,又便于用户对驱动的升级,同时增强了世纪星本身的可扩展性。