最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

opc学习资料

来源:动视网 责编:小OO 时间:2025-10-03 00:40:56
文档

opc学习资料

OPC(OLEforprocesscontrol)是一个工业标准。它是由一些世界上占领领先地位的自动化系统和硬件、软件公司和微软合作而建立的、满足开放性的和互操作性接口标准。OPC标准的建立基于微软的COM技术规范,并由OPC基金会这个国际组织管理。OPC为不同的厂商的硬件设备、软件和系统定义了公共的接口,使得过程控制和工厂自动化中的不同的系统、设备和软件之间能够互相连接、通信、操作。一般在控制系统中,包含过程画面的软件(如SCADA软件)在与现场设备通信的时常采用如下的方法:(1)采用标准通
推荐度:
导读OPC(OLEforprocesscontrol)是一个工业标准。它是由一些世界上占领领先地位的自动化系统和硬件、软件公司和微软合作而建立的、满足开放性的和互操作性接口标准。OPC标准的建立基于微软的COM技术规范,并由OPC基金会这个国际组织管理。OPC为不同的厂商的硬件设备、软件和系统定义了公共的接口,使得过程控制和工厂自动化中的不同的系统、设备和软件之间能够互相连接、通信、操作。一般在控制系统中,包含过程画面的软件(如SCADA软件)在与现场设备通信的时常采用如下的方法:(1)采用标准通
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,

Public CComCoClass       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客户端应用程序的C++实现 

在Visual C++或C++BUILDER环境中实现OPC客户应用程序,首先必须从OPC国际基金会官方网站下载OPC头文件("opcda_i.c"、"opcda.h" 、"opccomn_i.c"、"opccomn.h"),并在Visual C++工程的“Tool”→“Options”→“Directories”加载头文件。然后再进行登陆COM、连接服务器、数据读写等操作。在实际开发中,本文创建一个OPC通信类COPCComm,在需要通信的地方定义COPCComm类对象,然后进行相应的读写操作,其实现流程如图6所示: 

下面详细介绍通信类COPCComm的创建过程,并给出关键源代码: 

 1 创建OPCComm.h 

第一步:在OPCComm.h中预定义_WIN32_DCOM, 

#ifndef _WIN32_DCOM 

#define _WIN32_DCOM 

#endif 

包含如下头文件:"opcda_i.c"、"opcda.h"、 "opccomn_i.c"、"opccomn.h" 

第二步:申明Iunknown、IOPCServer、IOPCItemMgt、IOPCSyncIO等关键变量为公共变量(public): 

字串8 

IUnknown *pUnknown; 

IOPCServer *pServer; 

IOPCItemMgt *pOPCItemMgt; 

IOPCSyncIO *pOPCSync; 

HRESULT *pErrors; 

3.4.2创建OPCComm.cpp 

第一步:在构造函数COPCComm::COPCComm()中登录COM。 

函数CoInitislize()可以完成此功能。从函数CoGetMalloc()得到一个指向COM内存管理接口的指针。 

HRESULT rl; 

rl =CoInitialize(NULL); 

rl =CoGetMalloc(MEMCTX_TASK,&g_pIMalloc); 

第二步:添加函数HRESULT COPCComm::ConnectToServer(LPOLESTR ProgID, BOOL IsRemote, IUnknown **ppUnknown),并在函数中实现两个功能: 

(1) 将ProgID变换CLSID,每COM服务器有一个字符串类型的ProgID,通过它可以得到全球唯一CLISID。用CLSIDFromProgID()函数可以实现该转换。 

CLSID OPCCLSID; 

HRESULT hRet=CLSIDFromProgID(ProgID,&OPCCLSID); 

//如本系统中ProgID的值是“RSI.RSView 32OPCTagServer”。 

(2) 建立与OPC服务器的连接,CoCreateInstance()函数创建一个OPC Sever类实例,其CLSID值设定如下: 

hRet=CoCreateInstance(OPCCLSID,NULL,CLSCTX_LOCAL_SERVER,IID_IUnknown,(void **)ppUnknown); 

字串2 

return hRet; 

该段程序的结果是得到一个指向服务器对象Iunkown接口的指针变量ppUnknown。 

第三步:添加函数int COPCComm::Initial Communication(),并在函数中实现如下几步: 

(1) 请求其他接口指针: 

从Iunkown接口,通过QueryInterface()方法得到一个指向服务器对象IOPCSever接口的指针变量pServer: 

hRet=pUnknown->QueryInterface(IID_IOPCServer,(void **)&pServer);

// 得到一个指向服务器对象IOPCSVerser接口的指针(变量pServer)。 

(2) 创建OPC组, 

用IOPCSever接口方法AddGroup()实现: 

hRet=pServer->AddGroup(L"",TRUE,500,1235,&lTimeBias,&fTemp,0,&hOPCServerGroup, &dwActualRate,IID_IUnknown,&pUnknown);

// 创建一个有指向名称和属性的组。在返回的参数中,有一个指向所需要的进程组对象IOPCItemMgt接口的指针(变量pUnknown )。 

(3) 添加项:用IOPCItemMgt接口的AddItems()方法添加具有特殊属性的指定数量的项: 

hRet=pOPCItemMgt->AddItems(ItemNumber,ItemArray,(OPCITEMRESULT**)&pItemResult,(HRESULT **)&pErrors);

(4) 用OPC项执行所需的操作,本系统采用同步通信,就需要指向IOPCSyncIO接口指针。 

字串8 

hRet=pUnknown->QueryInterface(IID_IOPCSyncIO,(void **)&pOPCSync);

第四步:添加COPCComm::ReadFromRsview(int AIItemNumber, float fData【】),实现读取数据。 

HRESULT hRet; 

hRet=pOPCSync->Read(OPC_DS_CACHE, AIItemNumber, hServerAI, &pItemValue, &pErrors);

// OPC项的数据被送到客户程序的IadviseSink接口。 

for(int i=0;ifData【i】=V_R4(&pItemValue【i】.vDataValue); 

其中,AIItemNumber为一次读入数据的总个数,pItemValue为服务器保存数据的数组,fData为客户端读取数据的数组。 

第五步:添加COPCComm::WriteRsview(CString strSend, int iMark),实现数据写入。 

COleVariant WriteValue; 

HRESULT hRet; 

WriteValue = strSend;// strSend为待写的数据 

WriteValue.ChangeType(VT_R4); 

hRet=pOPCSync->Write(1, &hServerAO【iMark】, WriteValue, &pErrors); 

//写一个值,iMark表示执行器标号,可由用户自己定义。 

第六步:在析构函数~COPCComm()中销毁对象,释放内存,在程序停止运行之前,必须删除已创建的OPC对象并释放内存。 

pOPCSync->Release(); 字串9 

pOPCItemMgt->Release();

pServer->Release();

pUnknown->Release();

创建完通讯类后,则可以在需要通信的地方,调用相应的函数(方法)即可。 

4 结束语 

OPC规范把硬件供应系统和软件开发者分离开来,使得软件开发者不需要过多的了解硬件的实质和操作过程,只要遵循OPC规范进行开发,就可以访问OPC服务器的数据。本文介绍的VC++环境下的客户端应用程序,能够发挥OPC的最佳性能,完全满足过程控制领域对数据实时、高效的要求。

文档

opc学习资料

OPC(OLEforprocesscontrol)是一个工业标准。它是由一些世界上占领领先地位的自动化系统和硬件、软件公司和微软合作而建立的、满足开放性的和互操作性接口标准。OPC标准的建立基于微软的COM技术规范,并由OPC基金会这个国际组织管理。OPC为不同的厂商的硬件设备、软件和系统定义了公共的接口,使得过程控制和工厂自动化中的不同的系统、设备和软件之间能够互相连接、通信、操作。一般在控制系统中,包含过程画面的软件(如SCADA软件)在与现场设备通信的时常采用如下的方法:(1)采用标准通
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top