- 浏览: 4168428 次
最新评论
OPC Client 核心源码
好像技术一沾上工业,便有了很高的价值,大家三缄其口,谁都不点破这层窗户纸,好多的思路和源码都要从国外网站获得,国内总是有条件,有限制--就是不告诉你,怕教会徒弟,饿死师父吧。
研究了N天,开发了一个基于我的组态后台的OPC客户端驱动,考虑到驱动的特殊性,所以只开发了同步接口操作。测试一段时间后,还可以。现把核心代码公开出来,有点VC基础的人可以直接拿来用。
//*************************************************************************
//函 数 名:ConnectOPC
//所属类名:COPCClien
//输 入:CString SvrName
//输 出:
//功能描述:连接OPC服务器
//全局变量:
//调用模块:
//作 者:叶帆
//日 期:2005年12月1日
//修 改 人:
//日 期:
//版 本:
//*************************************************************************
long COPCClient::ConnectOPC(CString cSvrName)
{
HRESULT hr;
CLSIDclsid;
WCHARwszProgID [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<dwcount phserver><p>pIItemMgt->RemoveItems(dwCount, // [in] <br> phServer, // [in] <br> &pErrors); // [out]</p>
<p>arrhServer.RemoveAll();<br>arrhServer.FreeExtra();<br>arrItemType.RemoveAll();<br>arrItemType.FreeExtra();<br><br>//删除组<br>pOPC->RemoveGroup(hServer, //[in]<br> true); //[in]<br><br>//---------------<br>CoTaskMemFree(&hServer);<br>CoTaskMemFree(&hGroup);</p>
<p>if(pErrors) CoTaskMemFree(pErrors);<br> if(pResults) CoTaskMemFree(pResults);</p>
<p>if(pIAsync2) pIAsync2->Release();<br>if(pISync) pISync->Release();<br>if(pIItemMgt) pIItemMgt->Release();<br>if(pOPC) pOPC->Release();<br>if(pUNK) pUNK->Release();</p>
<p>pOPC=NULL;<br>pUNK=NULL;<br>pIItemMgt=NULL;<br>pIAsync2=NULL;<br>pISync=NULL;<br>hGroup=0;<br>hServer=0;<br><br>CoUninitialize(); //关闭COM</p>
<p>return 0;<br>}</p>
<p><br>//*************************************************************************<br>//函 数 名:AddGroup<br>//所属类名:COPCClient<br>//输 入:<br>//输 出:long<br>//功能描述:添加组<br>//全局变量:<br>//调用模块:<br>//作 者:叶帆<br>//日 期:2005年12月1日<br>//修 改 人:<br>//日 期:<br>//版 本:<br>//*************************************************************************<br>long COPCClient::AddGroup()<br>{<br>HRESULT hr;<br> WCHARwchBuffer[255];<br>longlBias=0;<br>floatfDeadband=0;<br>DWORDdwRevUpdateRate=0;<br>IUnknown *pUNKgroup; //组接口指针</p>
<p>MultiByteToWideChar(CP_ACP, 0, mIOMDevice->ConfigMessage, -1, wchBuffer, 255);<br><br>//添加组<br>hr = pOPC->AddGroup (<br>wchBuffer,// [in] group name<br>TRUE, // [in] active state<br>mIOMDevice->Scantime, // [in] requested update rate<br>hGroup, // [in] our handle to this group<br>&lBias,// [unique,in] time bias<br>&fDeadband,// [in] percent deadband<br>1033, // [in] requested language ID<br>&hServer,// [out] server handle to this group<br>&dwRevUpdateRate,// [out] revised update rate<br>IID_IUnknown, // [in] REFIID riid,<br>(LPUNKNOWN*)&pUNKgroup); // [out, iid_is(riid)] LPUNKNOWN *pUNKgroup</p>
<p>if(FAILED(hr)) //加入组失败<br>{<br>CoTaskMemFree(&hServer);<br>CoTaskMemFree(&dwRevUpdateRate);<br>if(pUNKgroup) pUNKgroup->Release();<br>pUNKgroup=NULL;<br>return 1;<br>}</p>
<p>//--------------------------------------<br>//查询pIItemMgt<br>hr=pUNKgroup->QueryInterface(IID_IOPCItemMgt, // [in]<br>(void**)&pIItemMgt); // [out]</p>
<p> //查询失败<br> if(FAILED(hr)) <br>{<br>CoTaskMemFree(&hServer);<br>CoTaskMemFree(&dwRevUpdateRate);<br>if(pUNKgroup) pUNKgroup->Release();<br>pUNKgroup=NULL;<br>if(pIItemMgt) pIItemMgt->Release();<br>pIItemMgt=NULL;<br>return 2; <br>}</p>
<p>if(pUNKgroup) pUNKgroup->Release();<br> pUNKgroup=NULL;<br>CoTaskMemFree(&dwRevUpdateRate);<br> return 0;<br>}</p>
<p>//*************************************************************************<br>//函 数 名:AddItem<br>//所属类名:COPCClient<br>//输 入:<br>//输 出:long<br>//功能描述:加入项<br>//全局变量:<br>//调用模块:<br>//作 者:叶帆<br>//日 期:2005年12月1日<br>//修 改 人:<br>//日 期:<br>//版 本:<br>//*************************************************************************<br>long COPCClient::AddItem()<br>{<br>HRESULT hr;<br>OPCITEMDEF *pItemArray = NULL;</p>
<p>HRESULT *pErrors = NULL;<br>DWORD dwCount,dwLen,i;<br><br> //--------------------------------------<br> //添加标签<br> dwCount=mIOMDevice->mItem.GetSize();<br>pItemArray = (OPCITEMDEF *) CoTaskMemAlloc (dwCount * sizeof (OPCITEMDEF)); //分配内存<br><br>for(i=0;i<dwcount></dwcount>{<br>dwLen = lstrlen (mIOMDevice->mItem[i].strTab);<br>pItemArray [i].szItemID = (WCHAR *) CoTaskMemAlloc ((dwLen + 1) * sizeof (WCHAR));<br>MultiByteToWideChar (CP_ACP, 0, mIOMDevice->mItem[i].strTab, -1, pItemArray [i].szItemID, dwLen + 1);<br>pItemArray [i].szAccessPath=NULL;<br>pItemArray [i].bActive = true; // active state<br>pItemArray [i].hClient = (OPCHANDLE)i; // our handle to item<br>pItemArray [i].dwBlobSize = 0; // no blob support<br>pItemArray [i].pBlob = NULL;<br>pItemArray [i].vtRequestedDataType =VT_EMPTY; // Requested data type<br>pItemArray [i].wReserved=0;<br>}<br><br> //添加<br>hr = pIItemMgt->AddItems (dwCount, //[in] DWORD dwCount,Item count<br>pItemArray, //[in, size_is(dwCount)] OPCITEMDEF * pItemArray, Array of item definition structures<br>&pResults, //[out, size_is(,dwCount)] OPCITEMRESULT ** ppAddResults, Result array<br>&pErrors); //[out, size_is(,dwCount)] HRESULT ** ppErrors Error array<br>//添加失败<br>if(FAILED(hr))<br>{<br> if(pResults) CoTaskMemFree(pResults);<br>if(pErrors) CoTaskMemFree(pErrors);<br>CoTaskMemFree(&hServer);<br>CoTaskMemFree(pItemArray);<br> return 2;<br>}<br><br>//同步接口<br>hr=pIItemMgt->QueryInterface(IID_IOPCSyncIO, // [in]<br>(void**)&pISync); // [out]</p>
<p>if(FAILED (hr))<br>{<br>CoTaskMemFree(&hServer);<br>if(pISync) pISync->Release();<br>if(pResults) CoTaskMemFree(pResults);<br> if(pErrors) CoTaskMemFree(pErrors);<br>pISync=NULL;<br>return 3; //查询pISync接口失败<br>}<br><br>//异步接口<br>hr=pIItemMgt->QueryInterface(IID_IOPCAsyncIO2,(void**)&pIAsync2);<br>if(FAILED (hr))<br>{<br>CoTaskMemFree(&hServer);<br>if(pIAsync2) pIAsync2->Release();<br>if(pResults) CoTaskMemFree(pResults);<br> if(pErrors) CoTaskMemFree(pErrors);<br>pIAsync2=NULL;<br>return 4; //查询pIAsync2接口失败<br>}<br><br>//---------------------<br>arrhServer.SetSize(dwCount);<br>arrItemType.SetSize(dwCount);</p>
<p>for(i=0;i<dwcount></dwcount>{<br>arrhServer.SetAt(i,pResults[i].hServer );<br>arrItemType.SetAt(i,(WORD)pResults[i].vtCanonicalDataType);<br>}</p>
<p>//---------------------</p>
<p> if(pErrors) CoTaskMemFree(pErrors);<br>CoTaskMemFree(pItemArray);<br> return 0;<br>}</p>
<p>//*************************************************************************<br>//函 数 名:SyncRead<br>//所属类名:COPCClient<br>//输 入:long lngNo,<br>//CString strData<br>//输 出:long<br>//功能描述:同步读取数据<br>//全局变量:<br>//调用模块:<br>//作 者:叶帆<br>//日 期:2005年12月1日<br>//修 改 人:<br>//日 期:<br>//版 本:<br>//*************************************************************************<br>long COPCClient::SyncRead(long lngNo,CString &strData)<br>{<br> HRESULThr = E_FAIL;<br>DWORD dwCount=1;<br>OPCDATASOURCE dwSource= OPC_DS_CACHE;<br>OPCHANDLE *phServer= NULL;<br>OPCITEMSTATE *pValues= NULL;<br>HRESULT *pErrors= NULL;</p>
<p>::Sleep(0);</p>
<p>try<br>{<br>phServer = (OPCHANDLE *) CoTaskMemAlloc (dwCount * sizeof (OPCHANDLE));<br>if (phServer == NULL)<br>{<br>return 1; //分配内存时出错<br>}</p>
<p>phServer[0] =(OPCHANDLE)arrhServer.GetAt(lngNo);<br>hr=pISync->Read(dwSource, //[in]<br>dwCount, //[in]<br>phServer, //[in]<br>&pValues, //[out]<br>&pErrors); //[out]<br>if(FAILED(hr))<br>{<br>if (phServer) CoTaskMemFree (phServer);<br> if (pValues) CoTaskMemFree (pValues);<br> if (pErrors) CoTaskMemFree (pErrors);<br>VariantClear (&pValues[0].vDataValue);<br>return 2; //同步读数据时出错<br>}</p>
<p>//数据转换<br>Variant2Str(pValues[0].vDataValue,strData);<br>VariantClear (&pValues[0].vDataValue);</p>
<p>if (phServer) CoTaskMemFree (phServer);<br>if (pValues) CoTaskMemFree (pValues);<br>if (pErrors) CoTaskMemFree (pErrors);<br>}<br> catch (...)<br>{<br> return 3;<br>}</p>
<p>return 0;<br>}</p>
<p>//*************************************************************************<br>//函 数 名:SyncWrite<br>//所属类名:COPCClient<br>//输 入:long lngNo,<br>//CString &strData<br>//输 出:long<br>//功能描述:同步写<br>//全局变量:<br>//调用模块:<br>//作 者:叶帆<br>//日 期:2005年12月1日<br>//修 改 人:<br>//日 期:<br>//版 本:<br>//*************************************************************************<br>long COPCClient::SyncWrite(long lngNo,CString strData)<br>{ </p>
<p>DWORD dwIndex= 0;<br>OPCHANDLE *phServer = NULL;<br>VARIANT *pValues= NULL;<br>HRESULT *pErrors= NULL;<br>HRESULT hr= E_FAIL;<br>DWORD cdwItems=1;</p>
<p>phServer = (OPCHANDLE *) CoTaskMemAlloc (cdwItems * sizeof (OPCHANDLE));<br>pValues = (VARIANT *) CoTaskMemAlloc (cdwItems * sizeof (VARIANT));</p>
<p>if (phServer == NULL || pValues == NULL)<br>{<br> return 1;<br>}<br><br>::Sleep(0);<br><br>try<br>{<br> //同步写数据<br>phServer[0] =(OPCHANDLE)arrhServer.GetAt(lngNo);<br><br>//数据转换 <br>Str2Variant(strData,pValues[0],arrItemType.GetAt(lngNo));</p>
<p>hr = pISync->Write (<br>1, // Item count<br>phServer,// Array of server handles for items<br>pValues,// Array of values<br>&pErrors);// Array of errors</p>
<p>if(FAILED(hr))<br>{<br>if (phServer) CoTaskMemFree (phServer);<br> if (pValues) CoTaskMemFree (pValues);<br> if (pErrors) CoTaskMemFree (pErrors);<br>VariantClear (&pValues[0]);<br>return 2; //同步读数据时出错<br>}<br><br>VariantClear (&pValues[0]);<br>}<br><br>catch (...)<br>{<br> return 3;<br>}</p>
<p>if(phServer)CoTaskMemFree (phServer);<br>if (pValues)CoTaskMemFree (pValues);<br>if (pErrors) CoTaskMemFree (pErrors);<br><br>return 0;<br>}</p>
<p></p>
<p></p>
<br><br><br></dwcount>
相关推荐
【程序老媛出品,必属精品,亲测校正,质量...资源名:基于java开发的opc client程序源码.zip 资源类型:程序源代码 源码说明: java实现的opc client,带有丰富接口和说明文档 适合人群:新手及有一定经验的开发人员
资源名:Visual C++ OPC Client程序源码.zip 资源类型:程序源代码 源码说明: 基于Visual C++写的OPC Client客户端程序实例源码 包含完整代码和注释 很适合借鉴学习 适合人群:新手及有一定经验的开发人员
opc quick client 源码
OPCClient代码,vs2010下测试通过,dll齐全,对研究opcclient很实用
【程序老媛出品,必属精品,亲测校正,质量保证】 ...源码说明: c#写的OPC Client源码 OPC同步读写程序,支持访问OPCServer数据,同步写数据,同步读数据。 适合人群:新手及有一定经验的开发人员
vc++ opc client源码,内容齐全,支持opc client协议2.0。
采用基金会提供的API编写的C# OPC client,连接西门子 simatic Net OPC Server,测试成功
OpcClient源码,支持远程连接以及订阅,能直接运行,如有问题欢迎指教
delphi opc client daauto源码示例,有连接,断开,读写,simatic net V13
vs,net开发的OPC客户端,引用的是OPC基金会相关DLL,对学习OPC编程的 朋友会有帮助
vb开发opcclent源码,仅供参考学习之用,如有不足之处请指教
c#写的OPC Client源码,里面代码比较易懂,适合初学者。
OPC Client源码,可以同时连接多个本地或远程ServerOPC Client源码
连接OPC server,从OPC server中取数据
源码说明: 基于C#写的OPC Client程序 支持各类OPC SERVER,如KEPServerEX等 采用webapi接口支持跨平台远程获取OPC数据 包含完整源码和说明文档 非常适合借鉴学习 适合人群:新手及有一定经验的开发人员
opc Client OPC Server/OPCClient OPCServer 客户端/服务端程序/kepserver源码 1、有使用java开发opc client 源码 2、c++开发 opc server、opc client源码 3、满足数据采集的opc da协议、opc ua协议 有源码,有封装...
opcclient的源码,是vc的。对有些人应该有用
PYTHON写的LINUX下的OPC 客户端
SIEMENS公司,OPC基金组织写的示例源码,包括OPC UA Server示例源码,OPC UA Client 示例源码,很有参考价值.
OPCClient源码OPC客户端全部源码,C#开发,可提供全部源码,包括内部基础的服务源码。已应用到电力、矿山、建筑、自动化等多个行业的几百个应用现场,长时间运行稳定,可靠。