IOPCDataCallback数据回调仅能得到1个数据的值? 点击:983 | 回复:0



GOTOVC

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 8回
  • 年度积分:0
  • 历史总积分:128
  • 注册:2006年11月08日
发表于:2009-03-31 09:18:18
楼主

第一步: 设置回调
CCallback * pCallback = new CCallback(hConnect, lpCallback);
// pCallback->AddRef();
DWORD dwCookie;
//使用Advise在连接点和调用方的接收对象之间建立一个通知连接
hr = pIConnectPoint->Advise(pCallback, &dwCookie);

第二步:添加Item
HANDLE SOPCC_AddItem(HANDLE hConnect /*OPC连接句柄*/,
HANDLE hGroup /*OPC组句柄*/,
LPCSTR ItemName /*OPC标签的名称*/)
{
//首先,得到用户指定的存放位置
COPCConn * pOPCConn = OPCCONN(hConnect);
if( NULL == pOPCConn ) return NULL;
COPCGroup * pOPCGroup = pOPCConn->OPCGROUP(hGroup);
if( NULL == pOPCGroup ) return NULL;

pOPCGroup->m_lItemMark = pOPCGroup->m_lItemMark + 1;

HRESULT hr;
OPCITEMDEF * pItemArray = NULL;
OPCITEMRESULT * pResult = NULL;
HRESULT * pError = NULL;
DWORD dwItemLength = 0;

pItemArray = (OPCITEMDEF*)CoTaskMemAlloc( sizeof(OPCITEMDEF) ); //分配内存
dwItemLength = lstrlen(ItemName);

//为Item的名称分配内存
pItemArray【0】.szItemID =
(WCHAR*)CoTaskMemAlloc( (dwItemLength + 1) * sizeof(WCHAR) );
//转换

MultiByteToWideChar(
CP_ACP,
0,
ItemName,
-1,
pItemArray【0】.szItemID,
dwItemLength + 1);

USES_CONVERSION;
pItemArray【0】.szItemID = A2W(ItemName);

//可选的通道路径,对于Simatiic Net不需要
pItemArray【0】.szAccessPath = L"";
//激活标志
pItemArray【0】.bActive = TRUE;
//Client handle 标签句柄 , 在OnDataChange中会用到
pItemArray【0】.hClient = pOPCGroup->m_lItemMark;
pItemArray【0】.dwBlobSize = 0;
pItemArray【0】.pBlob = NULL;
pItemArray【0】.vtRequestedDataType = VT_EMPTY;
pItemArray【0】.wReserved = 0;

//添加位号
hr = pOPCGroup->m_pIItemMgt->AddItems(1, //添加位号的数量
pItemArray,
(OPCITEMRESULT**)&pResult,
(HRESULT**)&pError);
if( FAILED(hr) ) //添加失败
{
//释放该位号的内存空间
if( pItemArray )
{
if( pItemArray【0】.szItemID )
{
CoTaskMemFree(pItemArray【0】.szItemID);
}
CoTaskMemFree(pItemArray);
}
if(pResult) CoTaskMemFree(pResult);
if(pError) CoTaskMemFree(pError);
return NULL;
}
else if( SUCCEEDED(hr) ) //添加成功
{
COPCItem * pOPCItem = new COPCItem;
pOPCItem->hConnect = hConnect;
pOPCItem->hGroup = hGroup;
pOPCItem->hItem = (HANDLE)pResult->hServer; //OPC位号的通信连接句柄
pOPCGroup->m_Items.push_back( pOPCItem ); //统一管理

if( pItemArray )
{

CoTaskMemFree(pResult->pBlob);
CoTaskMemFree(pResult);
pResult = NULL;

CoTaskMemFree(pError);
pError = NULL;

}
}
return (HANDLE)pOPCGroup->m_lItemMark;
}


热门招聘
相关主题

官方公众号

智造工程师