监督控制与数据采集技术华东理工大学自动化系王华忠hzwang@ecust.edu.cnCh4工业控制数据交换标准OPC规范一、OPC开发背景和历史1、为什么需要OPC(1)对于早期的计算机系统,为了实现不同的硬件和软件所构成的计算机之间的数据交换和通信,必须要花费很多时间去开发独自的通信程序。(2)由于驱动程序缺乏统一的连接标准,这样一旦硬件设备升级换代,就需要对相应的驱动程序进行更改,增加了系统的维护费用。(3)即使计算机中的SCADA、HMI等软件都有独立的驱动程序,但一般也不允许同时访问相同的设备,否则很容易造成系统崩溃(4)另一方面,现场控制层作为企业整个信息系统的底层部分,必然需要与生产过程管理层和经营决策层进行集成。这样也存在着监控计算机如何与其它计算机进行信息沟通和传递的问题。图4.1用驱动程序的系统连接客户应用程序A设备1驱动程序A设备2驱动程序A客户应用程序B设备1驱动程序B设备2驱动程序B设备1设备22、OPC是如何工作的OPC规范是由世界领先的自动化厂商与微软合作制定的一项工业标准,它以组件对象模型和分布式组件对象模型(COM、DCOM)技术为基础,采用C/S模式,定义了一组COM对象及其接口规范。OPC规范定义了客户程序与服务器程序进行交互的方法,但并没有规定具体的实现,OPC服务器可由不同供应商提供,其代码决定了服务器访问物理设备的方式、数据处理等细节。但这些对OPC客户程序来说都是透明的,只需要遵循相同的规范或方法就能读取服务器中的数据。通过COM接口,OPC客户程序可以和一个或多个提供商的OPC服务器连接。同时一个OPC服务器也可以同多个客户程序相连,形成多对多的关系。任何支持OPC的产品都可以无缝地实现系统集成。由于OPC技术基于DCOM所以客户程序和服务器可以分布在不同的主机上,形成网络化的监控系统。图4.2利用OPC的控制系统构成客户应用程序AOPC客户程序接口设备1设备2客户应用程序BOPC客户程序接口设备1OPC服务器设备2OPC服务器3、采用OPC的好处:各方受益(1)OPC技术把硬件和应用软件有效地分离开,硬件厂商只需要提供一套软件组件,所有OPC客户程序都可以使用这些组件,无需重复开发单独的驱动程序。一旦硬件升级,只需修改OPC服务器端I/O接口部分,无需改动客户端程序。(2)工控软件公司只要开发一套OPC接口就可采用统一的方式对不同硬件厂商的设备进行存取操作。这样,软硬件厂商可以专注于各自的核心部分,而不是兼容问题。(3)对于最终用户而言,由于无需担心互操作性,在选择和更换软硬件时有了更多的余地,不再局限于从单一的厂商购买专用成套系统。(4)同时在异构计算机环境下的系统集成将变得很简单,应用程序之间很容易实现信息的共享和交互。用户可以将重点放在整个系统的功能及应用上,这也意味着成本的降低。(5)OPC组件的使用也十分方便,用户只需进行简单的组态即可。4、OPC的历史早期的OPC标准是由提供工控软件的5家公司所组成的OPC特别工作小组所开发的。Fisher-Rosement,Intellution,RockwellSoftware,IntuitiveTechnology以及Opto22早在1995年开发了原始的OPC标准,微软同时作为技术顾问给予了支持。OPC基金会(OPCFoundation)是在1996年9月24日在美国的达拉斯举行了第一次理事会,并在同年10月7日在美国的芝加哥举行了第一次全体大会上宣告正式成立的。之后得到迅速发展,中国也成了了OPC促进会。-1现存的和正在开发的OPC的标准标准版本内容DataAccess1.0A,2.0,3.0数据访问的标准AlarmandEvents1.0,2.0警报和事件的标准HistoricalData1.0,1.2历史数据访问的标准Batch1.0,2.0批处理的标准Security1.0安全性的标准Compliance1.0数据访问标准的测试工具OPCXML1.01过程数据的XML标准OPCDataeXchange1.0服务器间数据交换的标准二、OPC规范简介1、OPC规范基础随着软件工业技术的迅速发展,传统的程序升级已经无法满足技术的发展需要,而且程序升级需要大量人力成本,解决这一问题的方法就是将应用程序分割成一些小的应用或组件,然后将这些组件在运行时组装起来以形成所需的应用程序,每一个组件都可以在不影响其他组件的情况下被升级。在组件技术规范方面,主要有两个标准:一个是由对象管理组织(ObjectManagementGroup,OMG)起草并颁布的公共对象请求代理体系结构(CommonObjectRequestBreakerArchitecture,CORBA),另外一个是由微软推出的组件对象模型(ComponentObjectModel,COM)技术。组件实际上是一些小的二进制可执行程序。它可以给应用程序、操作系统以及其他组件提供一些服务。多个COM对象可以连接起来以形成应用程序或组件系统,每一个应用程序都可划分为多个独立的模块进行开发,这里的每一个独立模块都是一个自给自足的组件。可以采取不同的开发语言去设计每一个组件。在运行时将这些组件通过接口组装起来以形成所需要的应用程序。(1)COM/DCOM简介由微软公司推出的开放的组件标准。COM标准包括规范和实现二大部分,规范部分定义了组件之间通信的机制,这些规范不依赖任何特定的语言和操作系统,具有语言无关性;COM标准的实现部分是COM库,COM库为COM规范的具体实现提供了一些核心服务。由于COM以客户/服务器模型为基础,因此具有良好的稳定性和很强的扩展能力。分布式组件对象模型(DistributedCOM,DCOM)是COM的网络扩展,它建立在COM之上,并且提供了一种使COM组件加入网络环境的透明网络协议,使COM对象能像在本机上一样在网络上彼此交互。DCOM技术的核心是地址透明性,它依赖对象远程过程调用(ObjectRemoteProcedureCall,ORPC)来完成它所有的网络通信工作,使DCOM组件不仅能跨越进程边界,而且能跨越计算机间的物理边界而相互交换信息,程序员不必编写网络通信所需要的繁杂代码。在分布式计算机环境下,DCOM服务器和客户处于不同的地址空间,不能直接交互信息,客户和DCOM服务器通过代理(proxy)对象和存根(stub)模块间接地交互。客户程序和COM组件程序进行交互的实体是COM对象。COM对象类似C++中对象的概念,它是某个类(class)的一个实例,包括一组属性和方法。COM接口是COM规范中最重要的部分,COM规范的核心内容就是对接口的定义,COM都是以接口的形式出现。组件与组件之间、组件与客户程序之间都要通过接口进行交互。COM对象提供的方法就是COM接口,它是一组逻辑相关函数的集合。客户程序必须通过接口才能获得COM对象的服务。COM接口的名字以字母I打头。COM组件有两个最基本的接口类,分别是IUnknown、IDispatch。所有的COM接口都必须继承一个名为IUnknown的接口,COM的核心接口是IUnknown接口。IUnkown接口提供了两个非常重要的特性:生存期控制和接口查询。Idispatch为调度接口。调度接口把每一个函数每一个属性都编上号。客户程序要调用这些函数属性的时侯就把这些编号传给IDispatch接口就行了,IDispatch再根据这些编号调用相应的函数。对于COM对象来说,接口是它与外界交互的唯一途径,因此,封装特性也是COM对象的基本特征。在COM模型中,对象本身对于客户来说是不可见的,客户请求服务时只能通过接口进行,每个COM对象是用一个128位的全局唯一标识符(GloballyUniqueIdentifier,GUID)来标识的,称为CLSID(classidentifier类标识和类ID)。COM规范采用开放软件基金会(OpenSoftwareFoundation,OSF)的分布式计算环境(DistributedComputingEnviroment,DCE)规范的描述远程调用接口描述语言(InterfaceDescriptionLanguage,IDL)的基础上,进行扩展形成了COM接口的描述语言。接口描述语言提供了一种不依赖于任何语言的接口描述方法,因此,它可以成为组件程序和客户程序之间的共同语言。(2)OPC对象与接口定制接口(custominterface)自动化接口(automationinterface)OPC规范描述了OPC服务器需要实现的COM对象及其接口,定义了:图4.3OPC自动化接口和定制接口(1)图4.4OPC自动化接口和定制接口(2)2、OPC数据存取规范(OPCDA)OPC数据存取规范是OPC基金会最初制定的1个工业标准,其重点是对现场设备的在线数据进行存取。该规范也分为定制接口规范和自动化接口规范二部分,2种接口完成的功能类似,下面主要介绍定制接口规范中基本的对象和接口功能。OPC数据存取服务器主要由以下几个对象组成:即服务器对象、组对象和项对象。OPC服务器对象维护有关服务器的信息并作为OPC组对象的包容器,可动态地创建或释放组对象;而OPC组对象除了维护有关其自身的信息,还提供了包容OPC项的机制,逻辑上管理OPC项;OPC项则表示了与OPC服务器中数据的连接。图4.5OPC数据访问对象的分层结构从定制接口的角度来看,OPC项并不是可以由OPC客户直接操作的对象,因此OPC项没有定义外部接口,所有对OPC项的操作都是通过包容该项的OPC组对象进行的。而OPC服务器对象和组对象是聚合关系,即OPC服务器对象创建OPC组后,将组对象的指针传递给客户,由客户直接操纵组对象。这样既提高了数据存取的速度也易于功能扩展,体现了组件软件的重用性。(1)OPC服务器对象OPC服务器对象是OPC服务器程序暴露的主要对象,客户程序首先创建该对象再通过其接口完成所需功能。图4.6标准OPC服务器对象A:IUnknown接口COM对象必须实现的接口,主要负责对象的接口查询和生存期管理,包括QueryIntertface()、AddRef()和Release()函数。客户程序可以通过QueryInterfac()查询需要访问的接口。因此,客户程序只要得到对象的任何一个接口,就可以访问对象的所有接口。B:IOPCCommon接口:OPC规范如DataAccess,HistoricalDataAccess,AlarmsandEvents等的OPCServer对象的公共接口,通过该接口的函数,可以设置或查询组件应用程序的位置标识LocalID,从而实现客户应用程序与服务器的有效会话,且客户程序间不受干扰。C:IOPCServcr接口:是Server对象的主要接口,主要完成Group对象的添加、删除、获取Server对象的状态、创建组对象枚举器等。IOPCServer是OPCServer的主接口,通过它实现OPCServer在操作系统中的安装和注册。此接口是必须要实现的,其所有方法也必须实现。在IOPCServer接口中共有六个函数:①IOPCServer::AddGroupHRESULTAddGroup(LPCWSTRszName,BOOLbActive,DWORDdwRequestedUpdateRate,OPCHANDLEhClientGroup,LONG*pTimeBias,FLOAT*pPercentDeadband,DWORDdwLCID,OPCHANDLE*phServerGroup,DWORD*pRevisedUpdateRate,REFIIDriid,LPUNKNOWN*ppUnk);此方法是在OPCServer上建立一个组②IOPCServer::GetErrorStringHRESULTGetErrorString(HRESULTdwError,LCIDdwLoc