VC OPC Client 核心代码 Sunny丨丶雨
好像技术一沾上工业,便有了很高的价值,大家三缄其口,谁都不点破这层窗户纸,好多的思路和源码都要从国外网站获得,国内总是有条件,有限制--就是不告诉你,怕教会徒弟,饿死师父吧。
研究了N天,开发了一个基于我的组态后台的OPC客户端驱动,考虑到驱动的特殊性,所以只开发了同步接口操作。测试一段时间后,还可以。现把核心代码公开出来,有点VC基础的人可以直接拿来用。
//*************************************************************************
//函 数 名:ConnectOPC
//所属类名:COPCClien
//输 入:CString SvrName
//输 出:
//功能描述:连接OPC服务器
//全局变量:
//调用模块:
//作 者:叶帆
//日 期:2005年12月1日
//修 改 人:
//日 期:
//版 本:
//*************************************************************************
long COPCClient::ConnectOPC(CString cSvrName)
{
HRESULT hr;
CLSID clsid;
WCHAR wszProgID [512];
//----------------------------------
//初始化COM
hr =CoInitialize(NULL);
if (FAILED(hr)) return 8; //com初始化失败
//-----------------------------------
if(strSvrName!="") //判断是否已经连接OPC
{
if (strSvrName==cSvrName) return 2; //OPC服务器已经连接
else return 4; //只能连接一个OPC服务器
}
//-----------------------------------
try
{
//----------------------------------
//把字符串形式的对象标识转化为CLSID结构形式
_mbstowcsz (wszProgID, cSvrName, sizeof (wszProgID) / sizeof (WCHAR));
hr= CLSIDFromProgID(wszProgID, // [in]
&;clsid); // [out]
if(FAILED(hr))
{
CoTaskMemFree(&;clsid); //COM 内存释放函数
CoUninitialize(); //终止COM库功能服务
return 16; //获取clsid失败
}
//--------------------------------
//创建Server实例
hr=CoCreateInstance(clsid, //[in]
NULL, //[in]
CLSCTX_SERVER, //[in]
IID_IUnknown, //[in]
(void**)&;pUNK); //[out]
if(FAILED(hr))
{
CoTaskMemFree(&;clsid);
if(pUNK) pUNK->Release();
pUNK=NULL;
CoUninitialize();
return 32; //创建Server实例失败
}
//------------------------------------
//查询pOPC接口
hr=pUNK->QueryInterface(IID_IOPCServer,// [in]
(void**)&;pOPC);// [out]
if(FAILED(hr))
{
CoTaskMemFree(&;clsid);
if(pOPC) pOPC->Release();
if(pUNK) pUNK->Release();
pOPC=NULL;
pUNK=NULL;
return 64; //查询pOPC接口失败
}
CoTaskMemFree(&;clsid);
//---------------------------
strSvrName=cSvrName; //赋值当前OPC服务名称
}
catch(...)
{
return
128; //连接服务器时出现严重错误
}
return 0; //成功
}
//*************************************************************************
//函 数 名:DisconnectOPC
//所属类名:COPCClient
//输 入:
//输 出:long
//功能描述:断开OPC服务器
//全局变量:
//调用模块:
//作 者:叶帆
//日 期:2005年12月1日
//修 改 人:
//日 期:
//版 本:
//*************************************************************************
long COPCClient::DisconnectOPC()
{
if(strSvrName=="") return 1; //OPC服务器尚未连接
HRESULT *pErrors = NULL;
DWORD dwCount=mIOMDevice->mItem.GetSize(),i;
strSvrName=""; //服务器名称清空
//---------------
OPCHANDLE *phServer = NULL;
//停止异步操作
pIAsync2->SetEnable(false);
//移除标签
phServer = (OPCHANDLE *) CoTaskMemAlloc (dwCount * sizeof (OPCHANDLE));
for(i=0;i
pIItemMgt->RemoveItems(dwCount, // [in]
phServer, // [in]
&;pErrors);