3,245
社区成员
发帖
与我相关
我的任务
分享
COPCDataCallback::COPCDataCallback(void)
{
}
COPCDataCallback::~COPCDataCallback(void)
{
std::cout<<"释放回调函数"<<std::endl;
}
STDMETHODIMP COPCDataCallback::OnDataChange( // OnDataChange notifications
DWORD dwTransID, // 0 for normal OnDataChange events, non-zero for Refreshes
OPCHANDLE hGroup, // client group handle
HRESULT hrMasterQuality, // S_OK if all qualities are GOOD, otherwise S_FALSE
HRESULT hrMasterError, // S_OK if all errors are S_OK, otherwise S_FALSE
DWORD dwCount, // number of items in the lists that follow
OPCHANDLE *phClientItems, // item client handles
VARIANT *pvValues, // item data
WORD *pwQualities, // item qualities
FILETIME *pftTimeStamps, // item timestamps
HRESULT *pErrors) // item errors
{
std::cout<<"11 触发数据变化事件"<<std::endl;
std::cout<<dwTransID<<std::endl;
int *value = new int [dwCount];
std::cout<<dwCount<<std::endl;
DWORD i;
for (i = 0; i<dwCount; i++)
{
std::cout<<typeid(pvValues[i].iVal).name()<<std::endl;
value[i] = pvValues[i].iVal;
/*quility[i] = GetQualityText(pwQualities[i]);
timestamp[i] = COleDateTime(pftTimeStamps[i]).Format();*/
std::cout<<value[i]<<std::endl;
}
std::cout << "数据变更完毕..." << std::endl;
return S_OK;
};
STDMETHODIMP COPCDataCallback::OnReadComplete( // OnReadComplete notifications
DWORD dwTransID, // Transaction ID returned by the server when the read was initiated
OPCHANDLE hGroup, // client group handle
HRESULT hrMasterQuality, // S_OK if all qualities are GOOD, otherwise S_FALSE
HRESULT hrMasterError, // S_OK if all errors are S_OK, otherwise S_FALSE
DWORD dwCount, // number of items in the lists that follow
OPCHANDLE *phClientItems, // item client handles
VARIANT *pvValues, // item data
WORD *pwQualities, // item qualities
FILETIME *pftTimeStamps, // item timestamps
HRESULT *pErrors) // item errors
{
std::cout<<"12 触发异步读取事件"<<std::endl;
std::cout << std::endl;
std::cout << "数据获取中..." << std::endl;
int *value = new int [dwCount];
DWORD i;
for (i = 0; i<dwCount; i++)
{
value[i] = pvValues[i].iVal;
std::cout<<int(value[i])<<std::endl;
}
std::cout << "读取完毕" << std::endl;
return S_OK;
};
STDMETHODIMP COPCDataCallback::OnWriteComplete(
/* [in] */ DWORD dwTransid,
/* [in] */ OPCHANDLE hGroup,
/* [in] */ HRESULT hrMastererr,
/* [in] */ DWORD dwCount,
/* [size_is][in] */ OPCHANDLE __RPC_FAR *pClienthandles,
/* [size_is][in] */ HRESULT __RPC_FAR *pErrors)
{
//Sleep(100);
std::cout<<"13 触发异步写入事件"<<std::endl;
std::cout << "数据已全部写完..." << std::endl;
return S_OK;
};
STDMETHODIMP_(ULONG) COPCDataCallback::AddRef ()
{
// Increment the reference count then return value:
std::cout<<"引用第"<<++m_cnRef<<"次";
return (m_cnRef);
}
STDMETHODIMP_(ULONG) COPCDataCallback::Release ()
{
// Decrement reference count and return immediately if not zero:
if (--m_cnRef != 0)
return (m_cnRef);
delete this;
// Return our refence count, which is zero now:
return (0);
}
STDMETHODIMP COPCDataCallback::QueryInterface (REFIID iid, LPVOID *ppInterface)
{
// Validate ppInterface. Return with "invalid argument" error code if invalid:
if (ppInterface == NULL)
return (E_INVALIDARG);
*ppInterface = NULL;
// Reset ppInterface if requested interface type is valid:
if (iid == IID_IUnknown)
*ppInterface = (IUnknown *) this;
else if (iid == IID_IOPCDataCallback)
*ppInterface = (IOPCDataCallback *) this;
else
{
return (E_NOINTERFACE);
}
AddRef ();
// Return with "success" code:
return (S_OK);
}
hRev = m_pUnknown->QueryInterface (
IID_IConnectionPointContainer, (void **) &(m_pIConnPtContainer));
HRESULT hr = E_FAIL;
if (m_pIConnPtContainer)
{
// Get connection point (IID_IOPCDataCallback interface):
IConnectionPoint *pCP = NULL;
hr = m_pIConnPtContainer->FindConnectionPoint (IID_IOPCDataCallback, &pCP);
// If we succeeded to get connection point interface, create
// our data sink interface and advise server of it:
if (SUCCEEDED (hr))
{
try
{
// Instantiate a new IKDataSink20:
COPCDataCallback* m_callBack = new COPCDataCallback ();
// Advise the server of our data sink:
hr = pCP->Advise (m_callBack, &m_dwAdvise);
// We are done with the IID_IOPCDataCallback, so release
// (remove us from its reference count):
pCP->Release ();
}
catch (...)
{
// If a problem, make sure hr = E_FAIL so error gets
// processed correctly below:
std::cout<<"错误";
hr = E_FAIL;
}
}
}
ObjKepOpcDemo.CreateOPCServer("KEPware.KEPServerEx.V4");
ObjKepOpcDemo.AddGroups("Test.Simens01.test1", 0, 0.0, 0);
ObjKepOpcDemo.ItemList("Test.Simens01.test1",1);
ObjKepOpcDemo.AddItems();
ObjKepOpcDemo.GetIO();
ObjKepOpcDemo.AsyncSetting();
ObjKepOpcDemo.SyncRead();
//Sleep(1000);
ObjKepOpcDemo.SyncWrite(10);
//Sleep(1000);
//_getch();
ObjKepOpcDemo.AsyncRead();
//Sleep(1000);
ObjKepOpcDemo.AsyncWrite(13);
//Sleep(1000);
std::cout<<"休眠完了";
ObjKepOpcDemo.StopServer();
system("pause");