(计算机系统结构专业论文)基于西门子plc的opc服务器开发.pdf_第1页
(计算机系统结构专业论文)基于西门子plc的opc服务器开发.pdf_第2页
(计算机系统结构专业论文)基于西门子plc的opc服务器开发.pdf_第3页
(计算机系统结构专业论文)基于西门子plc的opc服务器开发.pdf_第4页
(计算机系统结构专业论文)基于西门子plc的opc服务器开发.pdf_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

中文摘要 随着计算机控制系统结构的演变以及各种现场设备的层出不穷,计算机监控 系统规模越来越大,不同厂家生产的现场设备的种类在不断的增加,由于不同厂 家所提供的现场设备通讯机制各不相同,导致现场设备的通信协议各异,如何有 效组织分布式控制系统中的通信传输并实现过程控制与企业管理的无缝集成,已 成为新一代分布式控制系统的研究与开发课题。为了使客户端程序开发从底层开 发中解放出来,使程序员专注于客户端的开发,由上百家公司组成的o p c 基金会 颁布了o p c 规范以实现这种集成。 本文讨论了基于西门子p l c 的o p c s e r v e r 的设计与开发技术,此课题中本人 的主要工作包括o p c 服务器的总体架构设计,实现了o p c 标准规范中o p c s e r v e r 类、o p c g r o u p 类、o p c i t e m 类以及接口类,设计并实现了o p c d v d a t a 类,在此类 中封装了主要的对p l c 设备进行读写的程序,o p c 服务器通过o p c d v d a t a 类来读 写p l c 设备中的数据。o p c d v d a t a 类使用m o d b u s 通信协议与p l c 进行通信。最 后对本文实现的o p c 服务器进行了同步和异步读写测试,成功的读取现场设备中 的信息。 关键词: o p cm o d b u s 组件对象模型多线程服务器 a b s t r a c t w i t ht h ee v o l v e m e n to fc o m p u t e rc o n t r o ls y s t e m sa r c h i t e c t u r ea n da b u n d a n c e f i e l dd e v i c ee m e r g e n c el e a dt od i f f e r e n c ec o m m u n i c a t i o n s ,h o wt o c a r r yo u t i n t e g r a t i n gp r o c e s sc o n t r o lw i t hb u s i n e s sm a n a g e m e n th a sb e c o m e at a s kt h a tt h en e w g e n e r a t i o nd i s t r i b u t e dc o n t r o ls y s t e mi sc o n f r o n t e dw i t h o p cs p e c i f i c a t i o nt h a ti s e n a c t e db yo p cf o u n d a t i o ni sat e c h n o l o g ys t a n d a r dt h a ti m p l e m e n t st h i si n t e g r a t i o n , i ti sas p e c i f i c a t i o nt h a ti sd e s i g n e df o rf i e l dc o n t r 0 1 t h ea r t i c l ei n t r o d u c e so p c s e r v e r sd e s i g n i n ga n dd e v e l o p i n gt e c h n o l o g yb a s e do ns i e m e n sp l c i nt h i sa r t i c l e , m yj o bm a i n l yi n c l u d e s :o p cs e r v f 。q ss t r u c t u r ed e s i g n i n g ,c a r r yo u to p c c r i t e r i o n w h i c hi n c l u d eo p c s e r v e rc l a s s ,o p c g r o u pc l a s s ,o p c i t e mc a l s sa n dt h ei n t e r f a c e c ,l a s s t h i s a r t i c l ei m p l e m e n t st h eo p c d v d a t ac l a s sw h i c hi n c l u d e st h e c o m m u n i c a t i o nt op l cb ym o d b u sp r o t o c 0 1 f i n a l l y , w es u c c e s s f u l l yt e s tt h eo p c s e r v e r sa s y n c h r o n o u sr e a d ,w r i t i n ga n da s y n c h r o n o u sr e a da n d w r i t i n g k e y w o r d s :o p c ,m o d b u s ,c o m ,m u l t i t h r e a d i n g ,s e r v e r 独创性声明 本人声明所呈交的学位论文是本人在导师指导下进行的研究工作和取得的 研究成果,除了文中特别加以标注和致谢之处外,论文中不包含其他人已经发表 或撰写过的研究成果,也不包含为获得墨盗盘堂或其他教育机构的学位或证 书而使用过的材料。与我一同工作的同志对本研究所做的任何贡献均已在论文中 作了明确的说明并表示了谢意。 学位论文作者签名:准讫沾 签字日期: 岬 年月 砂日 学位论文版权使用授权书 本学位论文作者完全了解叁盗盘鲎有关保留、使用学位论文的规定。 特授权苤盎盘茔可以将学位论文的全部或部分内容编入有关数据库进行检 索,并采用影印、缩印或扫描等复制手段保存、汇编以供查阅和借阅。同意学校 向国家有关部门或机构送交论文的复印件和磁盘。 ( 保密的学位论文在解密后适用本授权说明) 学位论文作者签名: 磊碍馊 导师签名: 签字e 1 期:w 叼年月 砂同 答字嗍:7 年蝴z 同 天津大学硕士学位论文基于西门子p l c 的o p c 服务器开发 i1o p c 产生的背景 第一章绪论 随着计算机科学技术、工业控制等方面的新技术的迅速发展,计算机监控系 统 1 【2 3 由早期的集中式监控向全分布式的方向发展,随着面向对象技术和分 布式对象计算以及多层次c l i e n t s e r v e r 技术的成熟,计算机监控系统软件也从早 期面向功能的系统,发展为以面向具体现场设备为特征的面向对象的计算机监控 系统。同时,计算机监控系统规模越来越太,不同厂家生产的现场设备的种类在 不断的增加,由于不同厂家所提供的现场设各通讯机制不尽相同,计算机监控系 统软件需要开发的设备通讯驱动程序也越来越多,而基于c o m d c o m 技术的 o p c 技术,通过一个统一的o p c 技术规范标准,不同厂商只要遵循o p c 技术标 准就可以实现软硬件的互操作性。与传统的方式相比,o p c 技术具有以下优势: 1 硬件厂商熟悉自己的硬件设备,应而设备驱动程序性能更可靠、效率更高。 2 软件厂商可以减少负责的设备驱动程序的开发周期,只需一套遵循o p c 标 准的程序就可以实现与硬件设备的通信,并可以把人力、物力资源投入到系 统功能的完善中。 3可以实现软硬件的互操作性。 4 o p c 把软硬件厂商区分开来使得双方的工作效率有了很大的提高。 过程工业控制系统的信息结构可以归纳为图1 一】所示: 盟鐾淤巍 图1 1 过程控制信息结构图 第一章绪论 在现场管理级,采用先进的智能仪表和p l c 等,可以获得大量生产过程和现 场设备信息。利用这些信息,可以了解生产过程和现场设备的运行状况,它们的 运行参数和组态参数等,这些信息必须提交给用户和使用它的应用程序。 在过程管理级,使用d c s 系统去监控制造过程,通过各种传感器自动获取 所需要的现场信息,这些信息也必需提交给负责根据这些信息做出决策的操作员 和工程师。 在经营管理级,把从制造过程收集到的信息集成到经营管理系统中,这些信 息集中反映出现场设备中的数据,操作员根据这些信息来实现对过程的控制。把 这些信息以一致的方式提交给客户端程序,可减少实现这种集成所需要的费用。 从上述可知,现在的企业管理需要紧密集成控制过程的信息。为了实现访问 现场设备中的数据,并把它集成到现有的企业管理系统中,关键技术是实现一个 集中在数据访问上的、开放的、有效的通信使能器。由于在过程控制系统中,尤 其是传统的d c s ,p l c 系统中,不仅不同厂家的仪表设备间不能互操作,仪表硬 件与过程管理级的信息集成也是应用厂家独有的技术和标准,实现过程控制与企 业管理的良好集成变得很困难。有许多公司开发的应用程序能访问现场数据( 如 m m i s ,s c a d a ,s p c ) ,但这些公司是通过为它们的软件包编写专用的设备驱动程 序来访问数据的,这经常会造成下面的问题: 令接口开发工作的重复 每个开发者都必需为特定的硬件编写驱动程序。 令不同驱动程序的不一致性硬件特性并不向所有驱动程序开发人员提供。 令不支持硬件特性的变化硬件特性的添加或修改需要重写驱动程序。 令访问冲突两个软件包不能同时访问相同的设备,因为驱动程序不同。 1 20 p c 的意义 o p c ( o l ef o rp r o c e s sc o n t r 0 1 ) 【6 1 7 8 1 是为过程控制设计的o l e 技术,由一 些世界上技术占优势地位的自动化系统和硬件、软件公司与微软公司紧密合作而 建立的,o p c 基金会负责o p c 规范的制定和发布。o p c 提供了一套统一的标准, 采用c l i e n t s e r v e r 模式,规定硬件设备的驱动程序由硬件厂商或专门的公司 完成,并提供具有统一o p c 接口的s e r v e r 程序,软件厂商安装o p c 标准访 问s e r :v e r 程序即可实现与硬件设备的通信。 o p c 技术是实现控制系统中现场设备与过程管理之间进行信息交互,实现 控制系统开放的关键技术。o p c 以o l e c o m 机制作为应用程序级的通信标准, 采用c l i e n t s e r v e r 模式,把开发访闯接口的任务放在硬件生产厂家或第三方 厂家,以s e r v e r 的形式提供给c l i d 汀,并规定了一系列的接口标准,由 2 天津大学硕士学位论文基于西门子p l c 的o p c 服务器开发 c l i e n t 负责创建s e r v e r 的对象及访问s e r v e r 支持的接口,从而把硬件生产厂商 与软件开发人员有效地分离开来,如图卜一2 所示为现场总线【6 】【7 】【8 】应用模式: 现场设备 现场设备 图1 2 现场总线应用模式 o p c 技术得到了广大软硬件厂商的支持,并迅速发展。自从1 9 9 7 年9 月发 布的o p cd a l 0 规范以来,经过多年的发展,o p c 规范已经被工控领域大多数 厂商所接受,并成了工控软件的技术标准。目前o p c 规范主要有d a ( d a t a a c c e s s ) 规范,a e ( a l a r ma n de v e n t ) 规范;r a d 0 a i s t o r yd a t aa c c e s s ) 规范等待。而且随着 o p c 技术与企业整体信息系统的集成需求变得日益迫切,对o p c 技术的跨平台 性能和i n t e r n e t 特性提出了更高的要求。为此,o p c 基金会开始以x m l - d a l 0 1 规范,为o p c 经一步提高工业控制系统的互操作性揭开了新的篇章。 1 3 本课题的主要工作 本论文工作主要是研究了o p c s e r v e r 的开发,本人在此课题的工作主要是针 对西门子p l c $ 7 - - 2 0 0 1 4 5 硬件开发出一套通用的o p c 服务器,实现了o p c 基金会所提出的o p c 服务器的标准接口类和方法,在此服务器基础上,任何一 个遵守o p c 技术规范的客户端都可以通过本服务器来访问西门子p l cs 7 2 0 0 p l c 中的数据和状态信息,实现计算机控制自动化系统。 本文第一章介绍了o p c 技术产生的背景和意义,说明了o p c 技术发展的必 要性和重要性;第二章详细介绍了o p c 基金会的标准规范以及实现o p c 的核心 技术- - c o m ;第三章详细介绍了o p c 服务器整体架构及实现,在本章中实现 o p c 标准o p c s e r v e r 类、o p c g r o u p 类、o p c i t e m 类以及从这些类派生出来的接 口类,并在本章最后详细介绍了o p c d v d a t a 类,给出部分实现代码,此类封装 了对p l c 进行数据访问的所必需的函数;第四章讨论的o p c 服务器的重点一一 数据读写访问并给出部分程序实现过程;最后一章介绍了对服务器的读写访问的 测试。 第二章0 p c 技术规范与c o m 简介 第二章o p c 技术规范与c o m 简介 o pc 服务器是一个按o p c 标准组织的通用接口服务程序,对不同的硬件设 备,向上提供符合o p c 规范的标准接口。o p c 实现依赖的核心技术是o l e c o m 技术。o p c 服务器有三种实现方式:进程内服务器、本地服务器和远程服务器。 本章全面介绍o p c 的技术规范。 2 10 p 0 体系结构 o p c 基于c o m d c o m 技术【9 】【1 0 】,其作用是建立在客户服务器模型基础 上的。服务器是组件对象的容器,为客户提供服务。o p c 服务器提供对实际物 理设备的数据读写功能;o p c 客户主要是通过标准的o p c 接口和o p c 服务器交 互,调用其接口方法实现数据通讯。o p c 服务器以c o m 组件的形式存在,可分 为三类; 1 进程内组件:服务程序被加载到客户的进程空间,通常服务程序代码 以动态链接库( d l1 ) 形式存在。 2 进程间组件:服务程序与客户程序运行在同一台机器上,服务程序是一 个独立的应用程序,通常以可执行文件( e x e ) 形式存在。 3 远程组件:服务程序运行在与客户程序不同的机器上,既可以是一个动 态链接库模块,也可以是一个可执行文件,o p c 利用分布式结构d c o m 实现客户应用与远程服务器的接口。 在符合o p c 规范的应用系统中,一个o p c 服务器可以为多个o p c 客户提 供数据服务。同样,一个o p c 客户也可以连接到多个o p c 服务器,利用其接口 方法实现特定的功能,并且这些o p c 服务器完全可以是有不同厂家供应的,因 为他们符合o p c 规范,使用了o p c 规范中的统一的接口。 2 20 p 0 服务器对象模型 o p c 服务器的逻辑对象模型包括三类对象( o b j e c t ) :o p c 服务器对象 ( s e r v e r ) ,o p c 组对象( g r o u p ) ,o p c 项对象( i t e m ) 。这三类对象都包括一系列c o m 接1 :3 。s e r v e r 对象是g r o u p 对象的容器,g r o u p 对象是i t e m 对象的容器。其关系 图2 1 所示: 4 天津大学硕士学位论文 基于西门子p l c 的o p c 服务器开发 图2 一lo p c 服务器对象关系图 s e r v e r 对象有不同的属性,含有s e r v e r 对象的状态、版本等信息。它也有一 些方法,客户利用这些方法建立和管理g - r o u p 对象。s e r v e r 对象支持的由o p c 规范定义的标准接口,如图2 2 所示: l o p c c 拥n m o n l o f f 烛n , e r p o ! s o r 懈栅m 稍m 呐1 p e b 瞄鹤打懈峭血h 撼s 舯1 f i p 缸l f k l , 翻嘶玎o 硫p 幽h h l 幽o f 图2 2 标准o p c 服务器对象 g r o u p 对象为客户提供了一种组织数据的方式。它有不同的属性,含有g r o u p 对象自身的信息;它也提供其它许多方法,建立和管理i t e m 对象。g r o u p 对象 支持的由o p c 规范定义的标准接口,如图2 3 所示: 第二章o p c 技术规范与c o m 简介 l o p c l 细h 自非 l o 陀g m 叩& 出、啄 眇p c p b l k 蟊删p 乳柚办l g i l l o p c s m i o i o p c a s y n t l 0 2 k 沁m 憎d 确p b m 蕾c 日村l 豳e r l i 】p c a s y 耶l o l 砖d h d i l u d m 謇州o l d 图2 3 标准的o p cg r o u p 对象 o p c 服务器对象维护有关服务器信息,并作为o p c 组对象的包容器。o p c 使用了c o m 重用模型一一包容模型来实现o p c 服务器。一个o p c 服务器对应 于一个o p c 服务器对象,在一个o p c 服务器对象中包含有多个o p c 组对象。 它提供了管理o p c 组对象和对数据源进行读写或通讯的接口方法,数据源可能 是现场设备,也可以是其它应用程序。 o p c 组对象包含本组的所有信息,同时提供了从逻辑上包容o p c 项对象的 机制。o p c 组对象提供客户程序组织数据的手段,并管理o p c 项对象。o p c 规 范定义了两种组对象:公共组( p u b l i c ,也称全局组) 和局部组( l o c a l ,也称私有 组) 。公共组由多个客户共有,对所有连接在o p c 服务器上的o p c 客户都有效; 局部组只隶属于一个o p c 客户,更确切地说,局部组只对建立该组的o p c 客户 有效。一般来说,o p c 客户和服务器的一对连接只需要定义一个组对象,但在 一个组对象中可以包含若干个数据项对象。o p c 项对象包含在o p c 组对蒙中, 可由客户端定义和维护,是读写数据的最小逻辑单位。它包括值( v a l u e ) 、质量 ( q u a l i t y ) 、时间邮戳( t i m e s t a m p ) - 一个基本属性。由于o p c i t c m 对象没有定义相 应的外部接口,所以所有的对o p c i t e m 的操作都是通过包容此项的o p c 组对象 进行的。o p c i t e m 本身并不是数据源而是代表了与数据源的连接。可以认为 o p c i t e m 是数据源的地址,即数据源的引用,而不是实际数据源。 o p c 的规范中便定义了许多o p cs e r v e r 应该提供的i n t e r f a c e ,要撰写一个 o p cs e r v e r 的c o m 组件,你必须在你的组件中加入这些接口,并提供它们的 实现,c l i e n t 便可以通过这些接口,操作连接到o p cs e r v e r 的硬件装置,这也 就是o p cs e r v e r c l i e n t 运作的方式,如图2 4 所示: 天津大学硕士学位论文 基于西门子p l c 的0 p c 服务器开发 图2 40 p cs e r v e r c l i e n t 运作模式和服务器通用接口 o p c 技术规范只是规定了数据访问的接口,它没有规定接口的实现,需开 发人员实现这些接口。本论文编写的o p c 服务器,实现了o p c 规范规定的必须 实现的接口,同时也实现了一些可选接口。 实现o p c 的核心技术是微软的o l e c o m 技术,下一节介绍c o m 技术的 基础知识及如何实现c o m 对象。 2 3c o m 基础 随着计算机网络技术的发展,计算机监控系统也普遍的采用了分布式结构, 因而系统的异构性是一个非常显著的特点。o p c 技术本质是采用了m i c r o s o f t 的 c o m d c o m ( 组件对象模型分布式组件对象模型) 技术。c o m 主要是为了实 现软件通用和互操作性,并且为基于w i n d o w s 的程序提供了统一的、可扩充 的、面向对象的通讯协议,d c o m 是c o m 技术在分布式计算领域的扩展,是 c o m 支持在局域网、广域网甚至i n t e r a c t 上不同计算机的对象之间的通讯。 c o m 是由m i c r o s o f t 提出的组件标准,它不仅定义了组件程序之间进行交互 的标准,并且也提供了组件程序运行所需的环境。在c o m 标准中,一个组件程 序也被称为一个模块,它可以是一个动态链接库,被称为进程内组件( i n p r o c e s s c o m p o n e n t ) ;也可以是一个可执行程序,被称为进程外组件( o u t - o f - p r o c e s s c o m p o n e n t ) 。一个组件程序可以包含一个或多个组件对象,因为c o m 是以对象 为基本单元的模型,所以在程序于程序之间进行通信时,通信的双方应该是组件 对象,也叫做c o m 对象,而组件程序是提供c o m 对象的代码载体。 c o m 标准为组件软件和应用程序之间的通信提供了统一的标准,包括规范 和实现两个部分,规范部分规定了进程间的通信机制。由于c o m 的语言无关性, 在实现时不需要特定的语言环境和操作系统,只要按照c o m 规范开发即可。 7 第二章0 p c 技术规范与c o m 简介 c o m 模型是c s ( 客户服务器) 模型,o p c 技术的提出就是基于c o m 的c s 模式,o p c 开发分为o p c 服务器开发和o p c 客户程序开发。本论文就主要讨论 o p c 服务器程序开发。 c o m 模型作为规范,规定了在单个应用程序或应用程序之间对象的作用方 式。每个c o m 组件对象都遵从这种模型,实现和使用支持对象间相互作用的接 口。c o m 模型定义了下列内容: 1 ) 使用服务的客户和服务提供者之间的通信所用的接口概念。 2 ) 引用计数模型。用来进行对象管理,允许多个客户可以同时使用某个对象, 它同时也提供了识别何时一个对象不再使用并可安全地撤消的方法。 3 ) 一种能分配和释放客户和对象之间所传递的内存的机制。 4 ) 用于报告出错和状态信息的模型。 5 ) 允许对象跨越进程边界而透明地通信的机制。 6 ) 可以标识特定的对象实现方式的机制。 c o m 库也提供了一些基本的a p i 函数,用于对象的创建及管理和处理通过 进程边界的接口函数调用的调度。 c o m 对象由四个基本元素组成: ( 1 ) 类 类是具有一组接口的数据结构。这组接口用于存取和操纵该数据结构,与 c + + 中的类相似,区别在于c o m 允许由任意语言创建的类登记入操作系统,并 以一种与语言无关的方式使用。、 ( 2 ) 对象 类似于c + + 语言中类的概念,c o m 对象也包括属性和方法,对象的状态反映 了对象的存在,也是区别于其它对象的要素;而对象所提供的方法就是对象提供 给外界的接口,客户必须通过接口才能获得对象的服务。对于c o m 对象来说, 接口是它与外界进行交互的唯一途径,因此,封装性是c o m 对象的基本特征。 ( 3 ) 接口 接口是用于组件对象间作用的二进制标准。每个接口都包括了一系列的函 数,用于直接操纵类中的数据。这些函数规定了实现接口的对象和客户使用这些 对象所遵从的协议。指向接口的指针指向函数指针的数组,也即虚拟表( v t b l ) , 被v t b l 成员指向的函数称为接口方法或成员函数。c o m 的接口模型如图2 5 所示: 8 天津大学硕士学位论文基于西门子p l c 的o p c 服务器开发 图2 5c o m 接口模型图 在c o m 对象上的操作都是通过c o m 的不同接口的成员函数来实现的。当 某个对象的用户首次获得该对象的指针时,他只是获得了指向对象的某一接口的 指针,该接口指针允许用户调用这一接口函数表中的函数。但通过接口指针,用 户不能访问该对象的数据成员,也不能直接访问其它接口。 ( 4 ) 全局唯一标识符( g u m ) g u i d 是为每个c o m 对象提供的十六字节标识数。c o m 类有两个g u i d 类标识( c l s i d ) 和接口标识( i i d ) 。c l s i d 用于标识c o m 类,登记在w i n d o w s 注 册表中,包含指向包括类的d l l 或e x e 组件的路径。i i d 用于标识该类的接口, 被应用程序用来查询和触发该类的方法,同时登记在注册表中。由于对象类是由 g u i d 来标识的,所以必须严格保证它们的唯一性,才能使最终用户在使用由不 同软件商开发的组件不会发生冲突。 可以使用宏d e f i n e来声明 ,j 其定义如下:g u i d o g u i d d e fin e _ g uid ( n a m e , w o r d ,w o r d , w o r d , b y t e l ,b y t e 8 ) 其中n a m e 是标识数的名字。类标识的命名惯例是c l s i dc l a s s n a m e ,而接 口i d 的命名惯例是i i di n t e r f a c en a m e ,其余参数构成实际的d 码。 c o m 库为我们提供了以下a p i 函数可以产生g u i d : h r e s u l t c o c r e a t g u i d ( g u i d 彝p g u i d ) ; 如果创建成功,则函数返回s o k ,并且p g u i d 将指向所得到的g u i d 值。 2 3 1c o m 接口 c o m 对象和它的客户之间通过接口进行交互,因此c o m 接口的定义至关 重要。c o m 规范的核心内容就是关于接口的定义。接口的标识、接口的调用习 惯、参数处理、接口与对象的关系以及接口与c c + + 的关系、c o m 接口所具有 的特性等都需要仔细探讨。 第二章0 p c 技术规范与c o m 简介 2 3 2 接口的定义和标识 从技术上讲,接口是包含了一组函数的数据结构,通过这组数据结构,客户 代码可以调用组件对象的功能。接口定义了一组成员函数,这组成员函数是组件 对象暴露出来的所有信息,客户程序利用这些函数获得组件对象的服务。 客户程序用一个指向接口数据结构的指针来调用接口成员函数。按口指针实 际上又指向另一个指针,这第二个指针指向一组函数,成为接口函数表,接口函 数表中每一项为4 个字节长度的函数指针,多个函数指针与对象的其体实现连接 起来。通过这种方式,客户只要获得了接口指针,就可调用到该对象的实际功能。 通常我们把接口函数表称为虚函数表( v i r t u a lf u n c t i o nt a b l e ,简称v t a b l e ) ,指向 v t a b l e 的指针为p v t a b l e 。对于一个接1 2 1 来说,它的虚函数表v t a b l e 是确定的,因 此接口成员函数个数是不变的,而且成员函数的先后顺序也是不变的,对于每个 成员函数其参数和返回值也是确定的。在一个接口的定义中,所有这些信息都 必须在二进制一级确定,不管什么语言,只要能支持这样的内存结构描述,就可 以定义接口。 因为接口被用于组件程序和客户程序之间的通信桥梁,所以接口应该具有不 变性,一个c o m 对象可以支持很多个接口。但客户如何来标识一个接口呢? 类 似于c o m 对象的标识方法,c o m 接口也采用全局唯一标识符,被称为接1 2 1 标 识符( i i d ,i n t e r f a c ei d e n t i f i e r ) ,如: e x t e r n ”c ”c o n s tii dl i d i u n k n o w n = o x 0 0 0 0 0 0 0 0 ,o x0 0 0 0 ,o x0 0 0 0 ,( 0 x c 0 ,0 x 0 0 ,o x 0 0 ,o x 0 0 ,o x 0 0 ,0 x 0 0 ,0 x 0 0 ,0 x4 6 ) ) ; 如果客户要使用一个c o m 对象的某个接口;则它必须知道该接口的i i d 和 接口所能够提供的方法。 2 3 3 接口描述语言li ) l c o m 规范在采用o s f ( o p e ns o f tw a r ef o u n d a t i o n ,开放软件基金会) 的d c e ( d i s t r i b u t e dc o m p u t i n ge n v i r o n m e n t ,分布式计算环境) 规范描述远程调用接 口i d g ( i n t e r f a c ed e s c r i p t i o nl a n g u a g e ,接口描述语言) 的基础上,进行扩展形成了 c o m 接口的描述语言。接口描述语言提供了一种不依赖于任何语言的接口描述 方法,因此,它可以成为组件程序和客户程序之间的共同语言。 c o m 规范使用的i d l 接口描述语言不仅可用与定义c o m 接口,同时还定 义了一些常用的数据类型。也可以描述自定义的数据结构,对于接口成员函数, 我们可以指定每个参数的类型、输入输出特性,甚至支持可变长度的数组的描述。 i d l 支持指针类型,与c c + 十很类似。v i s u a lc 忖提供了m i d l 工具,可以把i d l 1 0 天津大学硕士学位论文基于西门子p l c 的o p c 服务器开发 接目描述文件编译成c c + + 兼容的接口描述头文件( h ) ,可被组件程序和客户程 序所使用。 2 3 4c o w 接口特性 二进制特性 接口规范并不建立在任何编程语言的基础上,而是规定了二进制一级的标 准。任何语言只要有足够的表达能力,它就可以对接口进行描述,从而可以用于 与组件程序有关的应用开发。 接口不变性 接口是客户程序和组件程序之间的桥梁,应具有不变性,只要客户程序和组 件程序都按照既定的接口设计进行开发,则可保证两者独立开发结束后它们的协 作能力能达到预期的效果。 继承性( 扩展性) 接口也可以继承发展,但接口继承只是说明继承,即派生的接口只继承了基 接口的成员函数说明,并没有继承基接口的实现,因为接口定义不包含函数的实 现部分;而且接口的继承只允许单继承,不允许多重继承。根据c o m 规范,所 有的接口都必须从i u n k o w n 接口派生,可以是直接派生,也可以是间接派生, 但事实上大多数接口都是直接派生于i u n k o w n 接口,而并没有使用自定义接口 继承特性,c o m 并不提倡自定义接口继承,除非在发展接口时无论从功能上还 是语义上都应该采用自定义接口继承,才会使用接口的继承特性。 多态性一运行过程中的多态性 多态性是面向对象系统的重要特性,c o m 对象的多态性通过c o m 接口体 现。多态性使得客户程序可以用统一的方法处理不同的对象,甚至是不同类型的 对象,只要它们实现了同样的接口。如果几个不同的c o m 对象实现了同一个接 口,则客户程序可以用同样的代码调用这些c o m 对象。c o m 规范允许一个对 象实现多个接口,因此,c o m 对象的多态性可以在每个接口上体现。正是由于 c o m 的多态性,我们才可以用c o m 规范建立组件系统,应用程序可以用统一 的方法处理每一个插件。 2 3 5iu n k n o w n 接口 c o m 定义的每个接口都必须从i u n k n o w n 继承过来,其原因在于i u n k n o w n 接口提供了两个非常重要的特性:生存期控制和接口控制。客户程序只能通过接 口与c o m 对象进行通信,虽然客户程序也可以不管对象内部的实现细节,但它 要控制对象的生存与否。如果客户还要继续对对象进行操作,则它必须保证对象 第二章0 p c 技术规范与c o m 简介 能一直存在与内存中;如果客户对对象的操作已经完成,以后也不再需要该对象 了,则它必须及时的把对象释放掉,以提高资源的利用率。i u n k n o w n 引入了“引 用计数”( r e f e r e n c ec o u n t i n g ) 方法,可以有效地控制对象的生存周期。 另一方面,如果一个c o m 对象实现了多个接口,在初始时刻,客户程序不 太可能得到该对象所有的接口指针,它只会拥有一个接口。如果客户程序需要其 它的指针,那么就必须通过i u n k n o w n 的“接口查询”方法来完成接口之间的跳 转。 i u n k n o w n 的定义接口( d l ) : i n t e r f a c ei u n k n o w n h r e s u l t q u e r y i n t e r f a c e ( i n 】r e f i i di i d , o u t v o i d 木囊p p v ) ; u l o n ga d d r e f ( v o i d ) ; u l o n gr e l e a s e ( v o i d ) ; i u n k n o w n 的c + + 定义形式: c l a s s1 - u n k n o w n p u b l i c : v i r t u a lh r e s u l ts t d c a l lq u e r y i n t e r f a c e ( c o n s ti i d & i i d ,v o i d 木奎p p v ) = 0 ; v t r t u a lu l o n g s t d c a l la d d r e f 0 = o ; v i r t u a lu l o n g s t d c a ur e l e a s e ( ) = o ; ) ; i u n k n o w n 包含了三个成员函数:q u e r y i n t e r f a c e 、a d d r e f 和r e l e a s e 。函数 q u e r y i n t e r f a c e 用于查询c o m 对象的其它接口指针,函数a d d r e f 和r e l e a s e 用 于对引用技术进行操作。当应用程序得到对接1 2 1 指针p i n t e r f a c e 的访问时,它调 用p i n t e r f a c e - a d d r e f 来增加引用计数,当应用程序处理完指针时,它调用 p i n t e r f a c e r e l e a s e 来减少引用计数。如指定接口的引用计数为零,接口的执行 被释放。如果一个对象整体上不再带有引用指针,那么对象被释放。 2 4c o m 组件 c o m 的实现与操作系统平台密切相关,因为c o m 源于m i c r o s o f tw i n d o w s 平台,所以c o m 实现部分( s 0c o m 库) 很多地方直接使用了w i n d o w s 系统的一 些特性,如系统注册表、动态链接库等等。但实际上c o m 是一个与平台无关的 1 2 天津大学硕士学位论文基于西门子p l c 的0 p c 服务器开发 组件软件模型,我们在w i n d o w s 上使用的c o m 标准实际上只是c o m 的一个具 体实现。c o m 组件分为进程内组件和进程外组件。 进程是一个正在运行的程序,它有单独的内存地址空间,拥有自己的一些系 统资源。如果我们用动态连接库的方式实现组件程序,则客户程序调用组件程序 的服务时,会把组件程序装入到自己的进程中,所以客户程序和组件程序运行在 同一个进程空间中,我们也把这种组件程序成为进程内组件。实现组件程序的另 一种形式是e x e 程序,这种组件程序在被调用时有其自己的进程空间,它运行 在与客户程序同一个机器上或者在远程机器上的另一个进程空间内,所以客户程 序和组件程序运行在不同的进程空间中,我们把这种组件程序称为进程外组件。 虽然c o m 对象有不同的进程模型,但这种区别对于客户程序来说是透明的, 因此客户程序在使用组件对象时可以不管这种区别的存在,只要遵照c o m 规范 即可。进程内模型的优点是效率高,但组件不稳定会引起客户进程崩溃,进程外 模型的优点是稳定性好,组件进程不会危及客户程序,但是进程外组件开销大, 而且调用效率相对低一些。用户可根据自己的需要选择进程模型。 对于进程外组件需要注意的问题是进程之间如何进行通信的。c o m 采用了 本地过程调用( l p c ) 和远过程调用( r p c ) 的方法进行进程之间的通信。l p c 用于 同一个机器上的进程之间的通信,r p c 用于不同机器上的进程间的通信,它们 机理相同,但r p c 要涉及网络传递信息,要比l p c 复杂。 客户程序和进程外组件的调用关系如图2 6 所示 1 5 】,客户程序只与同一 进程中的代理( p r o x y ) 对象打交道,组件程序只与同一进程中的存根, d l l 打交道, l p c 调用只在代理对象和存根d l l 之间进行,当客户程序需要调用组件提供的 功能服务时,它需要执行图中的六个步骤才可完成一个函数调用,如图2 6 所 示: 6 代理对 象返回最 终结果 1 瘩户调用接 口成员函数 客户程序 ( 客户进程) 4 5 6 步 组件程序 ( 组件对象) 陌雨网 1 2 3 步 代理d l l 中 的代理对象 2 代理对象通过 l p c 调用组件存根 5 。存根d u 通过 l p c 返回结果 存根d l l 4 完成任务 后返回 3 调用组件 对象接口成 员函数 图2 6 进程外组件与客户程序协作结构图 代理d l l 和存根d l l 除了完成l p c 调用之外,它还需要对参数和返回值 进行翻译和传递。客户程序调用的参数,首先经过代理d l l 的处理,把参数以 及其它的调用信息组装成一个数据包传递给组件进程,这个过程称为参数列集 第二章o p c 技术规范与c 伽简介 ( m a r s h a l i n g ) ;组件程序接收到数据包后,要进行解包操作,把参数信息提取出 来,这个过程被称为散集c o n m a r s f a l i n g ) ,然后再进行实际的接口调用。函数的 返回值和输出参数在返回的过程中也要进行列集和散集操作,只是在存根d l l 一端进行列集、在代理d i l 一端进行散集,最后把散集后的结果值返回给客户 程序,完成一次功能调用。 所有这些特性的实现可以建立在操作系统提供的l p c 和r p c 模块基础上, 不需要应用系统开发人员去考虑这些底层的细节技术问题。为了实现进程外组 件,我们除了实现组件程序外,还应该实现代理d l l 和存根d l l 两个程序模块。 如果我们使用自定义的c o m 接口,应建立自己的d l l 程序,如果我们使用己 定义的标准接口或者o l e 接口,可直接使用系统提供的d l l ,c o m 库会为我 们处理这些细节。 2 5c o m 类厂 因为c o m 对象可以位于客户程序线程空间之外,并且要能被不同的语言访 问,所以我们需要一种与语言无关的方法来实例化一个组件。c o m 提供了一个 标准的接口i c l a s s f a c t o r y ,该接口是一个特殊的、必须实现的构造器组件,使用 它才能让外部客户可以创建合自己的组件实例。 类厂本身也是一个c o m 对象,它唯一的功能是简化其它c o m 对象的创建 方法c e r e a t e l n s t a n c e 方法用与创建指定组件类的实例并返回该实例所请求的按 口,l o c k s e r v s r 为客户提供了一个在内存中锬定一个服务器的途径。通过在内存 中锁定服务器,即使当该服务器里没有出现已实现的组件时,客户程序也可以在 今后使它。 对应每一个c o m 类,都有一个专门的类厂是用于该c o m 类对象的创建工 作的。类厂创建工作是由c o m 库来完成的,但组件程序必须提供 d l l g e t c l a s s o b j e c t 引出函数。c o m 库在接到对象创建指令后,它调用进程内组 件的d l l g 吼c l a s s o b j e c t 函数,由该函数创建类厂对象,并返回类厂对象接口指 针,继而可创建相应的c o m 对象。 2 6c o m 对象的管理 c o m 规范使用1 2 8 位g u i d 来标识c o m 对象和接口,客户程序通过这些 g u i d 值来创建c o m 对象并与对象进行交互。因为客户程序与组件程序是独立 的,客户程序在创建对象时并不一定知道组件程序的确切位置,按照c o m 规范, 1 4 天津大学硕士学位论文基于西门子p l c 的0 p c 服务器开发 客户程序通过c o m 库完成对对象的创建工作。c o m 库通过系统注册表所提供 的信息进行组件的创建工作,系统注册表是一个全操作系统范围公用的信急仓 库,其中包含了所有的c o m 组件必要的信息以及其它一些信息。 组件程序把它所实现的c o m 对象的信息以及接口信息都保存到注册表中, 这个步骤称为组件的注册,如果组件程序具有自注册能力则我们称该组件程序为 可自注册的( s e l f - r e g i s t e r i n g ) 组件;客户程序在创建组件对象时,也需要直接或者 间接地访问注册表中的信息。 c o m 组件的注册信息,只用到系统注册表的h k e yc l a s s e sb o o t 键, 在i - i k e yc la s s e sb o o t 键下最主要的是c l s i d 子键,在c l s i

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论