首页 上一页 1 2 下一页 尾页

请问客户程序怎么样能够知道机器上注册的opc server啊? 点击:14031 | 回复:34



myopc

    
  • 精华:1帖
  • 求助:0帖
  • 帖子:25帖 | 43回
  • 年度积分:0
  • 历史总积分:159
  • 注册:2002年9月05日
发表于:2003-09-16 08:26:00
楼主



woodysummer

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 13回
  • 年度积分:0
  • 历史总积分:16
  • 注册:2003年7月04日
发表于:2004-10-07 21:56:00
21楼
VB里面可以用GetOPCServers()实现,指定参数NOde为 UNC names 或者 DNS names既可。 该函数可以返回计算机中所有注册过的OPC Server,list一下就可以了。

youyoufufu

  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 3回
  • 年度积分:0
  • 历史总积分:46
  • 注册:2004年11月16日
发表于:2005-01-19 15:43:00
22楼
使用opcenum ,VB代码. 楼上诸位有吗?给小弟个吧~求求~ longmarchufo@163.com

剑飞

  • 精华:0帖
  • 求助:1帖
  • 帖子:9帖 | 73回
  • 年度积分:0
  • 历史总积分:249
  • 注册:2002年8月22日
发表于:2005-08-05 12:37:00
23楼

剑飞

  • 精华:0帖
  • 求助:1帖
  • 帖子:9帖 | 73回
  • 年度积分:0
  • 历史总积分:249
  • 注册:2002年8月22日
发表于:2005-08-12 15:33:00
24楼
查注册表比较麻烦

hufuchuan

  • 精华:0帖
  • 求助:0帖
  • 帖子:8帖 | 24回
  • 年度积分:0
  • 历史总积分:81
  • 注册:2005年3月21日
发表于:2005-08-23 08:14:00
25楼
直接在DCOM配置里也应该可以看到吧,

ymtq

  • 精华:1帖
  • 求助:0帖
  • 帖子:8帖 | 425回
  • 年度积分:0
  • 历史总积分:874
  • 注册:2005年7月17日
发表于:2005-09-03 19:43:00
26楼
落雪说的没错,在运行里输入dcomcnfg就会打开,他是专门用来对远程COM对象进行配置的工具

一剑封吼

  • 精华:0帖
  • 求助:0帖
  • 帖子:8帖 | 22回
  • 年度积分:0
  • 历史总积分:55
  • 注册:2003年12月28日
发表于:2005-09-17 22:15:00
27楼
有了gx deleper和 wincc软件,请问为什么还要kepware软件呢?

我是啊铎

  • 精华:0帖
  • 求助:0帖
  • 帖子:7帖 | 33回
  • 年度积分:0
  • 历史总积分:55
  • 注册:2005年5月02日
发表于:2005-09-18 13:41:00
28楼
只要看有什么的话,查DCOM里面就能查的到了 要是要列举的话,在程序里面GETOPCSERVERS也可以啊

一剑封吼

  • 精华:0帖
  • 求助:0帖
  • 帖子:8帖 | 22回
  • 年度积分:0
  • 历史总积分:55
  • 注册:2003年12月28日
发表于:2005-09-18 18:37:00
29楼
有了gx deleper和 wincc软件,请问为什么还要kepware软件呢?请各位大师指点小弟。多谢。

剑飞

  • 精华:0帖
  • 求助:1帖
  • 帖子:9帖 | 73回
  • 年度积分:0
  • 历史总积分:249
  • 注册:2002年8月22日
发表于:2005-09-28 10:15:00
30楼
kepware实在是个非常好的东西

tomyi

  • 精华:0帖
  • 求助:1帖
  • 帖子:21帖 | 233回
  • 年度积分:0
  • 历史总积分:598
  • 注册:2002年10月30日
发表于:2005-11-21 17:00:00
31楼
首先,谢谢yu2018,通过几天的学习,使用方法二获得成功。现将原码附上,避免大家走多余的路。但第一种方法仍在试。

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



#define MAX_KEYLEN 256

int main(int argc, char* argv[])
{
    HKEY hk = HKEY_CLASSES_ROOT;
    TCHAR szKey[MAX_KEYLEN];
    WCHAR wszServerName[100];
    TCHAR szOPCName[100];
    CLSID clsid;
//    USES_CONVERSION;
    for(int nIndex = 0;::RegEnumKey(hk, nIndex, szKey, MAX_KEYLEN) == ERROR_SUCCESS; nIndex++)
    {
        HKEY hProgID;
        TCHAR szDummy[MAX_KEYLEN];
        TCHAR szOPC[MAX_KEYLEN];

        std::cout 
            <<"本地注册的OPC数据服务器"<< std::endl;    
        if(::RegOpenKey(hk, szKey, &hProgID) == ERROR_SUCCESS)
        {
            LONG lSize = MAX_KEYLEN;
            if(::RegQueryValue(hProgID, "OPC", szDummy, &lSize) == ERROR_SUCCESS)
            {
                _bstr_t str1=szKey;
                wcscpy(wszServerName, str1);

                char * pChar=str1;
                std::cout 
                    <<pChar
                    << std::endl;    

            //获得OPC数据服务器的CLSID
            HRESULT hr =::CLSIDFromProgID(wszServerName, &clsid );
            }
            ::RegCloseKey(hProgID);
        }
    }
  return 0;
}

tomyi

  • 精华:0帖
  • 求助:1帖
  • 帖子:21帖 | 233回
  • 年度积分:0
  • 历史总积分:598
  • 注册:2002年10月30日
发表于:2005-11-24 10:12:00
32楼
第一种方法试用成功,真不容易。
源码如下:

//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 = gpOPC->GetClassDetails(&clsid, &pszProgID, &pszUserType);
        //打印OPC数据服务器的有关信息
        printf("ProgID = %ls, UserType = %ls\n", pszProgID, pszUserType);
        CoTaskMemFree(pszProgID);
        CoTaskMemFree(pszUserType);
    }
    
    //释放接口
    if(gpOPC)
        gpOPC->Release();
}

//opcenum_i.c
#ifdef __cplusplus
extern "C"{
#endif 


#ifndef __IID_DEFINED__
#define __IID_DEFINED__

typedef struct _IID
{
    unsigned long x;
    unsigned short s1;
    unsigned short s2;
    unsigned char  c[8];
} IID;

#endif // __IID_DEFINED__

#ifndef CLSID_DEFINED
#define CLSID_DEFINED
typedef IID CLSID;
#endif // CLSID_DEFINED

const IID LIBID_OpcEnumLib = {0x13486D43,0x4821,0x11D2,{0xA4,0x94,0x3C,0xB3,0x06,0xC1,0x00,0x00}};


const IID IID_IOPCServerList2 = {0x9DD0B56C,0xAD9E,0x43EE,{0x83,0x05,0x48,0x7F,0x31,0x88,0xBF,0x7A}};


const IID IID_IOPCEnumGUID = {0x55C382C8,0x21C7,0x4E88,{0x96,0xC1,0xBE,0xCF,0xB1,0xE3,0xF4,0x83}};


const IID IID_IOPCServerList = {0x13486D50,0x4821,0x11D2,{0xA4,0x94,0x3C,0xB3,0x06,0xC1,0x00,0x00}};


const IID IID_IEnumGUID = {0x0002E000,0x0000,0x0000,{0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46}};


const CLSID CLSID_OpcServerList = {0x13486D51,0x4821,0x11D2,{0xA4,0x94,0x3C,0xB3,0x06,0xC1,0x00,0x00}};


#ifdef __cplusplus
}
#endif

builderone

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 15回
  • 年度积分:0
  • 历史总积分:35
  • 注册:2000年10月01日
发表于:2006-04-24 14:05:00
33楼
TO:tomyi
能否把第一直方法例子给我一份,一直没搞通!
builderone@163.com

zdszy2006

  • 精华:0帖
  • 求助:0帖
  • 帖子:49帖 | 232回
  • 年度积分:1040
  • 历史总积分:1467
  • 注册:2006年3月22日
发表于:2008-08-26 20:41:01
34楼

热门招聘
相关主题

官方公众号

智造工程师
    首页 上一页 1 2 下一页 尾页