天天看點

關于OPC自動化接口程式設計(OPCDAAuto.dll)幾點注意問題

關于OPC自動化接口程式設計(OPCDAAuto.dll)幾點注意問題

為了能夠在工作中友善的應用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