这里主要讨论的是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. 洛谷P1972 HH的项链

    传送门啦 分析: 题目描述不说了,大意是,求一段区间内不同元素的种数. 看到区间,我们大概先想到的是暴力(然后炸掉).线段树.树状数组.分块. 下面给出的是一种树状数组的想法. 首先,对于每一段区间里 ...

  2. 20165203实验四 Andriod程序设计

    20165203实验四 Andriod程序设计 实验内容 安装 Android Stuidio 学习Android Stuidio调试应用程序 实验要求 1.没有Linux基础的同学建议先学习< ...

  3. Web安全漏洞深入分析及其安全编码

    摘自:http://blog.nsfocus.net/web-vulnerability-analysis-coding-security/ 超全Web漏洞详解及其对应的安全编码规则,包括:SQL注入 ...

  4. Java 中的三大特性

    我们都知道 Java 中有三大特性,那就是继承 ,封装和多态 .那我今天我就来说说这几个特性 . 老样子 ,先问问自己为什么会存在这些特性 .首先说封装 ,封装就是使用权限修饰符来实现对属性的隐藏 , ...

  5. bzoj——2127: happiness

    2127: happiness Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 2570  Solved: 1242[Submit][Status][D ...

  6. 为什么要使用String

    最近在培训课期间指导初学者.任务之一就是要大家完成一个类,要求这个类对key为String类型的map执行dwarwle操作.其中一位学员完成的类中,有如下方法: void dwarwle(HashM ...

  7. 深入理解ajax系列第七篇

    前面的话 虽然ajax全称是asynchronous javascript and XML.但目前使用ajax技术时,传递JSON已经成为事实上的标准.因为相较于XML而言,JSON简单且方便.本文将 ...

  8. android studio 汉化包 美化包

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 汉化包 百度云盘 下载地址:https://pan.baidu.com/s/1pLjwy ...

  9. Failed to resolve: com.android.support:design:25.4.0

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 错误:(27, 13) Failed to resolve: com.android.s ...

  10. luogu NOIp热身赛(2018-11-07)题解

    为什么前面的人都跑得那么快啊? QAQ T1:区间方差 题目大意:询问区间方差,支持单点修改 首先把方差的式子展开,得到 $$d = \frac{a_1 + ... a_n}{n} - \frac{a ...