你现在位置:首页>技术论文>数据通讯>正文
OPC Client 核心源码(MFC)
日期:2006-7-21 21:47:44 来源:本站整理  
点击: 作者:未知
点击【】放大字体.

   好像技术一沾上工业,便有了很高的价值,大家三缄其口,谁都不点破这层窗户纸,好多的思路和源码都要从国外网站获得,国内总是有条件,有限制--就是不告诉你,怕教会徒弟,饿死师父吧。

WWW_PLCJS@_COM%-PLC-技.术_网

WWcW_PLCJS_COM-PLC-技.术_网

研究了N天,开发了一个基于我的组态后台的OPC客户端驱动,考虑到驱动的特殊性,所以只开发了同步接口操作。测试一段时间后,还可以。现把核心代码公开出来,有点VC基础的人可以直接拿来用。
WW.W_PLCJS_COM-PLC-技.术_网

WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

源码网址:http://blog.csdn.net/yefanqiu/archive/2005/12/02/542447.aspx
WWcW_PLCJS_COM-PLC-技.术_网

 以下是对《OPC Client 核心源码(MFC)》的回复:  

WW.W_PLC※JS_C,OM-PL,C-技.术_网

匿名回复:
WWW_PLCJS@_COM%-PLC-技.术_网

    //*************************************************************************
WWW_PLCJS_COM-PLC-技.术_网

//函 数 名:ConnectOPC
WWW_PL※CJS_COM-PLC-技.术_网

//所属类名:COPCClien
WWW_PL※CJS_COM-PLC-技.术_网

//输    入:CString SvrName
——可——编——程——控-制-器-技——术——门——户

//输    出:
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

//功能描述:连接OPC服务器
WWW_PL※CJS_COM-PLC-技.术_网

//全局变量:
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

//调用模块:
plcjs.技.术_网

//作    者:叶帆
WWW_PLC※JS_COM-PmLC-技.术_网

//日    期:2005年12月1日
P.L.C.技.术.网——可编程控制器技术门户

//修 改 人:
WWW_PLC※JS_COM-PmLC-技.术_网

//日    期:
plcjs.技.术_网

//版    本:
——可——编——程——控-制-器-技——术——门——户

//*************************************************************************
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

long COPCClient::ConnectOPC(CString cSvrName)
WWcW_PLCJS_COM-PLC-技.术_网

{
WWW_PL※CJS_COM-PLC-技.术_网

    HRESULT hr;
WW.W_PLCJS_COM-PLC-技.术_网

 CLSID clsid;
WWW_P※LCJS_COM-PLC-)技.术_网

 WCHAR wszProgID [512];
WWW_PLCJS@_COM%-PLC-技.术_网

P.L.C.技.术.网——可编程控制器技术门户

 //----------------------------------
WWW_PL※CJS_COM-PLC-技.术_网

 //初始化COM
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

 hr =CoInitialize(NULL);
P.L.C.技.术.网——可编程控制器技术门户

 if (FAILED(hr))  return 8;           //com初始化失败
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

    
——可——编——程——控-制-器-技——术——门——户

 //-----------------------------------
WWW.PLCJS.COM——可编程控制器技术门户

 if(strSvrName!="")        //判断是否已经连接OPC
W1WW_P4LCJS_COM-PLC-技.术_网

 {
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

  if (strSvrName==cSvrName) return 2;  //OPC服务器已经连接
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

  else                      return 4;  //只能连接一个OPC服务器 
plcjs.技.术_网

 }
WW.W_PLC※JS_C,OM-PL,C-技.术_网

    //-----------------------------------
WWW.PLCJS.COM——可编程控制器技术门户

WWW_PLCJS_COM-PLC-技.术_网

 try
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

 {
WWcW_PLCJS_COM-PLC-技.术_网

      
WWW_P※LCJS_CO※M-PLC-技-.术_网

  //----------------------------------
WWW.PLCJS.COM——可编程控制器技术门户

  //把字符串形式的对象标识转化为CLSID结构形式
plcjs.技.术_网

  _mbstowcsz (wszProgID, cSvrName, sizeof (wszProgID) / sizeof (WCHAR));
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

  hr= CLSIDFromProgID(wszProgID,    // [in]
W1WW_P4LCJS_COM-PLC-技.术_网

       &clsid);      // [out]
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

  if(FAILED(hr))
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

  {
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

   CoTaskMemFree(&clsid);        //COM 内存释放函数
WWW_PLCJS_COM-PLC-技.术_网

   CoUninitialize();             //终止COM库功能服务
WWcW_PLCJS_COM-PLC-技.术_网

   return 16;                    //获取clsid失败
WW.W_PLC※JS_C,OM-PL,C-技.术_网

  }
WWcW_PLCJS_COM-PLC-技.术_网

        
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

  //--------------------------------
WW.W_PLC※JS_C,OM-PL,C-技.术_网

  //创建Server实例
WW.W_PLCJS_COM-PLC-技.术_网

  hr=CoCreateInstance(clsid,       //[in]
WWW_P※LCJS_COM-PLC-)技.术_网

     NULL,                //[in]
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

     CLSCTX_SERVER,       //[in]
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

     IID_IUnknown,        //[in]
WWW_PLCJS@_COM%-PLC-技.术_网

     (void**)&pUNK);      //[out]
P.L.C.技.术.网——可编程控制器技术门户

WW.W_PLC※JS_C,OM-PL,C-技.术_网

  if(FAILED(hr))
——可——编——程——控-制-器-技——术——门——户

  {
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

   CoTaskMemFree(&clsid);
W1WW_P4LCJS_COM-PLC-技.术_网

      if(pUNK) pUNK->Release();
WWW_PLCJS@_COM%-PLC-技.术_网

   pUNK=NULL;
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

   CoUninitialize();
W1WW_P4LCJS_COM-PLC-技.术_网

   return 32;                   //创建Server实例失败
WWW_P※LCJS_COM-PLC-)技.术_网

  }
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

 
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

  //------------------------------------
WWcW_PLCJS_COM-PLC-技.术_网

  //查询pOPC接口
WWW_PLCJS_COM-PLC-技.术_网

  hr=pUNK->QueryInterface(IID_IOPCServer,// [in]
W1WW_P4LCJS_COM-PLC-技.术_网

        (void**)&pOPC);// [out]
WWW.PLCJS.COM——可编程控制器技术门户

  if(FAILED(hr))
WWW_PLCJS_COM-PLC-技.术_网

  {
——可——编——程——控-制-器-技——术——门——户

   CoTaskMemFree(&clsid);
——可——编——程——控-制-器-技——术——门——户

   if(pOPC) pOPC->Release();
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

   if(pUNK) pUNK->Release();
WWW_PLC※JS_COM-PmLC-技.术_网

   pOPC=NULL;
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

   pUNK=NULL;
WWW_PL※CJS_COM-PLC-技.术_网

   return 64;                   //查询pOPC接口失败
WWcW_PLCJS_COM-PLC-技.术_网

  }
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

W1WW_P4LCJS_COM-PLC-技.术_网

  CoTaskMemFree(&clsid);
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

WWW_P※LCJS_COM-PLC-)技.术_网

        //---------------------------
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

  strSvrName=cSvrName;             //赋值当前OPC服务名称
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

WW.W_PLC※JS_C,OM-PL,C-技.术_网

 
WWW_PLCJS_COM-PLC-技.术_网

 }
WWW.PLCJS.COM——可编程控制器技术门户

 catch(...)
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

 {
P.L.C.技.术.网——可编程控制器技术门户

  return 128;                      //连接服务器时出现严重错误
WWW.PLCJS.COM——可编程控制器技术门户

 }
WWW_PLCJS@_COM%-PLC-技.术_网

 return 0;                            //成功
WWW_P※LCJS_CO※M-PLC-技-.术_网

}
WWW.PLCJS.COM——可编程控制器技术门户

P.L.C.技.术.网——可编程控制器技术门户

//*************************************************************************
——可——编——程——控-制-器-技——术——门——户

//函 数 名:DisconnectOPC
WWW_P※LCJS_COM-PLC-)技.术_网

//所属类名:COPCClient
W1WW_P4LCJS_COM-PLC-技.术_网

//输    入:
plcjs.技.术_网

//输    出:long
plcjs.技.术_网

//功能描述:断开OPC服务器
WWW_PLCJS_COM-PLC-技.术_网

//全局变量:
——可——编——程——控-制-器-技——术——门——户

//调用模块:
WW.W_PLCJS_COM-PLC-技.术_网

//作    者:叶帆
WWW_PL※CJS_COM-PLC-技.术_网

//日    期:2005年12月1日
WWW.PLCJS.COM——可编程控制器技术门户

//修 改 人:
WWW_P※LCJS_CO※M-PLC-技-.术_网

//日    期:
P.L.C.技.术.网——可编程控制器技术门户

//版    本:
P.L.C.技.术.网——可编程控制器技术门户

//*************************************************************************
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

long COPCClient::DisconnectOPC()
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

{
W1WW_P4LCJS_COM-PLC-技.术_网

    if(strSvrName=="")  return 1;   //OPC服务器尚未连接
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

WWW_PLCJS_COM-PLC-技.术_网

 HRESULT *pErrors = NULL;
WWW_PLC※JS_COM-PmLC-技.术_网

 DWORD dwCount=mIOMDevice->mItem.GetSize(),i;
WWW_P※LCJS_COM-PLC-)技.术_网

WWW_P※LCJS_COM-PLC-)技.术_网

 strSvrName="";                  //服务器名称清空
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

 //---------------
P.L.C.技.术.网——可编程控制器技术门户

 OPCHANDLE *phServer = NULL;
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

 //停止异步操作
WWW_PLC※JS_COM-PmLC-技.术_网

 pIAsync2->SetEnable(false);
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

             
W1WW_P4LCJS_COM-PLC-技.术_网

 //移除标签
WWW.PLCJS.COM——可编程控制器技术门户

 phServer = (OPCHANDLE *) CoTaskMemAlloc (dwCount * sizeof (OPCHANDLE));
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

 for(i=0;iWWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

WW.W_PLC※JS_C,OM-PL,C-技.术_网

 pIItemMgt->RemoveItems(dwCount,   // [in] 
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

         phServer,   // [in] 
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

        &pErrors);  // [out]
WWW.PLCJS.COM——可编程控制器技术门户

plcjs.技.术_网

 arrhServer.RemoveAll();
WWW_P※LCJS_CO※M-PLC-技-.术_网

 arrhServer.FreeExtra();
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

 arrItemType.RemoveAll();
WWW_PLCJS@_COM%-PLC-技.术_网

 arrItemType.FreeExtra();
WWW_PLCJS@_COM%-PLC-技.术_网

 
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

 //删除组
WWW.PLCJS.COM——可编程控制器技术门户

 pOPC->RemoveGroup(hServer,   //[in]
WWcW_PLCJS_COM-PLC-技.术_网

      true);      //[in]
P.L.C.技.术.网——可编程控制器技术门户

  
WWW_PL※CJS_COM-PLC-技.术_网

 //---------------
P.L.C.技.术.网——可编程控制器技术门户

 CoTaskMemFree(&hServer);
WWcW_PLCJS_COM-PLC-技.术_网

 CoTaskMemFree(&hGroup);
WWW_P※LCJS_CO※M-PLC-技-.术_网

WW.W_PLC※JS_C,OM-PL,C-技.术_网

 if(pErrors) CoTaskMemFree(pErrors);
WWW_P※LCJS_CO※M-PLC-技-.术_网

    if(pResults) CoTaskMemFree(pResults);
P.L.C.技.术.网——可编程控制器技术门户

WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

 if(pIAsync2) pIAsync2->Release();
WW.W_PLCJS_COM-PLC-技.术_网

 if(pISync) pISync->Release();
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

 if(pIItemMgt) pIItemMgt->Release();
WWW_PLC※JS_COM-PmLC-技.术_网

 if(pOPC) pOPC->Release();
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

 if(pUNK) pUNK->Release();
WW.W_PLCJS_COM-PLC-技.术_网

WWW_PLC※JS_COM-PmLC-技.术_网

 pOPC=NULL;
WW.W_PLC※JS_C,OM-PL,C-技.术_网

 pUNK=NULL;
W1WW_P4LCJS_COM-PLC-技.术_网

 pIItemMgt=NULL;
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

 pIAsync2=NULL;
——可——编——程——控-制-器-技——术——门——户

 pISync=NULL;
WW.W_PLCJS_COM-PLC-技.术_网

 hGroup=0;
WW.W_PLC※JS_C,OM-PL,C-技.术_网

 hServer=0;
W1WW_P4LCJS_COM-PLC-技.术_网

 
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

 CoUninitialize();                //关闭COM
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

WWW_PL※CJS_COM-PLC-技.术_网

 return 0;
WWcW_PLCJS_COM-PLC-技.术_网

}
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

WWW.PLCJS.COM——可编程控制器技术门户

WWW_PLCJS@_COM%-PLC-技.术_网

//*************************************************************************
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

//函 数 名:AddGroup
W1WW_P4LCJS_COM-PLC-技.术_网

//所属类名:COPCClient
plcjs.技.术_网

//输    入:
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

//输    出:long
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

//功能描述:添加组
P.L.C.技.术.网——可编程控制器技术门户

//全局变量:
plcjs.技.术_网

//调用模块:
WWW_P※LCJS_CO※M-PLC-技-.术_网

//作    者:叶帆
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

//日    期:2005年12月1日
plcjs.技.术_网

//修 改 人:
WWW_PL※CJS_COM-PLC-技.术_网

//日    期:
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

//版    本:
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

//*************************************************************************
WWW.PLCJS.COM——可编程控制器技术门户

long COPCClient::AddGroup()
P.L.C.技.术.网——可编程控制器技术门户

{
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

 HRESULT hr;
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

    WCHAR wchBuffer[255];
WWW_PL※CJS_COM-PLC-技.术_网

 long lBias=0;
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

 float fDeadband=0;
WWW_PLCJS@_COM%-PLC-技.术_网

 DWORD dwRevUpdateRate=0;
W1WW_P4LCJS_COM-PLC-技.术_网

 IUnknown *pUNKgroup;        //组接口指针
——可——编——程——控-制-器-技——术——门——户

WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

 MultiByteToWideChar(CP_ACP, 0, mIOMDevice->ConfigMessage, -1, wchBuffer, 255);
WWW_PLC※JS_COM-PmLC-技.术_网

    
——可——编——程——控-制-器-技——术——门——户

 //添加组
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

 hr = pOPC->AddGroup (
WW.W_PLCJS_COM-PLC-技.术_网

   wchBuffer,     // [in] group name
WWcW_PLCJS_COM-PLC-技.术_网

   TRUE,                  // [in] active state
plcjs.技.术_网

   mIOMDevice->Scantime,       // [in] requested update rate
plcjs.技.术_网

   hGroup,                  // [in] our handle to this group
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

   &lBias,      // [unique,in] time bias
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

   &fDeadband,     // [in] percent deadband
WWW_PLC※JS_COM-PmLC-技.术_网

   1033,                     // [in] requested language ID
WWW_PLCJS@_COM%-PLC-技.术_网

   &hServer,     // [out] server handle to this group
WWW_P※LCJS_CO※M-PLC-技-.术_网

   &dwRevUpdateRate,   // [out] revised update rate
WW.W_PLC※JS_C,OM-PL,C-技.术_网

   IID_IUnknown,               // [in] REFIID riid,
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

   (LPUNKNOWN*)&pUNKgroup);    // [out, iid_is(riid)] LPUNKNOWN *pUNKgroup
WW.W_PLC※JS_C,OM-PL,C-技.术_网

WWW_PLCJS_COM-PLC-技.术_网

 if(FAILED(hr))  //加入组失败
plcjs.技.术_网

 {
WWW_PLC※JS_COM-PmLC-技.术_网

  CoTaskMemFree(&hServer);
plcjs.技.术_网

  CoTaskMemFree(&dwRevUpdateRate);
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

  if(pUNKgroup) pUNKgroup->Release();
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

  pUNKgroup=NULL;
WW.W_PLC※JS_C,OM-PL,C-技.术_网

  return 1;
WW.W_PLCJS_COM-PLC-技.术_网

 }
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

WWW_PLC※JS_COM-PmLC-技.术_网

 //--------------------------------------
WWW_PLCJS@_COM%-PLC-技.术_网

 //查询pIItemMgt
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

 hr=pUNKgroup->QueryInterface(IID_IOPCItemMgt,     // [in]
WWW_P※LCJS_COM-PLC-)技.术_网

        (void**)&pIItemMgt);  // [out]
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

——可——编——程——控-制-器-技——术——门——户

    //查询失败
WWW.PLCJS.COM——可编程控制器技术门户

    if(FAILED(hr)) 
WWW_P※LCJS_COM-PLC-)技.术_网

 {
WWW_P※LCJS_COM-PLC-)技.术_网

  CoTaskMemFree(&hServer);
WWW_P※LCJS_CO※M-PLC-技-.术_网

  CoTaskMemFree(&dwRevUpdateRate);
WW.W_PLCJS_COM-PLC-技.术_网

  if(pUNKgroup) pUNKgroup->Release();
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

  pUNKgroup=NULL;
WWcW_PLCJS_COM-PLC-技.术_网

  if(pIItemMgt) pIItemMgt->Release();
WWW_PLCJS_COM-PLC-技.术_网

  pIItemMgt=NULL;
WWW_PL※CJS_COM-PLC-技.术_网

  return 2;   
W1WW_P4LCJS_COM-PLC-技.术_网

 }
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

 if(pUNKgroup) pUNKgroup->Release();
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

    pUNKgroup=NULL;
WWcW_PLCJS_COM-PLC-技.术_网

 CoTaskMemFree(&dwRevUpdateRate);
WWW_PLC※JS_COM-PmLC-技.术_网

    return 0;
WWW_PLC※JS_COM-PmLC-技.术_网

}
WW.W_PLC※JS_C,OM-PL,C-技.术_网

WWW_PL※CJS_COM-PLC-技.术_网

//*************************************************************************
——可——编——程——控-制-器-技——术——门——户

//函 数 名:AddItem
P.L.C.技.术.网——可编程控制器技术门户

//所属类名:COPCClient
——可——编——程——控-制-器-技——术——门——户

//输    入:
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

//输    出:long
WW.W_PLCJS_COM-PLC-技.术_网

//功能描述:加入项
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

//全局变量:
WW.W_PLCJS_COM-PLC-技.术_网

//调用模块:
WWW_PLC※JS_COM-PmLC-技.术_网

//作    者:叶帆
WWW_PL※CJS_COM-PLC-技.术_网

//日    期:2005年12月1日
WW.W_PLCJS_COM-PLC-技.术_网

//修 改 人:
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

//日    期:
WW.W_PLCJS_COM-PLC-技.术_网

//版    本:
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

//*************************************************************************
WWW_PLCJS@_COM%-PLC-技.术_网

long COPCClient::AddItem()
WWcW_PLCJS_COM-PLC-技.术_网

{
WW.W_PLCJS_COM-PLC-技.术_网

 HRESULT hr;
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

 OPCITEMDEF *pItemArray = NULL;
WWcW_PLCJS_COM-PLC-技.术_网

WW.W_PLC※JS_C,OM-PL,C-技.术_网

 HRESULT *pErrors = NULL;
WWW_PLCJS@_COM%-PLC-技.术_网

 DWORD dwCount,dwLen,i;
WWW_PLCJS_COM-PLC-技.术_网

    
WWW_PL※CJS_COM-PLC-技.术_网

    //--------------------------------------
WWW_PL※CJS_COM-PLC-技.术_网

    //添加标签
——可——编——程——控-制-器-技——术——门——户

    dwCount=mIOMDevice->mItem.GetSize();
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

  pItemArray = (OPCITEMDEF *) CoTaskMemAlloc (dwCount * sizeof (OPCITEMDEF)); //分配内存
WWW_PL※CJS_COM-PLC-技.术_网

   
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

 for(i=0;iplcjs.技.术_网

 {
WWW_PLC※JS_COM-PmLC-技.术_网

  dwLen = lstrlen (mIOMDevice->mItem[i].strTab);
P.L.C.技.术.网——可编程控制器技术门户

  pItemArray [i].szItemID = (WCHAR *) CoTaskMemAlloc ((dwLen + 1) * sizeof (WCHAR));
WWW_PLC※JS_COM-PmLC-技.术_网

  MultiByteToWideChar (CP_ACP, 0, mIOMDevice->mItem[i].strTab, -1, pItemArray [i].szItemID, dwLen + 1);
plcjs.技.术_网

  pItemArray [i].szAccessPath=NULL;
——可——编——程——控-制-器-技——术——门——户

  pItemArray [i].bActive = true;                     // active state
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

  pItemArray [i].hClient = (OPCHANDLE)i;             // our handle to item
WWcW_PLCJS_COM-PLC-技.术_网

  pItemArray [i].dwBlobSize = 0;            // no blob support
WWW_PL※CJS_COM-PLC-技.术_网

  pItemArray [i].pBlob = NULL;
WW.W_PLCJS_COM-PLC-技.术_网

  pItemArray [i].vtRequestedDataType =VT_EMPTY;       // Requested data type
WWW_P※LCJS_COM-PLC-)技.术_网

  pItemArray [i].wReserved=0;
WWW_PLCJS@_COM%-PLC-技.术_网

 }
P.L.C.技.术.网——可编程控制器技术门户

    
WWW_PL※CJS_COM-PLC-技.术_网

    //添加
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

 hr = pIItemMgt->AddItems (dwCount,   //[in] DWORD dwCount,Item count
P.L.C.技.术.网——可编程控制器技术门户

       pItemArray,  //[in, size_is(dwCount)] OPCITEMDEF * pItemArray, Array of item definition structures
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

       &pResults,   //[out, size_is(,dwCount)] OPCITEMRESULT ** ppAddResults, Result array
——可——编——程——控-制-器-技——术——门——户

       &pErrors);   //[out, size_is(,dwCount)] HRESULT ** ppErrors Error array
WWW.PLCJS.COM——可编程控制器技术门户

 //添加失败
W1WW_P4LCJS_COM-PLC-技.术_网

 if(FAILED(hr))
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

 {
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

     if(pResults) CoTaskMemFree(pResults);
plcjs.技.术_网

  if(pErrors) CoTaskMemFree(pErrors);
WW.W_PLC※JS_C,OM-PL,C-技.术_网

  CoTaskMemFree(&hServer);
WWW.PLCJS.COM——可编程控制器技术门户

  CoTaskMemFree(pItemArray);
WWW_PLCJS_COM-PLC-技.术_网

        return 2;
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

 }
WWcW_PLCJS_COM-PLC-技.术_网

    
WWW_P※LCJS_CO※M-PLC-技-.术_网

 //同步接口
WWW.PLCJS.COM——可编程控制器技术门户

 hr=pIItemMgt->QueryInterface(IID_IOPCSyncIO,  // [in]
plcjs.技.术_网

        (void**)&pISync); // [out]
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

W1WW_P4LCJS_COM-PLC-技.术_网

 if(FAILED (hr))
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

 {
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

  CoTaskMemFree(&hServer);
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

  if(pISync) pISync->Release();
WWW_PLCJS_COM-PLC-技.术_网

  if(pResults) CoTaskMemFree(pResults);
WWcW_PLCJS_COM-PLC-技.术_网

        if(pErrors) CoTaskMemFree(pErrors);
WW.W_PLC※JS_C,OM-PL,C-技.术_网

  pISync=NULL;
WWcW_PLCJS_COM-PLC-技.术_网

  return 3;          //查询pISync接口失败
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

 }
WW.W_PLC※JS_C,OM-PL,C-技.术_网

    
WW.W_PLCJS_COM-PLC-技.术_网

 //异步接口
WWW_P※LCJS_COM-PLC-)技.术_网

 hr=pIItemMgt->QueryInterface(IID_IOPCAsyncIO2,(void**)&pIAsync2);
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

 if(FAILED (hr))
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

 {
WWW_PLCJS@_COM%-PLC-技.术_网

  CoTaskMemFree(&hServer);
P.L.C.技.术.网——可编程控制器技术门户

  if(pIAsync2) pIAsync2->Release();
WW.W_PLC※JS_C,OM-PL,C-技.术_网

  if(pResults) CoTaskMemFree(pResults);
——可——编——程——控-制-器-技——术——门——户

        if(pErrors) CoTaskMemFree(pErrors);
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

  pIAsync2=NULL;
W1WW_P4LCJS_COM-PLC-技.术_网

  return 4;         //查询pIAsync2接口失败
WWW_PLCJS@_COM%-PLC-技.术_网

 }
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

    
W1WW_P4LCJS_COM-PLC-技.术_网

 //---------------------
WWW_P※LCJS_COM-PLC-)技.术_网

 arrhServer.SetSize(dwCount);
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

 arrItemType.SetSize(dwCount);
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

WWcW_PLCJS_COM-PLC-技.术_网

 for(i=0;iWWW_PLCJS_COM-PLC-技.术_网

 {
W1WW_P4LCJS_COM-PLC-技.术_网

  arrhServer.SetAt(i,pResults[i].hServer );
WWW.PLCJS.COM——可编程控制器技术门户

  arrItemType.SetAt(i,(WORD)pResults[i].vtCanonicalDataType);
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

 }
WWW_PLC※JS_COM-PmLC-技.术_网

WW.W_PLC※JS_C,OM-PL,C-技.术_网

 //---------------------
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

W1WW_P4LCJS_COM-PLC-技.术_网

    if(pErrors) CoTaskMemFree(pErrors);
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

 CoTaskMemFree(pItemArray);
WWW_PLCJS@_COM%-PLC-技.术_网

    return 0;
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

}
——可——编——程——控-制-器-技——术——门——户

WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

//*************************************************************************
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

//函 数 名:SyncRead
WWW_PLCJS_COM-PLC-技.术_网

//所属类名:COPCClient
plcjs.技.术_网

//输    入:long lngNo,
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

//   CString strData
W1WW_P4LCJS_COM-PLC-技.术_网

//输    出:long
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

//功能描述:同步读取数据
WWW_PL※CJS_COM-PLC-技.术_网

//全局变量:
WWW.PLCJS.COM——可编程控制器技术门户

//调用模块:
——可——编——程——控-制-器-技——术——门——户

//作    者:叶帆
WWW_PLC※JS_COM-PmLC-技.术_网

//日    期:2005年12月1日
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

//修 改 人:
P.L.C.技.术.网——可编程控制器技术门户

//日    期:
WWW_PL※CJS_COM-PLC-技.术_网

//版    本:
——可——编——程——控-制-器-技——术——门——户

//*************************************************************************
WWW_PLC※JS_COM-PmLC-技.术_网

long COPCClient::SyncRead(long lngNo,CString &strData)
WWW_P※LCJS_CO※M-PLC-技-.术_网

{
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

    HRESULT hr = E_FAIL;
WW.W_PLCJS_COM-PLC-技.术_网

 DWORD dwCount=1;
WW.W_PLC※JS_C,OM-PL,C-技.术_网

 OPCDATASOURCE dwSource = OPC_DS_CACHE;
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

 OPCHANDLE *phServer  = NULL;
WW.W_PLC※JS_C,OM-PL,C-技.术_网

 OPCITEMSTATE *pValues = NULL;
WWW_PL※CJS_COM-PLC-技.术_网

 HRESULT *pErrors  = NULL;
WWW_PLCJS@_COM%-PLC-技.术_网

WWW_PLC※JS_COM-PmLC-技.术_网

 ::Sleep(0);
P.L.C.技.术.网——可编程控制器技术门户

——可——编——程——控-制-器-技——术——门——户

 try
——可——编——程——控-制-器-技——术——门——户

 {
——可——编——程——控-制-器-技——术——门——户

  phServer = (OPCHANDLE *) CoTaskMemAlloc (dwCount * sizeof (OPCHANDLE));
WW.W_PLCJS_COM-PLC-技.术_网

  if (phServer == NULL)
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

  {
WWW_P※LCJS_CO※M-PLC-技-.术_网

   return 1;   //分配内存时出错
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

  }
WWW_PLCJS@_COM%-PLC-技.术_网

WWW_PLCJS_COM-PLC-技.术_网

  phServer[0] =(OPCHANDLE)arrhServer.GetAt(lngNo);
WWW_PLCJS_COM-PLC-技.术_网

  hr=pISync->Read(dwSource,   //[in]
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

      dwCount,    //[in]
——可——编——程——控-制-器-技——术——门——户

      phServer,   //[in]
WWW.PLCJS.COM——可编程控制器技术门户

      &pValues,   //[out]
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

      &pErrors);  //[out]
W1WW_P4LCJS_COM-PLC-技.术_网

  if(FAILED(hr))
WWW_P※LCJS_CO※M-PLC-技-.术_网

  {
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

   if (phServer) CoTaskMemFree (phServer);
WWW_PLC※JS_COM-PmLC-技.术_网

      if (pValues) CoTaskMemFree (pValues); 
P.L.C.技.术.网——可编程控制器技术门户

      if (pErrors) CoTaskMemFree (pErrors);
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

   VariantClear (&pValues[0].vDataValue);
WWcW_PLCJS_COM-PLC-技.术_网

   return 2;   //同步读数据时出错
P.L.C.技.术.网——可编程控制器技术门户

  }
plcjs.技.术_网

WWW_PLC※JS_COM-PmLC-技.术_网

  //数据转换
WW.W_PLC※JS_C,OM-PL,C-技.术_网

  Variant2Str(pValues[0].vDataValue,strData);
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

  VariantClear (&pValues[0].vDataValue);
WWW.PLCJS.COM——可编程控制器技术门户

WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

  if (phServer) CoTaskMemFree (phServer);
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

  if (pValues) CoTaskMemFree (pValues); 
WW.W_PLCJS_COM-PLC-技.术_网

  if (pErrors) CoTaskMemFree (pErrors);
WWW_PL※CJS_COM-PLC-技.术_网

 }
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

    catch (...)
WWW.PLCJS.COM——可编程控制器技术门户

 {
WWW_PLCJS@_COM%-PLC-技.术_网

     return 3;
——可——编——程——控-制-器-技——术——门——户

 }
WWW_P※LCJS_COM-PLC-)技.术_网

WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

 return 0;
WWcW_PLCJS_COM-PLC-技.术_网

}
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

WWW.PLCJS.COM——可编程控制器技术门户

//*************************************************************************
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

//函 数 名:SyncWrite
WWW_PL※CJS_COM-PLC-技.术_网

//所属类名:COPCClient
plcjs.技.术_网

//输    入:long lngNo,
WWW_PLCJS@_COM%-PLC-技.术_网

//   CString &strData
WWW.PLCJS.COM——可编程控制器技术门户

//输    出:long
WWcW_PLCJS_COM-PLC-技.术_网

//功能描述:同步写
WWW_PLCJS@_COM%-PLC-技.术_网

//全局变量:
WWcW_PLCJS_COM-PLC-技.术_网

//调用模块:
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

//作    者:叶帆
P.L.C.技.术.网——可编程控制器技术门户

//日    期:2005年12月1日
WW.W_PLC※JS_C,OM-PL,C-技.术_网

//修 改 人:
WWcW_PLCJS_COM-PLC-技.术_网

//日    期:
W1WW_P4LCJS_COM-PLC-技.术_网

//版    本:
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

//*************************************************************************
plcjs.技.术_网

long COPCClient::SyncWrite(long lngNo,CString strData)
P.L.C.技.术.网——可编程控制器技术门户

{   
WWW_P※LCJS_COM-PLC-)技.术_网

WWW_P※LCJS_COM-PLC-)技.术_网

 DWORD dwIndex  = 0;
WW.W_PLCJS_COM-PLC-技.术_网

 OPCHANDLE *phServer = NULL;
WWW_PLC※JS_COM-PmLC-技.术_网

 VARIANT *pValues = NULL;
WWW_PLCJS_COM-PLC-技.术_网

 HRESULT *pErrors = NULL;
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

 HRESULT hr   = E_FAIL;
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

 DWORD cdwItems=1;
WW.W_PLC※JS_C,OM-PL,C-技.术_网

WWW.PLCJS.COM——可编程控制器技术门户

 phServer = (OPCHANDLE *) CoTaskMemAlloc (cdwItems * sizeof (OPCHANDLE));
WWW.PLCJS.COM——可编程控制器技术门户

 pValues = (VARIANT *) CoTaskMemAlloc (cdwItems * sizeof (VARIANT));
WWW.PLCJS.COM——可编程控制器技术门户

WW.W_PLC※JS_C,OM-PL,C-技.术_网

 if (phServer == NULL || pValues == NULL)
P.L.C.技.术.网——可编程控制器技术门户

 {
plcjs.技.术_网

    return 1;
WW.W_PLCJS_COM-PLC-技.术_网

 }
WWW_P※LCJS_COM-PLC-)技.术_网

    
plcjs.技.术_网

 ::Sleep(0);
plcjs.技.术_网

 
WWW_PL※CJS_COM-PLC-技.术_网

 try
WWW.PLCJS.COM——可编程控制器技术门户

 {
WW.W_PLCJS_COM-PLC-技.术_网

        //同步写数据
plcjs.技.术_网

  phServer[0] =(OPCHANDLE)arrhServer.GetAt(lngNo);
WWW_PLCJS@_COM%-PLC-技.术_网

        
plcjs.技.术_网

  //数据转换 
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

  Str2Variant(strData,pValues[0],arrItemType.GetAt(lngNo));
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

WWW_PLC※JS_COM-PmLC-技.术_网

  hr = pISync->Write (
plcjs.技.术_网

    1,             // Item count
W1WW_P4LCJS_COM-PLC-技.术_网

    phServer,  // Array of server handles for items
WW.W_PLC※JS_C,OM-PL,C-技.术_网

    pValues,  // Array of values
——可——编——程——控-制-器-技——术——门——户

    &pErrors);  // Array of errors
WWW_PL※CJS_COM-PLC-技.术_网

WWW_P※LCJS_COM-PLC-)技.术_网

  if(FAILED(hr))
WW.W_PLCJS_COM-PLC-技.术_网

  {
WW.W_PLCJS_COM-PLC-技.术_网

   if (phServer) CoTaskMemFree (phServer);
P.L.C.技.术.网——可编程控制器技术门户

      if (pValues) CoTaskMemFree (pValues); 
P.L.C.技.术.网——可编程控制器技术门户

      if (pErrors) CoTaskMemFree (pErrors);
WWW_PLCJS@_COM%-PLC-技.术_网

   VariantClear (&pValues[0]);
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

   return 2;   //同步读数据时出错
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

  }
W1WW_P4LCJS_COM-PLC-技.术_网

 
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

  VariantClear (&pValues[0]);
WWcW_PLCJS_COM-PLC-技.术_网

 }
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

 
WW.W_PLC※JS_C,OM-PL,C-技.术_网

 catch (...)
W1WW_P4LCJS_COM-PLC-技.术_网

 {
WW.W_PLC※JS_C,OM-PL,C-技.术_网

     return 3;
WW.W_PLCJS_COM-PLC-技.术_网

 }
plcjs.技.术_网

WWcW_PLCJS_COM-PLC-技.术_网

 if(phServer)CoTaskMemFree (phServer);
WWW_PL※CJS_COM-PLC-技.术_网

 if (pValues)CoTaskMemFree (pValues);
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

 if (pErrors) CoTaskMemFree (pErrors);
WWW_PLCJS@_COM%-PLC-技.术_网

    
WWW_PLCJS_COM-PLC-技.术_网

 return 0;
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

}
WWW_P※LCJS_CO※M-PLC-技-.术_网

P.L.C.技.术.网——可编程控制器技术门户

匿名回复:

本新闻共2页,当前在第11 2  
WWW_PLC※JS_COM-PmLC-技.术_网

上一篇: 一起看一下ABB AC800系统
下一: 求助RSLINX
评论内容
载入中...
载入中...
P
L
C



|










|


P
L
C









·最新招聘信息
·最新求职信息
·推荐产品
·推荐厂商
·栏目热门排行
·站内热门排行