+发表新主题
heavenfang 发布于2007-2-23 10:01 0 次浏览 0 位用户参与讨论
跳转到指定楼层
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规范都在不断的发展壮大之中,通过这些技术的掌握和运用,我们可以实现开放性好、兼容性强、配置方便的分布式控制系统
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ| Archiver|手机版|小黑屋| 碧波制图网 Stonespider

Copyright © 2021-2023 Kangli Wu   All Rights Reserved.

Powered by Discuz! X3.5( 苏ICP备18011607号-1 )

快速
回复
返回
列表
返回
顶部