这里主要讨论的是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. python软件依赖关系

    caffe:numpy,scikit-image opencv:numpy

  2. OA项目Spring.Net代替抽象工厂(三)

    Servrvice层的代码: <?xml version="1.0" encoding="utf-8" ?> <objects xmlns=& ...

  3. Rookey.Frame v1.0 视频教程之三发布-框架核心思想介绍

    本期发布视频: (三)Rookey.Frame v1.0框架核心思想 介绍了Rookey.Frame v1.0框架搭建的核心思想,将框架核心思想理解清楚,对框架运行就会得心应手 官方视频教程: htt ...

  4. 关于 eclipse启动卡死的问题 解决方法

    关于 eclipse启动卡死的问题(eclipse上一次没有正确关闭,导致启动的时候卡死错误解决方法),自己常用的解决方法: 方案一(推荐使用,如果没有这个文件,就使用方案二): 到<works ...

  5. 设置Loadrunner负载机临时文件目录

    设置Loadrunner负载机临时文件目录 最近在跑稳定性测试 3 X 24小时的时候,发现负载机产生的日志还运行记录等等竟然有100多G! C盘空间不足,但是D盘还有700多G空间呢,怎么让临时文件 ...

  6. js javascript 原型链详解

    看了许多大神的博文,才少许明白了js 中原型链的概念,下面给大家浅谈一下,顺便也是为了巩固自己 首先看原型链之前先来了解一下new关键字的作用,在许多高级语言中,new是必不可少的关键字,其作用是为了 ...

  7. Graphviz 在 Windows 10 下 的 安装 Bug 解决方案

    报错: 解决方法: 参考:stackoverflow

  8. CTF实验吧让我进去writeup

    初探题目 两个表单,我们用burp抓包试试 这时候我们发现Cookie值里有个很奇怪的值是source,这个单词有起源的意思,我们就可以猜测这个是判断权限的依据,让我们来修改其值为1,发送得到如下显示 ...

  9. Kubernetes1.3:POD生命周期管理

    转:http://blog.csdn.net/horsefoot/article/details/52324830 (一)  核心概念 Pod是kubernetes中的核心概念,kubernetes对 ...

  10. python2.7 关于打印中文的各种方法

    目录 str类型的中文 第一种姿势:逐个打印 第二种姿势: json dumps 第三种姿势: repr string_escape 第四种姿势:PEP3140 unicode类型的中文 当str与u ...