如何开发OPC Server(风间月) 点击:6150 | 回复:17



deng_lp

    
  • 精华:5帖
  • 求助:0帖
  • 帖子:65帖 | 2669回
  • 年度积分:0
  • 历史总积分:2876
  • 注册:2001年6月19日
发表于:2004-03-11 10:32:00
楼主
首先我们先来看一下什么是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 标准接口
[图1] 在这些接口中,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 = szName; if (RequestedName == "") RequestedName = pSvrObject->DefaultGroupName(); } else RequestedName = pSvrObject->DefaultGroupName(); for (i=0; iNumbrGroups(); i++) { pGroup = pSvrObject->GetGroup(i); if (RequestedName == pGroup->Name) return (OPC_E_DUPLICATENAME); } 这需要在内存中维护OPC Group(组)的列表(还要有OPC 项的列表)。 如果szName(组名)正确并且没有建立过该组,就开始根据传过来的参数进行组的建立,建立好后将该组加到自己的组列表中以备后用。 if ((dwRequestedUpdateRate == 0) || (dwRequestedUpdateRate < pApp->ServerTickRate)) ActualRate = pApp->ServerTickRate; else { ActualRate = dwRequestedUpdateRate; MinRate = pApp->ServerTickRate; ActualRate += (MinRate/2); ActualRate /= MinRate; ActualRate *= MinRate; } if (pRevisedUpdateRate) *pRevisedUpdateRate = ActualRate; pGroup = new (COPCGroup); if(pGroup == NULL) return (E_OUTOFMEMORY); pGroup->Name = RequestedName; pGroup->pSvrObject = pSvrObject; pGroup->MarkedForDeletion = FALSE; pGroup->ClientGroupHandle = hClientGroup; pGroup->UpdateRate = ActualRate; pGroup->IsActive = bActive; if (pPercentDeadband) pGroup->Deadband = *pPercentDeadband; else pGroup->Deadband = 0.0; pGroup->LCID = dwLCID; if (pTimeBias) pGroup->TimeBias = *pTimeBias; else { _ftime( &timebuffer ); pGroup->TimeBias = timebuffer.timezone; // pGroup->TimeBias = 300L; } r1 = pGroup->QueryInterface(riid, (LPVOID*) ppUnk); if(FAILED(r1)) { // If error - delete group and return delete (pGroup); return r1; } pSvrObject->AddNewGroup(pGroup); 最后将新建组的接口指针返回给客户端。 *phServerGroup = pGroup->ServerGroupHandle; 2、IOPCServer::GetErrorString HRESULT GetErrorString( [in] HRESULT dwError, [in] LCID dwLocale, [out, string] LPWSTR *ppString ); 为Server的错误代码返回相应的错误字符串。 char buf[128]; BOOL bFound = FALSE; for( int i = 0; i < nOpcErrors; ) { OpcError* e = &OpcErrors[i++]; if( (bFound = (hr == e->hrErr)) != FALSE ) { strcpy( buf, e->ErrText ); break; } } if( !bFound ) { DWORD dwStatus = FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ARGUMENT_ARRAY, // Arguments is not a va_list NULL, // LPCVOID pointer to message source hr, // DWORD requested message identifier LANG_NEUTRAL, // DWORD language identifier for message buf, // LPTSTR pointer to message buffer 127, // DWORD maximum size of message buffer NULL ); // va_list *Arguments address of array of message inserts if( !dwStatus ) { _snprintf( buf, 127, "", hr, hr ); } } *ppString = pApp->WSTRFromCString( buf, TRUE); 3、 IOPCServer::GetGroupByName HRESULT GetGroupByName( [in, string] LPCWSTR szName, [in] REFIID riid, [out, iid_is(riid)] LPUNKNOWN * ppUnk );



天涯孤鹰

  • 精华:0帖
  • 求助:0帖
  • 帖子:5帖 | 17回
  • 年度积分:0
  • 历史总积分:194
  • 注册:2003年4月07日
发表于:2004-03-15 11:38:00
1楼
如何通过OPC将现场数据写入管理数据库中(如Sysbase,SQL SERVER)

Bob Shen

  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 21回
  • 年度积分:0
  • 历史总积分:34
  • 注册:2002年8月29日
发表于:2004-03-22 14:27:00
2楼
通控集团博软公司发布新网站http://www.cybosoft.com.cn ,欢迎大家浏览。由于作者水平有限,请大家多提宝贵意见。欢迎联系。QQ:13707324

惊涛拍岸

  • 精华:0帖
  • 求助:0帖
  • 帖子:7帖 | 39回
  • 年度积分:0
  • 历史总积分:62
  • 注册:2004年3月26日
发表于:2004-03-30 11:08:00
3楼
如何通过OPC将MACSⅡ系统的实时数据写入自己的数据中,如PB、VB、EXCEL等

张行

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 1回
  • 年度积分:0
  • 历史总积分:51
  • 注册:2004年3月25日
发表于:2004-04-16 16:00:00
4楼
TRANE(特灵)空调的数据通过TRANE 公司的BCU(楼宇控制器)与安装了TRANE公司控制软件TRACER 的电脑能实现数据通讯和控制。现在其他BA公司想读取TRANE 空调的数据,有人建议在TRANE的电脑上安装OPC SERVER软件,这样其他BA就可以读取TRANE 数据了,请问如果这样的话,TRANE 电脑和软件要做怎样的配置才能实现此项功能?谢谢!

gongkongedit

  • 精华:1099帖
  • 求助:0帖
  • 帖子:14392帖 | 54470回
  • 年度积分:0
  • 历史总积分:622
  • 注册:2008年9月08日
发表于:2004-05-06 21:39:00
5楼
楼主写的文章不错!不知谁有OPC SERVER开发工具?SOFTING公司有个OPC开发工具,不知哪儿可买到?

兵笑

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 1回
  • 年度积分:0
  • 历史总积分:7
  • 注册:2002年10月29日
发表于:2004-05-21 12:22:00
6楼
感谢楼主的文章,希望以后有更多的机会互相共享,以提高我们的技术水平。

laocai

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 3回
  • 年度积分:0
  • 历史总积分:56
  • 注册:2002年5月28日
发表于:2004-06-06 20:50:00
7楼
向各位请教几个小问题:是否一定要用opc sever开发工具获取数据?此处所涉及到的数据是否就是关系型数据库中的数据?如果不是,如何转换?

新手陈

  • 精华:0帖
  • 求助:0帖
  • 帖子:3帖 | 3回
  • 年度积分:0
  • 历史总积分:12
  • 注册:2004年7月27日
发表于:2004-07-27 10:56:00
8楼
楼主真厉害! 我是个新手,请问:电厂的DCS要和变电站的监控系统连接,如何实现?还有国内的DCS厂家,哪家具有OPC功能? 谢谢!

bacman

  • 精华:3帖
  • 求助:0帖
  • 帖子:60帖 | 106回
  • 年度积分:0
  • 历史总积分:326
  • 注册:2002年4月15日
发表于:2006-10-29 08:46:00
9楼
To 张行:
我们的BACnet OPC Server可以直接从BCU读取数据并转换成OPC接口。所以你可以省掉Tracer软件。
结构就是:BCU->BACnet OPC Server->其它组态软件(只要支持OPC Client)

深圳市骏智高新科技有限公司
http://www.junzhi.net

我要翱翔

  • 精华:1帖
  • 求助:0帖
  • 帖子:10帖 | 110回
  • 年度积分:0
  • 历史总积分:495
  • 注册:2006年9月28日
发表于:2006-10-29 19:59:00
10楼
太专业了!

atop

  • 精华:0帖
  • 求助:0帖
  • 帖子:18帖 | 38回
  • 年度积分:0
  • 历史总积分:208
  • 注册:2005年9月28日
发表于:2008-05-23 16:19:25
11楼

上尚科技,提供SOC解决方案,支持OPC开发环境,scada系统,通讯管理机,智能通讯协议网关类资料。

南风

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 343回
  • 年度积分:0
  • 历史总积分:1474
  • 注册:2002年9月21日
发表于:2008-05-23 21:45:50
12楼
怎么没有找到杰控的版面啊!!!

南风

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 343回
  • 年度积分:0
  • 历史总积分:1474
  • 注册:2002年9月21日
发表于:2008-05-23 21:46:02
13楼
怎么没有找到杰控的版面啊!!!

南风

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 343回
  • 年度积分:0
  • 历史总积分:1474
  • 注册:2002年9月21日
发表于:2008-05-23 21:46:11
14楼
怎么没有找到杰控的版面啊!!!

南风

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 343回
  • 年度积分:0
  • 历史总积分:1474
  • 注册:2002年9月21日
发表于:2008-05-23 21:47:10
15楼
怎么没有找到杰控的版面啊!!!

海魂洋仔

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 114回
  • 年度积分:0
  • 历史总积分:983
  • 注册:2005年10月14日
发表于:2008-06-23 12:10:00
16楼
感谢楼主的文章,希望以后有更多的机会互相共享,以提高我们的技术水平

海魂洋仔

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 114回
  • 年度积分:0
  • 历史总积分:983
  • 注册:2005年10月14日
发表于:2008-06-23 12:10:12
17楼
感谢楼主的文章,希望以后有更多的机会互相共享,以提高我们的技术水平

热门招聘
相关主题

官方公众号

智造工程师