浏览本地OPC服务器 VC编程 点击:1165 | 回复:3



tomyi

    
  • 精华:0帖
  • 求助:1帖
  • 帖子:21帖 | 233回
  • 年度积分:0
  • 历史总积分:598
  • 注册:2002年10月30日
发表于:2007-10-02 14:56:00
楼主
//这是一个简单的OPC Client 入门程序

//main.cpp
//************************************************************************************************
//浏览本地OPC服务器
//************************************************************************************************

#define _WIN32_DCOM  // Needed in order to call CoInitializeEx()

#include <iostream>
#include <objbase.h>
#include <comdef.h>

#import "C:\WINNT\system32\OpcEnum.exe" no_namespace //根据OpcEnum.exe更改
#include "opcda.h"
#include "opcenum_i.c"

//--------------------------------------------------------------------------------------------------------------
//版本号----可以从规范中查到
static const CLSID CATID_OPCDAServer10 = 
{ 0x63d5f430, 0xcfe4, 0x11d1, { 0xb2, 0xc8, 0x0, 0x60, 0x8, 0x3b, 0xa1, 0xfb } };
// {63D5F430-CFE4-11d1-B2C8-0060083BA1FB}

static const CLSID CATID_OPCDAServer20 = 
{ 0x63d5f432, 0xcfe4, 0x11d1, { 0xb2, 0xc8, 0x0, 0x60, 0x8, 0x3b, 0xa1, 0xfb } };
// {63D5F432-CFE4-11d1-B2C8-0060083BA1FB}

//[uuid(CC603642-66D7-48f1-B69A-B625E73652D7)] interface CATID_OPCDAServer30
//--------------------------------------------------------------------------------------------------------------

void OPCServerList();

int main(int argc, char* argv[])
{
  HRESULT hr;
  int n_return = 0;

  try
  {
    // Initialize COM
    if(  
      FAILED( hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED) )
    )
      _com_issue_error(hr);
  }
  catch(_com_error e)
  {
    std::cout << "ERROR(" << e.Error() << "):  ";
    if( e.Description().length() > 0)
      std::cout << (TCHAR*)e.Description() << std::endl;
    else
  std::cout << e.ErrorMessage() << std::endl;
    n_return = 1;
  }

  OPCServerList();

  // Uninitialize COM
  CoUninitialize();

  return 0;
}

//使用CoCreateInstance
void OPCServerList()
{
CLSID clsid;
clsid = CLSID_OpcServerList; //在opcenum_i.c中定义
IOPCServerList *gpOPC = NULL;

DWORD clsctx;
clsctx = CLSCTX_LOCAL_SERVER; //本地服务
IID IIDOPCServerList=IID_IOPCServerList; //在opcenum_i.c中定义
// 创建OPC服务器的浏览器对象-----
HRESULT hr = CoCreateInstance(clsid, NULL, clsctx,IIDOPCServerList ,(void**)&gpOPC);

// 查询OPC DA 2.0 组件目录接口指针
CLSID catid;
catid=CATID_OPCDAServer20; //= CATID_OPCDAServer20; //OPC数据访问服务器2.0组件目录
IOPCEnumGUID *pEnumGUID;

hr = gpOPC->EnumClassesOfCategories( 1, &catid, 1, &catid, (IEnumGUID**)&pEnumGUID); 
if(S_OK!=hr)
return;

//获得支持OPC DA2.0数据服务器的CLSID
unsigned long c;
while (S_OK == pEnumGUID->Next(1, &clsid, &c)) 
{
LPOLESTR pszProgID;
LPOLESTR pszUserType;
hr =&



tomyi

  • 精华:0帖
  • 求助:1帖
  • 帖子:21帖 | 233回
  • 年度积分:0
  • 历史总积分:598
  • 注册:2002年10月30日
发表于:2007-10-02 15:12:00
1楼
对于初学者,建议先安装一个OPC Server软件,将会自动安装OPC相关的dll. 如果想进一步了解OPC的开发,可参阅我的Modbus OPC Server2.0 测试贴中的软件,内含有OPC Client 和调用我写的OPC Server Dll的完整源码. [url=http://www.gongkong.com/tech/detail.asp?id=413634]http://www.gongkong.com/tech/detail.asp?id=413634[/url] opc client 界面

heshi4124

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 1回
  • 年度积分:0
  • 历史总积分:1
  • 注册:2006年6月19日
发表于:2007-10-08 09:07:00
2楼
请问哪儿有可以下载opc server的,我是初学者。请多指教!

tomyi

  • 精华:0帖
  • 求助:1帖
  • 帖子:21帖 | 233回
  • 年度积分:0
  • 历史总积分:598
  • 注册:2002年10月30日
发表于:2007-10-11 21:21:00
3楼
我的Modbus OPC Server2.0 测试贴中的软件本身就是一个支持Modbus 协议的opc server.最简单的办法,安装组态王软件即可.

热门招聘
相关主题

官方公众号

智造工程师