期货老师这一年 pdf:获取本机OPC List

来源:百度文库 编辑:中财网 时间:2024/05/04 12:22:53
其一
VB里面可以用GetOPCServers()实现,指定参数NOde为 UNC names 或者 DNS names既可。
  该函数可以返回计算机中所有注册过的OPC Server,list一下就可以了。

其二:
   其实很简单:
  1. 使用OPC服务器浏览器对象
   下面一段代码显示了利用IOPCServerList接口浏览本地或远程计算机中已安装的OPC数据访问服务器的方法,省略处理错误返回代码步骤
   MULTI_QI mqi;
   COSERVERINFO sin, *sinptr;
   DWORD clsctx;
   unsigned long c;
   CLSID clsid;
   IEnumGUID *pEnumGUID;
   CLSID catid = CATID_OPCDAServer20;//OPC数据访问服务器2.0组件目录
   IOPCServerList *gpOPC = NULL;
   clsid = CLSID_OPCServerList;
  // set up server info
   sinptr = &sin;
   sin.dwReserved1 = sin.dwReserved2 = 0; 
   sin.pwszName = szNodeName; // szNodeName为本地或远程计算机名
   sin.pAuthInfo = 0;
   clsctx = CLSCTX_REMOTE_SERVER;
   // set up mqi
   mqi.pIID = &IID_IOPCServerList;
   mqi.hr = 0;
   mqi.pItf = 0;
   HRESULT hr = CoCreateInstanceEx(clsid, NULL, clsctx, sinptr, 1, &mqi);// 创建OPC服务器的浏览器对象
   gpOPC =(IOPCServerList*)mqi.pItf; //获得IOPCServerList接口
  // 查询OPC DA 2.0 组件目录接口指针
  hr = gpOPC->EnumClassesOfCategories(1, &catid, 1, &catid, &pEnumGUID); 
  //获得支持OPC DA2.0数据服务器的CLSID
  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);
   }
   // Free the interfaces
   if(gpOPC) gpOPC->Release();
  客户获得的clsid可以用来创建相应的OPC服务器。
  2.枚举OPC服务器
  在早先的版本里,OPC规范规定了用OPC子健来标识OPC服务器在注册表里的入口。客户必须按这个OPC子健进行浏览。这种方法效率较低,因为它要求浏览所有的CLSID条目,命名冲突也会时常发生。但这个方法比较简单,在OPC客户端程序中也有较多的应用,它不支持远程计算机。
   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];
   if(::RegOpenKey(hk, szKey, &hProgID) == ERROR_SUCCESS)
   {
   LONG lSize = MAX_KEYLEN;
  if(::RegQueryValue(hProgID, "OPC", szDummy, &lSize) == ERROR_SUCCESS)
   wcscpy(wszServerName, T2W(szKey));
   //获得OPC数据服务器的CLSID
   HRESULT hr =::CLSIDFromProgID(wszServerName, &clsid );
   ::RegCloseKey(hProgID);
   }
   }
  一般情况以上代码就可以枚举本机内的所有OPC服务器,还可以通过测试服务器对象是否支持连接点来判断它是否支持OPC DA 2.0。