大家用电脑更新有出现天龙功放接网络问题传接问题吗

OPC Server_百度百科
OPC Server
本词条缺少名片图,补充相关内容使词条更完整,还能快速升级,赶紧来吧!
OPC是OLE for Process Control的缩写。顾名思义,OPC是一种利用微软的COM/DCOM技术来达成的协定,根据OPC Specification 的定义,OPC is &a standard mechanism for communicating to numerous data sources, either devices on the factory floor, or a database in a control room.&
OPC Server简介
在现今的工业自动化中,我们需要一套整合的信息系统,由底层的各项装置采集信息 (Field Management),中层的控制系统或图控应用程序进行程序的控制 (Process Management),再由最上层的整合软件将这些信息整合起来以供企业决策或效能提升,如下图所示:
OPC 为硬件制造商与软件开发商提供了一条桥梁,透过硬件厂商提供的 OPC Server 接口,软件开发者不必考虑各项不同硬件间的差异,便可自硬件端取得所需的信息,所以软件开发者仅需专注于程序本身的控制流程的运作。此外,由于 COM/DCOM 实作并隐藏了网络的细节,透过 OPC 可以很容易地达成的理想。
OPC ServerOPC原理
在说明 OPC Server/Client 运作方式之前,我们先简单介绍一下 Microsoft 发展的 COM/DCOM 是什么?
COM 是一种发展的方法,所谓的软件组件,是指一个可以提供应用程序、操作系统、以及其它的二进制可执行程序。事实上,发展自订的 COM 对象就好象是在建构一套可以动态执行的对象导向 API 一般。你可以在应用程序执行的时期随意拼上或移除所需要的组件。依据 COM 这样的概念,发展应用程序就像是堆积木一样,每一个 COM 组件就是一块积木,你可以利用各式各样不同的积木,拼凑出你所需要的应用程序。
在实作上,COM 透过一组一组的接口 (Interface) 提供服务,所有 COM 组件的使用者,都必须透过这些 Interface 来使用组件提供的功能。OPC 的规格中便定义了许多 OPC Server 应该提供的 Interface,要撰写一个 OPC Server 的 COM 组件,你必须在你的组件中加入这些接口,并提供它们的实作,Client 便可以透过这些接口,操作连接到 OPC Server 的硬件装置,这也就是 OPC Server/Client 运作的方式。以下的图标可以让这样的概念更清晰。
OPC ServerOPC Server 架构
如前面所述,OPC Server 透过一组一组的接口提供服务,不过在实作的架构上,OPC Server 共分为三层:分别是 OPCServer, ,
其中每一个 OPCItem 对应到一个实际的硬件装置上的某一个 channel 或 port;每一个 OPCGroup 则包含了许多的 OPCItem,同时并定义这些 OPCItem 更新的时间、方式,以及提供读取 OPCItem 值的接口;而每一个 OPCServer 则包含若干个 OPCGroup,同时提供操作这些 OPCGroup 的接口。
下图可以较清楚地说明 OPCServer//OPCItem 间的关系:
OPC ServerOPC 定制接口
接下来的这一节,我们将讨论 OPC Server 的重点,也就是每一组接口的定义,以及它所提供的功能。
OPCServer 提供的接口:
IOPCCommon
HRESULT SetLocaleID ( dwLcid ) 设定位置信息
HRESULT GetLocaleID ( pdwLcid ) 取得位置信息
HRESULT QueryAvailableLocaleIDs ( pdwCount, pdwLcid ) 查询可用的位置ID
HRESULT GetErrorString ( dwError, ppString) 取得错误信息字符串
HRESULT SetClientName (szName)设定Client的名称
IOPCServer
HRESULT AddGroup(szName, bActive, dwRequestedUpdateRate, hClientGroup, pTimeBias, pPercentDeadband, dwLCID, phServerGroup, pRevisedUpdateRate, riid, ppUnk) 新增一个
HRESULT GetErrorString(dwError, dwLocale, ppString) 取得错误信息字符串
HRESULT GetGroupByName(szName, riid, ppUnk) 依据名称取得OPCGroup 的介面
HRESULT GetStatus(ppServerStatus) 取得 OPCServer的状态信息
HRESULT SetClientName (szName)设定Clinet的名称RemoveGroup(hServerGroup, bForce)移除一个
HRESULT CreateGroupEnumerator(dwScope, riid, ppUnk) 产生一个OPCGroup 列举器
IConnectionPointContainer
HRESULT EnumConnectionPoints( IEnumConnectionPoints ppEnum) 列举所有的 Connection Points
HRESULT FindConnectionPoint( REFIID riid, IConnectionPoint ppCP)找出一个 Connection Point
IProperties
HRESULT QueryAvailableProperties(szItemID, pdwCount,ppPropertyIDs, ppDescriptions, ppvtDataTypes ); 查询可用的 OPCItem属性
HRESULT GetItemProperties (szItemID, dwCount, pdwPropertyIDs,ppvData, ppErrors ) 取得
HRESULT LookupItemIDs( szItemID, dwCount, pdwPropertyIDs,ppszNewItemIDs, ppErrors )使用名称查询OPCItem 的 ID
IOPCBrowseServerAddressSpace (optional)
HRESULT QueryOrganization(pNameSpaceType )查询组织名称
HRESULT ChangeBrowsePosition(dwBrowseDirection, szString )变更浏览的位置
HRESULT BrowseIDs( dwBrowseFilterType, szFilterCriteria, vtDataTypeFilter, dwAccessRightsFilter, ppIEnumString )浏览 OPCServer 内所有定义的 OPCItem
HRESULT GetItemID( szItemDataID, szItemID ) 取得 OPCItem 的 ID
HRESULT BrowseAccessPaths( szItemID, ppIEnumString )浏览存取 的路径
Object 提供的介面
IOPCGroupStateMgt
HRESULT GetState(pUpdateRate, pActive, ppName, pTimeBias, pPercentDeadband, pLCID, phClientGroup, phServerGroup)取得OPCGroup的状态即设定信息
HRESULT SetState(pRequestedUpdateRate, pRevisedUpdateRate, pActive, pTimeBias, pPercentDeadband, pLCID, phClientGroup)设定 的状态信息
HRESULT SetName(szName)设定OPCGroup的名称
HRESULT CloneGroup(szName, riid, ppUnk) 复制一个OPCGroup
IOPCSyncIO
HRESULT Read(dwSource, dwCount, phServer, ppItemValues, ppErrors); 以同步方式读取内的(s) 的值
HRESULT GetItemProperties (szItemID, dwCount, pdwPropertyIDs,ppvData, ppErrors ) 取得 OPCItem 的属性
HRESULT Write(dwCount, phServer, pItemValues, ppErrors) 以同步方式将值写入OPCGroup 内的 OPCItem(s)
IOPCAsyncIO2
HRESULT Read(dwCount, phServer, dwTransactionID, pdwCancelID, ppErrors,) 以非同步方式读取内的(s)的值,值会在读取硬件的动作结束后以callback的形式传回
HRESULT SetState(pRequestedUpdateRate, pRevisedUpdateRate, pActive, pTimeBias, pPercentDeadband, pLCID, phClientGroup)设定OPCGroup的状态信息
HRESULT Write(dwCount, phServer, pItemValues, dwTransactionID, pdwCancelID, ppErrors)以非同步方式将值写入OPCGroup内的(s)
HRESULT Cancel2 (dwCancelID) 取消前一次的非同步读取/写入
HRESULT Refresh2(dwSource, dwTransactionID, pdwCancelID) 更新
内 OPCItem(s) 的值
HRESULT SetEnable(bEnable) 将 OPCGroup 设为 Enable
HRESULT GetEnable(pbEnable) 传回 OPCGroup 是否为 Enable
IOPCItemMgt
HRESULT AddItems(dwCount, pItemArray, ppAddResults, ppErrors); 在OPCGroup内新增OPCItem(s)
HRESULT ValidateItems(dwCount, pItemArray, bBlobUpdate, ppValidationResults, ppErrors)检查(s)的名称是否可用
HRESULT RemoveItems(dwCount, phServer, ppErrors) 移除 内的 OPCItem(s)
HRESULT SetActiveState(dwCount, phServer, bActive, ppErrors) OPCItem(s)是否为Avtive
HRESULT SetClientHandles(dwCount, phServer, phClient, ppErrors)设定 (s) 的 handle
HRESULT SetDatatypes(dwCount, phServer, pRequestedDatatypes, ppErrors) 设定OPCItem(s)的数据类型
HRESULT CreateEnumerator(riid, ppUnk)产生OPCItems的列举器
IConnectionPointContainer
HRESULT EnumConnectionPoints( IEnumConnectionPoints ppEnum)列举所有的 Connection Points
HRESULT FindConnectionPoint( REFIID riid, IConnectionPoint ppCP)找出一个Connection Point
OPC Server结论
OPC Server/Client 是一套利用微软的 COM/DCOM 技术达成工业自动化资料取得的架构。OPC Server 提供了许多的接口,Client 端通过这些接口,可以取得与 OPC Server 相连的硬件装置的信息,而无须了解这些硬件装置的细节信息。也就是说,程序设计者可以使用相同的程序代码,操作不同的硬件装置,充分达成 software reuse 的理想。同时,由于 COM/DCOM 已实作了网络部分的细节,也使得 Client 对 OPC Server 进行非常容易,使程序设计者很容易地达成的目标。开发opcserver教程
一.准备工作:
下载opc基金会的OPC
Proxy DLL然后按照说明进行安装。这些动态库是opc程序运行所必须的。
将下列文件拷贝至要运行OPC服务器和OPC客户端的机器上的SYSTEM32目录下
&&&&&&&&&&&&&
copy opcproxy.dll C:\WINDOWS\system32
&&&&&&&&&&&&&
copy opccomn_ps.dll C:\WINDOWS\system32
&&&&&&&&&&&&&
copy opc_aeps.dll C:\WINDOWS\system32
&&&&&&&&&&&&&
copy opchda_ps.dll C:\WINDOWS\system32
&&&&&&&&&&&&&
copy aprxdist.exe C:\WINDOWS\system32
&&&&&&&&&&&&&
copy opcenum.exe C:\WINDOWS\system32
&&&&&&&&&&&&&
REGSVR32 opcproxy.dll
&&&&&&&&&&&&&
REGSVR32 opccomn_ps.dll
&&&&&&&&&&&&&
REGSVR32 opc_aeps.dll
&&&&&&&&&&&&&
REGSVR32 opchda_ps.dll
如果在windows
系统(\WINDOWS
\system32)目下不存在actxprxy.dll,运行aprxdist.exe
opcenum.exe
&&&&&&&&&&&&&
opcenum /regserver
二.opcserver开发
新建vc工程。比如建一个控制台工程。在工程中包含如下头文件
#include "opcda.h"
#include "opc_ae.h"
#include "WTOPCsvrAPI.h"
#include "WtOPCsvrEXTapi.h"
以上头文件在例子程序中都能找到,拷贝到自己的工程下。
WTOPCsvrAPI.h是开发包动态库提供的导出函数文件。里面有每个函数的具体说明,调用的时候看一下说明。
在.cpp中定义一个GUID这个guid是用来标识opcserver的唯一id可以通过操作系统的工具生成,也可以编一个。格式如下。
const GUID
CLSID_OPCSimSvr = {0x99b8f472, 0xc037, 0x11d2,
{0x80, 0xb8, 0x0, 0x60, 0x97, 0x58, 0x58, 0xbe}};
在工程中加入对WtOPCSvr动态库的连接。
WTOPCsvr动态库的有关文件都在之前的例子包里面能找到。
WTOPCsvr.lib WTOPCsvr.dll是对应lib和dll
(1)调用UpdateRegistry()函数完成注册。下面是一个调用参考例子代码
BOOL COPCSimSvrApp::InitInstance()
szTokens[] = _T("-/ ");
CString HelpP
CString& SvrName,
HelpPath =
AfxGetApp()-&m_pszHelpFileP
i = HelpPath.ReverseFind('\\');
HelpPath = HelpPath.Left(i+1);
HelpPath +=
"OPCSIMSVR.EXE";&&&&&&&&&&&&&
// Self-Registration code
// (look for cmdline options to register &
unregister server)
SvrName = "WinTECH.OPCServer";
SvrDescrip = "WinTECH Software OPC Server
Simulator";
CString tempCmdLine(m_lpCmdLine);
LPTSTR lpszToken =
_tcstok(tempCmdLine.GetBuffer(1), szTokens);
while (lpszToken != NULL)
if (_tcsicmp(lpszToken, _T("UnregServer"))==0)
&&&&&&&&&&&&&&
&&&&&&&&&&&&&&
UnregisterServer ((BYTE *)&CLSID_OPCSimSvr,
&&&&&&&&&&&&&&
return (FALSE);
&&&&&&&&&&&&&&
else if (_tcsicmp(lpszToken, _T("RegServer"))==0)
&&&&&&&&&&&&&&
&&&&&&&&&&&&&&
UpdateRegistry ((BYTE *)&CLSID_OPCSimSvr,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
SvrDescrip,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
HelpPath);
&&&&&&&&&&&&&&
return (FALSE);
&&&&&&&&&&&&&&
lpszToken = _tcstok(NULL, szTokens);
(2)调用InitWTOPCsvr完成开发包dll初始化。
以上两个步骤不可颠倒。
这里的item是服务器所有的item,这些item通过opc库户端能浏览到。创建item的函数为CreateTag().
Opc有两种地址空间形式:扁平和多层结构的。
比如调用创建的点为item1、item2、item3.这类结构就是扁平的。各个点类似与文件系统中的文件。
比如调用创建的点为test.item1、test.item2、test.item3这种点名,开发包会自动形成多层的点结构。Test类似与文件系统中的文件夹,item类似与文件系统中的文件夹下的文件。扁平式和多层结构在客户端浏览点名时体现。
多层结构的点名之间默认是用“.”分隔。为了简单可以将我们的opcserver设计为扁平结构。
创建一个点时会返回一个handle用来标识这个点。我们程序需要自己建立这个handle和数据库中保存设备实时值的对应关系。这部分可以参考例子代码。
建立一个定时器采集设备数据
定时从数据库中取得各个handle对应的item的值。然后比较各个item的值是否和上一次读取的值有变化,如果有变化调用UpdateTagToList放入对应的队列。开发包会自动将变化的值送到客户端。
大致流程为
从数据库中采集一遍所有点的实时值。
调用StartUpdateTags()
循环读取每个item在数据库中的数据,和上一次读取到的进行比较。如果有变化调用UpdateTagToList()
最用调用EndUpdateTags()完成所有item的更新。
客户端控制
客户端写tag的值的时候,在opcserver是通过一个回调函数来响应的。
在服务器端必须调用EnableWriteNotification()来指定写值的回调函数。回调函数的格式为:
VOID (CALLBACK* WRITENOTIFYPROC)(HANDLE, VARIANT*,
然后在回调函数内部实现从HANDLE指定的tag写到具体的控制设备对应的变量中。
其它常用函数
RequestDisconnect()一般在opcserver在关闭时调用,用来通知客户端opcserver自己要关闭。
NumbrClientConnections()用来计算当前有多少个客户端连接到了opcserver
UninitWTOPCsvr()程序退出时清理
SetVendorInfo()设置厂商信息
三.opc客户端测试
下面以本机opcquickclient.exe为例说明服务器和客户端之间的应用关系。
运行opcquickclient.exe
点击edit-&new server connection
菜单。弹出server
properties对话框。从中展开opc data
access server version 2.0.会浏览到本机安装的所有opcserver。选中我们自己开发的opcserver,点击确定。完成与服务器的连接
点击edit-&new group
用默认值添加组。
点击edit-&new item
弹出如下对话框。(下图是一个多层结构地址空间的例子,单层的更简单)选中左侧的某个父节点,右侧会显示出各个子tag。选中要向opcserver查询的tag,点击add
leaves。然后点击ok
在客户端主界面上能看到刚才要查询的tag。它会自动跟随opcserver端数据的变化而变换。
右键要控制的tag,在菜单中选择同步写或者异步写(一般建议用异步,避免阻塞客户端的正常运行)。键入要写入的值。查看设备上是否动作。从而检验opcserver是否编写的正确。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。您的位置:>>>大洋新闻>正文
如何开发OPC Server
11:55来源:
    如何开发OPC Server首先我们先来看一下什么是OPC
       OPC (OLE for Process Control——用于过程控制的OLE)是基于Microsoft公司的DNA(Distributed Internet Application)构架和COM(Component Object Model)技术的一个工业标准接口,是根据易于扩展性而设计的。
再来了解一下OPC的用途
OPC主要适用于过程控制和制造自动化等应用领域。 OPC是以OLE/COM机制作为应用程序的通讯标准。OLE/COM是一种客户/服务器模式,具有语言无关性、代码重用性、易于集成性等优点。OPC规范了接口函数,不管现场设备以何种形式存在,客户都以统一的方式去访问,从而保证软件对客户的透明性,使得用户完全从低层的开发中脱离出来
然后我们再来看看OPC Server的组成
       一个设备的OPC Server主要有两部组成,一是OPC标准接口的实现;二是与硬件设备的通信模块。
      实现OPC 标准接口
在这些接口中,IOPCServer 是OPC Server的主接口,通过它实现OPC Server在操作系统中的安装和注册。此接口是必须要实现的,其所有方法也必须实现。其它的接口都是可选的我们就不做介绍了,下面主要来介绍如何实现IOPCServer接口。
在IOPCServer接口中共有六个法:
1、IOPCServer::AddGroup
HRESULT AddGroup( [in, string] LPCWSTR szName,
 [in] BOOL bActive,
[in] DWORD dwRequestedUpdateRate,
[in] OPCHANDLE hClientGroup,
[unique, in] LONG *pTimeBias,
[in] FLOAT * pPercentDeadband,
[in] DWORD dwLCID,
[out] OPCHANDLE * phServerGroup,
[out] DWORD *pRevisedUpdateRate,
[in] REFIID riid,
[out, iid_is(riid)] LPUNKNOWN * ppUnk );
       此方法是在OPC Server上建立一个组。下在我们来实现这个方法
首先要对组名(szName)进行检查,看是否有效或是否已经有这个组。
if (szName != NULL)
              RequestedName = szN
              if (RequestedName == "")
                     RequestedName = pSvrObject->DefaultGroupN
       }
       else
              RequestedName = pSvrObject->DefaultGroupN
      
       for (i=0; iNumbrG i++)
       {
              pGroup = pSvrObject->GetGroup(i);
              if (RequestedName == pGroup->Name)
                     return (OPC_E_DUPLICATENAME);
       }
       这需要在内存中维护OPC Group(组)的列表(还要有OPC 项的列表)。
       如果szName(组名)正确并且没有建立过该组,就开始根据传过来的参数进行组的建立,建立好后将该组加到自己的组列表中以备后用。
              最后将新建组的接口指针返回给客户端。
     
2、IOPCServer::GetErrorString
HRESULT GetErrorString( [in] HRESULT dwError,
[in] LCID dwLocale,
[out, string] LPWSTR *ppString );
       为Server的错误代码返回相应的错误字符串。
       代码略
3、IOPCServer::GetGrouPByName
HRESULT GetGroupByName( [in, string] LPCWSTR szName,
[in] REFIID riid,
[out, iid_is(riid)] LPUNKNOWN * ppUnk );
通过指定的组名(由同一客户端建立的)找到该组的接口指针。
此方法实现比较简单,只要根据提供的名子循环从组列表中找到该组的接口指针,并返回给客户端
4、IOPCServer::GetStatus
HRESULT GetStatus( [out] OPCSERVERSTATUS ** ppServerStatus );
返回当前Server的状态信息。
此方法比较简单,但要注意的是在使用OPCSERVERSTAUS前要进行内存分配。
5、IOPCServer::RemoveGroup
HRESULT RemoveGroup( [in] OPCHANDLE hServerGroup,
 [in] BOOL bForce );
       从服务器中删除指定组
       在组列表中找到指定的组,并将其删除。
6、IOPCServer::CreateGroupEnumerator
HRESULT CreateGroupEnumerator( [in] OPCENUMSCOPE dwScope,
[in] REFIID riid,
[out, iid_is(riid)] LPUNKNOWN* ppUnk );
为Server上所提供的组建立不同的列举器。
上面是直接使用COM技术进行开发的,这要求你必须熟悉COM技术。如果你对COM不是很了解那也没关系,可以选择OPC Server的开发工具,你只需要简单的调用开发工具的函数就可以实现OPC Server中的所有接口。
我们虽然实现了IOPCServer接口中的所有方法,但它只是OPC Client与我们通信的一个桥梁,最主要的还是我们要自己维护好OPC Group和OPC Item列表。这样我们才可以跟OPC Client进行真正的数据通信。
与硬件设备进行通信
接口已经实现好了,这回我们该从硬件设备中读取数据提供给OPC Client了。
同硬件设备通信有多种方法,如果你是设备的制造商就可以直对硬件进行数据操作了;你也可以通过设备驱动程序和硬件厂商提供的API或是通过TCP、串口等方法进行操作,这就要看硬件设备提供的与软件通信的接口是什么样的了。
       不管你用什么方法只要把数据从硬件设备中读取上来并与OPC 项进行关联,就可以实现OPC Server了。
下面我们为清华同方的RH2000系统来做一个OPC Server(如图2)。
因为RH2000系统由一个叫易视的软件系统进行调控的,它下面控制多种下位机(硬件设备)。我们只需要与易视进行通信就可以实现对硬件设备的操作(易视提供了TCP/IP通信方式)。首先与易视建立好Socket连接,然后发送控制命令读取与易视相连的硬件设备的信息(也就是设备点信息)。我们根据读取到的不同的设备点相应的建立OPC项,这样OPC Client只要读取到OPC 项就可以读取到设备信息。如果OPC Client对OPC 项进行修改,我们收到OPC项的变化就向易视发送相应命令对设备进行操作,这样就实现了OPC Client对硬件设备的操控了。
       虽然使用开发工具也可以开发OPC Server,但还是希望大家能多了解COM技术,这样对OPC Server的扩展和维护都有好处。并多到OPC基金会的官方网站上去了解OPC的最新知识和下载相关资料,网址是http://www.opcfoundation.org。
由于时间和作者水平的限制,难免有错误和不妥之处,敬请大家批评和指正。我的邮件是 .cn。最后感谢清华同限份有限公司的
周洪波博士和卢盛融经理给我开发和学习OPC的机会,使我了解OPC并写下这篇文章。
(编辑: keji)
更多精彩内容尽在广州日报大洋网()
随时随地畅享资讯
订制《广州日报》手机报:发送AA到
订制《信息时报》手机报:发送AB到
一键分享:
文明上网 理性发言
用户名: 密码:
赞助商链接【图文】OPC Server_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
OPC Server
上传于||文档简介
&&O​P​C​ ​S​e​r​v​e​r​简​介​以​及​编​写​方​法​简​介
大小:1.68MB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢

我要回帖

更多关于 天龙功放接网络问题 的文章

 

随机推荐