
為了能夠在工作中友善的應用OPC和充分的了解OPC的開發流程、内部機制,這兩天正在研究開發OPC用戶端程式,一般我們開發OPC用戶端程式有以下幾種方式:
(1) 使用OPCNetAPI,需要用到OPCNetAPI.dll,OPCNetAPI.Com.dll
(2) 使用自動化接口,需要用到OPCDAAuto.dll
(3) 使用自定義接口,需要用到多個Wrapper:OpcRcw.Ae.dll,OpcRcw.Batch.dll,OpcRcw.Comn.dll,OpcRcw.Da.dll,OpcRcw.Dx.dll,OpcRcw.Hda.dll,OpcRcw.Sec.dll
相關資料可以到http://www.opcfoundation.org/去找,注冊成為會員,可以下載下傳一些東西,但是有些是收費的。
我用的是OPCDAAuto.dll,版本是:2.2.5.30。大家可以到網上去下載下傳,網上版本有可能是2.0.0.0的。網上也有相關的
DEMO例子也,但是大家都是用的VB.NET和VB開發的比較多,用C#的比較少,即使有,代碼寫的也比較混亂,并且沒有使
用的一些注意事項。我是用C#開發的,但是,也隻是在試驗階段,下一步準備做一個公司内部通用的DLL.
經過試驗,注意事項如下:
(1)用SyncRead(組的同步讀)和AsyncRead(組的異步讀)讀取服務資料
c#代碼原形:
SyncRead (short source,int NumItems,ref Arrray ServerHandles,out Values,out Errors,out Qualities,out
TimeStamps);
AsyncRead(int NumItems,ref Arrray ServerHandles,out Errors,int TransactionID,out int CancelID);
大家可以看出這兩個函數裡邊都有一個ref Arrray ServerHandles,
如果我們在向函數傳遞參數的時候,
寫成:
int[] handle=new int []{item.ServerHandle};
System.Array ServerHandles=(System.Array)handle;
這時候會出現“參數不正确”的錯誤異常。
應該改成:
int[] handle=new int []{0,item.ServerHandle};
System.Array ServerHandles=(System.Array)handle;
OPCDAAuto.dll内部源碼:
for (LONG ii = 1; ii <= NumItems; ii++)
{
LONG hHandle = NULL;
SafeArrayGetElement(*ppServerHandles, &ii, &hHandle);
phHandles[ii-1] = hInvalidHandle;
ppItems[ii-1] = NULL;
COPCItem* pItem = LookupItem(hHandle);
if (pItem != NULL)
{
phHandles[ii-1] = pItem->GetServerHandle();
ppItems[ii-1] = pItem;
}
}
(2)AsyncRead(組的異步讀)讀取服務資料
當用異步讀取資料的時候,必須把相應的組的IsSubscribed參數設定為true,以訂閱狀态方式讀取資料;當我們用異步方式
讀取資料就會有一個異步讀取完成的事件:
聲明:
group.AsyncReadComplete +=new
OPCAutomation .DIOPCGroupEvent_AsyncReadCompleteEventHandler (AsyncReadComplete);
實作:
private void AsyncReadComplete(int TransactionID, int NumItems, ref System.Array ClientHandles, ref
System.Array ItemValues, ref System.Array Qualities, ref System.Array TimeStamps, ref System.Array
Errors)
{}
剛剛學習用戶端開發,把遇到的問題整理一下,做一下筆記,同時也供大家一起學習。革命尚未成功,同志仍需努力!
網名:唯笑志在
QQ:504547114