发表于:2004-05-11 00:07:00
9楼
重贴一下上次回复刘清的帖子:
以下仅供参考:
一、为了支持回调,OPC服务器和客户端必须具备的条件
OPC服务器:实现IConnectionPointContainer接口,并且拥有一个连接点(IConnectionPoint),支持IOPCDataCallback回调接口。
OPC客户端:为了能够使用连接点,通常需要创建一个对象(AAA),该对象支持IUnknown和IOPCDataCallback接口。
二、OPC服务器和客户端的协作过程
1.客户程序首先获得服务器的IConnectionPoint接口指针,然后通过IConnectionPoint::Advise()将对象AAA的IUnknown接口指针传给服务器。
2.服务器在接收到该指针后,将通过AAA的QueryInterface()获得IOPCDataCallback接口,并保存IOPCDataCallback接口指针。
3.服务器在适当的时候(如果是自己开发服务器,想什么时候就什么时候了)会调用AAA所实现的IOPCDataCallback::OnDataChange(),IOPCDataCallback::OnReadComplete,IOPCDataCallback::OnWriteComplete,IOPCDataCallback::OnCancelComplete四个函数。
三、关于数据类型
请看OPC 规范中IOPCDataCallback::OnDataChange的定义:
HRESULT OnDataChange(
[in] DWORD dwTransid,
[in] OPCHANDLE hGroup,
[in] HRESULT hrMasterquality,
[in] HRESULT hrMastererror,
[in] DWORD dwCount,
[in, size_is(dwCount)] OPCHANDLE* phClientItems,
[in, size_is(dwCount)] VARIANT* pvValues, //注意此处的数据类型
[in, size_is(dwCount)] WORD* pwQualities,
[in, size_is(dwCount)] FILETIME* pftTimeStamps,
[in, size_is(dwCount)] HRESULT* pErrors
);
显然,服务器发送给客户程序的数据类型是VARIANT类型的数组,也就是说基本上是任意的数据类型了,包括BOOL类型!
注:以上内容我参考的是 OPC DA Specification 3.0,该规范在www.OPCFoundation.org上可以免费下载。