📄 asynopcdlg.cpp
字号:
r1=m_IOPCItemMgt->QueryInterface(IID_IOPCGroupStateMgt, (void**) &m_IOPCGroupStateMgt);
if (r1 != S_OK)
{
AfxMessageBox("IOPCGroupStateMgt接口没有找到");
CoTaskMemFree(m_ItemResult);
m_IOPCItemMgt->Release();
m_IOPCItemMgt = 0;
m_GrpSrvHandle = 0;
m_IOPCServer->Release();
m_IOPCServer = NULL;
CoUninitialize();
return;
}
OnCheckActivategroup();
// 建立异步回调
CComObject<COPCDataCallback>* pCOPCDataCallback; // 回调对象的指针
//通过ATL模板创建回调对象的实例
CComObject<COPCDataCallback>::CreateInstance(&pCOPCDataCallback);
// 查询IUnknown接口
LPUNKNOWN pCbUnk;
pCbUnk = pCOPCDataCallback->GetUnknown();
// 建立一个服务器的连接点与客户程序接收器之间的连接
HRESULT hRes = AtlAdvise( m_IOPCGroupStateMgt, // [in] IUnknown Interface of the Connection Point
pCbUnk, // [in] IUnknown Interface of the Callback object
IID_IOPCDataCallback,// [in] Connection Point ID: The OPC Data Callback
&m_dwAdvise // [out] Cookie that that uniquely identifies the connection
);
if (hRes != S_OK)
{
AfxMessageBox("Advise失败!");
CoTaskMemFree(m_ItemResult);
m_IOPCItemMgt->Release();
m_IOPCItemMgt = 0;
m_GrpSrvHandle = 0;
m_IOPCServer->Release();
m_IOPCServer = NULL;
CoUninitialize();
return;
}
}
/*异步读*/
void CAsynOpcDlg::OnRead()
{
// TODO: Add your control notification handler code here
readFlag=1;
OPCHANDLE *phServer;
DWORD dwCancelID;
HRESULT *pErrors;
HRESULT r1;
CString szOut;
if (m_pErrors[0] != S_OK) // //Item不可用
{
AfxMessageBox("OPC Item 不可用,不能用同步读功能!");
return;
}
//内存分配
phServer = new OPCHANDLE[1];
//通过server句柄选择item(由AddItem得到的)
phServer[0] = m_ItemResult[0].hServer;
r1 = m_IOPCAsyncIO2->Read(1, // [in] Read 1 Item
phServer, // [in] Item defined in this array
1, // [out] Clients Transaction ID, not used in this sample
&dwCancelID, // [out] Servers Cancel ID, not used in this sample
&pErrors // [out] Errors for each item, returned by OPC Server
);
delete[] phServer;
if (r1 == S_FALSE)
{
AfxMessageBox("Read()错误");
}
if (FAILED(r1))
{
AfxMessageBox("异步读失败!");
}
else
{
//释放内存,如果操作成功
CoTaskMemFree(pErrors);
}
}
/*异步写,将写结果显示在对话框*/
void CAsynOpcDlg::OnWrite()
{
// TODO: Add your control notification handler code here
writeFlag=1;
OPCHANDLE *phServer;
DWORD dwCancelID;
VARIANT values[1];
HRESULT *pErrors;
HRESULT r1;
LPWSTR ErrorStr;
CString szOut;
if (m_pErrors[0] != S_OK) // Item not available
{
AfxMessageBox("OPC Item 不可用,不能用同步读功能!");
return;
}
//通过server句柄选择item(由AddItem得到的)
phServer = new OPCHANDLE[1];
phServer[0] = m_ItemResult[0].hServer;
// 从对话框获得数据
UpdateData(TRUE);
// 设置Variant变量的数据类型和数值
values[0].vt = VT_R8;
values[0].dblVal = m_writeValue;
r1 = m_IOPCAsyncIO2->Write( 1, // [in] Write 1 Item
phServer, // [in] Item defined in this array
values, // [in] Values defined in an array of Variants
2, // [in] Clients transaction ID, not used in this sample
&dwCancelID,// [out] Servers Cancel ID for this transaction, not used
&pErrors // [out] Errors for each item, returned by OPC Server
);
delete[] phServer;
if (r1 == S_FALSE)
{
m_IOPCServer->GetErrorString(pErrors[0], LOCALE_ID, &ErrorStr);
m_writeResult = ErrorStr;
UpdateData(FALSE);
}
if (FAILED(r1))
{
AfxMessageBox("异步写Item错误");
}
else
{ // release [out] parameter in case of not failed
CoTaskMemFree(pErrors);
}
}
void CAsynOpcDlg::OnCheckActivategroup()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
DWORD dwRevUpdateRate;
HRESULT r1= m_IOPCGroupStateMgt->SetState(NULL, // [in] RequestedUpdateRate
&dwRevUpdateRate, // [out] RevisedUpdateRate
&m_bChkGroupAct,//[in] ActiveFlag for Group
NULL, // [in] TimeBias
NULL, // [in] PercentDeadband
NULL, // [in] LCID
NULL); // [in] Handle ClientGroup
if (FAILED(r1))
{ MessageBox("Set State failed",
"Error", MB_OK+MB_ICONERROR);
return;
}
}
/*停止服务器*/
void CAsynOpcDlg::OnStop()
{
// TODO: Add your control notification handler code here
HRESULT r1;
OPCHANDLE *phServer;
HRESULT *pErrors;
// Unadvise Callback
HRESULT hRes = AtlUnadvise(m_IOPCGroupStateMgt, IID_IOPCDataCallback, m_dwAdvise);
m_IOPCGroupStateMgt->Release();
// Remove Items
phServer = new OPCHANDLE[1];
phServer[0] = m_ItemResult[0].hServer;
r1 = m_IOPCItemMgt->RemoveItems( 1, // [in] Remove two Items
phServer, // [in] Identified in by Server Handle
&pErrors // [out] Errors for each item, returned by OPC Server
);
if ( (r1 != S_OK) && (r1 != S_FALSE) )
{ MessageBox("RemoveItems failed!",
"Error RemoveItems()", MB_OK+MB_ICONERROR);
}
delete[] phServer;
CoTaskMemFree(pErrors);
CoTaskMemFree(m_ItemResult);
m_ItemResult=NULL;
CoTaskMemFree(m_pErrors);
m_pErrors=NULL;
//Release Interface for async calls
m_IOPCAsyncIO2->Release();
m_IOPCAsyncIO2 = NULL;
// Release ItemManagement Interface
m_IOPCItemMgt->Release();
m_IOPCItemMgt = NULL;
// Remove Group
r1=m_IOPCServer->RemoveGroup(m_GrpSrvHandle, TRUE);
if (r1 != S_OK)
{ MessageBox("RemoveGroup failed!",
"Error RemoveGroup()", MB_OK+MB_ICONERROR);
}
m_GrpSrvHandle = NULL;
// Release OPC-Server
m_IOPCServer->Release();
m_IOPCServer = NULL;
// Uninit COM
CoUninitialize();
}
void CAsynOpcDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
LPWSTR ErrorStr;
if(changeFlag==1)
{
m_dataValue=value[0];
m_dataTS=timestamp[0];
m_dataQulity=quility[0];
changeFlag=0;
UpdateData(FALSE);
}
if(readFlag==1)
{
m_readTS=readTS[0];
m_readValue=readValue[0];
m_readQulity=readQulity[0];
readFlag=0;
UpdateData(FALSE);
}
if(writeFlag==1)
{
m_IOPCServer->GetErrorString(writeRes[0], LOCALE_ID, &ErrorStr);
m_writeResult=ErrorStr;
writeFlag=0;
UpdateData(FALSE);
}
CDialog::OnTimer(nIDEvent);
}
void CAsynOpcDlg::OnRadioGroup1()
{
// TODO: Add your control notification handler code here
ChangeGroup(L"grp1");
CallBack();
}
void CAsynOpcDlg::OnRadioGroup2()
{
// TODO: Add your control notification handler code here
ChangeGroup(L"grp2");
CallBack();
}
BOOL CAsynOpcDlg::ChangeGroup(LPWSTR szName)
{
DWORD dwRevUpdateRate;BOOL m_bActivateGroup=FALSE;HRESULT r1;
if(m_dwAdvise)
{
r1 = AtlUnadvise(m_IOPCGroupStateMgt, IID_IOPCDataCallback, m_dwAdvise);
if(r1!=S_OK)
{
return FALSE;
}
r1= m_IOPCGroupStateMgt->SetState(NULL, // [in] RequestedUpdateRate
&dwRevUpdateRate, // [out] RevisedUpdateRate
&m_bActivateGroup,//[in] ActiveFlag for Group
NULL, // [in] TimeBias
NULL, // [in] PercentDeadband
NULL, // [in] LCID
NULL);
if (FAILED(r1))
{ ;
return FALSE;
}
m_IOPCGroupStateMgt->Release();
}
r1=m_IOPCServer->GetGroupByName(szName,IID_IOPCItemMgt,(LPUNKNOWN*)&m_IOPCItemMgt);
r1=m_IOPCItemMgt->QueryInterface(IID_IOPCGroupStateMgt, (void**) &m_IOPCGroupStateMgt);
m_bActivateGroup=TRUE;
r1= m_IOPCGroupStateMgt->SetState(NULL, // [in] RequestedUpdateRate
&dwRevUpdateRate, // [out] RevisedUpdateRate
&m_bActivateGroup, //[in] ActiveFlag for Group
NULL, // [in] TimeBias
NULL, // [in] PercentDeadband
NULL, // [in] LCID
NULL);
if (FAILED(r1))
{ ;
return FALSE;
}
if (r1 != S_OK)
{
CoTaskMemFree(m_ItemResult);
m_IOPCItemMgt->Release();
m_IOPCItemMgt = 0;
m_GrpSrvHandle = 0;
return FALSE;
}
return TRUE;
}
int CAsynOpcDlg::CallBack()
{
HRESULT r1;
r1=m_IOPCItemMgt->QueryInterface(IID_IOPCGroupStateMgt, (void**) &m_IOPCGroupStateMgt);
if (r1 != S_OK)
{
CoTaskMemFree(m_ItemResult);
m_IOPCItemMgt->Release();
m_IOPCItemMgt = 0;
m_GrpSrvHandle = 0;
m_IOPCServer->Release();
m_IOPCServer = NULL;
CoUninitialize();
return -1;
}
r1 = m_IOPCItemMgt->QueryInterface(IID_IOPCAsyncIO2, (void**)&m_IOPCAsyncIO2);
if (r1 < 0)
{
CoTaskMemFree(m_ItemResult);
m_IOPCItemMgt->Release();
m_IOPCItemMgt = 0;
m_GrpSrvHandle = 0;
m_IOPCServer->Release();
m_IOPCServer = NULL;
CoUninitialize();
return -1;
}
// Establish Callback for all async operations
CComObject<COPCDataCallback>* pCOPCDataCallback; // Pointer to Callback Object
// Create Instance of Callback Object using an ATL template
CComObject<COPCDataCallback>::CreateInstance(&pCOPCDataCallback);
LPUNKNOWN pCbUnk;
pCbUnk = pCOPCDataCallback->GetUnknown();
// Creates a connection between the OPC servers's connection point and
// this client's sink (the callback object).
HRESULT hRes = AtlAdvise( m_IOPCGroupStateMgt, // [in] IUnknown Interface of the Connection Point
pCbUnk, // [in] IUnknown Interface of the Callback object
IID_IOPCDataCallback,// [in] Connection Point ID: The OPC Data Callback
&m_dwAdvise // [out] Cookie that that uniquely identifies the connection
);
if (hRes != S_OK)
{
CoTaskMemFree(m_ItemResult);
m_IOPCItemMgt->Release();
m_IOPCItemMgt = 0;
return -1;
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -