come from:

http://www.chint.net/bbs/dispbbs.asp?Boardid=4&ID=50915&replyID=315788&skin=1

 OPC及OPC服务器的设计与实现
OPC及OPC服务器的设计与实现
                         _______OPCAnd Design&Implementation of OPC Server
引言 
   OPC(OLE for  process  control)是一个工业标准。它是由一些世界上占领领先地位的自动化系统和硬件、软件公司和微软合作而建立的、满足开放性的和互操作性接口标准。OPC标准的建立基于微软的COM技术规范,并由OPC基金会这个国际组织管理。OPC为不同的厂商的硬件设备、软件和系统定义了公共的接口,使得过程控制和工厂自动化中的不同的系统、设备和软件之间能够互相连接、通信、操作。
一般在控制系统中,包含过程画面的软件(如SCADA软件)在与现场设备通信的时常  
  采用如下的方法:
  (1)采用标准通信协议,如profibus、modbus、HART、CAN总线等,因为监控管理软件与现场的设备采用同样的通信协议,所以,监控管理软件不需要对现场设备的驱动程序。
  (2)对于没有采用标准通信协议的设备,监控管理软件需要在设备制造商的配合下为这些设备开发驱动程序。这种方式虽然执行效率比较高,但兼容性差,软件供应者必须对没一种接入的设备开发驱动程序,设备制造商也必须提供设备的通信协议。
  (3)通过OPC这个开放性的协议和过程控制或其他系统软件进行通信。这种方式的优点在于:不管硬件设备是否使用标准的通信协议,制造商只需要提供一套OPC服务器,就可以支持大部分的监控等软件,也不需要将自己的通信协议细节提供给软件商。
   OPC服务器的设计和实现
   目前的小型DCS控制系统使用了OPC服务器后,实现了对主流的监控软件(一般都有OPC接口)的兼容性,监控软件等OPC客户程序可以很方便的访问和设置DCS中的数据。
OPC服务器需要实现的主要功能就是根据控制系统的组态信息,实现OPC服务器对象、组对象等,并通过OPC驱动程序实现与DCS系统中主控器的通信,获得现场数据或设置现场数据项等。
   OPC服务器软件主要分为OPC服务器对象模块、服务器界面模块和OPC驱动程序模块,三个模块通过同一块主内存数据区来共享数据,通过线程的同步和互斥等技术的使用,可以解决共享数据的保护问题。下面简单介绍一下各个模块的功能:
  (1) 服务器界面模块
 服务器界面程序主要根据组态信息完成OPC Group对象和OPC Item对象的添加,并采用树型结构浏览查看内存数据区中的数据项(TAG),如数字量信号输入卡的输入信号等。
  (2) OPC驱动程序模块
 OPC驱动程序主要通过TCP/IP协议与多台主控制器的通信来实现OPC服务器的驱动部分(通过对驱动程序的替换,可以实现对其他产品的OPC服务器)。
   (3)OPC服务器对象模块
     OPC服务器对象模块是OPC服务器程序与OPC客户程序的交互部分,主要依靠OPC基金会的数据存取规范来实现。一般需要实现OPCserver、OPCGroup、EnumOPCItemAttributes等对象,其中OPCServer对象需要实现IOPCCommon、IOPCServer、IOPCItemProperties、IconnectionPointContaniner等接口的方法;OPCGroup对象需要实现IOPCSyncIO、IOPCGroupStateMgt、     
IOPCAsyncIO2、IOPCItemgt、IconnectionPointContainer等接口方法;EnumOPCItenAttributes需要实现IEnumOPCItemAttributes接口的方法。接口方法的原型参照OPCDa.idl中的定义。
   在对OPC服务器和客户端的开发中使用IDE的是  Microsoft  VisualC++,其中OPCServer对象、OPCGroup对象等COM组件的定义和实现运用了微软的ATL(Active Template Library活动摸板库)技术。
   下面的这一段代码示范了OPC服务器IOPCServer接口GetStarus()方法的访问(客户端可以通过GetStarus方法获得服务器开始工作的时间、更新、名称等信息)。
OPC客户程序:
{………….
  CoInitialize(NULL);   //初始化COM环境
   ……..             //略
  IOPCServer       *pSvr=null;   //定义IOPCSERVER接口指针
  HRESULT  hr=CoCreateInstance(CLSID-OPCServer,NULL,CLSCTX-ALL,
                                  IID-IOPCServer,(void**)&pSvr);
   //备注:OPCDa2.0可以通过IOPCServer调用OPCServerList获得OPCserver的CLSID
   OPCSERVERSTATUS*pServerStaus;   //定义OPCServer状态的结构
  PSvr->GetStaus(&pServerStaus);       //获得OPCserver返回的状态
  …………
  pSvr->Relese();                     //释放IOPCServer接口指针
  Couninitialize();                     //结束COM环境
  }
  OPC服务器程序:
 Class ATL-NO-VTABLE COPCserver:
      Public CcomObjectRootEx<CcomSingleThreadModel>,
      Public CComCoClass<CmeSvr,&CLSID-MeSvr,
      Public IOPCServer……//定义OPCServer
  {………
  STDMETHOD(GetStatus)(OPCSERVERSTATUS**ppServerStatus)
 {
   if (PPServerStatus==NULL)
    return E-INVALIDARG;   //错误的调用
  OPCSERVERSTATUS*ppServerStdus;  //定义OPCServer状态的结构
  PServerStatus=(OPCSERVERSTATUS*)pM->Alloc(OPCSERVERSTATUS)); //分配内存
  If(pServerStatus)
{
   pServerStatus->szVendorInfo=VendouInf;  //制造商信息
  pServerStatus->ftStartTime=svrStartTime;  //OPCserver开始工作时间
  CoFileTimeNow(&ServerStatus->ftCurrentTime;  //当前时间
  PServerstatus->ftLastUpdateTime=m-LastUpdate;  //最近更新时间
  PServerstatus->dwServerStatus=OPC-STATUS-RUNNING;  //OPCserver状态
  PServerstatus->deGroupCount=0;  //OPCserver中Group个数
  PServerstatus->dwBandWidth=0;   //带宽
  PServerstatus->wMajorVersion=0;  //版本信息
  PServerstatus->wMinorVersion=0;  //版本信息
  PServerstatus->wBuildNumber=0;  //版本信息
  PserverStatus->wReserved=11;     //保留位
  *ppServerstatus=pServerStatus;    //向OPCCClient返回OPCServer状态
  returen S-OK;   //OPCClient调用成功
                    }
  return E-OUTOFMEMORY;   //内存不够
        }
           ………. //略
                 }
   通过上面这个例子,可以了解到OPC客户程序OPC服务器程序的调用过程,即OPC服务器程序定义了COPCServer这个COM组件,继承了IOPCserver接口并实现了该接口的GetStatus()方法。OPC客户程序获得IOPCserver接口指针后,通过对GetStatus()方法的调用获得OPC服务器的工作状态,类似地,通过对OPC规范中定义的其他的必要借口(Required Interface)的实现,就可以:即插即用“的将设备集成到各种符合OPC规范的系统或应用中去。
  硬件设备通过OPC服务器可以规范地、以独立于协议的方式与客户进行通信,极大地提高了控制系统的互连和互操作性。同时COM、OPC规范都在不断的发展壮大之中,通过这些技术的掌握和运用,我们可以实现开放性好、兼容性强、配置方便的分布式控制系统

OPC及OPC服务器的设计与实现相关推荐

  1. OPC与OPC UA

    什么是OPC协议? 为了便于自动化行业不同厂家的设备和应用程序能相互交换数据,定义了一个统一的接口函数,就是OPC协议规范.有了OPC就可以使用统一的方式去访问不同设备厂商的产品数据. OPC基金会前 ...

  2. OPC协议解析-OPC UA OPC统一架构(转载)

    1    什么是OPC UA 为了应对标准化和跨平台的趋势,为了更好的推广OPC,OPC基金会近些年在之前OPC成功应用的基础上推出了一个新的OPC标准-OPC UA.OPC UA接口协议包含了之前的 ...

  3. 总体设计和登陆服务器 [游戏服务器的设计思路 转]

    作者博客: http://blog.csdn.net/yahle 大纲: 项目的历史背景 服务器的设计思路 服务器的技术 服务器的设计 服务器的改进 图形引擎myhoho及UI库的设计 客户端与服务器 ...

  4. linux 毕业设计 apache,毕业论文基于Linux的Apache服务器的设计与设计6喜欢就下吧...

    <[毕业论文]基于Linux的Apache服务器的设计与设计.doc>由会员分享,可免费在线阅读全文,更多与<毕业论文基于Linux的Apache服务器的设计与设计(6)(喜欢就下吧 ...

  5. 基于JAVA服务器监控系统设计,远程数字图像监控系统中web服务器的设计与实现...

    摘要: 数字图像监控系统在目前处于小规模发展阶段,系统的核心是监控服务器.在一些小规模的应用中,监控服务器同时还充当着监控终端的角色.但是,大部分监控系统都没有考虑用户权限.安全性.收费模式等方面的问 ...

  6. 服务器开发设计之算法宝典

    作者:lynhlzou,腾讯 IEG 后台开发工程师 孙子云:"上兵伐谋,其次伐交,其次伐兵,其下攻城",最上乘行军打仗的方式是运用谋略,下乘的方式才是与敌人进行惨烈的厮杀.同样的 ...

  7. 升讯威微信营销系统开发实践:(3)中控服务器的设计 .Net 还是 Java?

    在上一篇文章中,简要介绍了升讯威微信营销系统的功能设计和架构设计,限于篇幅只能抛砖引玉,从本章节开始将围绕功能的设计和架构的设计进行详细的论述. 中控服务器的设计 在上文中,我们谈到需要一个中控服务器 ...

  8. 算法属于计算机服务还是软件,第06讲 服务器软件设计的算法和问题

    第06讲 服务器软件设计的算法和问题 本文由Richard007_lin贡献 ppt1. <计算机通信与网络编程> 计算机通信与网络编程> 第六讲 服务器软件设计的算法和问题 电子科 ...

  9. gpu超算算法_英伟达推GPU加速Arm服务器参考设计!微软Azure启动GPU超算实例

    芯潮(ID:aichip001)文 | 韦世玮 芯潮11月20日消息,昨天,英伟达在2019国际超级计算大会(SC19)上推出用于构建GPU加速Arm服务器的参考设计,以及用于优化网络和存储数据处理的 ...

最新文章

  1. spring注解@Component、@Repository、@Service、@Controller
  2. Zero Copy 简介
  3. Python数据库字段拆分数据
  4. POJ 2389 Bull Math(水~Java -大数相乘)
  5. MySQL外键创建失败1005原因总结
  6. 断言assert使用方法
  7. java关机命令收集cmd关机命令
  8. 严肃贴:内幕 手机行业
  9. SAP License:BW用户删除或禁用报错
  10. python多态(一分钟读懂)
  11. Git命令之查看及设置用户名邮箱
  12. mysql查询top5_MySQL常用函数TOP5
  13. Android Scroller 滑动机制
  14. 最新Oracle官网JDK 8.0的下载
  15. 计算机绘图课程选用课本,机械制图与计算机绘图 机械制图与计算机绘图 机械制图与计算机绘图课程标准.doc...
  16. Python+Selenium多线程基础微博爬虫
  17. Python 解决报错NameError: name ‘LEFT‘ is not defined
  18. Mybatis源码阅读(二)
  19. Hive数据仓库数据分析
  20. 手撕promise.all以及promise.race

热门文章

  1. Java虚拟机学习集锦是我攒来的,【备战秋招冲击大厂(1)
  2. MATLAB 中nargin函数
  3. 网络组建大全(包括企业网、校园网、网吧和基础知识)(转)
  4. MATLAB app 实现音乐播放器
  5. 利用QT加C++语言如何计算MACD指标,并请给出示例代码
  6. Delphi D10 StringGrid安卓下虚拟键盘的使用
  7. 当clipper遇到重复裁剪框
  8. SurFS:共享式和分布式集群各取所长
  9. flutter1.9升级flutter2.0错误整理
  10. 使用SPSS进行多元回归分析