1、顾名思义,OPC是一种利用微软的COM/DCOM技术来达成自动化控制的协定,根据OPC Specification 的定义,OPC is a standard mechanism forcommunicating to numerous data sources,either devices on the factory floor,or a database in acontrol room.在现今的工业自动化中,我们需要一套整合的信息系统,由底层的各项装置采集信息(FieldManagement),中层的控制系统或图控应用程序进行程序的控制(Process Management),再由最上
2、层的整合软件将这些信息整合起来以供企业决策或效能提升,如下图所示:OPC 为硬件制造商与软件开发商提供了一条桥梁,透过硬件厂商提供的 OPC Server 接口,软件开发者不必考虑各项不同硬件间的差异,便可自硬件端取得所需的信息,所以软件开发者仅需专注于程序本身的控制流程的运作。此外,由于 COM/DCOM 实作并隐藏了网络的细节,透过 OPC 可以很容易地达成远程控制的理想。2.How does OPC work?在说明OPC Server/Client 运作方式之前,我们先简单介绍一下Microsoft 发展的COM/DCOM 是什么?COM 是一种发展软件组件的方法,所谓的软件组件,是指
3、一个可以提供应用程序、操作系统、以及其它组件服务的二进制可执行程序。事实上,发展自订的 COM 对象就好象是在建构一套可以动态执行的对象导向 API 一般。你可以在应用程序执行的时期随意拼上或移除所需要的组件。依据 COM 这样的概念,发展应用程序就像是堆积木一样,每一个 COM组件就是一块积木,你可以利用各式各样不同的积木,拼凑出你所需要的应用程序。在实作上,COM 透过一组一组的接口(Interface)提供服务,所有 COM组件的使用者,都必须透过这些 Interface 来使用组件提供的功能。OPC 的规格中便定义了许多 OPCServer 应该提供的 Interface,要撰写一个
4、OPC Server 的 COM 组件,你必须在你的组件中加入这些接口,并提供它们的实作,Client 便可以透过这些接口,操作连接到 OPC Server的硬件装置,这也就是 OPC Server/Client 运作的方式。以下的图标可以让这样的概念更清晰。3.OPC Server 架构如前面所述,OPC Server 透过一组一组的接口提供服务,不过在实作的架构上,OPC Server共分为三层:分别是 OPCServer,OPCGroup,OPCItem其中每一个 OPCItem 对应到一个实际的硬件装置上的某一个 channel 或 port;每一个OPCGroup 则包含了许多的 O
5、PCItem,同时并定义这些 OPCItem 更新的时间、方式,以及提供读取 OPCItem 值的接口;而每一个 OPCServer 则包含若干个 OPCGroup,同时提供操作这些 OPCGroup 的接口。下图可以较清楚地说明 OPCServer/OPCGroup/OPCItem 间的关系:4.OPC Custom Interface接下来的这一节,我们将讨论 OPC Serve 的重点,也就是每一组接口的定义,以及它所提供的功能。OPCServer 提供的接口:IOPCCommonHRESULT SetLocaleID(dwLcid)设定位置信息HRESULT GetLocaleID(p
6、dwLcid)取得位置信息HRESULT QueryAvailableLocaleIDs(pdwCount,pdwLcid)查询可用的位置IDHRESULT GetErrorString(dwError,ppString)取得错误信息字符串HRESULT SetClientName(szName)设定Clinet的名称IOPCServerHRESULT AddGroup(szName,bActive,dwRequestedUpdateRate,hClientGroup,pTimeBias,pPercentDeadband,dwLCID,phServerGroup,pRevisedUpdateR
7、ate,riid,ppUnk)新 增 一 个OPCGroupHRESULT GetErrorString(dwError,dwLocale,ppString)取得错误信息字符串HRESULT GetGroupByName(szName,riid,ppUnk)依据名称取得OPCGroup 的介面HRESULT GetStatus(ppServerStatus)取得 OPCServer的状态信息HRESULT SetClientName(szName)设定Clinet的名称RemoveGroup(hServerGroup,bForce)移除一个OPCGroupHRESULT CreateGroup
8、Enumerator(dwScope,riid,ppUnk)产生一个OPCGroup 列举器IConnectionPointContainerHRESULT EnumConnectionPoints(IEnumConnectionPoints ppEnum)列举所有的 ConnectionPointsHRESULT FindConnectionPoint(REFIID riid,IConnectionPoint ppCP)找出一个 ConnectionPointIOPCItemPropertiesHRESULTQueryAvailableProperties(szItemID,pdwCount
9、,ppPropertyIDs,ppDescriptions,ppvtDataTypes);查询可用的 OPCItem属性HRESULT GetItemProperties(szItemID,dwCount,pdwPropertyIDs,ppvData,ppErrors)取得OPCItem 的属性HRESULT LookupItemIDs(szItemID,dwCount,pdwPropertyIDs,ppszNewItemIDs,ppErrors)使用名称查询OPCItem 的 IDIOPCBrowseServerAddressSpace(optional)HRESULT QueryOrgan
10、ization(pNameSpaceType)查询组织名称HRESULT ChangeBrowsePosition(dwBrowseDirection,szString)变更浏览的位置HRESULTBrowseOPCItemIDs(dwBrowseFilterType,szFilterCriteria,vtDataTypeFilter,dwAccessRightsFilter,ppIEnumString)浏览 OPCServer 內所有定义的 OPCItemHRESULT GetItemID(szItemDataID,szItemID)取得 OPCItem 的 IDHRESULT Browse
11、AccessPaths(szItemID,ppIEnumString)浏览存取OPCItem 的路径OPCGroup Object 提供的介面IOPCGroupStateMgtHRESULT GetState(pUpdateRate,pActive,ppName,pTimeBias,pPercentDeadband,PLCID,phClientGroup,phServerGroup)取得OPCGroup的状态即设定信息HRESULTSetState(pRequestedUpdateRate,pRevisedUpdateRate,pActive,pTimeBias,pPercentDeadban
12、d,PLCID,phClientGroup)设定OPCGroup 的状态信息HRESULT SetName(szName)设定OPCGroup的名称HRESULT CloneGroup(szName,riid,ppUnk)复制一个OPCGroupIOPCSyncIOHRESULT Read(dwSource,dwCount,phServer,ppItemValues,ppErrors);以同步方式读取OPCGroup内的OPCItem(s)的值HRESULT GetItemProperties(szItemID,dwCount,pdwPropertyIDs,ppvData,ppErrors)取
13、得OPCItem 的属性HRESULT Write(dwCount,phServer,pItemValues,ppErrors)以同步方式将值写入OPCGroup內的 OPCItem(s)IOPCAsyncIO2HRESULT Read(dwCount,phServer,dwTransactionID,pdwCancelID,ppErrors,)以非同步方式读取OPCGroup内的OPCItem(s)的值,值会在读取硬件的动作结束后以callback的形式传回HRESULTSetState(pRequestedUpdateRate,pRevisedUpdateRate,pActive,pTim
14、eBias,pPercentDeadband,PLCID,phClientGroup)设定OPCGroup的状态信息HRESULT Write(dwCount,phServer,pItemValues,dwTransactionID,pdwCancelID,ppErrors)以非同步方式将值写入OPCGroup内的OPCItem(s)HRESULT Cancel2(dwCancelID)取消前一次的非同步读取/写入HRESULT Refresh2(dwSource,dwTransactionID,pdwCancelID)更 新OPCGroup內OPCItem(s)的值HRESULT SetEn
15、able(bEnable)将 OPCGroup 设为 EnableHRESULT GetEnable(pbEnable)传回 OPCGroup 是否为 EnableIOPCItemMgtHRESULT AddItems(dwCount,pItemArray,ppAddResults,ppErrors);在 OPCGroup 内 新 增OPCItem(s)HRESULT ValidateItems(dwCount,pItemArray,bBlobUpdate,ppValidationResults,ppErrors)检查OPCItem(s)的名称是否可用HRESULT RemoveItems(d
16、wCount,phServer,ppErrors)移除OPCGroup 內的 OPCItem(s)HRESULT SetActiveState(dwCount,phServer,bActive,ppErrors)高定 OPCItem(s)是否为AvtiveHRESULT SetClientHandles(dwCount,phServer,phClient,ppErrors)设 定OPCItem(s)的handleHRESULT SetDatatypes(dwCount,phServer,pRequestedDatatypes,ppErrors)设定OPCItem(s)的数据类型HRESULT CreateEnumerator(riid,ppUnk)产生OPCItems的列举器IConnectionPointContainerHRESULT EnumConnectionPoints(IEnumConnectionPoin
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1