OPCDAauto.dll技术内幕2及出售OPC基金会各类范例代码 点击:813 | 回复:0



opcfan

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:62帖 | 58回
  • 年度积分:0
  • 历史总积分:667
  • 注册:2004年9月29日
发表于:2008-08-03 19:36:59
楼主

http://www.opcfoundation.org/上的例子。现在把它们拿出来吧,大家有兴趣的可以跟我联系,不过事先说好啊,这些代码可不是免费的哦。要是需要到http://www.opcfoundation.org/下载别的资料,也可以找我们有偿服务。
OPC UA SDK 1.00 Sample Source Code Setup (x86) 500元:
OPC DA 3.00 sample code 3.50 : 200.00元
OPC XMLDA 1.00 sample code :200.00元
OPC AE 1.10sample code 2.40: 150.00元
OPC HDA 1.20 sample code 4.10:150.00元
OPC batch 2.00 sample code :150.00元
OPC Security 1.00 Sample CODE:150元
OPC Core Components Source Code :100元

VB中调用Server对象的Connect 方法,

Set ConnectedOPCServer = New OPCServer
ConnectedServerName = OPCServerName.Text
ConnectedNodeName = OPCNodeName.Text
ConnectedOPCServer.Connect ConnectedServerName, ConnectedNodeName

在OPCDAauto.dll的内部实现如下:

1、断开以前的连接。

2、判断是否是参数VARIANT Node(网络节点)是否是本机,假如是localhost、127.0.0.1或者和本机的计算机名相同。则设置网络节点的字符串为空。tsNodeName = NULL;

3、获得OPCEnum.exe组件里的IOPCServerList2接口指针,调用CLSIDFromProgID方法得到CLSID。假如OPCEnum.exe没有安装或者注册,则直接通过查找注册表获得CLSID。

4、调用OLE32.dll里的CoCreateInstanceEx API函数连接目标计算机(本机或者远程)的服务器。并获得IOPCServer接口指针m_pOPCServer。

5、执行m_pGroups->Connect(mqi.pItf),目的是保存m_pOPCServer接口指针到COPCGroups对象里。

6、创建shutdown连接点。

 具体代码如下:

STDMETHODIMP COPCAutoServer::Connect(BSTR ProgID, VARIANT Node)
{
USES_CONVERSION;

TRACE_FUNCTION_ENTER("COPCAutoServer::Connect");

// disconnect current server.
Disconnect();

// check arguments.
if (!CheckByValInArg(ProgID)) return E_INVALIDARG;
if (!CheckByValInVariantArg(Node, VT_BSTR, true)) return E_INVALIDARG;

// get node name from variant.
LPTSTR tsNodeName = NULL;

if ((Node.vt == VT_BSTR) && (Node.bstrVal != NULL) && (Node.bstrVal【0】 != 0))
{
// check for well-known node names.
if (wcsicmp(Node.bstrVal, L"localhost") != 0 && wcsicmp(Node.bstrVal, L"127.0.0.1") != 0)
{
tsNodeName = OLE2T(Node.bstrVal);
}
}

// check for non-null node names that reference the local computer.
if (tsNodeName != NULL)
{
// get own computer name
TCHAR szLocalHost【MAX_COMPUTERNAME_LENGTH+1】;
DWORD dwHostSize = sizeof(szLocalHost);

if (GetComputerName(szLocalHost, &dwHostSize) == TRUE)
{
if (_tcsicmp(szLocalHost, tsNodeName) == 0)
{
tsNodeName = NULL;
}
}
}

// get clsid.
CLSID cClsid = GUID_NULL;

// connect to OPC server enumerator.
IOPCServerList2* ipEnumerator = CreateEnumerator(CLSID_OpcServerList, tsNodeName);

if (ipEnumerator!= NULL)
{
TRACE_METHOD_CALL(CLSIDFromProgID);

HRESULT hResult = ipEnumerator->CLSIDFromProgID(ProgID, &cClsid);

// release server enumerator.
ipEnumerator->Release();
ipEnumerator = NULL;

if (FAILED(hResult))
{
TRACE_METHOD_ERROR(CLSIDFromProgID, hResult);
return hResult;
}
}

// lookup CLSID in registry if OpcEnum not available.
else
{
HKEY hKey = NULL;

TRACE_METHOD_CALL(RegConnectRegistry);

DWORD dwResult = RegConnectRegistry(tsNodeName, HKEY_CLASSES_ROOT, &hKey);

if (dwResult != ERROR_SUCCESS)
{
TRACE_METHOD_ERROR(RegConnectRegistry, GetLastError());
return E_FAIL;
}

TCHAR tsKey【MAX_PATH+1】;
memset(tsKey, 0, sizeof(tsKey));

HKEY hProgIDKey = NULL;

if (RegOpenKey(hKey, OLE2T(ProgID), &hProgIDKey) == ERROR_SUCCESS)
{
HKEY hClsidKey = NULL;

if (RegOpenKeyEx(hProgIDKey, _T("CLSID"), 0, KEY_READ, &h



热门招聘
相关主题

官方公众号

智造工程师