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