这里主要讨论的是OPC Data Access 2.0服务器的开发,在掌握了这个最常用的OPC服务器开发之后,对其它类型的OPC服务器,如A&E、HDA等就可以触类旁通了。

一个OPC服务器的开发,主要包括两大部分的工作:OPC接口的实现和设备驱动部分的开发。

OPC接口的实现,实质上就是按照OPC标准进行COM接口开发,对于大多数的OPC服务器开发者来说,我认为没有必要涉足。目前市场上有很多OPC服务器开发工具,国内外都有,当然价格也不尽相同,调研一下的话应该会找到适合自己的。有必要进行OPC接口开发的大致有这几种情况:1、有实力的大公司,OPC相关产品较多,需要对OPC技术进行深入了解;2、OPC服务器开发工具厂商;3、对OPC技术感兴趣的个人、院校及研究机构。除此之外,一般没有必要一头扎进COM的泥沼,去和内存分配、线程管理等繁琐的事务打交道。

所以,当决定为设备/程序开发OPC服务器时,首先要选择一款OPC服务器开发工具。(目前流行的OPC DA 2.0服务器开发工具的结构大同小异,kevin所在的公司也有这类产品,为避免广告之嫌,这里就不做详细介绍了。)

为了更好地理解OPC服务器开发工具的结构并合理使用,最好先了解OPC服务器的结构模型,这里简单说一下。OPC(DA 2.0)里主要定义了两个对象:OPCServer 和 OPCGroup。OPCServer对象是OPC服务器的核心,它提供的接口函数主要包括对OPCGroup对象的管理、OPCItem属性查询、连接点管理、以及地址空间浏览(可选)等。OPCGroup 对象的主要作用是管理一组数据项(Item),包括数据项的同步/异步访问、添加删除、属性查询等。从客户程序角度看,访问一个OPC服务器的过程大致是首先创建一个 OPCServer 对象,然后通过它创建一个 OPCGroup,在其中添加想要访问的数据项,之后利用订阅回调机制周期性获取动态数据或通过读写接口直接访问数据项。

在OPC服务器的实现中,组对象的管理是关键,不同客户程序可能创建多个组对象,每个组对象包含的数据项、更新周期都由客户程序决定,不尽相同,需分别处理。所幸的是大部分OPC服务器开发工具都已实现了这一部分,并进行了封装。用户开发OPC服务器时可把主要精力放在现场数据的读写上。目前大部分的OPC服务器开发工具都提供了一些类对象或API形式的函数,用户只需调用这些函数即可完成从现场数据到OPC服务器(通常是内部缓冲区)的数据更新。

在开始开发一个OPC服务器之前,用户还要确定服务器的运行形式。OPC服务器做为一个COM组件,运行方式主要包括进程内(DLL)、进程外(EXE)以及服务(Service)。这里的进程内/外是相对于客户程序说的,当OPC服务器是进程内组件时,它运行在客户程序的进程里(远程连接时是宿主程序(host)的进程),而我们通常接触到的OPC服务器一般都是进程外组件。选择哪一种形式要看具体的应用需求,进程内形式适合轻量级的小型服务器,特别是当底层设备具有较高的性能,支持并发多连接访问,OPC客户及服务器程序处于同一计算机上时,可采用进程内形式。其它情况下进程外形式可能更适合一些。简言之,当你不清楚到底那种更合适时,就选择进程外方式。服务形式主要是和进程外形式比较的,它在后台运行,没有用户界面。当OPC服务器计算机可能在没有用户登录,或者需要经常切换登录用户时,服务形式的OPC服务器是最合适的。无论那种形式,都与设备驱动开发的关系不大,大部分的OPC服务器开发工具都带有每种形式的服务器例程,用户可在开发时参考。

开发一个OPC服务器时,首先通常要确定地址空间结构。OPC DA 2.0规定了两种地址空间的组织形式:Flat(平坦的) 和 Hierarchical(分等级的)。可以理解为我们通常所说的“列表型”和“树状型”。虽说OPC DA 2.0里把IOPCBrowseServerAddressSpace接口定义为Optional,即可选的,但目前大部分OPC服务器开发工具都实现了这个接口,树状地址空间有利于客户程序浏览查询,特别是当数据项总数较多时,Flat 形式不利于数据项的分类、管理。所以建议定义树状地址空间。具体的空间结构因底层设备的特性而异,OPC没有严格要求。借用OPC标准里的例子,比如:
<ROOT> 
PLC_STATION_1 (branch)
 ANALOG_VALUES (branch)
  40001 (leaf)
  40002 (leaf)
  ...
 DISCRETE_VALUES (branch)
  ...

设计好地址空间结构之后,就要实现最主要的数据读写功能了(以后继续)。

BTW,有朋友曾在论坛里提到“通用”OPC服务器,我想可能是指Kepware之类的OPC服务器套件,支持当前很多主流的设备。但这也是包含了多家厂商设备驱动的结果。或者其它的针对某些通用、公开的协议,比如Modbus,开发的服务器,但显然它不能适应所有的设备。可以说,只要有私有协议的存在,就没有真正意义上的通用OPC服务器。OPC标准的根本目的是提供设备驱动程序(软件)与客户软件之间的互操作性。
refrence:http://blog.gkong.com/more.asp?name=kking&id=30090

OPC服务器开发浅谈 — 服务器模型(转)的更多相关文章

  1. linux服务器开发浅谈

    [开发前准备] 在进行linux服务器开发之前,必须很清楚地了解所开发的对象需要考虑的相关问题比如:功能架构:提供服务的模块体系结构稳定性:服务器的出core率,内存泄露情况性能:请求与返回的速度与正 ...

  2. Android开发-浅谈架构(二)

    写在前面的话 我记得有一期罗胖的<罗辑思维>中他提到 我们在这个碎片化 充满焦虑的时代该怎么学习--用30%的时间 了解70%该领域的知识然后迅速转移芳草鲜美的地方 像游牧民族那样.原话应 ...

  3. 基于第三方开源库的OPC服务器开发指南(3)——OPC客户端

    本篇将讲解如何编写一个OPC客户端程序测试我们在前文<基于第三方开源库的OPC服务器开发指南(2)——LightOPC的编译及部署>一篇建立的服务器.本指南的目的是熟悉OPC服务器的开发流 ...

  4. 基于第三方开源库的OPC服务器开发指南(2)——LightOPC的编译及部署

    前文已经说过,OPC基于微软的DCOM技术,所以开发OPC服务器我们要做的事情就是开发一个基于DCOM的EXE文件.一个代理/存根文件,然后就是写一个OPC客户端测试一下我们的服务器了.对于第一项工作 ...

  5. Python测试开发-浅谈如何自动化生成测试脚本

    Python测试开发-浅谈如何自动化生成测试脚本 原创: fin  测试开发社区  前天 阅读文本大概需要 6.66 分钟. 一 .接口列表展示,并选择 在右边,点击选择要关联的接口,区分是否要登录, ...

  6. 基于第三方开源库的OPC服务器开发指南(4)——后记:与另一个开源库opc workshop库相关的问题

    平心而论,我们从样例服务器的代码可以看出,利用LightOPC库开发OPC服务器还是比较啰嗦的,网上有人提出opc workshop库就简单很多,我千辛万苦终于找到一个05年版本的workshop库源 ...

  7. 基于第三方开源库的OPC服务器开发指南(1)——OPC与DCOM

    事儿太多,好多事情并不以我的意志为转移,原想沉下心好好研究.学习图像识别,继续丰富我的机器视觉库,并继续<机器视觉及图像处理系列>博文的更新,但计划没有变化快,好多项目要完成,只好耽搁下来 ...

  8. springboot开发浅谈 2021/05/11

    学习了这么久,本人希望有时间能分享一下,这才写下这篇浅谈,谈谈软件,散散心情. 这是本人的博客园账号,欢迎关注,一起学习. 一开始学习springboot,看了好多网站,搜了好多课程.零零落落学了一些 ...

  9. .NET项目开发—浅谈面向接口编程、可测试性、单元测试、迭代重构(项目小结)

    阅读目录: 1.开篇介绍 2.迭代测试.重构(强制性面向接口编程,要求代码具有可测试性) 2.1.面向接口编程的两个设计误区 2.1.1.接口的依赖倒置 2.1.2.接口对实体的抽象 2.2.迭代单元 ...

随机推荐

  1. SQL Server存储过程的删除方法

    SQL Server存储过程的删除方法使我们经常会用到的,下面就为您介绍扩展存储过程的删除方法,如果您对SQL Server存储过程方面感兴趣的话,不妨一看. --清除SQL Server所有的危险扩 ...

  2. HBase 入门笔记-数据落地篇

    一.前言 关于数据落地方面,HBase官网也有相关介绍.本文主要介绍一下实际工作中涉及的数据存储方面的一些经验和技巧,主要涉及表rowkey设计.数据落地方案 二.表设计 相对于MySQL等关系型数据 ...

  3. SCTF 2015 pwn试题分析

    Re1 是一个简单的字符串加密.程序使用了多个线程,然后进行同步.等加密线程加密好了之后才会启动验证线程.这个题比较坑的是IDA F5出来的结果不对,不知道是不是混淆机制. 刚开始看的是F5后的伪代码 ...

  4. CCF CSP 201709-3 JSON查询

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201709-3 JSON查询 问题描述 JSON (JavaScript Object Not ...

  5. explicit 显示的类型转换运算符

    C++提供了关键字explicit,可以阻止不应该允许的经过转换构造函数进行的隐式转换的发生.声明为explicit的构造函数不能在隐式转换中使用. 调用构造函数可以分为显示调用和隐式调用,当用赋值初 ...

  6. USACO 6.4 The Primes

    The PrimesIOI'94 In the square below, each row, each column and the two diagonals can be read as a f ...

  7. Django第一步

    对于一个web框架,掌握了三部分的内容,就可以说是迈出了第一步. 1. 准备开发环境 2. 创建一个工程,并运行 3. 开发hello world应用 1. 准备环境 首先应该是安装python和dj ...

  8. MyEclipse 10、9、8 添加jadClipse反编译插件

    jad是一个使用比较广泛的Java反编译软件,jadClipse是jad在eclipse下的插件,如何将jadclipse加入到MyEclipse10.X,9.X,8.X当中: http://nchc ...

  9. R语言实战(七)图形进阶

    本文对应<R语言实战>第11章:中级绘图:第16章:高级图形进阶 基础图形一章,侧重展示单类别型或连续型变量的分布情况:中级绘图一章,侧重展示双变量间关系(二元关系)和多变量间关系(多元关 ...

  10. iOS Sprite Kit教程之编写程序以及Xcode的介绍

    iOS Sprite Kit教程之编写程序以及Xcode的介绍 Xcode界面介绍 一个Xcode项目由很多的文件组成,例如代码文件.资源文件等.Xcode会帮助开发者对这些文件进行管理.所以,Xco ...