还剩63页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
PAGE鞍山科技大学本科生毕业设计(论文)第51页冷轧清洗线控制系统设计——用C++和OPC设计二级控制系统摘要传统工控系统的驱动和与其连接的应用程序之间的接口没有统一的标准为了实现不同的硬件和软件所构成的计算机之间的数据交换和传输必须开发各自的通讯程序这样一来导致了开发成本高、重复性劳动、驱动程序不一致和存在访问冲突等问题很难适应当今工控系统的开放性要求OPC(OLEforProcessControl,用于过程控制的OLE)技术的出现提供了解决方法OPC使不同供应厂商的设备和应用程序之间可以相互间数据交换把硬件供应商和软件开发商分离开来在设备和数据库等数据源和客户之间架起一座桥梁OPC是过程控制工业中的新兴标准,基于Microsoft的COM/DCOM技术,它包括一整套用于过程控制自动化接口和方法的标准集本文介绍了OPC技术产生的背景,以及它的主要特点与发展状况,并剖析了其核心COM/DCOM技术然后重点介绍了OPC数据访问规范及访问方法,OPC服务器对象和客户端对象接口及OPC客户端与服务器的通信最后介绍OPC技术在冷轧清洗线中的应用,OPC服务器与现场设备和客户端的连接关键词OPC,组件对象模型,客户端ColdRollingCleaningLineControlSystemDesign——DesignSecondLevelControlSystemwithC++andOPCAbstractThereisnouniversalstandardbetweenthedriveroftraditionalindustrycontrolsystemandapplicationprogram.Inordertorealizethedataexchangeandthetransmissionamongthecomputerswithdifferenthardwareandsoftwarepeoplemustdeveloprespectivecommunicationprogram.Asthematterstandsthereexistmanyproblemsincludingthehighdevelopmentcosttheduplicatedworkinconsistentdriverprogramandvisitconflictandsoon.Itisverydifficulttomeettheopenneedsofcurrenttheindustrycontrolsystem.OPCOLEforProcessControlusedinprocesscontrolOLEtechnique’sappearanceprovidethesolution.OPCmakesthedifferentsupplymerchantofequipmentandtheapplicationprogramexchangedatamutuallyandseparatethehardwaresupplierfromthesoftwaredeveloperwhichputsupabridgebetweencustomersanddataresourcesuchasequipmentanddatabaseetc.OPCisanemergingstandardintheprocesscontrolindustrybasedonMicrosoftCOMandDCOMtechnology.Itincludesthewholestandardcollectionwithinterfaceandmethodusedintheprocesscontrolautomation.ThispaperintroducesthebackgroundofOPCtechnologyaswellasitsmaincharacteristicandthedevelopmentconditionandanalyzesitscoreCOMandDCOMtechnology.ThenitintroducestheOPCdataaccessstandardandaccessmethodwithemphasistheinterfaceandthecommunicationbetweenOPCserverobjectandclientobject.IntheenditintroducestheapplicationofOPCtechnologyinthecoldrollingcleaningline,theconnectioninthecoldrollingcleaninglinebetweenOPCserverandthefielddeviceandthatbetweenOPCserverandtheclientside.Keywords:OPCCOMclientside目录TOC\o1-3\h\z\u摘要IAbstractII1绪论
11.1研究背景
11.2OPC的基础知识
11.
2.1OPC产生的背景
11.
2.2OPC的历史
31.
2.3OPC的现状和发展42OPC技术的基础—COM技术
62.1COM技术简介
62.
1.1COM概念
62.
1.2COM对象
62.2COM接口——IUnknown接口
62.3COM扩展——分布式COM(DCOM)73OPC技术介绍
83.1基于COM技术的OPC
83.2OPC数据访问规范
93.3OPC数据访问服务器的对象
93.4OPC数据访问方法
113.5OPC服务器对象及其组对象接口
133.
5.1OPC服务器接口
133.
5.2OPC组对象接口
153.6OPC客户端及其接口
183.
6.1OPC客户端概述
183.
6.2OPC客户端的数据来源
183.
6.3OPC客户端接口184OPC技术在冷轧清洗线中的应用
204.1工程背景及工艺
204.
1.1工程背景
204.
1.2工程工艺
204.2OPC服务器与现场设备的连接
214.3OPC服务器与客户端的连接
224.4OPC服务器客户端程序的主线程26总结28致谢29参考文献30附录A(OPC——thestandardforrealtimecommunication)31附录B(OPC——实时通信标准)35附录C38附录D47附录E55冷轧清洗线控制系统设计——用C++和OPC设计二级控制系统1绪论
1.1研究背景现在,工业自动化系统的应用已经非常普及,DCS(DistributedControlSystem,集散控制系统)得到了广泛应用,现场总线技术正在逐步完善、成熟起来但是目前工业自动化系统绝大多数是封闭的系统,缺乏统
一、标准的开放式接口不同厂家的产品如果要集成在一起,必须为它们开发专用的接口随着工业自动化系统功能要求越来越复杂,完全用一个厂家的产品来构成整个系统是很困难的不同厂家的产品之间接口的复杂性限制了用户的选择,不能根据系统的要求选择最佳的系统集成方案同时,软件在自动化领域内使用的重要性与日俱增无论项目是否涉及到操作、可视化、数据存档或控制,向纯粹的、基于PC的软件解决方案的发展趋势是不可阻挡的这些软件解决方案不再是开发单个的模块,而是由专用的软件组件组成采用可重复使用的软件组件以及利用这些软件组件所具有的柔性构成整个系统,成为发展的必然趋势,因而通信接口不兼容的问题急需解决OPC(OLEforProcessControl,用于过程控制的OLE)技术的出现提供了解决方法当现场设备、应用软件都具备标准的OPC接口时,便可集成来自不同数据源的数据,使运行在不用平台上、用不同语言编写的各种应用软件顺利集成
1.2OPC的基础知识
1.
2.1OPC产生的背景传统的SCADA监控与数据采集系统开发中出现的一个主要问题是软件的重复开发,软件不能够重用,资源不能共享,造成大量人力与物力资源的浪费随着计算机软件的发展,这种情况有所改观,高级语言中库函数的采用,实现了一定程度上资源的共享,尤其是面向对象的方法的应用,使得我们可以利用面向对象的继承等方法大量重用源代码但这些重用只是对源代码级的重用而不是对可执行文件级的重用,对每一类库都要重新编译,所以并没有真正实现资源共享,并且对某个模块中某个类库的修改将“触一发而动全身”,引起所有引用该类库的模块的修改,因此非常难以实现某个模块的升级同时,为一种语言开发的类库以及函数库都不能够为其他语言所用,也大大限制了软件的重用一般实时监控系统为分布式的结构,实现了人机接口、通信、数据处理等功能在网络上的分布,同时将一个系统划分为各个子系统,降低了系统的复杂程度,改善了系统性能,便于整个系统的开发,减少了开发周期与维护费用但由于系统各个计算机的通信协议依赖于某个厂家,没有形成统一的标准,不同厂家之间的软件与硬件的集成难于实现因此也没有真正实现不同厂家的软件共享从更广泛的意义上看,新的过程控制信息体系的各层都有着各自的要求,他们都要求信息的一致性现场控制层智能现场设备的出现,可以提供过去不能提供的大量丰富的有关此现场设备的信息所有这些信息必须以一致的方式提供给客户应用程序过程管理层DCS(集散控制系统)和SCADA必须以统一的方式为操作员和工程师等决策者提供数据经营决策层对生产过程信息的综合,有助于企业最优生产,节省财政开支而向客户应用程序以统一的方式提供信息,可最小化企业在信息综合上的精力为了有效地完成信息集成,关键是制订一种集中于数据访问而不是数据类型的开放的、有效的通信标准定义OPC的目的就是为应用程序访问工厂前台提供共同的方法,允许兼容的应用程序无缝的访问生产环境中的数据在传统的控制系统中,智能设备之间及智能设备与控制系统软件之间的信息共享是通过驱动程序来实现的任何一种HMI(HumanMachineInterface,人机接口)等上位监控软件或其它应用软件(如趋势图软件、数据报表与分析等)在使用某种硬件设备时都需要开发专用的驱动程序,如图
1.1所示
[1]图
1.1传统控制系统结构为了解决上述问题,硬件制造商们一直试图开发出一种可以被任何客户使用的超级“I/O驱动”程序但是由于客户协议的不一致,这项工作至今没有取得成功,OPC和现场总线标准的制定正好为上述问题的解决开辟了新的道路采用OPC标准后,针对硬件的驱动程序不再由软件开发商开发,而是由硬件开发商根据硬件的特征提供统一的OPC接口程序由于硬件开发商对自己的硬件特征了如指掌,从而能够最大限度地挖掘硬件的潜力,提高驱动程序的性能基于OPC标准的数据访问方式如图
1.2所示采用OPC标准后,由硬件开发商提供统一的OPC接口程序,从而避免了开发重复性,使开发费用大大降低OPC规范采用客户/服务器模型,其实质是在硬件供应商和软件供应商之间建立一套“游戏规则”,只要遵循这套规则,数据交互对两者来说都是透明的硬件供应商无需考虑应用程序的多种需求和传输协议,软件开发商也无需了解硬件的实质和操作过程这样可以灵活而有效地在应用和过程控制设备之间读写数据图
1.2采用OPC后控制系统结构
1.
2.2OPC的历史OPCOLEforProcessControl——用于过程控制的OLE是一个工业标准,它是许多世界领先的自动化和软、硬件公司与微软公司合作的结晶这个标准定义了应用Microsoft操作系统在基于PC的客户机之间交换自动化实时数据的方法管理该标准的组织是OPC基金会该基金会的会员单位在世界范围内超过220个,包括了世界上几乎全部的控制系统、仪器仪表和过程控制系统的主要供应商OPC基金会的先驱由Fisher-Rosemount、Rockwell软件公司、Opto
22、Intellution和IntuitiveTechnology公司组成的“特别工作组”在经过一年工作后,开发出一个基本的、可运行的OPC规范随着1997年2月Microsoft公司推出Windows95支持的DCOM技术,1997年9月新成立的OPCFoundation对OPC规范进行修改,增加了数据访问等一些标准,OPC规范得到了进一步的完善OPC是基于Microsoft公司的DistributedinterNetApplicationDNA构架和ComponentObjectModelCOM技术的,根据易于扩展性而设计的OPC规范定义了一个工业标准接口,这个标准使得COM技术适用于过程控制和制造自动化等应用领域OPC是以OLE/COM机制作为应用程序的通讯标准OLE/COM是一种客户/服务器模式,具有语言无关性、代码重用性、易于集成性等优点OPC规范了接口函数,不管现场设备以何种形式存在,客户都以统一的方式去访问,从而保证软件对客户的透明性,使得用户完全从底层的开发中脱离出来
[2]OPC技术是OPC基金会组织制定的工业控制软件互操作性规范,也是微软为了把WINDOWS应用于控制系统和控制界共同推出的一项技术它以微软的COM/DCOM组件对象模型和分布式组件对象模型技术为基础,为工业控制软件定义了一套标准的对象、接口和属性,通过这些对象接口,应用软件之间能够无缝地集成在一起,实现了应用程序之间数据交换方式的标准化,极大的提高了自动化系统,现场设备系统,商业办公系统之间的互操作性OPC接口既可以用于应用程序的最低级,即通过该接口将现场实时数据采集到DCS或SCADA中来,又可用于应用程序的中级环节,即通过该接口将数据从DCS或SCADA系统采集到上位机应用程序中来,还可将OPC应用于网络计算机来采集数据,设计一个OPC服务器,允许客户应用程序从该服务器或网上运行OPC服务器的其它节点计算机上采集数据总之,OPC应用不应该局限于应用程序与现场设备的接口,应该认为它是一种Windows应用程序相互交换数据的通用规范
1.
2.3OPC的现状和发展OPC技术的发展,源于OPC基金会及其300多家公司成员的共同努力世界领先的工业自动化软硬件厂商,作为OPC基金会的成员,为OPC技术的发展做出着重要的贡献目前现存的和正在开发的OPC标准如表
1.1所示表
1.1OPC标准标准最新版本内容OPCDataAccessOPCAlarmsEvents
3.
001.10数据访问标准报警和事件标准OPCBatch
2.00批处理标准OPCDataExchange
1.00服务器间数据交换标准OPCHistoricalDataAccess
1.20历史数据访问标准OPCSecurityOPCXML-DA
1.
001.01安全性标准XML数据访问标准OPCCommands
1.00命令标准OPCComplexData
1.00复杂数据访问标准2OPC技术的基础—COM技术
2.1COM技术简介
2.
1.1COM概念COM(ComponentObjectModel,组件对象模型)是由Microsoft提出的组件标准,是OLE、ActiveX、DCOM技术的基础,它不仅定义了组件程序之间进行交互的标准,并且也提供了组件程序运行所需的环境该模型的定义是为了实现语言无关、厂商无关、位置透明以及减少版本问题,从而使得来自不同厂商的、不同语言编写和运行在不同平台上的COM对象能够彼此协调地运行,共同实现某一任务
[3]
2.
1.2COM对象COM提供的是面向对象的组件模型,COM组件提供给客户的是以对象形式封装起来的实体客户程序与COM组件程序进行交互的实体是COM对象,它并不关心组件模块的名称和位置(位置透明性),但必须知道自己在与哪个COM对象交互类似于C++语言中类(Class)的概念,COM对象也包含属性(也称状态)和方法(也称操作),对象的状态反映了对象的存在,也是区别于其它对象的要素;而对象所提供的方法就是对象提供给外界的接口,客户必须通过接口才能获得对象的服务对于COM对象来说,接口是它与外界进行交互的唯一途径,因此,封装特性是COM对象的基本特征COM对象不同于像C++等面向对象语言中对象的概念,COM对象是建立在二进制可执行代码级的基础上,而C++等语言中的对象是建立在源代码级基础上的,因此COM对象是语言无关的,这一特性使用不同编程语言开发组件对象进行成为可能COM对象也具有可重用性,它表现在COM对象的包容和聚合,一个对象可以完全使用另一个对象的所有功能并且COM对象的重用是动态的,即被包容或被聚合对象的版本更新或功能增强后,包容或聚合对象根本不需要重新编译或者重新设置
2.2COM接口——IUnknown接口COM定义的每一个接口都必须从IUnknown继承过来,其原因在于IUnknown接口提供了两个非常重要的特性生存期控制和接口查询客户程序只能通过接口与COM对象进行通信,虽然客户程序可以不管对象内部的实现细节,但它要控制对象的存在与否如果客户还要继续对对象进行操作,则它必须保证对象能一直存在于内存中;如果客户对对象的操作已经完成,以后也不再需要该对象了则它必须及时地把对象释放掉,以提高资源的利用率IUnknown引入了“引用计数”方法,可以有效地控制对象的生存周期IUnknown包含了三个成员函数QueryInterface、AddRef、Release函数QueryInterface用于供客户端查询对象是否支持某个特定的接口,函数AddRef和Release用于完成对象的生存期控制
2.3COM扩展——分布式COM(DCOM)DCOM是COM的扩展,它可以支持不同计算机上组件对象与客户程序之间或者组件对象之间的相互通信,这些计算机可以在局域网内也可以在广域网上,甚至通过Internet进行连接对于客户程序而言,组件程序所处的位置是透明的,我们不必编写任何处理远程调用的代码,因此,DCOM也是COM的无缝扩展由于COM是一项应用广泛、成熟的组件技术,所以我们可以充分利用基于COM的应用、组件、开发工具以及知识,并把它们转移到分布式计算的应用领域中来因为DCOM已经为我们处理了底层网络协议的所有细节,所以我们可把重点放在应用的业务逻辑上,而不必再为底层处理费时费力典型的分布式应用系统是,在各个服务器上运行一些DCOM组件对象,客户程序调用这些组件对象,由它们完成实际的功能操作,比如访问数据库或进行一些复杂的数据处理,客户程序只负责接受用户的输入并把服务器的响应结果反馈给用户3OPC技术介绍
3.1基于COM技术的OPCOPC是以OLE/COM机制作为应用程序的通讯标准OLE/COM是一种客户/服务器模式,具有语言无关性、代码重用性、易于集成性等优点OPC规范了接口函数,不管现场设备以何种形式存在,客户都以统一的方式去访问,从而保证软件对客户的透明性,使得用户完全从低层的开发中脱离出来
[4]微软公司为了提供商业应用程序和特定用途的软件包间的相互连接性,开发了所谓的组件对象模型(ComponentObjectModelCOM)技术COM是一种软件组件间相互数据交换的有效方法COM技术具有以下特长
[5]
1、所谓COM并不是一种计算机语言,而是于运行的机器(只要互相连接),机器的操作系统(只要支持COM),以及软件开发的语言无关,任意的两个软件组件之间都可以相互通信的二进制和网络的标准
2、COM客户程序和COM服务器可以用完全不同的语言开发这样使利用C++,VisualBasic,以及Excel中作为宏使用的应用程序的VisualBasic等不同语言所开发的程序可以相互连接
3、作为COM技术扩展的分布式COM(DistributedComponentObjectModel分布式COM)技术,更可以使COM组件分布在不同的计算机上,并通过网络互相连接并互相交换数据所以对于COM客户程序来说,同样像连接本地计算机上的COM服务器一样,去连接远程计算机上的COM服务器,当然通信的速度不太一样,但是重要的是不必对服务器程序进行修正就可以在网络上自由构成(图
3.1)COM技术的出现使简单地实现控制设备和控制管理系统之间的数据交换提供了技术基础但是如果不提供一个工业标准化的COM接口,各个控制设备厂家开发的COM组件之间的相互连接仍然是不可能的这样的工业标准的提供,乃是OPC的目的所在总而言之,OPC是作为工业标准定义的特殊的COM接口OPC是以提供移植容易并具有可以满足大多数设备厂家要求的灵活性和高水平的机能性为目标而开发的,对于制造厂商和用户来说,分别可以从OPC得到以下的实惠
1、设备开发者可以使设备驱动器开发的单一化成为可能
2、应用程序软件开发者可以使用通用的开发工具不必开发特别的接口,使得图
3.1利用COM和分布式COM达成的组件间的互相连接设备接口的开发更为简单易行
3、用户可以选用各种各样的商业软件包,使得系统构成的成本大为降低同时可以更加容易地实现由不同供应厂商提供的设备所混合构成的工业控制系统随着基于OPC标准的控制组件的推广和普及,不仅使控制系统的增设和组件的置换更加简单,而且使过程数据的访问也变得容易
3.2OPC数据访问规范OPC规范定义了两套接口标准,包括自动化标准AutomationInterfaceStandard和自定义接口标准CustomInterfaceStandard自动化接口是为了向VB之类的脚本语言编写的客户程序提供服务,而自定义接口适用于C和C++应用程序,它比自动化接口更高效,功能更强大(图
3.2)
[6]OPC数据访问规范描述了由OPC服务器实现的OPC/COM对象及相应接口规范指出一个OPC客户程序可以连接到一个或多个由不同厂家提供的OPC服务器程序,而多个OPC客户程序也可以连接到一个OPC服务器程序上,服务器所要访问的设备、数据源、数据名及服务器程序如何进行数据的访问由厂商提供的代码决定其OPC客户与OPC服务器的关系见图
3.3,这是COM中典型的客户/服务器模型
3.3OPC数据访问服务器的对象OPC数据访问服务器在COM基础上建立了符合OPC规范的COM接口和对象
[7]图
3.2OPC服务器与不同类型的OPC客户连接图
3.3OPC客户与OPC服务器的关系OPC逻辑对象模型包括三类对象OPC服务器对象、OPC组对象、OPC项对象,每类对象都包括一系列接口OPC组对象包含在OPC服务器对象中,并由客户端定义和维护,每个服务器可以包含多个组对象OPC组对象可以增加或删除OPC项对象,OPC项对象包含在OPC组对象中,一个组对象可以包含多个项对象,同样由客户端定义和维护OPC客户端与OPC服务器连接并通过接口与OPC服务器通信,OPC服务器对象向OPC客户端提供创建和操作OPC组对象的功能这些组允许OPC客户对它们要访问的数据进行组织一组可以作为一个单元被激活或失活一组也可以提供一种方法允许客户“订阅Subscription”项目列表,以便在数据项变化时它能得到通知每个数据项对象包含一个ID标识即用字符串表示的数据位号、一个数值、一个质量值表示数据的可信度、一个时间标签表示最新数据变动时间对数据项可进行读写操作并可根据需要使其激活或失活数据项不能被OPC客户作为对象进行操作,所有对OPC数据项的操作都是通过组对象来进行的OPC数据访问服务器所定义的三个对象中只有两个标准的COM对象,即OPCServer和OPCGroup对象OPCServer对象是客户端与服务器交互的首要对象客户端访问OPCServer对象的接口函数组织管理OPCGroup对象OPCGroup对象用于组织管理服务器内部的实时数据信息在OPC规范中,使用项对象描述实时数据项对象是非COM对象,也是客户端不可见的对象OPCServer对象功能主要表现为创建和管理OPCGroup对象;管理服务器内部的状态信息;浏览服务器内部地址空间的数据组织结构从OPCServer对象的功能可以看出,OPCServer对象面向OPC服务器的技术细节,基本独立于实时数据源,可以统一实现其中,数据的组织结构和数据源属性与具体数据源有关,需要从用户处获取信息OPCGroup对象的主要功能表现为管理OPCGroup对象的内部状态信息;创建和管理项对象;OPC服务器内部的实时数据存取服务同步与异步方式从OPCGroup对象的功能可以看出,该对象面向OPC服务器中的数据存取信息,对实时数据源依赖性很强,需要从用户数据源处获取信息OPC规范只规定了COM接口的名称和接口向OPC客户程序提供的行为,但没有规定如何去实现它OPC体系结构是客户/服务器模式,OPC服务器组件提供OPC对象接口并管理这些接口
3.4OPC数据访问方法OPC数据传输机制主要有同步访问,异步访问和数据订阅三种方式对于如图
3.4所示的同步访问,OPC服务器把按照OPC应用程序的要求得到的数据访问结果作为方法的参数返回给OPC应用程序,OPC应用程序在结果被返回之前必须处于等待状态图
3.4同步数据访问处理与此相对,如图
3.5所示的异步访问,OPC服务器接到OPC应用程序的要求后,几乎立即将方法返回OPC应用程序随后可以进行其他处理当OPC服务器完成数据访问时,触发OPC应用程序的异步访问完成事件,将数据访问结果传送给OPC应用程序OPC应用程序在VB的事件处理程序中接受从OPC服务器传送来的数据图
3.5异步数据访问处理除了上述的同步和异步数据访问以外,还有如图
3.6所示的并不需要OPC应用程序向OPC服务器要求,就可以自动接到从OPC服务器送来的变化通知的订阅方式数据采集(Subscription)服务器按一定的更新周期(UpdateRate)更新OPC服务器的数据缓冲器的数值时,如果发现数值有变化时,就会以数据变化事件(DataChange)通知OPC图
3.6订阅方式数据采集应用程序如果OPC服务器支持不敏感带(DeadBand),而OPC标签的数据类型是模拟量的情况,只有当前值与前次值的差的绝对值超过一定限度时,才更新缓冲器数据并通知OPC应用程序由此可以无视模拟值的微小变化,从而减轻OPC服务器和OPC应用程序的负荷
3.5OPC服务器对象及其组对象接口
3.
5.1OPC服务器接口图
3.7标准OPC服务器对象OPC服务器对象接口的行为
[8](图
3.7)
1、IUnknown所有COM对象必须实现的最基本接口,包括AddRef,Release和QueryInterface,所有COM对象都必须实现这个接口
2、IOPCCommon此接口被应用于各种类型的服务器,它们共享这个接口设计它提供设置和查询LocaleID(本地语言标识)的功能,对特定的客户/服务器交互有效也就是说,一个客户的行为不会影响其它客户
3、IOPCServer这是OPC服务器对象的主接口,它可完成组对象的动态创建以及对其进行管理服务器对象必须提供此接口AddGroup;创建一个组对象,并返回客户请求的接口指针,其参数反映了组对象创建时的状态这是组对象暴露给客户程序的唯一途径GetGroupByName;通过组名获得一个已有私有组对象的接口指针,从而与之建立连接它主要用于当相应组对象的接口指针都被释放后重新与之建立连接(当然如果此组对象已从内存中删除除外)GetStatus;返回服务器对象当前状态信息,如服务器运行状态,组对象的数目,版本号,厂商信息,以及当前时间和前次数据刷新时间等等客户可对GetStatus方法进行周期性调用来确定服务器是否连接和可用RemoveGroup;删除不再使用的组对象当所有的组对象接口都释放后客户再调用此函数,使相应组对象在内存中彻底删除但它不能用于公共组对象CreateGroupEnumerator;创建一个可列举当前服务器对象内的组对象的枚举器可以列举组对象的名称,也可以列举指向组对象的IUnknown接口的指针枚举器也是一个COM对象,它实现了相应类型枚举接口,如IEnumString和IEnumUnknown接口,OPC服务器对它的实现进行了简化,由相应接口函数来创建它的对象,由客户程序来释放它
4、IConnectionPointContainer服务器对象上的此接口主要提供了相对于IOPCShutdown出接口连接点的访问支持IOPCShutdown出接口用于当服务器主动与客户程序断开连接时对客户程序进行通知OPC
2.0服务器必须支持此接口它的实现与一般连接点对象的实现相同
5、IOPCItemProperties此接口用于浏览与ITEMID(用于标识一个特定的项)相关的属性,也可读取这些属性当前的值之所以设计本接口是因为许多ITEMID与其它像代表工程单位范围或对象描述或报警状态的ITEMID相关联使用此接口可以方便的浏览、定位和读取与特定ITEMID相关的信息,可以在不创建OPC组对象的情况下读取
6、IOPCServerPublicGroups(可选)公共组对象为客户和服务器提供了共享数据的一种机制,可被多个客户程序访问,它可由服务器或客户程序创建当由客户程序创建时,首先创建私有组对象,然后通过MoveToPublic转换成公共组对象一个客户程序可通过CreateGroupEnumerator枚举可用的公共组对象,然后用GetPublicGroupByName连接到公共组对象,再通过IEnumOPCItemAttributes检查组对象的内容,最后通过使用各种IOPCItemMgt函数分配客户句柄和数据类型GetPublicGroupByName;通过公共组对象的名字获取指向组对象的指针,从而连接到公共组对象RemovePublicGroup;删除一个公共组对象
7、IOPCBrowseServerAddressSpace(可选)此接口为OPC客户提供了一个有效访问OPC服务器数据的方式,能够为用户提供相应的ITEMID列表服务器数据的地址空间可以以平面(flat)结构或分层hierarchical结构来实现,此接口使客户从厂商定义的ITEMID的语法中分离出来
8、IPersistFile可选这是一个标准IPersistFile接口的实现此可选接口允许客户装载和存储OPC服务器的‘配置’,但不能存储任何客户定义的信息像组对象和项对象的定义
3.
5.2OPC组对象接口OPC组对象接口的行为如下
[8](图
3.8)
1、IOPCItemMgt此接口的功能是允许客户添加和删除项对象并可控制项对象的行为AddItems;向组对象中添加一个或多个项对象可添加相同的数据项两次,但每一个项对象的ServerHandle(项服务器句柄)唯一ValidateItems;判断数据项能否被合法的添加,不会对组对象造成任何影响图
3.8标准OPC组对象RemoveItems;从组对象中删除项对象从组对象中添加和删除项对象并不影响服务器和物理设备地址空间的数据项,它仅说明了客户是否关心那些数据项SetActiveState;设置项对象的激活标志SetClientHandles;改变项对象的客户句柄一般来讲,客户程序在添加项对象时就设置了客户句柄,在以后不会改变它SetDatatypes;改变项对象要求的数据类型CreateEnumerator;在组对象内创建一个可以列举项对象的枚举器
2、IOPCGroupStateMgt此接口允许客户程序管理组对象的所有状态最基本的是改变组对象的更新率和活动状态GetState;获得组对象的当前属性状态,如更新率,激活状态,组名,时区,死区,语言标识,客户句柄和服务器句柄等SetState;客户可设置组对象不同属性的状态,可改变的属性可从其参数知道SetName;设置私有组对象的名称,名字必须唯一CloneGroup;使用唯一组名建立某一组对象的另一个副本新的组对象为私有的组对象和项对象的几乎所有属性被复制,但新组完全独立于旧的组对象
3、IOPCPublicGroupStateMgt(可选)此接口用于将私有组对象转换成公共组对象,因为当客户创建一个组对象时,被初始化为私有组对象
4、IOPCSyncIO此接口允许客户对服务器执行同步读写操作操作将一直运行到完成才返回Read;同步读取组对象内的项的值、品质和时间邮戳等信息可以从内存(CHCHE)中读取,也可以从设备内直接读取只有组对象和项对象都处于激活状态时,才可从内存内读取数据
5、IOPCAsyncIO2此接口允许客户对服务器执行异步读写操作,操作被‘排队等候’,函数立即返回每项操作被看作一个‘事务’,并被分配一个事务ID当操作完成时,客户IOPCDataCallback接口的回调将执行回调中的信息指出了事务ID和操作结果
6、IConnectionPointContainer数据访问规范
2.0组对象必须实现此接口,与服务器对象的此接口的唯一区别是管理得出接口不一样,组对象管理的出接口是IOPCDataCallback接口,可使客户与服务器连接并进行最有效的数据传送其接口方法的行为只是将服务器对象的IOPCShutdown接口换成IOPCDataCallback接口即可,可参考服务器对象的实现
7、IEnumOPCItemAttributesIEnumOPCItemAttributes接口允许客户找出组对象内的项以及项的相关属性(以项属性结构作为枚举对象),它不是组对象实现的一个接口,只能通过IOPCItemMgt::CreateEnumerator方法创建相应枚举器的实例,不可通过接口查询获得其接口方法与普通枚举接口方法功能相同
8、IOPCAsyncIOold它是数据访问规范
1.0必须实现的接口之一,按照程序兼容规则,符合规范
2.0的服务器也应该实现规范
1.0的必选接口IOPCAsyncIO接口允许客户对服务器执行异步读写操作,其行为与IOPCAsyncIO2类似,可参考IOPCAsyncIO2,只是操作完成后结果是由IAdviseSink的回调返回给客户
9、IDataObjectoldOPC规范
1.0需要服务器实现的接口,这允许使用OPC数据流格式创建客户与组对象之间的Advise连接,用于进行高效的数据交换此接口处理的是流而不是单个的项,所以如下方法可只返回E_NOTIMPL
3.6OPC客户端及其接口
3.
6.1OPC客户端概述OPC标准包括服务器和客户端两部分
[9]OPC服务端的作用是使不同的设备都能够提供标准的符合OPC规范的接口,它一般都是由控制设备的生产厂商提供的OPC客户端一般由应用软件的开发者自己开发,完成与OPC服务器数据交互等工作由于OPC服务端和客户端之间的接口是标准的,所以就可以开发出通用的OPC客户端,使不同的应用程序访问同一台设备或者使同一个应用程序访问不同的设备OPC规范的制定使不同设备之间的交互遵循同样一个标准,因而可以极大地缩短工期和节约资金
3.
6.2OPC客户端的数据来源OPC客户端的数据来源可以分为服务器缓冲区数据OPCCache和设备数据DeviceOPC服务器本身就是一个可执行程序,该程序以设定的速率不断地同物理设备进行数据交互
[10]服务器内有一个数据缓冲区,其中存有最新的数据值、数据质量戳和时间戳时间戳表明服务器最近一次从设备读取数据的时间服务器对设备寄存器的读取是不断进行的,时间戳也在不断更新客户端既可以从服务器缓冲区读取数据,也可以直接从设备读取数据,但是从设备直接读取数据速度会慢一些,一般只用在故障诊断等特殊情况下
3.
6.3OPC客户端接口
1、IOPCDataCallback为支持此连接点,客户必须创建一个既支持IUnknown又支持IOPCDataCall-back的接受器对象客户向服务器IConnectionPoint的Advise方法传递IUnknown接口建立连接,然后服务器调用其QueryInterface方法获得IOPCDataCallback接口指针接口指针可在组对象的数据变化时或IOPCAsyncIO2接口被调用时用到OnDataChange;当组对象的数据改变时和Refresh方法调用时服务器调用此方法通知客户进行数据处理OnReadComplete;当IOPCAsyncIO2接口异步读完成时服务器调用此方法通知客户进行数据处理OnWriteComplete;当IOPCAsyncIO2接口异步写完成时服务器调用此方法通知客户进行数据处理OnCancelComplete;当IOPCAsyncIO2接口异步取消操作完成时服务器调用此方法通知客户进行相关处理
2、IOPCShutdown为支持此连接点,客户必须创建一个既支持IUnknown又支持IOPCShutdown的接受器对象服务器获得IOPCShutdown接口指针的方法IOPCDataCallback出接口相同接口的ShutdownRequest方法在服务器需要切断连接时调用,客户应该用UnAdvise取消所有连接,移除所有组,并释放所有接口当一个客户程序与多个OPC服务器相连时应该保存相对于每个对象的独立的ShutdownRequest回调,这样每个服务器可以独立的切断服务
[11]4OPC技术在冷轧清洗线中的应用
4.1工程背景及工艺
4.
1.1工程背景在冷轧带钢的表面上附着许多轧制油,机油铁末和灰尘等异物,清除附着在带钢表面这些污物是清洗线作业的目的,当清洗不净时,退火后这些污垢成为碳化物残留着,既有损外观,也是后步工序产生事故的原因,特别是进行表面涂、镀层等处理的钢板,产生表面层不均,往往使耐蚀性变坏近来清洗作业为提高生产能力,有高速化,大型化,和自动化的倾向在高速下要达到清洗得干净,这就成为极大的问题,既要有好的清洗方法,又要对带钢进行有效的跟踪跟踪是清洗过程计算机控制的基本功能,只有正确的跟踪才能做到各功能程序的正确启动随着计算机在带钢连续生产线应用的发展,带钢生产线的自动化程度也就越来越高同时,也要求对带钢的带钢跟踪更为精确,要在生产线的全程对带钢进行有效地跟踪为设定计算提供正确的带钢数据以及为人机界面提供数据及画面显示提供操作人员及维护人员正确掌握生产状态这样就需要有在线即时的数据存储器,OPC服务器就包括这种功能,它能全天侯的对现场设备进行即时跟踪,将现场设备的即时数据反映在管理主机上,使工艺调整做出最快、最准确的修正,实现了动态管理
4.
1.2工程工艺冷轧清洗线是冷轧后的工艺流程,它的目的是洗去带钢表面的油污及乳化液冷轧清洗线工艺分为五部分上料段、入口段、工艺段、出口段、卸料段冷轧清洗线工艺流程如图
4.1上料段入口小车将钢卷从1#或2#鞍座位送到开卷机上的过程,在此过程中开卷机上的一些辅助设备配合进行相应的动作;然后开卷机与磁力皮带反转90度,将带头甩至钢卷上方以便穿带入口段从开卷到挖边以及到1#导向夹送辊的过程首先穿带;接着入口剪切头;然后焊接;最后挖边,通过挖边机挖一个圆角,以利于带钢顺利通过图
4.1冷轧清洗线工艺流程图工艺段从碱洗槽入口压辊到2#导向夹送辊整个清洗的过程首先经过碱洗槽;接着经过电解槽,然后经过热水刷洗;最后进入漂洗槽漂洗、挤干机挤干、再由烘干机烘干出口段从3#导向夹送辊到卷曲的过程卸料段出口小车将钢卷从卷取机运到1#或2#鞍座位的过程卸卷小车把卷取机上的卷先运至打捆位,由门型吊车把卷运走入库而此时,卷取机进行下一卷的卷曲准备,出口的辅助设备进行相应的动作准备
4.2OPC服务器与现场设备的连接OPC服务器与现场设备的连接就是OPC服务器与PLC的连接,在软件S7-400中建立2级组态软件LEVEL2,在LEVEL2下建立OPCServer,这样PLC就与OPC服务器建立了连接(图
4.2)图
4.2S7-400中LEVEL2下的OPCServer
4.3OPC服务器与客户端的连接图
4.3OPC服务器与现场设备和客户端的连接OPC服务器客户端程序的设计思路是先实现服务器对象类,组对象类,项对象类服务器对象中可添加组对象,组对象中可添加项对象项对象中添加所要设定和测量的值,将所添加的参数封装在项对象类中只有从项对象中才能获得参数的值,客户先访问在OPC服务器对象中建立的组对象的IUnknown接口;再通过IUnknown接口连接组对象;最后通过组对象来连接项对象,每个项对象都有一个句柄即项对象的标识,查找项对象的句柄,连接句柄,与项对象建立连接通过这种方法客户从OPC服务器中获得数据接着实现Level1类,Level1类即是二级控制系统,客户端的所有操作都通过调用Level1类中的成员函数来实现然后实现现场设备类Machine类,它是以Level1类的指针lv1为指针建立的类,成员函数update的功能是刷新项对象中的参数值,每隔一段时间访问现场设备,将测量值刷新,返回给Level1这样实现了OPC服务器与客户端的连接OPC服务器客户端程序中重要的类有classCOPCServer,classCOPCGroup,classOPCItem,classLevel1下面介绍这个4个重要类,具体实现看附录C,DclassCOPCServer{IOPCServer*opc;//封装指向IOPCServer的指针public:staticvoidInitialize;//初始化COM库staticCOPCServerCreateOPCServer_bstr_tconstserverNameCLSIDconstclsid;//以服务器的名字创建Server对象COPCGroupAddGroupDWORDdwUpdateRate;//添加组对象OPCServerStatusGetStatus;//得到Server的信息,如启动时间,上一次更新时间,组个数};classCOPCGroup{OPCHANDLEhServer;//OPC句柄hServerIUnknown*pSink;//指向IUnknown接口的指针IConnectionPointContainer*pCPC;//封装指向IConnectionPointContainer的指针IConnectionPoint*pCP;//封装指向IConnectionPoint的指针public:voidConnectIUnknown*pSink;//与IUnknown接口连接,即将组对象与OPC服务器相连接{this-pSink=pSink;HRESULThr=S_OK;hr=group-QueryInterfaceIID_IConnectionPointContainervoid**pCPC;//查询指向IConnectionPointContainer的指针pCPChr=pCPC-FindConnectionPointIID_IOPCDataCallbackpCP;//寻找连接点,返回指向IOPCDataCallback的指针pCPhr=pCP-AdvisepSink;//建立连接,返回给IUnknown接口指针pSink}};classOPCItem{struct_Data//定义一个结构体_Data,其中包含Item名,客户名,服务器名,变量{WCHARwszName
[50];VARTYPEvt;DWORDhClient;DWORDhServer;VARIANTvar;unsignedlongrefCount;}public:getNameconst{returnd_item-wszName;}//获得Item名,返回指向wszName的指针voidsetValueconstVARIANTvar//将设定值var给itemvoidgetValueVARIANTval//从item中得到测量值val};ClassLevel1是客户端程序中最重要的类,是整个OPC服务器客户端程序运行中的主要部分classLevel1{COPCServeropc;COPCGroupgroup;CSimpleMapintOPCItemitems;Observer*d_observer;public:Level1;~Level1;voidread;voidattachObserver*obs;voiddetachObserver*obs;voidnotify;boolisRunning;boolconnect;OPCItemgetItem;voidaddToUpdateList;voidupdate;};类Level1中私有成员有OPCServer类型的变量COPCServeropc,OPCGroup类型的变量COPCGroupgroup,OPCItem类型的变量CSimpleMapintOPCItemitems和Observer类型的变量的指针Observer*d_observer公共成员主要介绍OPC运行程序中用到的构造函数Level1和成员函数read,connect构造函数Level1是向CSimpleMapintOPCItemitems添加所要测量和设定的值,即冷轧清洗线二级控制系统所要设定和测量的一级控制系统中参数其中有COIL_ID钢卷号;STEEL_GRADE钢卷种类;LENGTH钢卷长度;WIDTH钢卷宽度;THICKNESS钢卷厚度;WEIGHT钢卷重量;DIA_INNER钢卷内径;DIA_OUTER钢卷外径;ENT_TENSION入口张力;EXT_TENSION出口张力;ENT_LEV_HEIGHT入口矫直辊高度;ENT_CUT_TAIL_LENGTH入口切尾长度;ENT_FRONT_END_CUT_NUM入口切段段数;ENT_FRONT_END_CUT_LEN入口切段长度;EXT_SAMPLE_LENGTH出口采样长度;ENT_FRONT_END_CUT_MODE入口切段模式;ENT_CUT_TAIL_MODE入口切尾模式;ENT_NOTCH_MODE入口切边模式;Level1::connectconstchar*serverName{opc=COPCServer::CreateOPCServerserverNameIID_IOPCServerSimaticNet;group=opc.AddGroup100;OPCItemMgtAddItemsadditemsitems.GetSize;forinti=0;iitems.GetSize;i++additems.addItemiitems.GetValueAti;HRESULThr=additemsgroup.GetOPCItemMgt;group.Connectthis;returntrue;};成员函数connect先在主机上初始化一个OPCServer,接着添加group对象,然后调用group中的Connect,group.Connect将指针与IUnknown接口连接,这样OPC服务器与客户端就建立了连接voidLevel1::read{COPCSyncIO_Readreaditems.GetSize;fori=0;iitems.GetSize;i++items.GetValueAti.setValueread.getValuei.vDataValue;};成员函数read是用同步读得到在CSimpleMapintOPCItemitems中添加的变量,然后将从OPCServer读到的数据赋给item
4.4OPC服务器客户端程序的主线程OPC服务器客户端程序是一个单线程的应用程序,它的运行在客户端可以查看到一级控制系统的各个参数的信息,也可以及时的修改设定值主线程的主要进程如下初始化COM库//CoInitializeNULL与数据库建立连接//dba.connectecluserecluserecldb初始化Level1类//Level1*lv1=newLevel1与OPC服务器建立连接//lv1-connectecl-l2-server从OPC服务器读取数据//lv1-read初始化Machine类//Machine*machine=newMachine*lv1设置定时器时间,时间间隔为1000毫秒//SetTimerNULL100010000初始化系统消息,作为客户从服务器得到的消息//MSGmsg系统开始运行,是个死循环,每隔1000毫秒刷新一次从OPC服务器中读到的数据//whileGetMessagemsg000{}全程序看附录E总结OPC技术是一个新兴的工业控制领域的标准,到目前为止,国内外已经有多家大型的工业控制软件商推出支持该标准的产品我国各大工业控制软件商也在各自的产品中应用该技术OPC在硬件生产者和软件开发者之间建立了联系硬件开发商只需提供设备的OPC服务器OPC服务器封装了对设备复杂的数据访问软件开发者只需知道OPC服务器的接口就可以开发访问和使用工厂数据的应用程序本文对OPC技术进行了比较全面的研究,并同时剖析了COM/DCOM技术,接着对OPC数据访问规范进行了深入的分析,然后较全面的介绍了OPC服务器对象及其组对象接口和OPC客户端及其接口,最后介绍了OPC技术在冷轧清洗线中的应用,冷轧清洗线OPC服务器与现场设备和客户端的连接,重点讲解了OPC服务器与客户端的连接程序OPC技术以其巨大的优势越来越受到工控领域广大厂商与用户的青睐,在未来的发展中,OPC技术肯定要取代传统的驱动程序技术,这是不可阻挡的,未来的工控领域的产品会越来越多的应用OPC技术OPC技术不仅能应用于应用程序与现场设备之间,而且还应该把它作为一种Windows应用程序相互交换数据的通用规范随着控制领域技术的飞速发展,控制软件和硬件设备的种类越来越多,更新周期也越来越短,自控设备之间的信息共享迫切需要一个统一的接口标准OPC技术正是适应工业控制向着开放系统发展的产物它作为一项崭新的开放式数据交换技术给工业控制软硬件的发展带来了巨大的影响,给自控设备制造业的产品开发带来了新的机遇和挑战OPC技术正处于不断发展的阶段,它具有强大的应用潜力,已经在许多领域取得了成功它为构建开放的自动化系统提供了有效的解决方案和工具,促进了工控系统朝着开放的方向发展但OPC基金会所定义的OPC规范缺乏对OPCServer的统一管理所以OPC技术将会在OPCServer的统一管理等方面做出改进OPC也将融合更多的新技术,应用领域也将会进一步扩大,也会有更加光明的前景致谢在此论文完成之际,我要由衷地感谢我的指导老师戴立红戴老师的严谨细致的工作作风和灵活求实的研究方法使我受益颇深正是在戴老师的指导和帮助下,论文才得以顺利完成在此,谨向戴老师表示深深的敬意和诚挚的感激我还要特别感谢本校在读研究生张力,为我提供冷轧清洗线OPC服务器客户端的运行程序,在此深表感谢感谢在写论文期间给予我的帮助,他严谨的学习态度值得我永远学习感谢百忙之中审阅本文的各位老师!参考文献
[1]ReneePale.OPC——thestandardforrealtimecommunication[Z].1995
[2]OPC(中国)促进委员会.OPC应用程序入门[M].2002
[3]潘爱民.COM原理与应用[M].北京清华大学出版社1999
[4]张烈平,吴名欢,周德俭.基于COM的OPC技术及其应用程序的开发[R].桂林桂林工学院电子与计算机系,2004
[5]顾键,王京春,黄德先.OPC——COM技术在工业自动化软件中的应用[R].北京清华大学自动化系,2001
[6]刘杉.OPC数据访问标准[D].上海同济大学电气工程系,2003
[7]李晓虹.OPC技术及实时数据平台软件的研究与开发[D].北京中国科学院自动化研究所,2001
[8]OPCCommonDefinitionsandInterfacesVersion
1.0[Z].OPCFoundation,1998
[9]李鹏.OPC数据访问客户端开发库的研究与实现[D].北京华北电力大学,2004
[10]刘庚.OPC及在工业控制中的应用研究[D].南京河海大学,2005
[11]OPCDataAccessCustomInterfaceSpecification
2.05A[Z].OPCFoundation.2002附录A(OPC——thestandardforrealtimecommunication)
1.InitialPositioninmanyEnterprisesInmoreandmoreenterprisesthereisagrowingfocusonminimizinggeneralcostsaswellasmaximizingproductqualityandoptimizingproductivity.Clearlyoptimizingtheallsystemsdealingwithautomationwithinacompanyfromtheenterprisemanagementlevelthroughtheprocesssupervisionlevelrightdowntothecontrolequipmentontheplantfloorwillhaveadirectandpositiveinfluenceonthecompanyoperations.Thesoftwareusedincompanyadministrationandthatusedinprocessautomationaremovingcloserandclosertoeachother.ThisdevelopmentislargelyduetothewidespreadandgrowinguseofWindowsNTasthesingleoperatingsysteminmanyorganizations.Windowsapplicationsaresowidelyusedtodayespeciallyintheadministrativeenvironmentthatitwouldbehardtoimaginerunningabusinesswithoutthem.Thenextlevelweareaimingatisthestandardizationofcommunicationbetweenthedifferentlevelsinacompany.WiththefastdevelopmentsinbothPChardwareandsoftwaretechnologypowerfulandintegratedsystemssuchasMicrosoftwithWindowsNTandlntellutionwithFIXandVisualBatchareavailablethatearlierwereonlypossiblewithhighinvestments.Earliersystemsalsohadthedisadvantageoffrequentlyofferingonlyislandsolutions.Thegreatestamountofeffortandthereforecostsinvolvedwithimplementingautomationsystemshasbeenrelatedtosolvingtheproblemofinterfacesbetweendifferenttypesofequipmenthardwareandsoftware.Thehistoricalproblemhasalwaysbeenthatthedataofdifferentsystemsallhavedifferentformatsandcommunicationprotocols.ThisisveryimportantwhenforexampledrivesareconnectedtoaPC-basedSCADAsystem.SoftwarevendorssuchasIntellutionwiththeirprocessmonitoringcontrolanddatamanagementsystemtheFIXwererequiredtodevelopanindividualI/Odriverforeachprotocol.ThisI/OdriverwouldthenallowfortheconnectionoftheSCADAsoftwaretoeachofthedifferentfieldI/OdevicesPLCsI/Osystemscontrollers.Clearlythedevelopmentbysoftwarevendorsofuniquedriversforeachdifferenttypeofplantfloorcontrolequipmentisnotonlytimeconsumingandinefficientbutalsoinherentlyaddsadditionalriskstothesuccessfulandtimelycompletionofaproject.ItisforthesereasonsthatfivecompanieswithMicrosoftdecidedtoworktogethertoremovethesecommunicationbarriers.
2.WhatisOPCOLEforProcessControlInco-operationwithMicrosoftanOPCTaskforceconsistingof5companiesIntellutionOpto-22Fisher-RosemountRockwellSoftwareandlntuitiveSoftwarewasfoundedinMay
1995.ThecommitteesaimwastofullydefineinterfacesthatarebasedontheOLE/COMstandardOLE=ObjectLinkingEmbeddingCOM=CommonObjectModelwithMicrosoft.Thefirstdraftofthespecificationwascompletedbytheendof
1995.Thankstothecollaborationof90companiesworld-widewhichcheckedthisdaftspecificationthefirstreleaseofthespecificationwascompletedinAugust
1996.ThegoaloftheOPCcommitteeistoprovideastandardapplicationprogramminginterfacefordataexchangethatcansimplifyI/Odriverdevelopmentandimproveoperatorinterfacesystemperformance.AnypeoplestillrememberinstallinghowdifficultandtimeconsumingitcouldbetoinstallaprinteronaDOSbasedsystem.TodayPlugandPlaywithWindows95andWindowsNTmakestheentireprocessalmosteffortless.PlugandPlaymeansthatallcardsinsidethePCordevicesconnectedtothePCareautomaticallyrecognizedbytheoperatingsystem.Theuserveryoftensimplyhastoconfirmthecomputerchoicesorselectanoptionfromapick-list.TheaimwithOPCistoachievethesamekindofease-of-usewiththeconnectionofprocesscontrolequipmenttoaPC-basedprocessmonitoringorcontrolsystem.Intheexampleofimage
1.1WithoutOPCitisclearthatinthisscenariotheapplicationsXYandZmustcommunicatewithfourdifferenttypesofprocesscontrolequipment.Thatcallsforusing12differentI/Odrivers.WithOPCeveryparticipantcancommunicateusingastandardinterface.Manymanufacturersofhardwareandsoftwarehavealreadyannouncedtheirintentiontoreleaseproductsthatfollowthisstandard.ThefollowingcommentsaretoexplainwhyandhowOPCsimplifiestheinterface-problemanddecreasesthecostsandtimeofautomationprojects.OLE/COMstandsforMicrosoftsobjecttechnologythataimsatintegratingapplicationswithagreatdealofcompatibilitybetweenthevariousapplications.ForexampleaCABdrawingcanbeintegratedintoaWorddocumentoranExceltable.Evenapplicationsthatareprogrammedindifferentlanguagescanbeintegrated.OLEisbasedonthebinarystandardandcommunicationbetweendifferentOLEcomponentsispossible.TheimportanceoftheOLE/COMintegrationforautomationsolutionswasrealizedbythesoftwareproviders.OPCisacommunicationstandardthatisbasedonOLEanditwillallowformoreefficientandeasiercommunicationbetweenthedifferentautomationlevels.UsingtheOLEtechnologydescribedaboveOPCdefinesmethodsandobjectstoachievecommunicationbetweenthedifferentsoftwareapplicationsnomatteriftheseexistonaPCintheprocessmanagementenvironmentorontheprocesscontrolequipment.TheexpansionofOLEfunctionalitysmakessoftwaresystemsseemmoreandmorelikemodulesorcomponents.ThismakestheinformationaccessibletoallconnectedOLEclientsseeimage
1.
1.
3.StandardInterfaceManymanufacturersofDCSsystemsPLCsandcontrollershavealreadytestedtheOPCspecificationsandwillshortlybegintoshipOPCinterfaceswiththeirhardware.Thisdevelopmentallowstheusertodecidefreelywhichhardwarecomponentisbestsuitedtoaparticularapplication.ThereisnolongerandneedforlongdiscussionsorI/Odriverdevelopment.HardwaremanufacturersofDCS’sPLC’sandcontrollerswillbenefitfromthereduceddevelopmentexpenses.Eachhardwareorsoftwaremanufactureronlyhastosupportoneinterface.Therewillnolongerbeadriverrequiredforeachhardwaresystemreleasedbyvariousmanufacturers.AproductconformingtotheOPCstandardwillbeabletocommunicatewithanyotherOPCcompliantproduct.OPCexpandsOLEbyincludingstructuredefinitionsinterfacesandtechniquesforamoreefficientdatatransfer.OPCusesalltheadvantagesofOLEbutadaptsittotherequirementsoftheprocesscontrolindustry
4.MicrosoftSQLServerandVisualBatchThetraditionalapproachtosoftwaredevelopmentwastointegrateasmuchfunctionalityaspossibleintoonesoftwareapplication.Whilethismayhaveresultedinpowerfulsoftwareproductstherewereofteninherentproblemsduetothembeingclumsyanddifficulttouseapplications.Fortheuserworkingwithandunderstandingthesoftwarebecamemoreandmorecomplicatedeventhoughmanymanufacturerstrytostressease-of-useasanimportantrequirementinsoftwareproducts.Modernsystemsallowtheusertocomposehisapplicationbyusingthemodularityofferedbydifferenthardwareandsoftwareproducts.ThisapproachwithoutastandardsuchasOPCcouldleadtoeventualinterfaceproblems.HoweverwithOPCitispossiblefortheusereasilytointegrateavarietyofapplications.SoftwareprogramsthatconformtothestandardcanalsobecombinedwithMicrosoftOfficeandBackOfficeproducts.Thismeansthatdataexchangebetweenprogramsinthefuturewillbemucheasiertoachieve.FortheuserofsoftwareapplicationsPlugandPlaybecomesreality.Withthesemechanismsdatacanbeexchangedbetweenapplicationsfromproductionlevelprocesscontrollevelmanagementinformationsystemsandorderadministrationsystemsinaneasytouseyetefficientway.Whenconsideringissuesofsecuritysupportandservicetherearemanyreasonsforanintegratedapplicationsuite.AnexcellentexampleofthisgrowingtendencyisthefactthatIntellution’snewVisualBatchproductwillbesuppliedfullybundledwithMicrosoft’sSQLserversoftware.ThisbundlingofapplicationsclearlyshowsnotonlythemoveinthisenvironmenttowardsprovideacompletesolutiontocustomersbutalsoshowsthestrengthofMicrosoftinthisenvironment.MicrosoftSQLserverisfastbecomingthestandardplatformofplantdatasystemsinmuchthesamewayasWindowsNThasbecometheoperatingsystemifchoiceinthisenvironment.附录B(OPC——实时通信标准)
1.许多企业的最初情况在越来越多的企业中不断地把焦点集中在减少总体费用并且增加产品质量和最优生产力明显地,在一个企业中,从企业管理层到过程监督层再到现场控制层,选择合适的系统处理自动化,对企业的运作有直接和积极的影响公司管理用的软件和自动化过程用的软件彼此越来越接近这种发展趋势主要归结于在许多组织中把视窗NT作为唯一操作系统并且广泛的使用当今窗口应用被广泛地使用特别是在管理层里很难想象没有他们业务怎么运作我们瞄准的下个目标就是使公司不同层的通信标准化随着个人计算机硬件和软件技术的快速发展强有力的集成系统譬如微软的视窗NT和lntellution只可能以高额投资才可得到的早期的系统也有频繁地提供唯一海岛解答的缺点巨大的努力和金钱花费在解决不同类型设备的硬件和软件间接口的问题上不同的系统数据全部有不同的格式和通信协议,这个问题一直存在这非常重要例如当驱动被连接到基于SCADA的个人计算机系统上,软件商譬如Intellution他们的过程控制器和数据管理器和FIX,就要为每个控制器开发各自的I/O驱动器然后这个I/O驱动会允许SCADA软件与每个不同领域的I/O设备PLCI/O系统控制器相连接很明显,为每个不同类型的现场设备开发一个驱动不仅费时费力而且增加及时地,成功地完成项目的风险基于这些原因五个公司与微软决定共同解决这个通信障碍
2.什么是OPC(用于过程控制的OLE)由5家公司IntellutionOpto-22Fisher-RosemountRockwell软件公司和lntuitive软件公司组成的与微软合作的OPC先驱,在1995年5月成立委员会的目标就是依据微软的OLE/COM标准OLE=对象的连接与嵌入COM=组件对象制定接口初草案在1995年年底完成由于全世界90个公司的合作检查了初稿规范在1996年8月被完成OPC委员会的目标就是提供一个专为I/O数据交换的应用编程接口,这能加快驱动的发展和提高接口系统性能许多人仍然记得在基于DOS的系统上安装打印机是多么困难和费时今天在视窗95和视窗NT下的即插即用功能使整个过程几乎不费力即插即用意味着所有个人计算机或与个人计算机连接的设备中的信息能被操作系统自动识别用户必须非常经常简单地证实计算机选择或选择采摘名单OPC的目的就是完成同样易于程序控制设备与一个基于个人计算机的程序控制或控制系统连接的使用如图
1.1的例子“没有OPC”XY和Z的应用必须联络四个不同类型程序控制设备那要求使用12个不同的I/O驱动器“有OPC”每部分都使用一个标准接口硬件和软件的许多制造者已经宣布他们产品跟随这个标准以下评论将解释OPC为什么和怎么简化接口问题和减少自动化项目的费用和时间OLE/COM代表微软的对象技术,目标是将各种各样的应用集成兼容性的应用例如小室图画可能被并入词文档或表格中甚至用不同的语言编程的应用也能被合并OLE是基于二进制标准并且可以在不同的OLE组件之间通信用OLE/COM综合化来解决自动化的重要性由软件提供者意识到OPC是基于OLE的通信标准而且它使在不同的自动化水平之间的通信更高效和更容易使用在上面被描述的OLE技术OPC的定义方法和对象可以在不同的软件应用之间达到通信无论这些在一台个人计算机进程管理环境里或在过程控制设备里OLE功能的扩展使软件系统似乎越来越像模块或组件这使信息能被所有连接到OLE的客户得到参见图
1.
13.标准接口许多生产DCS系统PLC和控制器的制造商已经使用OPC规范很快开始出售使用OPC接口的硬件这种发展允许用户自由地决定对一个特别的应用哪个硬件组件是最佳的不再需要长时间的讨论或需要I/O驱动器的发展DCS,PLC和控制器的硬件制造商将从减少的开发费用中受益每个硬件或软件制造商只须支持一个接口每个制造商生产的硬件系统不再需要驱动器一个符合OPC标准产品能与其他服从OPC的产品通信OPC是OLE的扩展,包括结构定义更高效的数据传送的接口和技术OPC继承了OLE所有的优点并且满足了过程控制产业的要求4.微软的SQL服务器和可视化Batch软件开发的传统方法是将尽可能多的功能集成到一个应用软件中当这导致了强有力的软件产品使用笨拙困难的问题就经常发生了为了用户,即使许多制造商设法注重为软件产品,制造更易于使用的硬件,但用户还是很难理解和应用越来越复杂化的软件现代系统允许用户使用由不同的硬件和软件产品提供模块化来组成他的应用这种方法如果没有OPC标准就导致了接口的问题然而有了OPC用户更容易地使用为集成各种各样的应用依照标准的软件程序可能与微软办公系统相结合这意味着在未来,数据交换在程序之间更加容易达到对于软件应用的用户即插机用成为现实以这些机制不同应用的数据在生产层过程控制层管理信息系统层和指令管理系统层间更容易高效的交换集成应用系统的原因就是考虑了安全,支持,服务的问题这个增长倾向的优秀例子是Intellution新的VisualBatch产品,包含了微软的SQL服务器软件这种应用不仅清楚地显示了在这个环境里提供一种为用户完全解答的方向而且显示微软在这个环境里的能力微软SQL服务器是快速成为现场设备数据系统的标准平台,以同样的方式在这种环境中,就选择视窗NT成为操作系统附录CclassCOPCServer{IOPCServer*opc;public:staticvoidInitialize{HRESULThr;hr=::CoInitializeExNULLCOINIT_MULTITHREADED;//setupCOMlibifFAILEDhr_com_errorhrNULL;//bypassDCOMSecurityhr=::CoInitializeSecurityNULL-1NULLNULLRPC_C_AUTHN_LEVEL_NONERPC_C_IMP_LEVEL_IDENTIFYNULLEOAC_NONENULL;ifFAILEDhrthrowCOPCExceptionhr;}staticCOPCServerCreateOPCServer_bstr_tconstserverNameCLSIDconstclsid{//browseregistryforOPC
1.0AServersHKEYhk=HKEY_CLASSES_ROOT;COSERVERINFOsin*sinptr;MULTI_QImqi;sinptr=sin;sin.dwReserved1=0;sin.dwReserved2=0;sin.pwszName=serverName;sin.pAuthInfo=0;mqi.pIID=IID_IUnknown;mqi.hr=0;mqi.pItf=0;//CreatearunningobjectfromthatclassID//CLSCTX_ALLwillallowin-proclocalandremoteHRESULThr=CoCreateInstanceExclsidNULLCLSCTX_REMOTE_SERVERsinptr1mqi;ifFAILEDhr||FAILEDmqi.hr{throwCOPCExceptionhr;}IOPCServer*pIOpc=0;hr=mqi.pItf-QueryInterface__uuidofIOPCServervoid**pIOpc;ifFAILEDhr||pIOpc==NULL{throwCOPCExceptionhr;}returnpIOpc;}staticCOPCServerCreateOPCServer_bstr_tconstserverName_bstr_tconstprogId{CLSIDclsid;HRESULThr=::CLSIDFromProgIDprogIdclsid;ifFAILEDhrthrow_com_errorhr;returnCreateOPCServerserverNameclsid;}private:COPCServerIOPCServer*opc{this-opc=opc;}COPCServerCOPCServers;public:COPCServer:opc0{}~COPCServer{ifopcopc-Release;}COPCServeroperator=COPCServerrhs{ifrhs==thisreturn*this;ifopc{HRESULThr=opc-Release;}opc=rhs.opc;rhs.opc=0;return*this;}COPCGroupAddGroupDWORDdwUpdateRate{floatfTemp=
0.0f;longlTimeBias=0;DWORDdwRevisedUpdateRate=0;HRESULThr;OPCHANDLEhClientGroup;IUnknown*group;//createanin-activegroup//NOTE:1stparammustnotbeaNULLortheproxywillpukehr=opc-AddGroupL//[in]ServernameifNULLOPCServerwillgenerateauniquenameTRUE//[in]StateofgrouptoadddwUpdateRate//[in]Requestedupdaterateforgroupms1234//[in]ClienthandletoOPCGrouplTimeBias//[in]TimefTemp//[in]PercentDeadband0//[in]LocalizationIDhClientGroup//[out]ServerHandletogroupdwRevisedUpdateRate//[out]RevisedupdaterateIID_IUnknown//[in]Typeofinterfacedesiredgroup;//[out]wheretostoretheinterfacepointerifFAILEDhrthrowCOPCExceptionhr;ifdwRevisedUpdateRate!=dwUpdateRatedwUpdateRate=dwRevisedUpdateRate;returngroup;}OPCServerStatusGetStatus{OPCSERVERSTATUS*result=NULL;HRESULThr=opc-GetStatusresult;ifFAILEDhrthrowCOPCExceptionhr;returnresult;}voidRelease{ifopc{opc-Release;}}};classCOPCGroup{OPCHANDLEhServer;IUnknown*group;IUnknown*pSink;IConnectionPointContainer*pCPC;IConnectionPoint*pCP;DWORDdwCookie;public:COPCGroup:groupNULL{}COPCGroupIUnknown*pUnk:grouppUnk{}~COPCGroup{ifgroupgroup-Release;}COPCGroupCOPCGroups{group=s.group;s.group=NULL;}COPCGroupoperator=COPCGrouprhs{ifthis==rhsreturn*this;ifgroupgroup-Release;group=rhs.group;rhs.group=NULL;return*this;}COPCItemMgtGetOPCItemMgt{IOPCItemMgt*mgt=NULL;ifgroup==0throwCOPCExceptionE_POINTER;HRESULThr=group-QueryInterfaceIID_IOPCItemMgtvoid**mgt;ifFAILEDhrthrowCOPCExceptionhr;returnmgt;}COPCSyncIOGetOPCSyncIO{IOPCSyncIO*pIO;HRESULThr=group-QueryInterfaceIID_IOPCSyncIOvoid**pIO;ifFAILEDhrthrowCOPCExceptionhr;returnpIO;}COPCAsyncIO2GetOPCAsyncIO2{IOPCAsyncIO2*pIO2;HRESULThr=group-QueryInterfaceIID_IOPCAsyncIO2void**pIO2;ifFAILEDhrthrowCOPCExceptionhr;returnpIO2;}voidConnectIUnknown*pSink{this-pSink=pSink;HRESULThr=S_OK;//obtainconnectionpointshr=group-QueryInterfaceIID_IConnectionPointContainervoid**pCPC;ifFAILEDhrthrowCOPCExceptionhr;hr=pCPC-FindConnectionPointIID_IOPCDataCallbackpCP;ifFAILEDhrthrowCOPCExceptionhr;hr=pCP-AdvisepSinkdwCookie;ifFAILEDhrthrowCOPCExceptionhr;}voidDisconnect{ifpCP{HRESULThr=pCP-UnadvisedwCookie;ifFAILEDhr{}pCP-Release;pCPC-Release;}}};classOPCItem{struct_Data{WCHARwszName
[50];VARTYPEvt;DWORDhClient;DWORDhServer;VARIANTvar;unsignedlongrefCount;_Data{}_Dataconst_bstr_ttintvtTypeinthandle:refCount1{wcscpywszNamet;vt=vtType;hClient=handle;hServer=0;var.vt=vtType;ifvtType==VT_BSTR{var.bstrVal=SysAllocStringLenNULL256;}}};_Data*d_item;public:OPCItem:d_itemNULL{}OPCItemconstwchar_t*nameintvtTypeinthandle:d_itemnew_DatanamevtTypehandle{}OPCItemconstOPCItems{ATLASSERTs.d_item!=NULL;d_item=s.d_item;d_item-refCount++;}~OPCItem{ifd_item{if--d_item-refCount==0deleted_item;}}OPCItemoperator=constOPCItemrhs{ATLASSERTrhs.d_item!=NULL;ifrhs==thisreturn*this;ifd_item{if--d_item-refCount==0deleted_item;}d_item=rhs.d_item;d_item-refCount++;return*this;}WCHAR*getNameconst{returnd_item-wszName;}OPCHANDLEgetClientHandleconst{returnd_item-hClient;}constintgetVariantTypeconst{returnd_item-vt;}OPCHANDLEgetServerHandleconst{returnd_item-hServer;}voidsetServerHandleOPCHANDLEhServer{d_item-hServer=hServer;}booloperator==constWCHAR*name{returnwcscmpd_item-wszNamename==0true:false;}//accessmethodvoidgetValueVARIANTval{VariantCopyvald_item-var;}longgetLong{returnd_item-var.intVal;}floatgetFloat{returnd_item-var.fltVal;}doublegetDouble{returnd_item-var.dblVal;}boolgetBoolean{returnd_item-var.intVal!=0;}unsignedshort*getString{returnd_item-var.bstrVal;}OPCStringgetOPCString{returnOPCStringd_item-var.bstrVal;}voidsetValueconstVARIANTvar{ifd_item-var.vt==VT_BSTR{setStringvar.bstrVal;}elsed_item-var=var;}voidsetDoubledoubleval{d_item-var.dblVal=val;}voidsetFloatfloatval{d_item-var.fltVal=val;}voidsetLonglongval{d_item-var.lVal=val;}voidsetBooleanboolval{d_item-var=_variant_tval;}voidsetStringconstunsignedshort*s{forinti=0;i255s[i]!=0;i++d_item-var.bstrVal[i]=s[i];d_item-var.bstrVal[i]=0;}voidsetStringconstchar*s{forinti=0;i255s[i]!=0;i++d_item-var.bstrVal[i]=s[i];d_item-var.bstrVal[i]=0;}};附录D//level
1.cpp:implementationofthelevel1class.#includestdafx.h#includeopcwrap.h#includeobserver.h#includeopcda_i.c#includevector#includeLevel
1.h#includeiostream.h#includelog.hexternDebugdeb;Level1::Level1{_updateList.reserve20;inti=0;items.AddiOPCItemLCOIL_SETUP.COIL_IDVT_BSTRi++;//items.AddiOPCItemLCOIL_SETUP.COIL_ID_SONVT_BSTRi++;items.AddiOPCItemLCOIL_SETUP.STEEL_GRADEVT_BSTRi++;//items.AddiOPCItemLCOIL_SETUP.SYS_DATEVT_BOOLi++;items.AddiOPCItemLCOIL_SETUP.LENGTHVT_R4i++;items.AddiOPCItemLCOIL_SETUP.WIDTHVT_R4i++;items.AddiOPCItemLCOIL_SETUP.THICKNESSVT_R4i++;items.AddiOPCItemLCOIL_SETUP.WEIGHTVT_R4i++;items.AddiOPCItemLCOIL_SETUP.DIA_INNERVT_R4i++;items.AddiOPCItemLCOIL_SETUP.DIA_OUTERVT_R4i++;items.AddiOPCItemLCOIL_SETUP.MAX_SPEEDVT_R4i++;items.AddiOPCItemLCOIL_SETUP.ENT_UNIT_TENSIONVT_R4i++;items.AddiOPCItemLCOIL_SETUP.EXT_UNIT_TENSIONVT_R4i++;items.AddiOPCItemLCOIL_SETUP.ENT_TENSIONVT_R4i++;items.AddiOPCItemLCOIL_SETUP.EXT_TENSIONVT_R4i++;items.AddiOPCItemLCOIL_SETUP.ENT_LEV_HEIGHTVT_R4i++;items.AddiOPCItemLCOIL_SETUP.ENT_MGC_CONV_TIMEVT_I4i++;items.AddiOPCItemLCOIL_SETUP.ENT_MGC_TALBE_TIMEVT_I4i++;items.AddiOPCItemLCOIL_SETUP.ENT_CUT_TAIL_LENGTHVT_R4i++;items.AddiOPCItemLCOIL_SETUP.ENT_FRONT_END_CUT_NUMVT_I2i++;items.AddiOPCItemLCOIL_SETUP.ENT_FRONT_END_CUT_LENVT_R4i++;items.AddiOPCItemLCOIL_SETUP.EXT_CROP_NUMVT_I2i++;items.AddiOPCItemLCOIL_SETUP.EXT_CROP_LENGTHVT_R4i++;items.AddiOPCItemLCOIL_SETUP.EXT_SAMPLE_LENGTHVT_R4i++;items.AddiOPCItemLCOIL_SETUP.ENT_FRONT_END_CUT_MODEVT_BOOLi++;items.AddiOPCItemLCOIL_SETUP.ENT_CUT_TAIL_MODEVT_BOOLi++;items.AddiOPCItemLCOIL_SETUP.ENT_CUT_TAIL_SHAPEVT_BOOLi++;items.AddiOPCItemLCOIL_SETUP.EXT_DISPARTVT_BOOLi++;items.AddiOPCItemLCOIL_SETUP.EXT_SAMPLEVT_BOOLi++;items.AddiOPCItemLCOIL_SETUP.ENT_NOTCH_MODEVT_BOOLi++;items.AddiOPCItemLCOIL_SETUP.VALIDVT_I2i++;items.AddiOPCItemLCOIL_SETUP.ANSWERVT_I2i++;items.AddiOPCItemLCOIL_SETUP.DENSITY_OF_CURRENTVT_I2i++;items.AddiOPCItemLCOIL_LOAD_REQUESTVT_I2i++;items.AddiOPCItemLCOIL_ID_REQUEST_FLAGVT_I2i++;items.AddiOPCItemLREQUESTED_COIL_IDVT_BSTRi++;items.AddiOPCItemLCOIL_RESULT.COIL_IDVT_BSTRi++;items.AddiOPCItemLCOIL_RESULT.LENGTHVT_R4i++;items.AddiOPCItemLCOIL_RESULT.WIDTHVT_R4i++;items.AddiOPCItemLCOIL_RESULT.THICKNESSVT_R4i++;items.AddiOPCItemLCOIL_RESULT.WEIGHTVT_R4i++;items.AddiOPCItemLCOIL_RESULT.DIA_INNERVT_R4i++;items.AddiOPCItemLCOIL_RESULT.DIA_OUTERVT_R4i++;items.AddiOPCItemLCOIL_RESULT.MAX_SPEEDVT_R4i++;items.AddiOPCItemLCOIL_RESULT.ENT_TENSIONVT_R4i++;items.AddiOPCItemLCOIL_RESULT.EXT_TENSIONVT_R4i++;items.AddiOPCItemLCOIL_RESULT.DENSITY_OF_CURRENTVT_R4i++;items.AddiOPCItemLCOIL_RESULT.LYE_TEMPVT_R4i++;items.AddiOPCItemLCOIL_RESULT.ELEC_TEMPVT_R4i++;items.AddiOPCItemLCOIL_RESULT.RINSE_TEMPVT_R4i++;items.AddiOPCItemLCOIL_RESULT.LYE_CONDUVT_R4i++;items.AddiOPCItemLCOIL_RESULT.ELEC_CONDUVT_R4i++;items.AddiOPCItemLCOIL_RESULT.REQUEST_IDVT_I2i++;items.AddiOPCItemLCOIL_RESULT.BAND_REQUEST_IDVT_I2i++;items.AddiOPCItemLCOIL_RESULT.BAND_COIL_IDVT_BSTRi++;items.AddiOPCItemLCOIL_RESULT.START_TIMEVT_DATEi++;items.AddiOPCItemLCOIL_RESULT.END_TIMEVT_DATEi++;items.AddiOPCItemLTENSION_SETUP.COIL_IDVT_BSTRi++;items.AddiOPCItemLTENSION_SETUP.MEASURE_WIDTHVT_R4i++;items.AddiOPCItemLTENSION_SETUP.ENT_UNIT_TENSIONVT_R4i++;items.AddiOPCItemLTENSION_SETUP.EXT_UNIT_TENSIONVT_R4i++;items.AddiOPCItemLTENSION_SETUP.ENT_TENSIONVT_R4i++;items.AddiOPCItemLTENSION_SETUP.EXT_TENSIONVT_R4i++;items.AddiOPCItemLTENSION_SETUP.REQUEST_EVENTVT_I2i++;items.AddiOPCItemLTENSION_SETUP.STATUSVT_I2i++;items.AddiOPCItemLREJECT.ANSWERVT_I2i++;items.AddiOPCItemLREJECT.COIL_IDVT_BSTRi++;items.AddiOPCItemLREJECT.COIL_POSVT_I2i++;items.AddiOPCItemLREJECT.FLAGVT_I2i++;items.AddiOPCItemLREJECT.REASONVT_BSTRi++;items.AddiOPCItemLREJECT.REASON_CODEVT_I2i++;items.AddiOPCItemLREJECT.REQ_NOVT_I2i++;items.AddiOPCItemLSTOP.STOP_FLAGVT_BOOLi++;}Level1::~Level1{try{intn=items.GetSize;OPCItemMgt_RemoveItemsremoven;forinti=0;in;i++remove.setItemiitems.GetValueAti;HRESULThr=removegroup.GetOPCItemMgt;ifhr==S_FALSE{deb1removeitemsoccurerror.\n;forinti=0;in;i++{debremove.getErrorCodei\n;}}items.RemoveAll;}catchCOPCExceptione{deb1erroroccurdestrcutlevel1errormessage:%s\ne.ErrorMessage.c_str;}}STDMETHODIMPLevel1::OnDataChange/*[in]*/DWORDdwTransid/*[in]*/OPCHANDLEhGroup/*[in]*/HRESULThrMasterquality/*[in]*/HRESULThrMastererror/*[in]*/DWORDdwCount/*[size_is][in]*/OPCHANDLE__RPC_FAR*phClientItems/*[size_is][in]*/VARIANT__RPC_FAR*pvValues/*[size_is][in]*/WORD__RPC_FAR*pwQualities/*[size_is][in]*/FILETIME__RPC_FAR*pftTimeStamps/*[size_is][in]*/HRESULT__RPC_FAR*pErrors{forDWORDi=0;idwCount;i++{items.GetValueAtphClientItems[i].setValuepvValues[i];}notify;returnS_OK;}voidLevel1::notify{ifd_observer{d_observer-updatethis;}}voidLevel1::attachObserver*obs{d_observer=obs;}voidLevel1::detachObserver*obs{d_observer=0;}boolLevel1::isRunning{try{OPCServerStatusstatus=opc.GetStatus;ifstatus.status-dwServerState==OPC_STATUS_RUNNINGreturntrue;elsereturnfalse;}catchCOPCExceptione{deb1OPCServerconnectionisbrokenerrormessage%s\ne.ErrorMessage.c_str;returnfalse;}returnfalse;}voidLevel1::read{try{COPCSyncIO_Readreaditems.GetSize;forinti=0;iitems.GetSize;i++{read.setHandleServeriitems.GetValueAti.getServerHandle;}HRESULThr=readgroup.GetOPCSyncIO;ifhr==S_FALSE{deb1erroroccuronreadvaluefromremoteOPCServer.\n;forinti=0;iitems.GetSize;i++{VARIANTvar;items.GetValueAti.getValuevar;debread.getErrorMessagei.c_str-;debOPCStringitems.GetValueAti.getName.c_str\n;//deb-value:varendl;}}fori=0;iitems.GetSize;i++{items.GetValueAti.setValueread.getValuei.vDataValue;}}catchCOPCExceptione{deb1erroroccuronLevel1::readerrormessage:%s\ne.ErrorMessage.c_str;}inti=0;}boolLevel1::connectconstchar*serverName{try{//opc=COPCServer::CreateOPCServerserverNameIID_IOPCServerWincc;opc=COPCServer::CreateOPCServerserverNameIID_IOPCServerSimaticNet;group=opc.AddGroup100;OPCItemMgtAddItemsadditemsitems.GetSize;forinti=0;iitems.GetSize;i++additems.addItemiitems.GetValueAti;HRESULThr=additemsgroup.GetOPCItemMgt;ifhr==S_FALSE{deb1additemshasoneormoreerror.\n;forinti=0;iitems.GetSize;i++{debOPCStringitems.GetValueAti.getName.c_str-;debadditems.getErrorMessagei.c_str;deb\n;}}fori=0;iitems.GetSize;i++items.GetValueAti.setServerHandleadditems.getItemResulti.hServer;group.Connectthis;returntrue;}catchCOPCExceptione{deb1erroroccuronLevel1::connecterrormessage:%s\ne.ErrorMessage.c_str;returnfalse;}}voidLevel1::addToUpdateListconstOPCItemitem{_updateList.push_backitem;}voidLevel1::update{intn=_updateList.size;ifn==0return;try{COPCSyncIOio=group.GetOPCSyncIO;COPCSyncIO_Writessyncn;forinti=0;in;i++{OPCHANDLEhServer=_updateList[i].getServerHandle;VARIANTvar;VariantInitvar;_updateList[i].getValuevar;sync.SetValueihServervar;}HRESULThr=syncio;ifhr==S_FALSE{deb1writeshasonormoreerror.\n;fori=0;in;i++{debsync.getErrorCodeiendl;}}}catchCOPCExceptione{deb1Level1::updateerrormessage:%s\ne.ErrorMessage.c_str;}_updateList.clear;}OPCItemLevel1::getItemconstwchar_t*szName{forinti=0;iitems.GetSize;i++{ifitems.GetValueAti==szNamereturnitems.GetValueAti;}deb1OPCItemnotexistname:%s\nOPCStringszName.c_str;returnOPCItem;}附录E#includestdafx.h#includevector#includeopcwrap.h#includeobserver.h#includelevel
1.h#includeconio.h#includeocci.h#includedba.h#includemachine.h#includeiostream#includelog.husingnamespacestd;DebugdebECL_DEB_FILE.LOGtrue;Databasedba;voidmain{deb.set4;deb2initializeCOMLibrary.\n;CoInitializeNULL;deb2initilizeCOMSecurity.endl;HRESULThRes=::CoInitializeSecurityNULL-1NULLNULLRPC_C_AUTHN_LEVEL_NONERPC_C_IMP_LEVEL_IDENTIFYNULLEOAC_NONENULL;deb2estiablishdatabaseconnection.endl;ifdba.connectecluserecluserecldb==false{return;}{Level1*lv1=newLevel1;deb2estiablishSimaticNetOPCServerconnection.endl;iflv1-connectecl-l2-server==false{deb1CannotestiablishSimaticNetOPCconnection.endl;return;}deb2readdatafromOPCServer.endl;lv1-read;Machine*machine=newMachine*lv1;SetTimerNULL100010000;MSGmsg;deb2systemisstartuped.endl;whileGetMessagemsg000{ifmsg.message==WM_TIMER{ifkbhitbreak;}DispatchMessagemsg;}deletemachine;deletelv1;}deb2systemexit.\n;CoUninitialize;}。